Downloads, ambient lighting, comment translation and 20+ toggles — for YouTube and YouTube Music, with separate settings for each.
Ambilight sampling the picture, the injected toolbar, and the frosted queue panel — the same script on both sites.
You need a userscript manager, then the script.
| Manager | Chrome | Firefox |
|---|---|---|
| Tampermonkey (recommended) | add | add |
| Violentmonkey | add | add |
Then refresh a YouTube tab you already have open — a brand-new tab is fine too, but the gear button only appears once the page finishes loading.
| Where the gear button appears | |
|---|---|
| youtube.com | Top-right of the page header, immediately left of the Create button |
| music.youtube.com | Top-right of the page, immediately left of the Cast button |
Three things catch people out on their first run. All three are fixed further down.
- Turn on hardware acceleration if you want Ambilight or the wave visualiser. Check
chrome://gpu— see below. - Allowlist the download servers in your adblocker, or downloads fail.
- Downloads are proxied through third-party servers. The script asks
savenow.to/lbserver.xyz/dubs.iofor a direct file link and pulls the FFmpeg core fromcdn.jsdelivr.net. Your video request goes through those servers, not straight to YouTube. Settings, bookmarks and history stay in your browser.
| Formats | Notes | |
|---|---|---|
| Video | 144p–1080p MP4 · 1440p 2160p 4320p WEBM |
Above 1080p is WEBM only |
| Audio | FLAC WAV WEBM (lossless) · MP3 M4A AAC OPUS OGG (lossy) |
Lossless is labelled UHQ in the menu |
Files are tagged in-browser — title, artist, album and cover art go straight into the file (ID3v2 for MP3, Vorbis Comments for FLAC) before it downloads.
Everything lives in the General tab. Anything not marked (on) is off by default.
Rebuilt from the script's own markup and stylesheet.
| Appearance | Playback | Community |
|---|---|---|
| Active Themes | Nonstop playback (on) | Show Dislikes (on) |
| Ambilight | Audio-only mode | Like vs Dislike bar |
| Cinematic Mode | Audio-only this tab | Translate comments |
| Royal Purple Timeline | Reverse mode | Download avatars |
| Wave visualizer Beta (on) | Disable Autoplay | Bookmarks (timestamps) |
| Shorts: show channel name | Disable Subtitles | Save Mix as playlist |
| UI style | Disable Annotations | Continue watching |
| Hide Comments | ||
| Hide Sidebar |
Five more controls sit below the grid: UI style, Effect wave visualizer, Default video player quality, Language for translate comments (12 languages) and Video Player Size with a Reset button.
Three labels read
Disable something. Those are the real menu labels — they mean "turn this YouTube behaviour off", not "stop disabling it".
Settings → General → UI style. YouTube and YouTube Music remember the choice separately, so the two sites can look different at the same time.
| Style | What you see |
|---|---|
Standard |
Nothing is overridden. Header, search box and panels stay exactly as YouTube built them. |
Blur |
Light frosted glass on the watch playlist panel and the YT Music queue panel. |
Liquid Glass |
Heavier glass — more blur, more saturation, plus a soft gradient on the playlist panel. |
Transparent |
No tint, no blur. Offered on youtube.com only. |
Colours and background image live on the Themes tab:
The script also adds its own row of buttons — and the two sites do not get the same set.
Left: youtube.com, 8 buttons. Right: music.youtube.com, 6.
| youtube.com | music.youtube.com |
|---|---|
| Image video | Image video |
| Repeat video | MP4 |
| Add bookmark | MP3 |
| Show bookmarks | Close |
| History | Picture to picture |
| MP4 / MP3 download | Screenshot video |
| Picture to picture | |
| Screenshot video |
Repeat video and the bookmark/history buttons are guarded by if (!isYTMusic), so they are
never built on YouTube Music.
| Symptom | Cause |
|---|---|
| No gear button after installing | Tab not refreshed, or the manager has not granted access |
Network Error while downloading |
Adblocker eating the API |
| Settings open but changes do nothing | Preferences did not finish loading |
| Effects stutter, CPU at 100% | No hardware acceleration |
| "Save Mix as playlist" missing | Wrong site, or signed out |
Found something else? Open an issue →
No gear button after installing
- Refresh the tab you were already on. A page open before you installed keeps running the old version until you reload.
- Check the manager granted permission. Click the Tampermonkey icon → this script →
allow access to
youtube.comandmusic.youtube.com. - Confirm the script is enabled — the Tampermonkey dashboard shows a toggle per script.
- Check the page. Shorts, watch pages and YouTube Music work; embedded players and most
youtube.comsub-pages do not carry the script's UI.
Network Error during downloads
Add these to uBlock Origin → Dashboard → My filters, at the very bottom:
@@||savenow.to^
@@||lbserver.xyz^
@@||dubs.io^
@@||cdn.jsdelivr.net^
@@ means "do not block". dubs.io is the fallback provider; cdn.jsdelivr.net serves
the FFmpeg core used to convert and tag files — both are required even when the primary
provider works.
The last rule unblocks a whole CDN. To keep it narrow, leave it out first and only add it if a conversion or tagging step fails.
Still failing? Open DevTools (F12) → Console and retry. The script logs
SaveNow provider did not return success/progress_url or All SaveNow providers failed,
which names the host that actually failed.
Settings do not apply
A timeout can fire before preferences finish loading on a slow connection. Refresh the page — that fixes it most of the time.
Otherwise, in the DevTools console:
GM_deleteValue('ytSettingsMDCM');copy(GM_getValue('ytSettingsMDCM'))
Ambilight needs hardware acceleration
Without it the browser falls back to software rendering (SwiftShader), the WebGL shader runs on the CPU, and the effect stutters. This matters most on laptops with integrated graphics.
Check chrome://gpu → WebGL row:
Hardware accelerated→ fineSwiftShaderorSoftware only→ this is your problem
Enable it at chrome://settings/system → Use graphics acceleration when available →
restart the browser. A tab refresh is not enough. Ambilight, the wave visualiser and the
YT Music ambient glow all depend on this.
"Save Mix as playlist" does not appear
The button only shows on a Mix, and only on the regular YouTube site. A Mix is any page
whose list parameter starts with RD; in the examples below <token> stands for any
characters:
list=RDMM unnamed mix
list=RDMM<token> named mix (Mixes tab)
list=RD<videoId>&start_radio=1 mix seeded from a single video
Check the console for a line starting with [YT Tools] mixPlaylist — it prints whether
the feature is enabled and which list id was found.
Creating the playlist uses an internal YouTube endpoint that needs you signed in. Signed
out, the request returns 401.
The script declares
@connect *because the final file URL is returned by the API at runtime, so the full set of possible hosts cannot be listed up front.
Node.js 18 or newer (tested on 24.x). One dependency: fs-extra.
git clone https://github.com/akari310/youtube-tools.git
cd youtube-tools
npm install
npm run build # → youtube-tools.user.js at the repo rootLayout and build order
16 modules across 5 directories, concatenated into one IIFE — not imported.
| Directory | Files | Contents |
|---|---|---|
src/core/ |
3 | Userscript header, shared bootstrap and DOM helpers, DOM/security policy |
src/ui/ |
5 | Glass components, shared DOM helpers, styles, settings menu, injected buttons |
src/features/ |
3 | WebGL Ambilight, Cinema mode, Mix → playlist |
src/main/ |
3 | DOM observers, feature manager, bootstrap |
src/utils/ |
2 | Downloader/API wrappers, URL-and-settings module |
Placement gotcha: the downloader lives in
src/utils/, notsrc/features/. The wave visualiser and dislike counter also sit outsidesrc/features/.
scripts/build.js concatenates using an explicit FILE_ORDER array — not
alphabetical, not filesystem order. Declaration order is execution order, so a module in
the wrong slot can break the whole bundle. core/meta.js first, core/init.js next (it
opens the IIFE), main/final.js last (it runs the bootstrap).
Commands
| Command | Effect |
|---|---|
npm run build |
Concatenate src/ into youtube-tools.user.js |
npm run bump |
Bump the version across every location it appears |
npm run release |
Bump, commit, force-push to main |
npm run push |
Commit without bumping |
npm run release or npm run push casually. Both stage with git add .
— anything untracked gets swept in — and both push with --force. Stage explicitly:
git add -- src/ youtube-tools.user.js package.json
git commit -m "feat: ..."
git push origin mainnpm run bump touches no git state on its own. But a push that includes a bumped
youtube-tools.user.js kicks off the release workflow, which publishes a public GitHub
Release the moment it sees that version. Confirm the bump is intended before you push — a
published release cannot be taken back, and deleting the tag afterwards only makes the next
bump collide with it.
| Akari | Optimization & development |
| DeveloperMDCM | Original project creator |
| nvbangg | Audio-only & nonstop playback |
| WesselKroos | WebGL Ambilight — original extension |
GPL-3.0 © Akari, DeveloperMDCM, nvbangg




