The YouTube companion that respects your time, your attention, and your data.
Local-only · No account · No sync · No tracking
YouTube forgets where you stopped. Across reloads. Across SPA navigations. Across days. WatchDeck quietly remembers your position on every video you watch and seeks back to it the next time you open it.
That is the first feature. More are coming.
WatchDeck is built for a long backlog of small, useful YouTube enhancements. Each one ships behind the same principles: local-first, narrow scope, no tracking, honest defaults. Planned directions include:
- Continuity. A private continue-watching dashboard. Per-channel resume memory. Local export of your saved progress.
- Bookmarks and notes. Timestamped bookmarks. Private notes attached to a video. One-click copy of timestamped links.
- Player memory. Default playback speed. Preferred quality with a safe fallback. A-B segment loop. Captions that stay on when you want them.
- Focus. Hide recommendations, comments, live chat, or Shorts. Focus presets for learning, music, or research.
- Workflow. Local queues separate from YouTube playlists. Triage saved videos into states like later, learning, reference, or done.
- Local by default. Resume timestamps live in your browser's local storage. There is no server, no account, no analytics, no telemetry.
- Narrow surface. The extension runs only on
youtube.com/watchpages. Nothing on the homepage, Shorts, live streams, embeds, or anywhere else on the web. - Quiet. No overlays. No toasts. No autoplay hijacking. The only thing you notice is that your video resumes.
- Honest. Open the popup. You see exactly what is saved. One click erases it.
Listing coming soon.
- Go to the Releases page and download the latest
watchdeck-x.y.z.zip. - Unzip it anywhere on your computer. You will get a folder containing
manifest.json,popup.html, and the script and icon files. - Open
chrome://extensions(works in any Chromium-based browser: Chrome, Brave, Edge, Arc, Vivaldi). - Toggle Developer mode on in the top right.
- Click Load unpacked. Select the unzipped folder.
- WatchDeck appears in your toolbar. Click the icon to open the popup.
To update later, download the new release ZIP, unzip over the same folder, then click the reload arrow on the extension card in chrome://extensions.
- Clone this repo. Run
npm install && npm run build. - Open
chrome://extensions. Enable Developer mode. - Click Load unpacked. Choose the
dist/folder.
WatchDeck stores per-video resume timestamps only in your own browser. Nothing leaves your device.
| Permission | Why |
|---|---|
storage |
Save resume timestamps in chrome.storage.local. |
activeTab |
When you click the toolbar icon, identify the current YouTube tab so the popup can target it. Granted only on user gesture. Revoked on tab change. |
Content script on https://www.youtube.com/* |
The only place WatchDeck runs. |
WatchDeck never sees what is on any other website. Read the full statement in PRIVACY.md.
npm install
npm run build # bundle into dist/
npm test # run unit tests
npm run release # build, test, package an upload-ready ZIP| Command | What it does |
|---|---|
npm run build |
Bundle the extension into dist/. |
npm test |
Run the test suite. |
npm run smoke |
Verify build artifacts and manifest contracts. |
npm run icons |
Regenerate icons from assets/branding/watchdeck-logo.png. |
npm run release |
Full pipeline: build, smoke, tests, ZIP. |
src/
├── entrypoints/ content script · service worker · popup
├── features/resume/ eligibility · controller · progress tracker
├── adapters/youtube/ SPA detection · player lifecycle
├── storage/ chrome.storage.local repositories
└── settings/ user preferences
WatchDeck uses Conventional Commits plus release-please to drive releases end to end. There is no manual version bump.
How it works:
- Every commit landed on
mainis parsed by the Release Please workflow. - Once the next release would contain at least one user-visible change (
fix:orfeat:), release-please opens a Release PR that bumpspackage.jsonandpublic/manifest.jsontogether and writes a CHANGELOG entry from the commits. - Reviewing and merging that PR cuts a tagged GitHub Release.
- Publishing the release fires the Release workflow. It checks out the tag, runs the full pipeline (
build→smoke→vitest --run→package), and attacheswatchdeck-X.Y.Z.zipas a release asset. - Users go to the Releases page, download the ZIP, unzip, and load unpacked.
Commit prefixes that drive releases:
| Prefix | Bumps |
|---|---|
fix: … |
patch (0.1.0 → 0.1.1) |
feat: … |
minor (0.1.0 → 0.2.0) |
feat!: … or any commit with a BREAKING CHANGE: footer |
major (0.1.0 → 1.0.0) |
chore:, docs:, ci:, test:, refactor:, style: |
no release |
Anything that ships to users belongs as feat or fix. Internal cleanup belongs as chore. Read CONTRIBUTING.md for the full convention.
Bug reports, feature ideas, and pull requests are welcome. See CONTRIBUTING.md before opening a PR. Be kind. Read CODE_OF_CONDUCT.md.
For security disclosure, see SECURITY.md. For the privacy statement, see PRIVACY.md. For release history, see CHANGELOG.md.
For anything else, reach the maintainer at contactutpalsen@gmail.com.
