Turns a Raspberry Pi or any Debian-based Linux into a multi-source audio streamer.
Part of the odio project β Full documentation.
Open-source audiophile distribution for Debian/Ubuntu and Raspberry Pi with native Home Assistant integration.
odios turns a β¬35 Raspberry Pi into what commercial streamers sell for β¬300β500: Bluetooth A2DP (in & out), AirPlay, Snapcast multi-room, UPnP/DLNA, CD playback with metadata β all in one box, controlled from a web app, no account or subscription required. Other PCs running PulseAudio or PipeWire can also stream directly to it over the network, making it a true whole-home audio sink.
Built on modern foundations: everything runs as unprivileged systemd user services (no root daemons), orchestrated through a unified REST API written in Go. Battle-tested on a Raspberry Pi B+ (armv6l) for over 6 years without reinstall.
Full Home Assistant integration included β odios nodes appear as native media players in your HA dashboard.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β odio-pwa (remote) β β manage multiple nodes from any device
ββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ
β HTTP
ββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββ
β go-odio-api β β unified REST API + embedded UI
β systemd Β· PulseAudio Β· MPRIS Β· Bluetooth β
β β
ββββββββ¬βββββββββββ¬βββββββββββ¬βββββββββββ¬ββββββββββββββ
β β β β
PulseAudio MPD Shairport Snapcast
(network) Sync client
Bluetooth MPD (AirPlay) upmpdcli
(A2DP) Disc (UPnP/DLNA)
Player
Most service run as systemd user services β no root daemons, full per-user isolation.
| Component | Role |
|---|---|
| go-odio-api | REST API + embedded UI, bridges systemd / PulseAudio / MPRIS / D-Bus / Bluetooth Speaker |
| go-mpd-discplayer | Automatic CD/USB playback with metadata via MPD |
| PulseAudio | Central audio server, routes all sources to the DAC output β other PCs running PulseAudio or PipeWire can stream to it over the network via TCP/Zeroconf (wired connections only) |
| MPD | Music Player Daemon (network, CD/USB) |
| mpDris2 (fork) | MPRIS bridge for MPD with CD cover art support |
| myMPD | Web UI for MPD (default port 8080) |
| Shairport Sync | AirPlay receiver |
| Spotifyd | Spotify Connect receiver |
| Snapcast | Multi-room audio client |
| upmpdcli | UPnP/DLNA renderer |
| Bluetooth | A2DP sink with automatic pairing, plus audio output to Bluetooth speakers/headphones |
The fastest way to get started on a Raspberry Pi: flash a pre-built image with Raspberry Pi Imager.
- Open Raspberry Pi Imager
- Go to Options app > Content Repository > Use custom URL
- Enter:
https://github.com/b0bbywan/odios/releases/latest/download/odio.rpi-imager-manifest - Select your image, configure hostname/SSH/WiFi/user, and flash
See image-builder/README.md for details and manual flashing options.
curl -fsSL https://github.com/b0bbywan/odios/releases/latest/download/install.sh | bashThe installer works on both fresh and existing systems (idempotent, safe to re-run). It prompts for a target user β if the user doesn't exist it is created automatically. Installing for an existing user is supported: config files are backed up before any modification.
See installer/README.md for full installation options, environment variables, and testing.
Each release installs /usr/local/bin/odio-upgrade with two subcommands: check runs daily via a systemd user timer and refreshes /var/cache/odio/upgrades.json; apply performs the upgrade.
odio-upgrade # alias of `apply` β upgrade to the latest reported version
odio-upgrade apply --version 2026.5.0 # target a specific version
odio-upgrade apply --reinstall # re-run every role in full (repair a broken install)
odio-upgrade apply --progress # emit structured progress events for odio-apiodio-upgrade reads /var/lib/odio/state.json (or rebuilds from dpkg as a last resort) to preserve the feature selection and role opt-outs across upgrades. Run odio-upgrade --dry-run --force to see what would be invoked without running it. Use --reinstall to force every role through a full first-install pass (bypassing the smart-upgrade skips) when an install needs repairing. Use --progress to emit structured ODIO_PROGRESS JSON lines (one per role and phase) to stdout for odio-api to display, without altering the normal output.
| Client | Protocol | Platform |
|---|---|---|
| odio-pwa | odio REST API | Any (browser) |
| MALP | MPD | Android |
| BubbleUPnP | UPnP/DLNA | Android / iOS |
| odio | Volumio | |
|---|---|---|
| License | 100% open source | Partially closed source |
| Price | Free | Freemium β Premium at β¬60/year |
| Account required | No | Yes |
| Cloud dependency | None | Yes (account, Premium, plugins) |
| Minimum hardware | Raspberry Pi B (armv6l, 2012) | Raspberry Pi 3 |
| Music library management | β Via myMPD (web UI) | β Built-in library browser |
| Bluetooth A2DP | β Included | π° Premium only |
| Bluetooth output (speakers/headphones) | β Included | |
| AirPlay | β Included | β Free plugin |
| Spotify Connect | β Included | β Free plugin |
| Qobuz | β Included (via upmpdcli) | π° Premium only |
| Tidal / Tidal Connect | β Included (via upmpdcli) | π° Premium only |
| UPnP/DLNA | β Included | β Included |
| Web radios | β Included (upmpdcli + myMPD) | β Included |
| Multi-room | β Included (Snapcast) | π° Premium only |
| CD playback | β Included with metadata | π° Premium only |
| Network audio sink | β PulseAudio/PipeWire TCP (wired) | β Not supported |
| Home Assistant | Native integration | Unofficial community plugin |
| Voice assistant / AI | Via Home Assistant | π° CORRD (Premium) |
| Embedded UI | Lightweight HTMX/Tailwind | Node.js/React |
| Multi-node remote | Svelte PWA (install from browser, no store) | Native mobile app (iOS/Android) |
| Architecture | User session, PulseAudio/PipeWire, Golang | System session, ALSA, Node.js |
| System philosophy | Linux-native modular stack | Appliance-style distribution |
| Debian base | Trixie (stable) | Bookworm (oldstable) |
| Installation | Image flash (Pi) or curl | bash (any Debian/Ubuntu) |
Image flash |
| Upgrade | odio-upgrade or reflash |
OTA updates / Reflash between major versions |
- odio-pwa β Progressive Web App to control multiple odios nodes (live)
- odio-ha β Full Home Assistant integration: odios nodes appear as native HA media players and can be mapped to official integrations to inherit their full capabilities
- go-odio-api β REST API and embedded UI
- go-mpd-discplayer β CD/USB player daemon
This project is licensed under the BSD 2-Clause License β see LICENSE.
The installer distribution (odio-*.tar.gz) includes ansible-core, which is licensed under the GNU General Public License v3.0. A copy of that license is included in the archive under licenses/ANSIBLE-LICENSE-GPLv3.
The odios playbooks and scripts are independent works that invoke ansible-core as an external tool and are not subject to the GPL.
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!