{"id":47908385,"url":"https://github.com/lukeredpath/tabsync","last_synced_at":"2026-04-04T05:01:03.061Z","repository":{"id":347354640,"uuid":"1192944484","full_name":"lukeredpath/tabsync","owner":"lukeredpath","description":"A local web app for practising with YouTube tab videos","archived":false,"fork":false,"pushed_at":"2026-03-30T19:05:24.000Z","size":8402,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-04T04:59:55.061Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lukeredpath.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-26T18:04:10.000Z","updated_at":"2026-03-30T19:05:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"21f941be-82bb-47cd-ac22-3470d073dcb2","html_url":"https://github.com/lukeredpath/tabsync","commit_stats":null,"previous_names":["lukeredpath/tabsync"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lukeredpath/tabsync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lukeredpath%2Ftabsync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lukeredpath%2Ftabsync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lukeredpath%2Ftabsync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lukeredpath%2Ftabsync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lukeredpath","download_url":"https://codeload.github.com/lukeredpath/tabsync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lukeredpath%2Ftabsync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31388169,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T04:26:24.776Z","status":"ssl_error","status_checked_at":"2026-04-04T04:23:34.147Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-04T05:00:25.476Z","updated_at":"2026-04-04T05:01:03.029Z","avatar_url":"https://github.com/lukeredpath.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TabSync\n\n[![Playwright Tests](https://github.com/lukeredpath/tabsync/actions/workflows/playwright.yml/badge.svg)](https://github.com/lukeredpath/tabsync/actions/workflows/playwright.yml)\n\nA local web app for musicians who practise with YouTube tab videos. Load a tab video alongside the original song audio, keep them in sync, and build a persistent library of tracks so you can jump straight into practising.\n\nWorks for any tab-based practice — bass, guitar, or otherwise.\n\n![TabSync screenshot](screenshot.png)\n\n## Features\n\n### Library\n- Add tracks with a title, artist, tab video URL, and optional audio track URL\n- Set independent start offsets for each video to the nearest 0.1 second, so both begin at exactly the right moment\n- Organise tracks into folders\n- Mark tracks as favourites for quick access\n- Set a difficulty rating (1–5)\n- Search across titles and artists; sort by title, artist, difficulty, or recently added\n- Track metadata (title and artist) is auto-fetched from YouTube when you paste a URL\n\n### Player\n- Tab video fills the main area; if you've added an audio track, it plays in a small draggable overlay (drag with mouse or touch) with the tab video muted\n- Play, pause, restart, and skip ±5 seconds with on-screen controls or keyboard shortcuts\n- Playback speed control — 0.5×, 0.75×, 1×, or 1.25×; persisted across sessions\n- Count-in mode — optional 3-second countdown before playback starts; can be overridden per track\n- Both videos start together from their configured offsets\n- If you seek in the tab video using the player's native controls, the audio track resyncs automatically\n\n### Keyboard shortcuts\n| Key | Action |\n|---|---|\n| `Space` | Play / Pause |\n| `R` | Restart from beginning |\n| `←` | Skip back 5 seconds |\n| `→` | Skip forward 5 seconds |\n\n### Library management\n- Export your library as a dated JSON file for backup or migration\n- Import a JSON file to restore a library (replaces current data with confirmation)\n\n### Other\n- Light and dark themes, following your system preference by default with a manual override\n- All data stored locally in your browser — nothing is sent to any server\n- Works in Chrome; Safari support depends on your version and YouTube's embed policy\n\n## Requirements\n\n- Python 3 (for the local server — included with macOS)\n- A modern browser (Chrome recommended)\n\n## Getting started\n\n```bash\ngit clone https://github.com/lukeredpath/tabsync.git\ncd tabsync\nmake start\n```\n\nThis starts a local server on port 8080 and opens the app in Safari. To use a different port:\n\n```bash\nmake start PORT=9000\n```\n\nTo stop the server:\n\n```bash\nmake stop\n```\n\n## How it works\n\nTabSync is a fully client-side web app — there is no backend. Your track library is stored in your browser's `localStorage`. The YouTube IFrame API handles video playback.\n\nBecause data lives in `localStorage`, it is tied to the browser profile you use. If you clear your browser data, your library will be lost. Use the export feature to keep a backup.\n\n## Planned features\n\n- Auto-detect the correct sync offset by scanning the start of each video\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flukeredpath%2Ftabsync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flukeredpath%2Ftabsync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flukeredpath%2Ftabsync/lists"}