| name | cliamp-terminal-music-player |
| description | Expert guide for using cliamp, a retro terminal music player inspired by Winamp that supports local files, streaming services, and remote media servers |
| triggers | ["how do I play music in the terminal with cliamp","set up cliamp with spotify and navidrome","configure cliamp for youtube music streaming","how to use cliamp music player keybindings","integrate cliamp with plex or jellyfin","create custom radio stations in cliamp","write lua plugins for cliamp","troubleshoot cliamp audio output issues"] |
cliamp Terminal Music Player
Skill by ara.so — Devtools Skills collection.
cliamp is a retro terminal music player inspired by Winamp. It plays local files (MP3, FLAC, WAV, OGG, AAC, ALAC, Opus, WMA), streams (HTTP, HLS, Icecast), podcasts, and integrates with Spotify, YouTube Music, SoundCloud, Bilibili, NetEase Cloud Music, Navidrome, Plex, and Jellyfin. Features include a spectrum visualizer, parametric EQ, playlist management, radio browser, and Lua plugin system.
Installation
Quick Install (macOS/Linux)
curl -fsSL https://raw.githubusercontent.com/bjarneo/cliamp/HEAD/install.sh | sh
Homebrew (macOS)
brew install bjarneo/cliamp/cliamp
The Homebrew formula automatically installs all required codec libraries (FLAC, Vorbis, Ogg).
Arch Linux (AUR)
yay -S cliamp
From Source
Prerequisites:
- Go 1.25.5 or later
- Linux: ALSA development headers (
libasound2-dev on Debian/Ubuntu, alsa-lib-devel on Fedora, alsa-lib on Arch)
git clone https://github.com/bjarneo/cliamp.git
cd cliamp
make && make install
Or without Make:
go build -o cliamp .
Optional Runtime Dependencies
Install these for extended format and streaming support:
brew install ffmpeg yt-dlp
sudo apt install ffmpeg yt-dlp
sudo pacman -S ffmpeg yt-dlp
- ffmpeg: AAC, ALAC, Opus, WMA playback
- yt-dlp: YouTube, YouTube Music, SoundCloud, Bandcamp, Bilibili, NetEase Cloud Music
Quick Start
Basic Playback
cliamp ~/Music
cliamp *.mp3 *.flac
cliamp https://example.com/stream.mp3
cliamp "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
cliamp "https://soundcloud.com/artist/track"
Interactive Setup Wizard
Configure remote providers (Navidrome, Plex, Jellyfin, Spotify, YouTube Music, NetEase Cloud Music):
cliamp setup
The wizard validates connections and writes configuration to ~/.config/cliamp/config.toml.
Key Commands
Press Ctrl+K in the player to see all keybindings.
Navigation & Playback
Space / P: Play/Pause
N: Next track
Shift+N: Previous track
S: Stop
R: Open radio browser
L: Toggle lyrics view
F: Toggle fullscreen mode
Q / Ctrl+C: Quit
Volume & EQ
+ / -: Volume up/down
M: Mute/unmute
E: Toggle equalizer
- Arrow keys in EQ: Adjust frequency bands
Playlist Management
A: Add to playlist
D: Remove from playlist
C: Clear playlist
Shift+S: Shuffle playlist
Ctrl+S: Save playlist
Visualizer
V: Cycle visualizer modes (spectrum, bars, dots, etc.)
B: Toggle visualizer display
Configuration
Configuration file: ~/.config/cliamp/config.toml
Basic Configuration
[player]
volume = 80
shuffle = false
repeat = "none"
visualizer = "spectrum"
[ui]
theme = "winamp"
show_spectrum = true
show_lyrics = true
[audio]
sample_rate = 44100
buffer_size = 4096
Spotify Integration
[spotify]
enabled = true
username = "${SPOTIFY_USERNAME}"
Run cliamp setup and select Spotify to authenticate. The wizard handles OAuth flow and stores credentials securely.
Navidrome Integration
[navidrome]
enabled = true
server_url = "https://music.example.com"
username = "${NAVIDROME_USERNAME}"
password = "${NAVIDROME_PASSWORD}"
Plex Integration
[plex]
enabled = true
server_url = "https://plex.example.com:32400"
token = "${PLEX_TOKEN}"
Get your Plex token: https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/
Jellyfin Integration
[jellyfin]
enabled = true
server_url = "https://jellyfin.example.com"
api_key = "${JELLYFIN_API_KEY}"
user_id = "${JELLYFIN_USER_ID}"
YouTube Music Integration
[youtube_music]
enabled = true
cookies_from_browser = "firefox"
Extract cookies with yt-dlp:
yt-dlp --cookies-from-browser firefox --print cookies https://music.youtube.com
Custom Radio Stations
Create ~/.config/cliamp/radios.toml:
[[stations]]
name = "Soma FM Groove Salad"
url = "https://somafm.com/groovesalad130.pls"
genre = "Ambient"
[[stations]]
name = "NTS Radio 1"
url = "https://stream-relay-geo.ntslive.net/stream"
genre = "Eclectic"
[[stations]]
name = "Jazz24"
url = "https://live.wostreaming.net/direct/ppm-jazz24aac-ibc1"
genre = "Jazz"
Playlist Management
Save/Load Playlists
cliamp --save-playlist my-playlist.m3u
cliamp --playlist ~/Music/playlists/favorites.m3u
cat > my-playlist.m3u << EOF
#EXTM3U
#EXTINF:180,Artist - Song Title
/path/to/song.mp3
#EXTINF:240,Another Artist - Another Song
https://example.com/stream.mp3
EOF
cliamp --playlist my-playlist.m3u
Supported Playlist Formats
- M3U / M3U8
- PLS
- Direct URLs (one per line)
Remote Control (IPC)
cliamp supports IPC commands when running in daemon mode:
cliamp --headless ~/Music
cliamp ipc play
cliamp ipc pause
cliamp ipc next
cliamp ipc previous
cliamp ipc volume 75
cliamp ipc seek 30
cliamp ipc status
IPC in Scripts
#!/bin/bash
status=$(cliamp ipc status --json)
duration=$(echo "$status" | jq -r '.duration')
if [ "$duration" -gt 600 ]; then
cliamp ipc next
fi
Lua Plugins
cliamp supports Lua plugins for custom visualizers, audio effects, and UI extensions.
Plugin Directory Structure
~/.config/cliamp/plugins/
└── my-plugin/
├── plugin.lua
└── config.toml (optional)
Example Plugin: Custom Visualizer
~/.config/cliamp/plugins/pulse-visualizer/plugin.lua:
plugin = {
name = "Pulse Visualizer",
version = "1.0.0",
author = "Your Name",
description = "Pulsing circle visualizer"
}
function on_audio_frame(samples, sample_rate)
local sum = 0
for i, sample in ipairs(samples) do
sum = sum + math.abs(sample)
end
local avg = sum / #samples
local radius = math.floor(avg * 50)
return {
type = "circle",
x = 40,
y = 12,
radius = radius,
color = {r = 255, g = 100, b = 200}
}
end
function on_load()
print("Pulse Visualizer loaded")
end
function on_unload()
print()
Enable Plugin
Add to ~/.config/cliamp/config.toml:
[plugins]
enabled = ["pulse-visualizer"]
Plugin API Reference
Available Lua functions:
on_audio_frame(samples, sample_rate)
on_track_change(track)
on_play()
on_pause()
on_stop()
on_load()
on_unload()
draw_text(x, y, text, color)
draw_rect(x, y, width, height, color)
draw_circle(x, y, radius, color)
draw_line(x1, y1, x2, y2, color)
log(message)
get_config(key)
http_get(url)
Community Plugins
Install community plugins:
cd ~/.config/cliamp/plugins/
git clone https://github.com/bjarneo/cliamp-plugin-soap-bubbles.git soap-bubbles
Enable in config:
[plugins]
enabled = ["soap-bubbles"]
SSH Streaming
Stream audio from a remote server to your local machine:
cliamp --headless --http-server 0.0.0.0:8080 ~/Music
ssh -L 8080:localhost:8080 user@remote-server
cliamp http://localhost:8080/stream
Advanced Usage
Custom Audio Quality
cliamp --sample-rate 96000 --buffer-size 8192 ~/Music
cliamp --buffer-size 2048 ~/Music
Batch Processing with Shell Scripts
#!/bin/bash
for album_dir in ~/Music/*/; do
echo "Playing: $album_dir"
cliamp "$album_dir"
done
Integration with System Media Controls (Linux)
Enable MPRIS support to control cliamp with media keys:
[player]
mpris = true
Control with playerctl:
playerctl -p cliamp play-pause
playerctl -p cliamp next
playerctl -p cliamp previous
Now-Playing Display (Quickshell)
Example Quickshell widget configuration for displaying currently playing track:
// ~/.config/quickshell/nowplaying.qml
import Quickshell
import Quickshell.Services.Mpris
MprisPlayer {
player: "cliamp"
Text {
text: player.metadata.title + " - " + player.metadata.artist
font.pointSize: 12
}
}
Troubleshooting
No Audio Output (Silence)
On Linux with PipeWire or PulseAudio, install the ALSA bridge:
sudo pacman -S pipewire-alsa
sudo pacman -S pulseaudio-alsa
sudo apt install pipewire-alsa
sudo apt install pulseaudio-alsa
"Library not loaded" on macOS
If you downloaded pre-built binaries directly (not via Homebrew):
brew install flac libvorbis libogg
Or install via Homebrew to avoid this:
brew install bjarneo/cliamp/cliamp
YouTube/SoundCloud Not Playing
Ensure yt-dlp is installed and up-to-date:
pip install --upgrade yt-dlp
brew upgrade yt-dlp
yt-dlp --version
Spotify Authentication Failed
Re-run setup wizard:
cliamp setup
Select Spotify and follow the OAuth flow. Ensure your Spotify account is Premium (free accounts are not supported for streaming).
High CPU Usage
Reduce visualizer complexity or disable it:
[ui]
show_spectrum = false
Or use a lighter visualizer mode (press V to cycle).
Playlist Not Saving
Ensure the directory exists and is writable:
mkdir -p ~/.config/cliamp/playlists
cliamp --save-playlist ~/.config/cliamp/playlists/my-playlist.m3u
Remote Server Connection Issues
Check firewall rules and server URL:
curl -u "${NAVIDROME_USERNAME}:${NAVIDROME_PASSWORD}" \
"https://music.example.com/rest/ping.view?v=1.16.1&c=cliamp"
curl -H "X-Plex-Token: ${PLEX_TOKEN}" \
"https://plex.example.com:32400/library/sections"
curl -H "X-Emby-Token: ${JELLYFIN_API_KEY}" \
"https://jellyfin.example.com/Users/${JELLYFIN_USER_ID}"
Common Patterns
Daily Playlist Rotation
#!/bin/bash
day=$(date +%u)
cliamp --playlist ~/.config/cliamp/playlists/day-${day}.m3u
Random Album Playback
#!/bin/bash
albums=(~/Music/*/)
random_album=${albums[$RANDOM % ${#albums[@]}]}
cliamp "$random_album"
Status Bar Integration (i3/polybar)
#!/bin/bash
status=$(cliamp ipc status --json 2>/dev/null)
if [ $? -eq 0 ]; then
title=$(echo "$status" | jq -r '.title // "N/A"')
artist=$(echo "$status" | jq -r '.artist // "N/A"')
echo "♫ $artist - $title"
else
echo ""
fi
Auto-Resume Last Playlist
Add to shell profile:
alias music='cliamp --playlist ~/.config/cliamp/last-session.m3u'
trap 'cliamp ipc save-playlist ~/.config/cliamp/last-session.m3u' EXIT
This skill covers installation, configuration, CLI usage, plugin development, remote control, integrations, and troubleshooting for the cliamp terminal music player.