DJ Gem streaming that reads the room
Press Ctrl+R and a Gemini-powered Queue Director lines up songs that fit the mood — Focused, Balanced, or Discovery. Press w for its reasoning, in plain words.
● ~/yututui — Rust · ratatui · MIT
Stable enough for daily use, still moving fast. A keyboard-driven YouTube Music client with DJ Gem streaming, live radio, terminal-aware album art fallbacks, synced lyrics, scrobbling, and one-command Spotify import. No browser. No ads.
$ brew install Ochichan/tap/yututui
Ask me to play, queue, or find music — I can build playlists too.
● The good stuff
It's all keyboard, all fast, and all yours to rebind. Here's what you get the moment you type ytt.
Press Ctrl+R and a Gemini-powered Queue Director lines up songs that fit the mood — Focused, Balanced, or Discovery. Press w for its reasoning, in plain words.
Cover art uses Kitty, Sixel or iTerm2 when your terminal supports it, with halfblock or retro fallback; time-synced lyrics scroll underneath — and v floats the music video in a little mpv window where your OS session supports it. When mpv has focus, Space/./,/q/f/m handle playback, next/previous, close, fullscreen, and mute, and those keys are remappable too.
YouTube Music is home base, but the same box searches SoundCloud, Audius, Jamendo, Internet Archive, Radio Browser and your OpenSubsonic music server. Flip sources with Tab, or hit them all at once — every result tagged [SRC].
Alt+Shift+R turns the whole app into an internet-radio tuner — true live streams that re-sync themselves to the live edge, with radio-only favorites, history, even its own theme. Press i and Gemini names what's playing right now; f favorites it. Press a for Atlas — a rotatable globe of live stations drawn in Braille dots, no image protocol needed.
Liked songs and playlists migrate to YouTube Music with one checkpointed, resumable command — CJK-safe matching, ambiguities reported instead of guessed. Works the other way too.
Build playlists in the Library (or let DJ Gem build them), and press d to save any track as a tagged m4a with cover art — Shift+D grabs the whole list, played offline from the Downloads tab or the immersive Local Deck (Alt+Shift+L).
Media keys, macOS Control Center, a menu-bar / tray mini player, Linux MPRIS, ytt -r from any shell — or no terminal at all with the headless daemon.
Last.fm and ListenBrainz, done properly: Now Playing updates, the half-track rule, likes synced as loves — and offline listens queue on disk until you're back.
14 themes, all 34 color roles hex-editable, a 10-band EQ with presets, and your pick of audio-output device — plus 40 animations, from a spinning ASCII donut to full-canvas showpieces (fireworks, Game of Life, pipes, plasma), and a retro mode for a bare Linux console.
Press ? for the always-current cheat sheet — your language, your custom bindings — and a guided Beginner Mode walks first-timers through the app. Korean jamo work as-is (ㅂ = q), everything on screen is clickable, right-click opens a context menu, and Ctrl+- / Ctrl+= zooms the whole UI. Drag to select row ranges — in Search results just like the Library — and Ctrl+click (⌘+click on macOS) toggles single rows in and out of the selection.
● Streaming with its reasons
YuTuTui!'s streaming plans a set — a core, a bridge, a discovery — and keeps the music flowing as the queue runs dry. Press w and it shows its work, in plain language.
● Internet radio · Alt+Shift+R
Alt+Shift+R flips the whole app into an internet-radio tuner — proper live broadcasts, pinned to LIVE. And when a song grabs you, one key tells you what it is.
i — Gemini reads the live stream and names the song, right on the player.f favorites the identified track; g hands it to DJ Gem for more like it.● Retro mode · CP437
One toggle (Settings → Graphics) makes every frame CP437-safe — exactly what a bare Linux console can draw. Great over a crusty SSH session, too.
Ctrl+Alt+F3, log in, ytt.debian login: ochi Password: $ ytt ╔══════════════[ YuTuTui! · Player ]══════════════╗ ║ ║ ║ ♪ Christmas Song - back number ║ ║ [██████████████░░░░░░░░░░░] 3:12 / 5:42 ║ ║ >playing vol 80% eq:Bass x:x r:x ║ ║ ║ ║ ░░▒▒▓▓▓▓▓▓▓▓▓▓▓▓▒▒░░ ║ ║ ▒▒▓▓████████████▓▓▒▒ ║ ║ ▓▓██▒▒░░♪ ♪░░▒▒██▓▓ ║ ║ ▓▓██░░ ♪♪♪♪ ░░██▓▓ ║ ║ ▒▒▓▓████████████▓▓▒▒ ║ ║ ░░▒▒▓▓▓▓▓▓▓▓▓▓▓▓▒▒░░ ║ ║ ║ ║ [?] keys [s] search [c] queue [q] back ║ ╚════════════════════════════════════════════════╝
● Leaving Spotify?
Liked songs, playlists, the lot — matched track by track, written to YouTube Music or into local playlists, with likes kept in order.
resume continues where it stopped.ytt auth spotify --client-id <your-app> # one time, PKCE — no secretytt transfer import liked --to likesytt transfer resume sp2yt-1751443200-a3f1ytt transfer backup --dir ~/music-backup --csv # every YTM playlist → JSON + CSV● Last.fm · ListenBrainz
Now Playing as the song starts, the scrobble at the classic half-track-or-4-minutes mark, likes synced to Last.fm as loves. Connect in Settings → Accounts, or with ytt auth lastfm.
api_url at it.● Remote control · daemon · OS integration
Once ytt is playing — or the headless daemon is — boss it around from any shell, your media keys, Control Center or the tray. One command, one tidy line back.
ytt -r ppPlay / pauseytt -r nextSkip to the next songytt -r volume 40Set the volume outrightytt -r seek-to 90Jump to a timestampytt -r streaming onSwitch endless streaming onytt -r status --jsonNow-playing snapshot, script-readyytt -r infoOwner mode, protocol and safe capabilitiesytt -r queue-listNumbered queue (1-based)ytt -r queue-play 2Play the second queue rowytt -r settings-showCompact, non-secret settings summaryytt -r watch --jsonPlayer/queue/system events; all adds settingsytt daemon start --resumeHeadless: restore the saved queue and playytt -r play "lofi"Daemon: search and play the first hitytt daemon stopStop the daemon and reap mpvLaunching ytt twice never starts a second player — it just hands you the controls. The daemon restores queue, cursor, shuffle/repeat and streaming state, and keeps scrobbling.
Remote control is same-machine, same-OS-user IPC only — never expose its runtime directory as a LAN or HTTP remote.
The real Now Playing card: artwork, a working scrubber, even a Like button — and the same mini player rides your menu bar via yututray, shipped with the macOS build.
Media overlay with artwork and seek, plus a tray companion: left-click for the mini player, right-click for the full menu. yututray --install-startup if you want it at login.
A first-class org.mpris.MediaPlayer2 citizen: playerctl, GNOME and KDE widgets, waybar — they all just see a music player, because it is one.
ytt's mpv launches are protected by a heartbeat guardian. POSIX adds an inherited mpv fd lease, Linux also adds PDEATHSIG, and Windows instead uses Job Objects. Recognized Unix terminal/multiplexer loss and normal Windows console events fail closed. Retained ConPTY brokers and repeated Screen/Zellij nesting need the daemon or a host-side lifetime supervisor/lease.
The next track's stream URL is resolved while the current one plays, so "next" starts in a blink, not in three seconds. Gapless by default.
Scrobbles hit disk before the network. Transfers checkpoint every few tracks. Config saves are atomic. Your data assumes the worst so you don't have to.
YouTube changes weekly. ytt keeps its own current yt-dlp (SHA-256-verified), swaps it in when a track breaks, and retries — automatically. ytt doctor checks everything else.
● Two minutes to music
The package managers pull in ytt's helpers (mpv, yt-dlp, ffmpeg) for you; the direct installer and source build check for them and tell you what's missing. Then type three letters and you're listening.
brew install Ochichan/tap/yututuiHomebrew pulls in mpv, yt-dlp and ffmpeg automatically — and installs yututray, the menu-bar companion, alongside. Don't have Homebrew? Grab it at brew.sh first.
scoop bucket add extrasscoop bucket add yututui https://github.com/Ochichan/scoop-bucketscoop install yututuiUses Scoop (scoop.sh). Installs ytt plus mpv, yt-dlp, ffmpeg — and the YuTuTray! mini player, which stays out of your way until you want it.
nix run github:Ochichan/Yututui yay -S yututui-bin curl -fsSL https://raw.githubusercontent.com/Ochichan/Yututui/main/install.sh | bashThe curl one-liner verifies the checksum and adds ytt to your PATH. It installs only ytt — run ytt doctor afterwards to check the helpers.
./install.sh --build powershell -ExecutionPolicy Bypass -File .\install.ps1 --buildClone the repo first. Building takes a few minutes — a great excuse to make coffee.
Something off? Run ytt doctor — it checks mpv, yt-dlp and ffmpeg and tells you exactly what to fix. No YouTube account needed; public tracks play anonymously, and your own account is one cookies.txt away if you want it.