YTuff is a terminal music player for local files and YouTube Music. it has a full TUI, a background playback daemon, playlists, downloads, lyrics, artwork, media controls, and local library scanning.
first of all, shoutout @Metrolist. they made the API part of the project pretty easy. i personally hate kotlin, but i love what they made out of it. all my best wishes and prayers to you guys.
fun fact: this originally started out as a SoundCloud terminal client, almost an year ago, or atleast i started planning it at that time. because the SoundCloud API said "if your application streams or uses SoundCloud data, it has to have the powered by SoundCloud logo" . well, i can't pay 15usd a month for artist pro. i'm broke. so then, i shifted to YT and well, here we are.
previously named rustplayer, because made in rust and music player, but since the name was taken, ytuff it is.
- Terminal UI for local music and YouTube Music
- Local library scanning
- YouTube Music search
- YouTube playlist, album, artist, and home/library support
- Background daemon for playback
- Queue, history, repeat, shuffle, autoplay, seeking, volume control, and sleep timer
- Playlists stored locally
- Lyrics support
- Downloads as
m4aormp3 - Artwork rendering through
wimg, Kitty graphics, Sixel, or block art - Windows and Linux login window for YouTube Music auth
- OS media controls on Windows and Linux
- Tray support on Windows
- FFmpeg backed streaming and local playback fallback
Build, packaging, release, repo layout, and development notes live in DEVELOPMENT.md.
YTuff TUI
Local library + YouTube Music + queue + artwork
Winget: winget install ytuff
Download the latest Windows installer from Releases:
ytuff-windows-x64.msiOr, if you want the portable build:
ytuff-windows-x64.zipThe portable Windows release should include:
ytuff.exe
wimg.exe
ffmpeg.exe
ffprobe.exe
WebView2Loader.dll
libgcc_s_seh-1.dll
libjpeg-8.dll
libpng16-16.dll
libsixel-1.dll
libwinpthread-1.dll
zlib1.dll
install-user.bat
install-user.ps1
README.txt
LICENSE
The MSI installs everything into Program Files\YTuff, adds that folder to PATH, and registers uninstall support.
For the portable zip, do not delete the DLL files. They are required by the bundled wimg.exe renderer.
To make the portable zip available from any terminal, run:
.\install-user.batRestart your terminal, then run:
ytuff tuiArch User Repository(AUR)
yay -S ytuff-bin
yay -S ytufflinks to the packages: https://aur.archlinux.org/packages/ytuff-bin https://aur.archlinux.org/packages/ytuff
Download the Linux tarball, extract it, and run:
./ytuff tuiInstall to your user PATH:
./install-user.shThen run:
ytuff tuiLinux builds expect system dependencies to be installed through your distro package manager.
Arch / Manjaro:
sudo pacman -S ffmpeg webkit2gtk-4.1 gtk3 alsa-libUbuntu / Debian:
sudo apt install ffmpeg libwebkit2gtk-4.1-0 libgtk-3-0 libasound2If your distro does not package libwebkit2gtk-4.1, install the closest WebKitGTK 4.1 package available for your release.
Start the TUI:
ytuff tuiSearch YouTube Music:
ytuff search "daft punk" --limit 10Play something:
ytuff play "never gonna give you up"Pause, resume, skip, or stop:
ytuff pause
ytuff resume
ytuff next
ytuff stopCheck status:
ytuff statusStop the background daemon:
ytuff shutdownYTuff supports multiple artwork renderers.
Set one manually:
Windows PowerShell:
$env:YTUFF_ART="wimg"
.\ytuff.exe tuiLinux shell:
YTUFF_ART=kitty ./ytuff tuiSupported renderer values:
wimg
kitty
sixel
blocks
off
Recommended values:
Windows: wimg
Kitty terminal: kitty
Sixel terminal: sixel
Fallback: blocks
No artwork: off
The Windows release bundles wimg.exe and its DLLs. Linux builds do not need wimg; use kitty, sixel, or blocks.
To force a specific wimg.exe path on Windows:
$env:YTUFF_WIMG="C:\path\to\wimg.exe"The packaged Windows release should not need this because wimg.exe is bundled beside ytuff.exe.
Press ? or h inside YTuff to open the built in help.
| Key | Action |
|---|---|
s |
Switch local / YouTube mode |
/ |
Search current mode |
Enter |
Play track, or open selected YouTube playlist or album |
Tab |
Accept selected YouTube live suggestion |
a |
Add selected track to queue |
c |
Clear queue |
P |
Play selected playlist or album |
Q |
Queue selected playlist or album |
Space |
Pause |
r |
Resume |
n |
Next track |
p |
Previous track |
R |
Cycle repeat off / all / one |
z |
Toggle shuffle |
Left / Right |
Seek 5 seconds |
b / f |
Seek 30 seconds |
o |
Open selected YouTube link |
i |
Preview artwork with wimg |
S |
Save the current playing song to Liked playlist |
y |
Open lyrics |
D |
Download selected track, playlist, or album |
g |
Load YouTube home |
m |
Load account playlists |
u |
Go back |
A |
Toggle autoplay |
l |
Open YouTube login window |
L |
Sign out |
+ / - |
Volume up / down |
0 |
Mute |
d |
Audio devices |
F |
Local folders |
v |
Visualizer |
j / k |
Move selection |
J / K |
Move inside queue |
M |
Minimize to tray |
q |
Quit or close overlay |
Esc |
Close overlay or cancel input |
Add a folder:
ytuff library add-path "/path/to/Music"Windows example:
ytuff library add-path "D:\Music"List folders:
ytuff library list-pathsRemove a folder by index:
ytuff library remove-path 0You can also pass scan paths when starting the app:
ytuff --path "/path/to/Music" tuiSupported local file extensions include:
mp3, flac, wav, m4a, ogg, aac, opus, wma
YTuff uses FFmpeg as a fallback for formats that the native decoder does not handle cleanly.
Guest playback works for many tracks, but YouTube can block or limit some requests. Signing in gives YTuff access to personalized home, account playlists, and more reliable playback.
Open the login window:
ytuff auth loginShow current auth state:
ytuff auth showImport a cookie file:
ytuff auth cookie-file cookies.txtImport a raw cookie header:
ytuff auth cookie-header "SID=...; SAPISID=..."Import ytmusicapi headers:
ytuff auth headers-file headers.jsonSign out from the TUI with L.
Add something to the queue:
ytuff queue add "aphex twin xtal"Show the queue:
ytuff queue showClear the queue:
ytuff queue clearCreate a playlist:
ytuff playlist create mixList playlists:
ytuff playlist listShow a playlist:
ytuff playlist show mixAdd a track:
ytuff playlist add mix "https://music.youtube.com/watch?v=lYBUbBu4W08"Import a YouTube playlist or album:
ytuff playlist import "https://music.youtube.com/playlist?list=..." --name my-playlistPlay a playlist:
ytuff playlist play mixQueue a playlist:
ytuff playlist enqueue mixDownload a playlist:
ytuff playlist download mix --format m4aShow lyrics for the current track:
ytuff lyricsUse cached lyrics only:
ytuff lyrics --cachedReturn JSON:
ytuff lyrics --jsonIn the TUI, press y to open lyrics for the current track.
Download a track as M4A:
ytuff download "https://music.youtube.com/watch?v=lYBUbBu4W08" --format m4aDownload as MP3:
ytuff download "https://music.youtube.com/watch?v=lYBUbBu4W08" --format mp3Choose an output folder:
ytuff download "https://music.youtube.com/watch?v=lYBUbBu4W08" --format mp3 --output "/path/to/output"Windows example:
ytuff download "https://music.youtube.com/watch?v=lYBUbBu4W08" --format mp3 --output "D:\Music"Enable autoplay:
ytuff autoplay onDisable autoplay:
ytuff autoplay offSet a sleep timer:
ytuff sleep 30Clear the sleep timer:
ytuff sleep --offSome commands support JSON output through the global --json flag.
ytuff --json statusytuff --json search "boards of canada" --limit 5Print the current config:
ytuff configYTuff stores config, playlist data, downloads, and cached lyrics in your OS app directories under ytuff.
Important config values include:
quality
scan_paths
autoplay
lyrics_enabled
auto_fetch_lyrics
daemon_addr
downloads_dir
youtube_cookie_header
youtube_cookie_file
youtube_auth_user
start_background_on_boot
Build, packaging, release, repo layout, and ongoing development notes live in DEVELOPMENT.md.
Use Windows Terminal and make sure Sixel support is available. Then force wimg:
$env:YTUFF_ART="wimg"
.\ytuff.exe tuiMake sure these files are beside ytuff.exe:
wimg.exe
libgcc_s_seh-1.dll
libjpeg-8.dll
libpng16-16.dll
libsixel-1.dll
libwinpthread-1.dll
zlib1.dll
Check PATH:
where.exe wimgForce the exact renderer:
$env:YTUFF_WIMG="C:\path\to\wimg.exe"For packaged releases, keep wimg.exe beside ytuff.exe.
Make sure FFmpeg is available.
Windows packaged release:
ffmpeg.exe
ffprobe.exe
Linux:
ffmpeg -version
ffprobe -versionTest a local file directly:
ffmpeg -v error -i "/path/to/song.m4a" -f null -On Windows:
.\ffmpeg.exe -v error -i "D:\Music\song.m4a" -f null -If FFmpeg prints nothing and exits, it can decode the file.
Stop the old daemon:
ytuff shutdownOn Windows:
taskkill /IM ytuff.exe /FThen start again:
ytuff tuiSearch and playback are separate paths. Search can work while the daemon or FFmpeg playback path is broken.
Check:
ytuff status
ffmpeg -versionRestart the daemon before testing again.
Try logging in:
ytuff auth loginIf needed, import headers:
ytuff auth headers-file headers.jsonYou probably forgot the wimg DLLs, WebView2Loader.dll, or the FFmpeg files. Ship the full Windows file set listed above.