Installation — Docker Compose
import { Aside, Steps } from ‘@astrojs/starlight/components’;
Requirements
Section titled “Requirements”- Docker Engine and Docker Compose
- Bluetooth adapter on the host
- PulseAudio or PipeWire on the host
- Music Assistant on your network
The published image supports linux/amd64, linux/arm64, and linux/arm/v7.
Quick start
Section titled “Quick start”-
Pair the speaker on the host first
Terminal window bluetoothctlscan onpair AA:BB:CC:DD:EE:FFtrust AA:BB:CC:DD:EE:FFconnect AA:BB:CC:DD:EE:FFexit -
Create
.envAUDIO_UID=1000TZ=Europe/LondonWEB_PORT=8080BASE_LISTEN_PORT=8928 -
Create
docker-compose.ymlservices:sendspin-client:image: ghcr.io/trudenboy/sendspin-bt-bridge:latestcontainer_name: sendspin-clientrestart: unless-stoppednetwork_mode: hostvolumes:- /var/run/dbus:/var/run/dbus- /run/user/${AUDIO_UID:-1000}/pulse:/run/user/${AUDIO_UID:-1000}/pulse- /run/user/${AUDIO_UID:-1000}/pipewire-0:/run/user/${AUDIO_UID:-1000}/pipewire-0- /etc/docker/Sendspin:/configenvironment:- SENDSPIN_SERVER=auto- TZ=${TZ:-UTC}- WEB_PORT=${WEB_PORT:-8080}- BASE_LISTEN_PORT=${BASE_LISTEN_PORT:-8928}- CONFIG_DIR=/config- PULSE_SERVER=unix:/run/user/${AUDIO_UID:-1000}/pulse/native- XDG_RUNTIME_DIR=/run/user/${AUDIO_UID:-1000}devices:- /dev/bus/usb:/dev/bus/usbcap_add:- NET_ADMIN- NET_RAW -
Start the container
Terminal window mkdir -p /etc/docker/Sendspindocker compose up -d -
Open the web UI
http://<host-ip>:<WEB_PORT>
Port planning
Section titled “Port planning”WEB_PORTcontrols the direct web UI/API listener in Docker mode.BASE_LISTEN_PORTis the default Sendspin listener base for devices that do not definelisten_portexplicitly.- Each device without a manual port uses
BASE_LISTEN_PORT + device_index. - Advanced setups can assign a per-device
listen_portandlisten_hostin the web UI or/config/config.jsonafter the first start.
Example device block in /config/config.json:
{ "mac": "11:22:33:44:55:66", "player_name": "Kitchen Speaker", "listen_port": 8935, "listen_host": "192.168.1.50"}listen_host only changes the advertised host/IP shown for the player; it does not change the bind address inside the container.
Multiple bridge containers on one host
Section titled “Multiple bridge containers on one host”If you run more than one bridge container on the same machine:
- give each container a unique
WEB_PORT - give each container a unique
BASE_LISTEN_PORT - do not configure the same Bluetooth speaker in two running containers
Network and capabilities
Section titled “Network and capabilities”network_mode: host is required for:
- mDNS discovery when
SENDSPIN_SERVER=auto - access to the host Bluetooth stack through D-Bus
Required capabilities:
| Capability | Purpose |
|---|---|
NET_ADMIN | Bluetooth adapter control |
NET_RAW | Raw Bluetooth/HCI socket access |
Verify the container
Section titled “Verify the container”docker logs -f sendspin-clientcurl -s http://localhost:${WEB_PORT:-8080}/api/preflight | python3 -m json.toolApplying configuration changes
Section titled “Applying configuration changes”Changes to devices, adapters, WEB_PORT, BASE_LISTEN_PORT, and Music Assistant connection settings require a container restart.