Odio - free audiophile streamer: Flash images, full documentation, and looking for beta testers

A few months ago I introduced go-odio-api here, a Go daemon that turns any Linux machine into a controllable multimedia hub with a native HA integration. Since then, it grew into odio: a complete open source audio streamer built on top of that API, based on a setup I’ve been using for years and documented on medium.

An odio node is an AirPlay 2 receiver, a Spotify Connect device, a Bluetooth speaker, a UPnP/DLNA renderer (with Tidal and Qobuz support), a CD player with metadata, a USB media player, a Snapcast multi-room client, and a PulseAudio network sink. All running in a systemd user session on standard Debian, no root, no cloud, no account. The whole ecosystem is multiple repositories, each usable independently: the API, the installer, the HA integration, the PWA, the disc player daemon, and more. Everything is open source under MIT or BSD 2-Clause: code, CI pipelines, documentation.

I’m building this in the same spirit as the Open Home Foundation: privacy, choice, and sustainability. odio runs on a Pi B+ from 2014, and the first user feedback I got was someone recycling their Pi 1 from 2012. Free software keeping old hardware alive instead of generating e-waste.

What’s new

Flash images. odio is now available directly through Raspberry Pi Imager. Open Imager → Options → Content Repository → Use custom URL → https://beta.odio.love/odio.rpi-imager-manifest. Pick armhf or arm64, configure hostname and SSH, flash, boot. No terminal, no curl, no Ansible. Your Pi comes up with the full stack running: MPD, PulseAudio, Bluetooth, AirPlay, Spotify Connect, UPnP/DLNA, Snapcast, and the odio API with its embedded web UI.

The curl | bash installer is still there for existing Debian systems and non-Pi hardware.

Complete documentation. docs.odio.love covers installation, architecture, every feature, every use case, and the full API reference. Each component is documented independently.

Since the first post: SSE for real-time push updates (no more polling), MPRIS players as HA entities, Bluetooth speaker with commercial-like pairing, Zeroconf auto-discovery, embedded web UI at 0% idle CPU, and the odio PWA for multi-node management.

Looking for beta testers

odio is in open beta. It already has a few declared users, beside me. If you have a Raspberry Pi and a DAC (HAT or USB) collecting dust somewhere, flash the image and see what happens. Being comfortable with Linux and a terminal helps, but even pure UX feedback is valuable: what felt confusing, what worked on first try, what didn’t. Tested so far on Pi B+, Pi 3B+, and several x86-64 setups. The more setups, the better. Feel free to share your experience right here.

Music Assistant

For those of you running Music Assistant: I documented the integration paths at docs.odio.love/guides/music-assistant. AirPlay via shairport-sync and DLNA via upmpdcli are both auto-discovered by Music Assistant with zero configuration on either side. I don’t run Music Assistant myself (my NAS doesn’t have the resources), so this is based on MA’s documented capabilities and hasn’t been validated end-to-end.

The Bluetooth path interests me in particular: Music Assistant could in theory drive an odio node as a Bluetooth speaker via odio-ha’s media player entities and the HA player provider, or with ha-bluetooth-audio-manager. If someone runs both and wants to try any of these paths, I’d love the feedback.

Roadmap

The roadmap is mostly in my head for now, but it doesn’t have to stay that way. It’s already evolving based on user feedback: a user proposed web radio browsing and favourites with detailed user stories and integration questions, and that’s now on the radar. If you want to help, there are many ways beyond code: testing, docs, sharing your setup. See docs.odio.love/guides/community

Hi, don’t want to be unpolite, I don’t know why you called it “odio” but in Italian that word means “hate” and the link odio.love makes me laugh :joy: a lot.
Anyway looking into it and might try as soon as I have some spare time.

EDIT: the hate and love is the feeling I have with the current solution I am using for streaming my music.

1 Like

Interesting profile image, bring out the big guns…

Haha actually my first contributor is also Italian and had quite the same reaction. It started as a dumb play on words with “audio”, I had already set the API port 8018 to match the name, and to use speakers for the logo, and that’s what convinced me to keep it. I realized later it meant hate in Spanish (and only last week that it’s the same in Italian), so I bought the .love domain as a silly joke and counterbalance.

You can choose the hostname you want with Raspberry Imager (or with an env var with the curl | bash installer) , except for zeroconf and the built-in UI which are “branded”, every service exposed is based on the hostname, not odio. That’s also on purpose!

Let me know how it goes when you try it!

Haha well that also match the song illustrating the dashboard “Knowledge is a weapon [of mass instruction]” :smile:

Getting weird vibes…

Hello. Very nice project, but I have two questions:

  1. Is it possible to connect a Bluetooth speaker to Odio for sound output? Simultaneous streaming via Bluetooth and output through a speaker probably won’t work, but that isn’t necessary in my case (streaming via Wi-Fi).
  2. Moode, Volumio, piCorePlayer are offering an interface to configure the output device (DAC hat or usb DAC etc). Is this possible to integrate this feature to the Odio web ui? I assume most users avoid the Raspberry Pi’s onboard analog audio jack or using a raspi zero/zero2 without an audio jack.
    Best regards Jarny
1 Like

Hi Jarny,

Thanks a lot for the support ! odio still a very young project, I’m far from finished !

About DAC configuration it’s on the roadmap, but I have no idea how I’ll deal with this, as odio run in the user session without root privileges, it shouldn’t be able to write in /boot/firmware/config.txt. To be honest, I’m not sure how I’m going deal with this, but I shall find a proper solution at some point.

My feeling is that at this point, most people interested in odio are tech enthusiasts that can deal with editing /boot/firmware/config.txt, either from SSH, or directly after using Raspberry Imager. I should be more explicit about that in docs I think.

I can’t give you a proper answer yet, because I haven’t tested it. But it might work, as you long as you manage the pairing and connect from your pi from SSH (with bluetoothctl for example). That could be a feature I add in my odio-api bluetooth backend at some point.

An audio output should be created by pulse, and you should be able to choose your bluetooth speaker in the audio outputs on the dashboard. Like here

I’ll test soon and come back with documentation about what I found :slight_smile:

Yep I confirm you can use a remote bluetooth speaker from odio, here’s the doc
Bluetooth output | odio docs.

Pairing is a one time process in SSH (described in the docs), then you can do it from UI. I’ll improve UX with this if there’s demand!

So thanks a lot for the nudge to test that feature, I really like adding more docs with features I hadn’t tested yet!

Thank you b0bbywan for the instructions to connect my bluetooth speaker.
My JBL Flip works but dont reconnect automatically. Same with my mini speaker (Huawei CM510).
Next week I try to configure systemd to connect to the speakers via Odio UI.
best regards
Jarny

1 Like

Thanks a lot ! Let me know if you need help with that, and if you wanna share when you’re done, i’ll use it in the docs !