Run cliamp without a TUI. The daemon listens on the same Unix socket as the interactive player, so every cliamp <subcommand> keeps working — but nothing renders to the terminal. This is useful when you want a music player you only ever talk to over IPC: from a status bar, a script, a hotkey daemon, or a cron job.
cliamp --daemon # no TUI, IPC only
cliamp -d # short form
cliamp --daemon --auto-play --playlist Lofi # start playing on launch
cliamp --daemon ~/Music --auto-play # auto-play a directorySend SIGINT or SIGTERM to stop. Resume position is saved on graceful shutdown.
The daemon exposes the same IPC surface as the TUI. See Remote Control for the full list:
- Playback:
play,pause,toggle,stop,next,prev - Position:
seek,volume,speed - Playback modes:
shuffle,repeat,mono - Library:
load "Name",queue /path/to.mp3 - Audio:
eq <preset>,eq --band N <dB>,device <name|list> - Status:
status,status --json
UI-only commands return an error in headless mode:
theme— no UI to apply a theme tovis— no visualizer running
There is also no MPRIS / macOS NowPlaying bridge in this mode. Wire your media keys to cliamp subcommands directly (see Hyprland below).
Start cliamp once at login (e.g. via ~/.config/systemd/user/cliamp.service or your DE's autostart) and leave it running. Control it from any terminal:
cliamp toggle # play/pause from anywhere
cliamp next
cliamp volume -3A minimal systemd user unit:
[Unit]
Description=cliamp headless music player
[Service]
ExecStart=%h/.local/bin/cliamp --daemon --auto-play --playlist "Lofi"
Restart=on-failure
[Install]
WantedBy=default.targetsystemctl --user enable --now cliamp.servicePoll cliamp status --json on an interval, render whatever fields you want.
Waybar (~/.config/waybar/config):
Polybar:
[module/cliamp]
type = custom/script
exec = cliamp status --json | jq -r '.track.title // ""'
interval = 2
click-left = cliamp toggle
click-right = cliamp nextBind your media keys directly to IPC subcommands.
Hyprland (~/.config/hypr/hyprland.conf):
bind = , XF86AudioPlay, exec, cliamp toggle
bind = , XF86AudioNext, exec, cliamp next
bind = , XF86AudioPrev, exec, cliamp prev
bind = , XF86AudioRaiseVolume, exec, cliamp volume +3
bind = , XF86AudioLowerVolume, exec, cliamp volume -3sxhkd:
XF86AudioPlay
cliamp toggle
XF86AudioNext
cliamp next
# Start lofi playback at 8am on weekdays
0 8 * * 1-5 /home/me/.local/bin/cliamp --daemon --auto-play --playlist Lofi >/dev/null 2>&1 &
# Stop at 6pm
0 18 * * * pkill -TERM -f 'cliamp --daemon'Build a queue from a script:
cliamp --daemon --auto-play &
sleep 1 # let the socket bind
for f in $(find ~/Music/Albums/Daft\ Punk -name '*.flac' | sort); do
cliamp queue "$f"
doneSince the socket lives at ~/.config/cliamp/cliamp.sock and the CLI talks to it locally, anything that gets you a shell on the host (SSH, tmux session attach) lets you control playback:
ssh kitchen-pi cliamp toggle
ssh kitchen-pi cliamp status --jsonRun on a Pi or small Linux box that has no display. The daemon needs no terminal allocation, just a working ALSA/PipeWire/PulseAudio output.
cliamp --daemon --auto-play http://radio.cliamp.stream/lofi/stream- The daemon and TUI share the same Unix socket, so only one cliamp instance can run at a time per user. Starting a second instance refuses to bind.
- Lua plugins are not loaded in this version of headless mode. They depend on UI hooks that aren't wired up here.
- Auto-advance has no gapless preloading in headless mode — small inter-track gaps are expected.