Skip to content

odio API

go-odio-api bridges audio components — MPRIS players, PulseAudio/PipeWire, Bluetooth, systemd services, and power management — into a single REST API with real-time SSE events.

go-odio-api is part of the odio project but is a standalone project — it runs on any Linux system with a D-Bus user session, independently of the odio distribution. Written in Go, no dependencies beyond D-Bus. Cross-compiled binaries, deb/rpm packages, and multi-arch Docker images (ghcr.io/b0bbywan/go-odio-api) are available on GitHub releases, and via the odio apt repository.

Each backend maps to a Linux subsystem via D-Bus:

BackendWhat it doesDefault
MPRISAuto-discovers and controls all media playersEnabled
PulseAudioVolume, mute, outputs, per-client controlEnabled
SystemdStart/stop/restart whitelisted user servicesEnabled
BluetoothA2DP sink — pair, power, discoverable modeEnabled
PowerRemote reboot and power-offConfigurable
ZeroconfmDNS/DNS-SD auto-discovery on the LANEnabled

Disabling a backend removes all its routes from the API.

GET /server

Returns enabled backends and server metadata.

All backends emit changes as SSE events. Connect once, filter by backend or event type, and react in real time.

GET /events

The odio installer generates ~/.config/odio-api/config.yaml. You can edit it freely, but note that installer updates will overwrite it.

Each backend has its own config block — see the individual backend pages for details.

The binary ships a built-in web UI at /ui — see Embedded web UI for details.

The API has no authentication. It is designed for trusted local networks only — anyone on the network can control your node. This is a deliberate trade-off for simplicity, similar to most home audio devices.

Authentication may be added in the future if there is demand (open an issue).

That said, all endpoints validate and sanitize their inputs. And because the stack runs in an unprivileged systemd user session, the attack surface is limited to what that user can do — no root, no system-level access. go-odio-api refuses to run as root. The only system-scope systemd unit exposed is bluetooth.service, in read-only (status monitoring only).