Better controls for YouTube.
The first ytctl feature is flexible playback-speed control with hotkeys, user-created profiles, and per-creator rules.
Status:
0.1.xbeta. Versioning follows Epoch Semantic Versioning.
- Playback speeds from 0.25× to 4×
- Customizable increase, decrease, reset, and profile-slot hotkeys
- Unlimited user-created profiles with up to nine hotkey slots
- Separate defaults and creator rules for regular videos and Shorts
- Temporary speed changes that never overwrite rules automatically
- Creator profile or custom-speed assignments from the toolbar popup
- Searchable creator-rule management with channel avatars in Settings
- Local-only storage with JSON backup and restore
- Live streams fixed at 1× and ads left untouched
- Open
about:debugging. - Select This Firefox.
- Select Load Temporary Add-on….
- Choose this repository's
manifest.json. - Reload any YouTube tabs that were already open.
- Run
./scripts/package.sh. - Open
chrome://extensions. - Enable Developer mode.
- Select Load unpacked.
- Choose
dist/chrome. - Reload any YouTube tabs that were already open.
Run:
./scripts/package.shThis creates:
dist/ytctl-firefox-<version>.zipdist/ytctl-chrome-<version>.zipdist/firefoxanddist/chromeunpacked development builds
manifest.json and manifest.firefox.json are the Firefox manifests. Chrome-specific differences live in manifest.chrome.json. Firefox releases must be signed through Mozilla Add-ons; Chrome releases can be uploaded to the Chrome Web Store.
npm install
npm test
npm run packageAdd a changeset with each user-facing pull request:
npm run changesetTo consume pending changesets and update CHANGELOG.md, package.json, and all extension manifests:
npm run changeset:versionCommit the generated version changes, then run npm run package to produce the browser archives.
The manually triggered Publish Firefox workflow validates and submits the extension to AMO. Configure these GitHub Actions repository secrets first:
AMO_JWT_ISSUERAMO_JWT_SECRET
Create the credentials at addons.mozilla.org/developers/addon/api/key. The initial listing metadata is stored in store/firefox/amo-metadata.json.
Normal releases use the Changesets version PR:
- User-facing pull requests include a changeset.
- After those pull requests merge, Changesets creates or updates the version PR.
- Merging the version PR changes
package.json, which automatically submits that version to AMO and creates a matching GitHub release.
The manually triggered Publish Firefox workflow remains available for dry runs and recovery. Leave Submit to AMO disabled to test, package, lint, and upload artifacts without publishing.
Mozilla reviews listed submissions before publication. Direct pushes to main are blocked; all changes go through pull requests and CI.
Alt + Shift + ↑: increase speedAlt + Shift + ↓: decrease speedAlt + Shift + 0: reset to the applicable creator rule or defaultAlt + Shift + P: open the toolbar popupAlt + Shift + 1through9: temporarily activate the profile in that slot
Hotkeys can be changed or cleared in the extension's Settings page. They are ignored while focus is in a text or editable field.
MIT © 2026 Max Knerrich
All settings are stored in browser.storage.local. The extension does not store viewing history, use Firefox Sync, or send data to external services. Channel metadata is resolved from the active YouTube page; if YouTube has not exposed it in the page yet, the extension may fetch that same YouTube page to identify the stable channel ID.