Introducing Odio, a universal remote for Linux multimedia, with Home Assistant integration

Hi everyone,

I just released the first official versions of Odio and wanted to share it here.

Why

I run several Linux machines for multimedia (Nas to manage multimedia library and snapcast server), Raspberry Pis with Pulseaudio/Pipewire server, MPD, Snacpast…, HTPC with Kodi and Firefox kiosks for streaming). I got tired of relying on the SSH integration or KDE Connect to manage them. Neither gives you proper media control, service lifecycle, or per-app volume inside HA. So I built Odio.

What is Odio?

Odio (go-odio-api) is a lightweight Go daemon that turns any Linux machine into a controllable multimedia hub via REST API. Think of it as a universal remote for your Linux user session, no SSH needed.

It exposes four backends over D-Bus:

  • MPRIS: Auto-discovers all players (Spotify, VLC, Firefox, MPD, Kodi…) in real time. Full playback control, metadata, shuffle, loop.
  • PulseAudio / PipeWire: Global and per-client volume & mute.
  • systemd: Whitelist-based user service management (start/stop/restart/enable/disable). System units monitor only. Nothing managed unless explicitly listed.
  • Power: Reboot / power-off via login1 (disabled by default).

It also ships with a built-in responsive web UI at /ui and an installable PWA for managing multiple instances from your phone: odio-pwa.vercel.app

Pre-built deb/rpm packages for amd64, arm64, armv7hf, armhf and Docker multi-arch image available on github. Tested on Raspberry B and B+ and several x86_64 setups (Fedora 43, Debian 13, Raspbian 13, OpenMediaVault 8).

go-odio-api v0.6.0: GitHub - b0bbywan/go-odio-api: Unleash the power of Linux multimedia. Transform any Linux system into a smart, controllable multimedia hub via simple REST API.

Home Assistant integration: odio-ha

odio-ha (0.4.1) is the companion custom integration, installable via HACS as a custom repository.

Discovery & setup

Your Linux machine can be auto-discovered via Zeroconf (mDNS) . Everything groups under a single “Odio Remote (hostname)” device. Backends are configured server-side, HA discovers them automatically via the API.

Entities

  • media_player.odio_remote_[hostname]: Main hub. Global PulseAudio/PipeWire volume & mute. State: playing / idle / off.
  • media_player per mapped systemd service (e.g. mpd.service): Start/stop + volume/mute via Pulse/PipeWire.
  • media_player per remote tunnel client: Volume/mute for PipeWire tunnel clients from other hosts.
  • button: Power off / reboot (if power backend is enabled).
  • switch per user service: Direct start/stop toggle.
  • binary_sensor: API connectivity status (diagnostic).

Entity mapping: the key feature

You can map any Odio entity to an existing HA media_player via the configuration/option flow. For example:

  • Map mpd.servicemedia_player.music_player_daemon
  • Map a PipeWire tunnel client → media_player.kodi_htpc

When mapped, the Odio entity combines start/stop control via systemd, independent volume/mute via PulseAudio/PipeWire, and all native features of the mapped player: play/pause/next/previous/seek/shuffle/repeat/source selection/album art/metadata, everything.

Odio augments your existing players with Linux-level audio control and service management, without replacing their core playback features.

odio-ha 0.4.1: GitHub - b0bbywan/odio-ha: HomeAssistant Integration for Odio

Roadmap

  • SSE support for real-time push updates (instead of polling)
  • MPRIS player entities in HA
  • Bluetooth backend: turn your Linux box into a fully API-controllable BT speaker
  • Wayland remote control
  • Authentication

This is the first public release, the project is still young, so expect some rough edges and possible bugs. The default 5s polling might cause some instabilities, you can change it the option flow.
I’m actively working on it and very open to feedback. If something doesn’t work as expected or you have ideas, don’t hesitate to post here or open an issue on GitHub. I’d love to hear how you’d use it in your setup!

1 Like

This is great.

Did you know about this?

Has auth, supports MPRIS media players as entities in HA, event push instead of polling (instant updates).

Thank you for the support !

Great work! I didn’t know about it. MPRIS wasn’t in my scope at the beginning of my PoC, my first worry was pulseaudio and systemd. MPRIS was an easy bonus when I started playing with Dbus :slight_smile: It surely gave a new scope to my PoC and the urge to take it to production !

I’ve just merged the bluetooth speaker in main, soon to be released, then SSE is next in my PR !

Just released v0.7.0 of odio-api Release v0.7.0 · b0bbywan/go-odio-api · GitHub with bluetooth sink support.

I’ll add MPRIS and Bluetooth support to Odio-ha when I migrate it to SSE. It should be released in the coming weeks, I’ll make a complete new post then.

SSE has landed on go-odio-api v0.8.1 ! Release v0.8.1 · b0bbywan/go-odio-api · GitHub.
Extremely lightweight, runs on my Raspberry B+ from 2016 with less than 20Mb of RAM

odia-ha 0.5.1 already available on HACS with SSE Support. Odio-ha now reacts immediately and issues caused by polling have completely disappeared.

odio-ha 0.6.0-rc.1 in pre-release on HACS for bluetooth management entities

Binaries, deb, rpm and docker images for go-odio-api available on github