Anonymous Twitch TUI for browsing and watching live streams.
No Twitch account, no OAuth, no tracking. Plays through Twitch ad breaks with live HLS-session bypass — the player never stalls on a midroll. Runs mpv or vlc under the hood.
- Browse live streams by category or search channels by name
- Favorites (WatchList tab) with live status, viewer count, uptime
- Ignore list — hide channels everywhere with
x - Ad-break bypass — segment-level ad filtering plus a live HLS-session swap under the running player, so midrolls turn into a short glitch instead of a silent pause. MPEG-TS PCR/PTS/DTS and continuity counters are rewritten at the swap boundary to keep the player's demuxer happy.
- Quality picker (
i) or auto-best - Theme picker (
t) with 11 presets; honorsNO_COLOR - Auto-refresh at a configurable interval
- ASCII fallback for terminals without Unicode (
--ascii,TERM=linux) - Live chat pane per playing stream (anonymous, read-only); opens on demand with
Cor automatically via[chat] auto-open. Pause on scroll-back, cycle withc, hide withC
Binary release (recommended): download the archive for your platform from Releases, extract, move twui to somewhere on your $PATH.
# example for linux/amd64
curl -LO https://github.com/Stoica-Mihai/twui/releases/latest/download/twui_<version>_linux_amd64.tar.gz
tar -xzf twui_<version>_linux_amd64.tar.gz
sudo mv twui /usr/local/bin/From source:
git clone https://github.com/Stoica-Mihai/twui
cd twui
make build
./twuiRequires Go 1.25+ and one of mpv (default) or vlc on your $PATH.
twui # launch the TUI
twui 1080p60 # launch with a default quality hint
twui --ascii # 7-bit safe glyphs
twui --refresh 1m # auto-refresh the current view every 60sKeys (see ? in the TUI for the full list):
| Key | Action |
|---|---|
j / k |
Navigate |
Tab / Shift+Tab |
Switch view |
Enter |
Launch stream / open category |
/ |
Search |
f |
Toggle favorite |
x |
Toggle ignore |
i |
Quality picker |
t |
Theme picker |
r |
Related / host channels |
? |
Help overlay |
q / Ctrl+C |
Quit |
Related overlay (opened with r):
| Key | Action |
|---|---|
j / k |
Navigate |
Enter |
Launch the selected stream |
f |
Toggle favorite on the selected channel |
x |
Ignore the selected channel (drops from the overlay) |
Esc / r |
Close |
Chat pane (appears when a stream is playing):
| Key | Action |
|---|---|
c |
Cycle focus between live sessions |
C |
Toggle chat pane visibility |
[ / ] |
Scroll chat back / forward one line (back auto-pauses) |
{ / } |
Scroll chat back / forward one page |
| Mouse wheel over pane | Scroll (auto-pauses) |
Space |
Resume autoscroll, jump to newest |
Esc |
Hide pane |
Lives at ~/.config/twui/config.toml and is written in place on favorite / ignore / theme changes.
[twitch]
channels = ["streamer1", "streamer2"] # favorites
ignored = ["channelX"]
low-latency = false
[general]
player = "mpv" # or "vlc"
player-args = [] # extra player args
refresh = "30s" # auto-refresh interval; 0 or empty = disabled
[theming]
theme = "catppuccin" # or: default, dracula, nord, solarized-dark,
# gruvbox, tokyo-night, rose-pine, kanagawa,
# everforest, one-dark
# Optional per-field hex overrides:
# border = "#..."
# text = "#..."
# live = "#..."
[chat]
enabled = true # set false to never open IRC connections
max-backlog = 500 # per-session message cap
auto-open = false # true: connect + show pane on stream launch
# false (default): connect lazily when you press CEnvironment variables:
| Variable | Effect |
|---|---|
NO_COLOR |
Disable all ANSI color output |
TWUI_ASCII |
Force ASCII glyphs (same as --ascii) |
TWUI_* |
Override any config key (Viper convention) |
make test # go test ./...
make test-race # with -race
make test-live # network required; Twitch API canary
make coverage # coverage.out + summary
make lint # requires golangci-lint installed
make fmt # gofmt + goimports