A cross-browser extension that cleans YouTube watch URLs by removing playlist/mix context while keeping useful video parameters like timestamps. Supports Chrome and Firefox from a shared codebase.
For how it works and the reasoning behind the key decisions, see docs/architecture.md.
- Removes Mix/playlist context from
youtube.com/watchbefore the page loads, so the Mix never starts — no reload, no flash (Chrome, via declarativeNetRequest) - Independent controls to clean Mixes & radio, Playlists, or turn cleaning off entirely
- Keeps useful video parameters such as the
ttimestamp - Back button returns to the previous page, never the playlist
- Falls back to a content script for in-app (SPA) Mix clicks and for browsers without DNR
- Lightweight MV3 architecture with shared code for both browsers
- Clone this repository
- Run
npm run dev:chrome - Open
chrome://extensions/ - Enable Developer mode
- Click Load unpacked and select
dist/chrome-dev
- Run
npm run build:chrome - Use
dist/tubeplus-chrome.zip
- Clone this repository
- Run
npm run dev:firefox - Open
about:debugging#/runtime/this-firefox - Click Load Temporary Add-on
- Select
dist/firefox-dev/manifest.json
- Run
npm run build:firefox - Use
dist/tubeplus-firefox.zip
npm install
# Prepare dev folders
npm run dev
npm run dev:chrome
npm run dev:firefox
# Produce store zip files
npm run build
npm run build:chrome
npm run build:firefox
# Remove generated artifacts
npm run cleanTubePlus/
├── README.md
├── LICENSE
├── package.json
├── .gitignore
├── docs/ # Context: architecture.md (design + decisions), changelog.md, privacy.md
├── store-assets/ # Store/marketing assets
├── shared-assets/ # Shared extension icons/assets (source)
├── scripts/ # Build/package helpers
├── src/
│ ├── common/ # Shared extension runtime files
│ │ ├── url-cleaner.js # settings model + cleaning decision (unit-tested)
│ │ ├── rules.js # builds declarativeNetRequest rules from settings
│ │ ├── background.js # Chrome service worker: applies DNR rules
│ │ ├── content.js # fallback for in-app SPA navigations / non-DNR browsers
│ │ └── popup.* # popup UI
│ ├── chrome/ # Chrome shell (manifest with DNR + service worker)
│ │ └── manifest.json
│ └── firefox/ # Firefox shell (content-script path, no DNR)
│ └── manifest.json
└── dist/ # Generated dev/build artifacts
MIT