Installation — Raspberry Pi
import { Aside, Steps } from ‘@astrojs/starlight/components’;
Supported models
Section titled “Supported models”| Model | Architecture | Docker platform | Status |
|---|---|---|---|
| Raspberry Pi 5 | aarch64 | linux/arm64 | ✅ Recommended |
| Raspberry Pi 4 | aarch64 | linux/arm64 | ✅ Recommended |
| Raspberry Pi 3 B+ | armv7l | linux/arm/v7 | ⚠️ Best for 1–2 speakers |
| Raspberry Pi Zero 2 W | aarch64 | linux/arm64 | ⚠️ Limited RAM |
Quick start
Section titled “Quick start”The one-liner installer is the fastest path:
curl -sSL https://raw.githubusercontent.com/trudenboy/sendspin-bt-bridge/main/scripts/rpi-install.sh | bashIt checks the host, installs Docker if needed, writes a working Compose setup, and can help with Bluetooth pairing.
After installation, the web UI is available on http://<raspberry-pi-ip>:8080 unless you changed WEB_PORT.
Manual installation
Section titled “Manual installation”-
Prepare the host
- install a current Raspberry Pi OS
- install Docker
- pair the Bluetooth speaker on the host with
bluetoothctl
-
Run the pre-flight check
Terminal window curl -sSL https://raw.githubusercontent.com/trudenboy/sendspin-bt-bridge/main/scripts/rpi-check.sh | bash -
Create a project directory
Terminal window mkdir -p ~/sendspin-bt-bridge && cd ~/sendspin-bt-bridge -
Create
.envAUDIO_UID=1000TZ=Europe/LondonWEB_PORT=8080BASE_LISTEN_PORT=8928 -
Download the current Compose file
Terminal window curl -sSL https://raw.githubusercontent.com/trudenboy/sendspin-bt-bridge/main/docker-compose.yml -o docker-compose.ymlmkdir -p configdocker compose up -d -
Open the web UI
http://<raspberry-pi-ip>:<WEB_PORT>
Port planning on Raspberry Pi
Section titled “Port planning on Raspberry Pi”WEB_PORTchanges the direct web UI/API listener on the Pi.BASE_LISTEN_PORTchanges the default Sendspin port block for speakers.- Devices without an explicit
listen_portuseBASE_LISTEN_PORT + device_index. - You can override a single device with
listen_portandlisten_hostin the web UI or/config/config.json.
Example advanced device entry:
{ "mac": "AA:BB:CC:DD:EE:FF", "player_name": "Kitchen Speaker", "listen_port": 8935, "listen_host": "192.168.1.50"}listen_host changes only the advertised host/IP for the player. It does not change the bind address inside the container.
Running more than one bridge on a Pi or LAN segment
Section titled “Running more than one bridge on a Pi or LAN segment”If you run multiple bridge containers or combine a Raspberry Pi bridge with another bridge on the same host/network namespace:
- give each bridge its own
WEB_PORT - give each bridge its own
BASE_LISTEN_PORT - do not assign the same Bluetooth speaker to two running bridges
Verify the runtime
Section titled “Verify the runtime”docker logs -f sendspin-clientcurl -s http://localhost:${WEB_PORT:-8080}/api/preflight | python3 -m json.toolUpdating
Section titled “Updating”cd ~/sendspin-bt-bridgedocker compose pulldocker compose up -dnetwork_mode: hostis required for Bluetooth control and Music Assistant auto-discovery.- Raspberry Pi OS Bookworm uses PipeWire with PulseAudio compatibility by default; the bridge works with both PipeWire and PulseAudio.
- Changes to devices, adapters,
WEB_PORT,BASE_LISTEN_PORT, and Music Assistant connection settings require a container restart.