Skip to content

b0bbywan/odios

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

213 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

odio

odios

Turns a Raspberry Pi or any Debian-based Linux into a multi-source audio streamer.

Release License Build GitHub Sponsors All Contributors

Bluetooth AirPlay Spotify Connect UPnP / DLNA MPD Multi-room Tidal & Qobuz PulseAudio TCP

Part of the odio project β€” Full documentation.

Debian Go htmx Tailwind CSS Python Ansible Bash GitHub Actions Svelte Astro Starlight

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.

Home Assistant integration

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                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.

Components

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

Installation

Raspberry Pi (pre-built image)

The fastest way to get started on a Raspberry Pi: flash a pre-built image with Raspberry Pi Imager.

  1. Open Raspberry Pi Imager
  2. Go to Options app > Content Repository > Use custom URL
  3. Enter:
    https://github.com/b0bbywan/odios/releases/latest/download/odio.rpi-imager-manifest
    
  4. Select your image, configure hostname/SSH/WiFi/user, and flash

See image-builder/README.md for details and manual flashing options.

Any Debian/Ubuntu system (installer)

curl -fsSL https://github.com/b0bbywan/odios/releases/latest/download/install.sh | bash

The 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.

Upgrading

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-api

odio-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.

Recommended clients

Client Protocol Platform
odio-pwa odio REST API Any (browser)
MALP MPD Android
BubbleUPnP UPnP/DLNA Android / iOS

odio vs Volumio

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 ⚠️ Community plugin only
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

Related projects

  • 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

License

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.

Contributors ✨

Thanks goes to these wonderful people (emoji key):

b0bbywan
b0bbywan

πŸ› πŸ“ πŸ’» πŸ–‹ πŸ”£ πŸ“– 🎨 πŸ’‘ πŸ€” πŸš‡ 🚧 πŸ“¦ πŸ“† πŸ’¬ πŸ”¬ πŸ‘€ πŸ›‘οΈ πŸ”§ ⚠️ βœ…
Paolo Battino
Paolo Battino

πŸ› πŸ“– πŸ’‘ πŸ€” πŸ”¬
Frankie Bigslave
Frankie Bigslave

πŸ€” πŸ”¬ βœ…
Konrad Kollnig
Konrad Kollnig

πŸ›
Matthias Vitt
Matthias Vitt

πŸ›
andrum993
andrum993

πŸ› πŸ€”
Thomas-O
Thomas-O

πŸ€”
voterpublic
voterpublic

πŸ“–
Pleasant-Mind-7122
Pleasant-Mind-7122

πŸ› πŸ€”
ThisLeedsGuy
ThisLeedsGuy

πŸ€”
Sterkenzz
Sterkenzz

πŸ€”
2wistd
2wistd

πŸ€”
vascoguita
vascoguita

πŸš‡

This project follows the all-contributors specification. Contributions of any kind welcome!