Twitch Utils

Keybind-toggled utility HUD for Twitch — Web Audio chain (gain to 500%, compressor, bass shelf, mono, loudness-derived auto gain), player-core stats and latency control, quality pinning, ad mute/blank, auto-claim, cast, screenshot, PiP.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

作者
SpacersVIP
今日安裝
0
安裝總數
21
評價
0 0 0
版本
5.0.0
建立日期
2026-07-17
更新日期
2026-07-17
尺寸
117.3 KB
授權條款
未知
腳本執行於

A utility HUD for Twitch. Press ` (backtick) on any Twitch page to open it.
https://github.com/SpacersVIP/Twitch-Utils-Menu-TamperMonkey-/tree/main

Twitch's web player is Amazon IVS, and the player instance is reachable from the page — it exposes the real quality ladder, live latency, dropped frames, ad break timing and the ABR internals. Most scripts scrape the DOM for this and break whenever Twitch ships a change. This one asks the player directly.

---

## What it does

**Audio**
Gain up to 500%, a compressor with a live gain-reduction meter, bass shelf, and mono downmix. Auto-gain reads Twitch's own per-channel loudness measurement and boosts quiet streams to a target you pick — no more riding the volume slider between channels.

**Quality**
Pin any variant from the real ladder. Turning off auto quality takes Twitch's entire ABR filter chain out of the loop — including the dropped-frame filter, which *lowers your quality when your machine drops frames*, which is a feedback loop nobody asked for. There's also a button that tells you which variants the player is refusing to give you, and why.

**Playback stats**
FPS, dropped/decoded frames, buffer, resolution, live latency, bitrate, bandwidth estimate. Optional always-on overlay.

**Latency**
Low-latency toggle plus a latency cap that gently speeds playback until you're caught up.

**Ads**
Mute and blank the player during breaks, with a real countdown — pulled from the player's ad events, so it's the actual remaining time, not a guess. Shows "2/3" when a break has multiple spots. Three independent safety layers make sure your audio always comes back.

**Channel points**
See balances across any list of channels from a single tab. Claim pending chests from anywhere — including ones you earned on a channel you've since left. Auto-claim while you watch. Clickable list of who you follow that's currently live.

**Lurk**
Runs real players for several channels in small scaled thumbnails on one page. Silenced (without touching the mute state), pinned to the lowest quality, claiming their own chests. Size slider, or hide the thumbnails entirely while they keep running.

**VOD & rewind**
Frame-step with , and ., A/B loop, copy a timestamped link. Rewind works on live streams that expose a DVR window, and the panel tells you how big yours is.

**Display**
Fill an ultrawide monitor by stretching or cropping — it shows you exactly what each costs before you pick ("stretch = 48% wider · crop loses 32% of height"). Saturation control. Screenshot the current frame. Picture-in-picture. Copy the raw manifest URL for mpv/VLC/yt-dlp.

**Other**
Auto-dismiss content warnings and age gates. Hide the Prime crown, sidebar, or chat. Drop to low quality when a tab is hidden (for running several at once). Export/import settings. Everything persists, and the panel is draggable and foldable.

---

## Important: do not add a @grant

The script uses `@grant none` and that is not optional. It's what keeps the script in page context, where Twitch's React internals are visible. Any `@grant` value sandboxes it, the player can't be found, and half the features silently fall back to DOM scraping.

If the console says `video present but player core unreachable`, this is why.

---

## Privacy

Worth being explicit, since the points features touch your account:

- The script reads Twitch's `Authorization` header off Twitch's own outgoing requests, keeps it in memory, and uses it only to talk to `gql.twitch.tv`. It is never stored, never logged, and never leaves your browser.
- The only network requests it makes go to Twitch. There is no server behind this, no telemetry, no analytics.
- Settings live in your browser's localStorage.
- Nothing is obfuscated. Read the source.

---

## What it does not do

**It does not block ads.** Twitch stitches ads into the same stream server-side — same manifest, no separate request to intercept. Skipping and player-resetting don't work; a proxy is the only approach that does, and this isn't one. It mutes and blanks them and counts them down, which is the honest limit.

**It does not fake watch time.** Points require a real player actually running. The lurk feature runs real players; it doesn't pretend. If you're after something that farms channels you aren't watching, this isn't it.

**It can't cast.** The player feeds video through MediaSource, and a Chromecast can't resolve a `blob:` URL from your tab. That's a browser limitation, not a Twitch one. Use *Copy stream URL* and cast from VLC instead — there's a button that explains this in one click.

**It can't rewind past what you've watched.** A live playlist only lists recent segments, so anything from before you tuned in was never available to your player. The rewind window is your session and grows as you watch. For the earlier part of a broadcast, the archive VOD is the only place it exists — there's a button for that too.

---

## Notes

A few things found while building this, in case they're useful:

- `setLiveMaxLatency()` exists on the player but throws `UnboundTypeError` — it takes a C++ type Embind never registered in this build. The error surfaces asynchronously inside a worker, so it's uncatchable. The latency cap uses `playbackRate` instead.
- The player object existing is not the same as a stream being loaded. Commands sent too early are dropped silently, and `getQualities()` returns an empty array that's easy to cache forever.
- `getDuration()` returns `Infinity` on live and a real number on VOD, which makes it a reliable way to tell them apart.
- The experiment store has exactly one key in it, and it's a test placeholder.

Bug reports welcome, especially with console output. Most of what's good here came from someone reporting that a thing didn't work.

MIT licensed.