~/audio/cliamp
A full music player that lives in your terminal. No browser tab required.
Playlists, a 10-band equalizer, 31 visualizers, synced lyrics, podcasts, remote control, and Lua plugins. Stream from Spotify, Qobuz, Tidal, YouTube Music, Plex, Jellyfin, Emby, Navidrome, Lyrion, Yandex Music — plus podcast feeds and about 58,000 internet radio stations.
Linux · macOS · Windows MIT licensed Go 1.26
$ cliamp --provider radioplays live in your browser
tty1 C L I A M P
♫Lofi
pick a station below and press play
00:00 ■ stopped live stream
EQ [Rock]
SRC [Radio] 1/14
▸─ Playlist[Shuffle: Off][Repeat: All]
$ cliamp https://radio.cliamp.stream/lofi/stream.plsspace · < >
Install
One line. Click any command to copy it.
then just run cliamp — cliamp setup walks you through streaming services and media servers. Optional: ffmpeg for AAC, ALAC, Opus and WMA, yt-dlp for YouTube, SoundCloud, Mixcloud, Bandcamp, Bilibili and NetEase. Windows builds are in Releases.
Every source, one interface
Streaming services, self-hosted libraries, local files, podcasts, and radio — all through the same playlist, EQ, visualizer, and lyrics pipeline.
What's inside
10-BAND EQ
Parametric equalizer with 14 presets — Rock, Jazz, Classical, Bass Boost, Vocal, Podcast and more — or dial in your own curve. The Custom preset survives restarts.
VISUALIZERS
31 built-in modes rendered in the terminal from live FFT data: spectrum bars, scope, wave, matrix, flame, and a true-stereo LED peak meter. v cycles, V goes full screen.
SYNCED LYRICS
Embedded LRC first, then LRCLIB and NetEase. Time-aligned lines scroll with playback, and live radio refreshes on every ICY track change. Press y.
PLAYLISTS & QUEUE
TOML playlists with live [[dir]] folder sources, M3U/M3U8/PLS import and export, cross-playlist favorites, a play-next queue you edit while the music keeps playing, and undo.
REMOTE CONTROL
Newline-delimited JSON over a local Unix socket, with full state snapshots and push events for scripts, status bars, and GUIs. Media keys via MPRIS on Linux and Now Playing on macOS. Run --daemon for headless playback.
THEMES
22 built-in color schemes that pass contrast checks — catppuccin, dracula, gruvbox, nord, tokyo-night, winamp and more — or drop a TOML file in ~/.config/cliamp/themes. Press t.
PODCASTS
Apple's top charts and 19 genre categories, or any RSS feed. Browse episodes, subscribe locally with f, and skip in 30-second jumps. No account or API key.
GAPLESS & STREAMS
Preloads the next track for seamless transitions. Plays URLs, HLS (.m3u8) and internet radio with jitter buffering and live ICY metadata, and cliamp:// links from a browser or chat.
cliamp radio
Fourteen channels we run ourselves — always on, no account. Play any of them in the player above, or pipe the URL straight into cliamp or any player of your choice.
Who's listening right now
Live connections to the cliamp radio channels, by country. Drag the globe to spin it, or hover a country for its count.
$ cliamp radio --stats --globe● live
TOP COUNTRIESLISTENERS
LISTENING HOURS · LAST 31 DAYS
Keyboard first
Everything is one keystroke away — no mouse, no menus. Vim-style j/k movement, Tab cycles the controls, and ? or Ctrl+K shows the full keymap for the screen you are on. All keybindings ↗
Extend it with Lua
Hook playback events, add commands and key bindings, scrobble, post to a status bar, or draw a visualizer — plugins drop into ~/.config/cliamp/plugins/ and run in sandboxed Lua 5.1 VMs. A crashing plugin never takes the player down.
plugins/now-playing.lua
-- write the current track for Waybar, Polybar, tmux… local p = plugin.register({ name = "now-playing", type = "hook", }) p:on("track.change", function(track) cliamp.fs.write("/tmp/cliamp-now-playing", track.artist .. " - " .. track.title) end)
track.change · playback.state · queue.change
Ten events to subscribe to: track changes, scrobbles, seeks, volume, EQ, shuffle and repeat, queue edits, start and quit.
p:bind("ctrl+n", fn) · p:command("name", fn)
Register your own key bindings and shell-invokable commands.
cliamp.http · cliamp.fs · cliamp.store · cliamp.timer
Talk to any API, write files for status bars, persist state and schedule work — inside a sandbox with declared permissions.
type = "visualizer" → p:render(bands, frame, rows, cols)