play / control
spotuify play "imagine dragons"spotuify next # toggle · seek +15s · volume 70First match plays on the active device; the rest are small, scriptable receipts. Terminal Control →
Homebrew
brew tap planetaryescape/spotuifybrew trust --formula planetaryescape/spotuify/spotuifybrew install planetaryescape/spotuify/spotuifyLinux x86_64
curl -fsSLO https://raw.githubusercontent.com/planetaryescape/spotuify/main/install.shbash install.shWindows x64
$Version = "v<version>"$Archive = "spotuify-$Version-windows-x86_64.zip"Invoke-WebRequest "https://github.com/planetaryescape/spotuify/releases/download/$Version/$Archive" -OutFile $ArchiveExpand-Archive $Archive -DestinationPath "$env:LOCALAPPDATA\spotuify\bin" -Forceafter install and login, try these
Real terminal recipes, not feature screenshots. Paste any one of these and it just runs. Every card links to the guide it came from, so this list doubles as a map into the docs.
play / control
spotuify play "imagine dragons"spotuify next # toggle · seek +15s · volume 70First match plays on the active device; the rest are small, scriptable receipts. Terminal Control →
fuzzy pick + play
spotuify search "luther vandross" \ --type track --format ids \ | fzf | xargs spotuify play-uriA terminal picker that starts the track you choose. Recipes →
fill the queue
spotuify search "burial" \ --type track --limit 5 --format ids \ | spotuify queue add --ids -Five search hits queued through the daemon. Queue and Playlists →
playlist, previewed
spotuify playlist plan "focus coding" --format json > p.jsonspotuify resolve-tracks --from p.json --format jsonl > c.jsonlspotuify playlist create "Focus" --from c.jsonl --dry-runSee the exact write before Spotify is touched; add —yes to commit. Agents and MCP →
browse a discography
spotuify artist albums spotify:artist:36QJpDe2go2KgaRleHCDTp \ --library-onlyA full catalog with a ✓ on the albums you’ve saved. Browse Artists →
discover
spotuify artist related spotify:artist:4uLU6hMCjMI75M1A2tKUQCspotuify radio start spotify:track:... --dry-runRelated artists and seeded radio, off the librespot session. Browse Artists →
listening analytics
spotuify analytics top --kind artists --since 30dspotuify analytics rediscovery --gap 90dTop listens and forgotten favourites, answered from local SQLite. Analytics and Hooks →
status bar feed
spotuify status --format json \ | jq -r '.item.name + " - " + .item.subtitle'A now-playing string for tmux, SketchyBar, or Waybar. Terminal Control →
lyrics in the terminal
spotuify lyrics follow --lines 3Synced previous / current / next, advancing with the track. Terminal Control →
undo a write
spotuify ops log --limit 3spotuify ops undo --dry-runPlaylist and library writes land in a reversible op log. Recipes →
hand it to an agent
spotuify mcp37 MCP tools, backed by the daemon that plays the audio. Agents and MCP →
spotuify is for the part of your day where Spotify should behave like the rest of your tools. Open the TUI when you want to browse. Use commands when you already know the action. The one-command version is still there:
spotuify play "burial archangel"The daemon embeds librespot and registers as the Spotify Connect device, so it is not remote-controlling some other player: it is the player. It also keeps a metadata cache and a local search index. Everything else is a view over one Unix socket.
Ten screens: player, search, library, playlists, queue, history, devices, lyrics, diagnostics, notifications. Album art and a live spectrum rendered in the terminal. Synced lyrics. Vim-style keys. Quitting it changes nothing about the music.
spotuifyIf the TUI can do it, spotuify <command> can do it: 57 commands, output as table, json, jsonl, csv, or ids. fzf, jq, xargs, and your status bar are part of the product.
spotuify search "luther vandross" --type track --format ids \ | fzf \ | xargs spotuify play-uriTell your agent what you are in the mood for. It runs the same CLI you do: plan candidates, resolve tracks, preview the playlist, create it once you approve. Prefer a server? The built-in MCP server exposes 37 tools, backed by the daemon that plays the audio.
spotuify mcpA native SwiftUI player and menubar app on the same socket, for the moments you want a window instead of a terminal. One client among four, not the product.
Forty seconds of the whole claim, on tape: play from the shell, browse in the TUI, quit it, prove playback from a pipe, then queue five tracks through stdin.
Playback, queue, devices, and cache live in the daemon. Close the TUI mid-song; nothing skips. Reattach from any client and the state is where you left it.
spotuify status --format jsonThe local store is metadata only: SQLite rows and a Tantivy index over your library, playlists, and listening history. Search and analytics answer from disk. The audio itself streams from Spotify, same as any Connect device.
spotuify search "ambient" --source local --format jsonlspotuify analytics top --kind artists --since 30dPlaylist writes can show the exact change before touching Spotify, and playlist and library writes land in an operation log you can reverse. Useful when a script or agent made the list.
spotuify playlist create "Exile" --from candidates.jsonl --dry-runspotuify playlist create "Exile" --from candidates.jsonl --yesspotuify ops undo --dry-runBackfill local analytics from Last.fm:
spotuify analytics import lastfm --user your-lastfm-user --from 2024-01-01 --format jsonspotuify analytics import lastfm --user your-lastfm-user --from 2024-01-01 --apply --format jsonPlenty of Spotify terminal apps are built around the screen. spotuify is built around the command surface. If an action matters in the TUI, it should be reachable from spotuify <command> too.
That costs more command plumbing, but it gives us something concrete to test, script, and hand to agents. The screen is optional. The daemon and CLI are the contract.
spotuify doctor.Active and dogfooded daily: real and usable, released often, not finished. Expect the occasional rough edge while the player and sync settle. See what’s planned in the Implementation Roadmap and what shipped in the releases.