██████ ██      ██  █████  ███    ███ ██████ 
██      ██      ██ ██   ██ ████  ████ ██   ██
██      ██      ██ ███████ ██ ████ ██ ██████ 
██      ██      ██ ██   ██ ██  ██  ██ ██     
 ██████ ███████ ██ ██   ██ ██      ██ ██     
TERMINAL MUSIC PLAYER
A retro music player inspired by Winamp, built for the terminal.
Spectrum visualizer, 10-band EQ, playlists, streaming, and more.

    
$ cliamp https://radio.cliamp.stream/lofi/stream.pls
════════════════════════════════════════════════════════════════
demo.mp4
════════════════════════════════════════════════════════════════
install.sh
Direct
$ curl -fsSL https://raw.githubusercontent.com/bjarneo/cliamp/HEAD/install.sh | sh COPIED
Homebrew (macOS / Linux)
$ brew install bjarneo/cliamp/cliamp COPIED
Arch Linux (AUR)
$ yay -S cliamp COPIED
Or build from source: see the README
════════════════════════════════════════════════════════════════
features.txt
Audio Formats

MP3, WAV, FLAC, OGG, AAC, ALAC, Opus, and WMA

10-Band Equalizer

Parametric EQ with presets: Rock, Jazz, Pop, Classical, and more

Themes & Visualizers

Multiple color themes and visualizer modes to match your vibe

Playlists

TOML playlists, M3U/M3U8/PLS support, built-in playlist manager

HTTP Streaming

Play from URLs, internet radio stations, and remote M3U playlists

yt-dlp Integration

YouTube, SoundCloud, Bandcamp, and Bilibili playback via yt-dlp. Search YouTube with cliamp search "query" or SoundCloud with cliamp search-sc "query". Press f / F to search in-player

Podcasts

Pass an RSS feed URL and listen to any podcast in your terminal

Navidrome

Browse and stream your self-hosted Navidrome music library

Lyrics

Synced lyrics with auto-scroll for local & Navidrome tracks, manual scroll for streams. Press y to view

Gapless Playback

Seamless track transitions with preloaded next-track buffering

MPRIS / Media Keys

Linux desktop integration. Control playback with hardware media keys and playerctl

Audio Quality

Configurable sample rate (22kHz–192kHz), buffer size, and resample quality

Live Radio Metadata

ICY/Shoutcast metadata. See the current song title on internet radio streams

Embedded Tag Reading

ID3v2, Vorbis comments, and MP4 atoms. Reads artist, album, genre, year, and track number

CLI Flags

Override volume, shuffle, repeat, mono, theme, EQ, sample rate, and more per-session

Self-Update

Run --upgrade to update to the latest release directly from your terminal

Spotify

Stream your Spotify Premium library. Playlists, EQ, visualizer, and all effects apply. OAuth login with cached credentials

YouTube Music

Browse and play your YouTube Music playlists via OAuth. Automatic music/non-music classification with cached login

Plex

Stream music from your Plex Media Server. Browse albums and play directly. No extra software required

Jellyfin

Stream music from your Jellyfin server. Browse artists, albums, and tracks with buffered gapless playback

════════════════════════════════════════════════════════════════
themes.toml

17 built-in themes. Press t to switch, or use --theme "name" from the CLI. Drop a .toml file in ~/.config/cliamp/themes/ to add your own.

Ayu Mirage Dark
██ ██ ██ ██ ██ ██
Catppuccin
██ ██ ██ ██ ██ ██
Catppuccin Latte
██ ██ ██ ██ ██ ██
Ethereal
██ ██ ██ ██ ██ ██
Everforest
██ ██ ██ ██ ██ ██
Flexoki Light
██ ██ ██ ██ ██ ██
Gruvbox
██ ██ ██ ██ ██ ██
Hackerman
██ ██ ██ ██ ██ ██
Kanagawa
██ ██ ██ ██ ██ ██
Matte Black
██ ██ ██ ██ ██ ██
Miasma
██ ██ ██ ██ ██ ██
Nord
██ ██ ██ ██ ██ ██
Osaka Jade
██ ██ ██ ██ ██ ██
Ristretto
██ ██ ██ ██ ██ ██
Rosé Pine
██ ██ ██ ██ ██ ██
Tokyo Night
██ ██ ██ ██ ██ ██
Vantablack
██ ██ ██ ██ ██ ██
Each pair represents: accent, bright foreground, foreground, green, yellow, red
════════════════════════════════════════════════════════════════
--help

Override any config option for a single session. Flags can appear before, after, or between file arguments.

--volume <dB>Volume [-30, +6]
--shuffleEnable shuffle
--repeat <mode>off, all, or one
--mono / --no-monoMono downmix
--auto-playStart playback immediately
--theme <name>UI theme
--eq-preset <name>EQ preset
--sample-rate <Hz>Output sample rate
--buffer-ms <ms>Speaker buffer (50–500)
--resample-quality <n>Resample quality (1–4)
--compactCap width at 80 columns
--bit-depth <n>PCM bit depth: 16 or 32
--playlist <name>Load a local TOML playlist and start playing
--provider <name>Default provider (radio, navidrome, plex, jellyfin, spotify, ytmusic)
--visualizer <mode>Visualizer mode (Bars, Wave, Matrix, Retro, etc.)
--upgradeUpdate to latest release
--help / --versionHelp & version info
════════════════════════════════════════════════════════════════
remote-control

Control a running cliamp instance from another terminal via Unix socket IPC.

cliamp play / pause / togglePlayback control
cliamp stopStop playback
cliamp next / prevTrack navigation
cliamp status [--json]Current state
cliamp volume <dB>Set volume in dB
cliamp seek <seconds>Relative seek (positive or negative)
cliamp load "Name"Load a playlist
cliamp queue /path/to/fileQueue a track
cliamp shuffle [on|off|toggle]Toggle or set shuffle
cliamp repeat [off|all|one|cycle]Set or cycle repeat mode
cliamp mono [on|off|toggle]Toggle or set mono output
cliamp speed <ratio>Playback speed (0.25–2.0)
cliamp eq <preset>Set EQ preset (Flat, Rock, Pop, Jazz, …)
cliamp eq --band <0-9> <dB>Set individual EQ band
cliamp device listList audio output devices
cliamp device <name>Switch audio output device
cliamp theme <name|list>Set or list themes
cliamp vis <name|next|list>Set or cycle visualizer
════════════════════════════════════════════════════════════════
keybindings.conf
SpacePlay / Pause
sStop
> .Next track
< ,Previous track
← →Seek −/+5s
Shift+← Shift+→Seek −/+large step (default 30s)
+ / −Volume up / down
] [Speed up / down (±0.25x)
mToggle mono
TabFocus: Playlist / EQ
j kScroll / adjust EQ (wraps around)
PgUp PgDn / Ctrl+U Ctrl+DScroll playlist/browser by page
Home End / g GGo to top/end of playlist/browser
h lEQ band left / right
EnterPlay selected
eCycle EQ preset
tChoose theme
vCycle visualizer
VFull-screen visualizer
/Search playlist
fFind on YouTube (queue)
Ctrl+FFind on SoundCloud (queue)
FSpotify search + add to playlist
uLoad URL (stream/playlist)
yShow lyrics
Ctrl+JJump to time
Ctrl+XExpand playlist
oOpen file browser
aQueue (play next)
AQueue manager
pPlaylist manager
iTrack info / metadata
rRepeat: Off / All / One
zToggle shuffle
NNavidrome browser
LBrowse local playlists
ROpen radio provider
SOpen Spotify provider
POpen Plex provider
JOpen Jellyfin provider
YOpen YouTube provider
Ctrl+SSave to ~/Music
Shift+↑ Shift+↓Move track up / down
Esc / bBack to provider
Ctrl+KShow keymap
qQuit
════════════════════════════════════════════════════════════════
plugins.lua

Lua 5.1 plugin system. Hook into playback events, add custom visualizers, or push data to external services. Each plugin runs in an isolated sandbox. A crash in one cannot affect others or the player. Drop a .lua file in ~/.config/cliamp/plugins/ and restart.

Now Playing (status bar)
-- ~/.config/cliamp/plugins/now-playing.lua
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)

p:on("app.quit", function()
    cliamp.fs.remove("/tmp/cliamp-now-playing")
end)
Webhook
-- ~/.config/cliamp/plugins/webhook.lua
local p = plugin.register({
    name = "webhook",
    type = "hook",
})

local url = p:config("url")

p:on("track.change", function(track)
    if not url then return end
    cliamp.http.post(url, {
        json = { title = track.title, artist = track.artist }
    })
end)
Custom Visualizer
-- ~/.config/cliamp/plugins/simple-bars.lua
local p = plugin.register({
    name = "simple-bars",
    type = "visualizer",
})

-- Called ~20 FPS. bands: 10 values (0.0-1.0)
function p:render(bands, frame)
    local lines = {}
    for row = 5, 1, -1 do
        local line = ""
        for i = 1, 10 do
            if bands[i] > (row - 1) / 5 then
                line = line .. "██████ "
            else
                line = line .. "       "
            end
        end
        table.insert(lines, line)
    end
    return table.concat(lines, "\n")
end
Events
track.changeNew track starts playing
track.scrobbleTrack played ≥50% or ≥4 min
playback.statePlay, pause, stop, seek, volume change
app.startAfter all plugins loaded
app.quitBefore shutdown
player

Read-only playback state: state(), position(), volume(), shuffle(), eq_bands(), and more

track

Current track metadata: title(), artist(), album(), genre(), duration_secs()

http

HTTP client with get() and post(). JSON, form body, custom headers. 5s timeout

fs

Sandboxed file I/O: write(), read(), append(), remove(), exists()

json

encode() and decode() for JSON serialization

crypto

md5(), sha256(), hmac_sha256() for hashing and signing

notify

Desktop notifications via notify-send. Works with mako, dunst, etc.

timer

Schedule callbacks: after(), every(), cancel()

log

info(), warn(), error(), debug()~/.config/cliamp/plugins.log

config

Read per-plugin values from [plugins.name] in config.toml via p:config(key)

Community Plugins
Last.fm scrobbling
════════════════════════════════════════════════════════════════
radio.stats
LIVE
-
listening now
-
total sessions
-
listen hours
Daily Activity
Listeners Around the World
Top Countries
════════════════════════════════════════════════════════════════