sendspin-cli is a headless audio player for the
Sendspin protocol. It appears on your network, a
Sendspin server finds it, and it plays synchronized audio with the rest of your group.
It runs on Linux, Apple-silicon macOS and Windows 10 1809 or later.
curl -fsSL https://raw.githubusercontent.com/Sendspin/sendspin-cpp-cli/main/scripts/get_started_linux.sh | bashIt downloads the release for your machine, verifies its checksum, asks for a player name and an output device, and starts the player as a systemd service. Every command that needs root is printed first and waits for your yes.
Prefer to read it first?
curl -fLO https://raw.githubusercontent.com/Sendspin/sendspin-cpp-cli/main/scripts/get_started_linux.sh
less get_started_linux.sh
bash get_started_linux.sh--help lists the flags, among them --yes --name <name> --output <device> for an
unattended install and --user-service to run as you and follow your desktop's PipeWire or
PulseAudio. The Linux guide
and the Raspberry Pi guide
have the full walkthrough.
Download the Apple-silicon .pkg installer or tarball from
Releases, then follow the
installation guide
and start a player from a terminal with sendspin-cli -n living-room.
The guided Windows installer needs no administrator rights:
Invoke-WebRequest https://raw.githubusercontent.com/Sendspin/sendspin-cpp-cli/main/scripts/get_started_windows.ps1 -OutFile get_started_windows.ps1
notepad get_started_windows.ps1
powershell -ExecutionPolicy Bypass -File .\get_started_windows.ps1It verifies the release, installs it for your user and starts it whenever you log on. See Getting Started on Windows for the walkthrough, including the firewall rule a server needs to reach it.
The player advertises itself on the local network and a Sendspin server finds it. Connections are encrypted, and a server must pair with the player before it can play. Print the token to paste into the server:
# Linux service, as installed above
sudo sendspin-cli pair-token --control-socket /run/sendspin-cli/control.sock
# --user-service, macOS, Windows, or a player started from your own shell
sendspin-cli pair-tokenPairing a player
covers that and the two code-based ways. --allow-unpaired lets any server on the network
play without pairing.
The service reads its options from a config file; the same options are flags when you run the player yourself:
sendspin-cli -n living-roomThe options most people need beyond a name:
# Pick a sound card -- run `sendspin-cli -l` to list what this host has
sendspin-cli -n living-room -o hw:1,0
# Prefer formats, in order -- the server uses the first one it can encode
sendspin-cli -n living-room --audio-format flac:48000:24:2,pcm:48000:24:2
# Connect out to a specific server, instead of waiting to be found
sendspin-cli -n living-room -s music.local
# Also stream this host's microphone or line-in to the server
sendspin-cli -n den --input default| Option | What it does |
|---|---|
-n, --name <name> |
The friendly name a server displays. Defaults to this host's name. |
-o, --output <device> |
Which sound card to play through. -l lists this host's devices and what they accept. |
--audio-format <codec:rate:depth:channels>[,...] |
Formats to offer first, in priority order, e.g. flac:48000:24:2,pcm:48000:24:2. Everything else the player normally offers still follows, and a server uses the first format it can encode, so it can still fall back to a later one. This sets a preference, not a restriction. |
--input <device> |
Audio to stream to the server: a microphone or line-in, e.g. default, hw:1,0, pulse, pipewire:<node> or portaudio, or coreaudio on macOS; or loopback for what this host plays (on macOS without the player's own playback, on Linux with it). -l lists them. Off unless given. See Stream a microphone or line-in and Stream what this host plays. |
--allow-unpaired |
Let a server play without pairing with this player first. Off by default. |
--fixed-volume |
Play at full volume, unmuted, and let the server set neither — for a line-out into an amplifier whose level is set there. |
--release-device |
Close the output device when a stream ends and reopen it when the next one starts, so other players can take turns on an exclusive device such as an ALSA hw: DAC. Off by default: between streams another app can take the device, and the next stream is then discarded. ALSA and PortAudio only. |
--pairing-code <8 digits> |
A fixed code a server can pair with, confirmed with sendspin-cli pair confirm. Without it the player shows a fresh 6-digit code per attempt. |
-s, --server <host[:port]> |
Connect out to a server rather than waiting to be discovered, or mdns:[<name>] to discover one over mDNS. Turns off the mDNS advertisement. |
Common local controls are available from the same host:
sendspin-cli status
sendspin-cli pause
sendspin-cli vol 40curl -fsSL https://raw.githubusercontent.com/Sendspin/sendspin-cpp-cli/main/scripts/uninstall_linux.sh | bashIt removes the service and the installed files, and keeps your config and the player's
remembered state unless you pass --purge.
The wiki is the complete end-user
reference. It covers installation, configuration, service management, local controls,
troubleshooting, and advanced usage.
Run sendspin-cli --help for the command-line reference.
Contributions, bug reports, and documentation improvements are welcome. Read
contributors.md for the development setup, test commands, project
layout, CI, and release process. Wiki pages are authored in this repository under
docs/wiki/, so documentation changes can be reviewed in a pull request.