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_playerper mapped systemd service (e.g.mpd.service): Start/stop + volume/mute via Pulse/PipeWire.media_playerper remote tunnel client: Volume/mute for PipeWire tunnel clients from other hosts.button: Power off / reboot (if power backend is enabled).switchper 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.service→media_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!

