A terminal music player for Linux. It plays audio from YouTube Music, keeps your Spotify playlists in sync, saves songs for offline listening, and shows synced lyrics and a spectrum visualizer.


m on a downloaded song. Each preset plays live as you move to it, sliders adjust speed, reverb, bass and 8D, and saved mods get their own Modded tab.playerctl, Waybar and lockscreens can control it.You need mpv and ffmpeg. cava is optional (visualizer), and so is nodejs, deno or bun, which you only need for 256 kbps audio when signed in to YouTube Music Premium.
sudo pacman -S mpv ffmpeg cava nodejs # Arch
sudo apt install mpv ffmpeg cava nodejs # Debian / Ubuntu
sudo dnf install mpv ffmpeg cava nodejs # Fedora
pipx install spoff
spoff tells you when a new release is out; pipx upgrade spoff updates it.
Download spoff-x86_64.AppImage from the releases page, make it executable and run it. It bundles Python and all of spoff's Python packages, but not mpv or ffmpeg. The first release with an AppImage will be the one after v0.1.0.
Not on Flathub yet. The manifest in packaging/flatpak builds a Flatpak that includes mpv, ffmpeg, cava and deno; see its README for the commands.
spoff isn't on the AUR yet. The PKGBUILD in this repo builds the latest PyPI release as a pacman package:
git clone https://github.com/vrdq/spoff.git
cd spoff
makepkg -si
Pacman owns this install, so update by pulling and running makepkg -si again. spoff won't try to update itself.
git clone https://github.com/vrdq/spoff.git
cd spoff
python3 -m venv .venv
source .venv/bin/activate # fish: source .venv/bin/activate.fish
pip install -e .
spoff
1 and type to search. Enter plays the highlighted song, a adds it to a playlist and l likes it. Ctrl+E switches between YouTube Music and Spotify search.i) to import it.2 for your playlists, move with j/k, and press Enter or l to open one. h goes back to the sidebar. Shift+J/Shift+K reorder songs or playlists, and S on a playlist edits its name, description and privacy.b downloads the highlighted song and B the whole playlist. Press 3 to see everything saved.4 for lyrics while a song plays.L to connect your Spotify account., for settings, the equalizer, YouTube sign-in and key bindings.Every key can be changed in Settings (,). These are the defaults.
| Key | Action |
|---|---|
1 2 3 4 5 6 |
Search, Playlists, Offline, Lyrics, Liked Songs, Modded |
h |
Focus the playlist sidebar |
Right |
Focus the song list |
j / k (or arrows) |
Move down / up |
Tab |
Switch between sidebar and song list |
f |
Find a song in the current view |
/ |
Focus the search box |
Esc |
Close a popup or leave a text box |
| Key | Action |
|---|---|
Enter |
Play the highlighted song |
Space |
Play / pause |
n / p |
Next / previous song |
Left / Right |
Seek 5 seconds back / forward |
s |
Shuffle |
r |
Cycle repeat mode |
Ctrl+R |
Song radio (similar songs) |
m |
Mod the highlighted song |
c |
Copy the song's link |
F1 / F2 / F3 |
Mute / volume down / volume up |
| Key | Action |
|---|---|
a |
Add the song to a playlist |
l |
Like / unlike |
b / B |
Download the song / the whole playlist |
i |
New playlist or import a link |
d |
Remove the song (or delete a modded song) |
D |
Delete the playlist |
R / Y / S |
Rename / copy / playlist settings |
y |
Copy the playlist's link |
Shift+J / Shift+K |
Move the song or playlist down / up |
| Key | Action |
|---|---|
e |
Equalizer |
E |
Bypass the EQ (A/B compare) |
Alt+E |
EQ settings |
v / Shift+V / C |
Visualizer style / on-off / colour |
| Key | Action |
|---|---|
Ctrl+E |
Switch search between YouTube Music and Spotify |
L |
Spotify account |
, |
Settings |
: |
Help |
u |
Check for updates |
q |
Quit |
Everything lives in ~/.local/share/spoff/:
cache/ holds downloaded songs and saved modsplaylists.json, liked_songs.json and modded_tracks.json hold your libraryconfig.json holds settings, including the EQspotify_auth.json holds your Spotify loginYour Google login stays in your browser. spoff reads it when it needs it and never writes it to disk.
Questions, bug reports and EQ presets go on the Discord server. Bugs can also go in GitHub issues.
MIT