Multi-room (Snapcast)
Snapcast provides perfectly synchronized audio playback across multiple rooms. odio nodes run as Snapcast clients — you need a Snapserver running elsewhere (typically a NAS).
How it works
Section titled “How it works”Snapcast has two components:
- Snapserver runs on your NAS or a dedicated machine. It receives audio from multiple sources (MPD, Spotify, AirPlay, PipeWire) and distributes them as synchronized streams.
- Snapclient runs on each odio node. It receives a stream from the Snapserver and plays it back in perfect sync with all other clients.
The heavy work (mixing, source management) is on the server. Clients are lightweight — even old Raspberry Pi B+ boards work perfectly.
Snapserver setup
Section titled “Snapserver setup”Install Snapserver on your NAS. Debian 13 ships Snapcast 0.31+ natively:
sudo apt install snapserverNote: Snapserver >= 0.31 is required for AddStream/RemoveStream support. On Debian 12, install from GitHub releases.
Install Snapweb for the web UI:
wget https://github.com/snapcast/snapweb/releases/download/v0.9.3/snapweb_0.9.3-1_all.debsudo dpkg -i snapweb_0.9.3-1_all.debConfigure /etc/snapserver.conf:
[http]enabled = truebind_to_address = 0.0.0.0doc_root = /usr/share/snapweb
[tcp]enabled = truebind_to_address = 0.0.0.0MPD stream
Section titled “MPD stream”Add a FIFO output to your NAS MPD config (/etc/mpd.conf):
audio_output { type "fifo" name "SnapMPD" path "/tmp/mpdfifo" format "48000:16:2" mixer_type "software"}Then add the stream source in /etc/snapserver.conf:
[stream]source = pipe:///tmp/mpdfifo?name=MPD&devicename=SnapMPDSpotify stream (Librespot)
Section titled “Spotify stream (Librespot)”Install Librespot from source (Debian packages are too old):
sudo apt install build-essential libasound2-devcurl https://sh.rustup.rs -sSf | shcargo install librespotsudo mv .cargo/bin/librespot /usr/local/binAdd the stream source in /etc/snapserver.conf:
[stream]source = librespot:///usr/local/bin/librespot?name=Spotify&devicename=SnapSpot&bitrate=320&volume=100&normalize=falseAirPlay stream (shairport-sync)
Section titled “AirPlay stream (shairport-sync)”Install shairport-sync on the NAS and disable the standalone service (Snapserver will manage it):
sudo apt install shairport-syncsudo systemctl disable --now shairport-syncShairport-sync is started by the _snapserver user, so you need to allow it to own the D-Bus services. Add the following to the shairport-sync D-Bus policy files:
Debian 12: /etc/dbus-1/system.d/
Debian 13: /usr/share/dbus-1/system.d/
In shairport-sync-dbus-policy.conf:
<policy user="_snapserver"> <allow own="org.gnome.ShairportSync"/></policy>In shairport-sync-mpris-policy.conf:
<policy user="_snapserver"> <allow own="org.mpris.MediaPlayer2.ShairportSync"/></policy>Restart D-Bus and add the stream source:
sudo systemctl restart dbus.service[stream]source = airplay:///usr/bin/shairport-sync?name=Airplay&devicename=SnapAir&port=5000Restart Snapserver after adding all stream sources:
sudo systemctl restart snapserverControlling rooms
Section titled “Controlling rooms”- Snapweb — web UI at
http://<server>:1780showing all clients and streams. - Snapcast app (Android) — assign streams to rooms, control per-room volume.
Each client can be assigned to a different stream: living room on Spotify, bedroom on MPD, office on AirPlay.
Integration
Section titled “Integration”Snapclient runs as a systemd user service on each odio node. It can be started/stopped from the embedded UI, the application, or Home Assistant via the service controls.
Snapcast also has its own Home Assistant integration for controlling clients and streams.
Desktop integration (PipeWire)
Section titled “Desktop integration (PipeWire)”PipeWire can automatically detect Snapcast servers on your network. With the libpipewire-module-snapcast-discover module, any audio played on a desktop or laptop (browser, media player, games, system sounds) automatically appears as a Snapcast stream — zero configuration needed.
Create ~/.config/pipewire/pipewire.conf.d/my-snapcast-discover.conf:
context.modules = [{ name = libpipewire-module-snapcast-discover args = { stream.rules = [ { matches = [ { snapcast.ip = "~.*" } ] actions = { create-stream = { node.name = "Snapcast" node.description = "Snapcast Server" } } } ] }}]Restart PipeWire:
systemctl --user restart pipewire-pulse.service pipewire.service wireplumber.serviceThe Snapserver appears as “Snapcast Server” in your audio outputs. Select it, and all your desktop audio is distributed to every room.