Upgrade
Upgrading an existing odio installation means re-running the installer. The installer is fully idempotent, safe to re-run at any time to update or repair.
curl -fsSL https://beta.odio.love/install | bashWhen a configuration file has been modified, the installer creates a <config>.bak backup before applying changes. If the file ends up identical, no backup is kept. This applies to /etc/bluetooth/main.conf, ~/.config/mpd/mpd.conf, ~/.config/mpd-discplayer/config.yaml, ~/.config/odio-api/config.yaml, ~/.config/pipewire/pipewire-pulse.conf, ~/.config/shairport-sync/shairport-sync.conf, ~/.config/spotifyd/spotifyd.conf, and ~/.config/upmpdcli/upmpdcli.conf.
Pin a specific version
Section titled “Pin a specific version”To install a specific release or pre-release, set the ODIOS_VERSION variable to an existing release tag:
curl -fsSL https://github.com/b0bbywan/odios/releases/download/2026.4.1rc1/install.sh | ODIOS_VERSION=2026.4.1rc1 bashSkip what you don’t need
Section titled “Skip what you don’t need”Not every release is worth applying. Upgrades are skippable, you can wait for the next one that brings something you actually care about. The version check described below tells you what’s available, not what you have to run.
Detect available upgrades
Section titled “Detect available upgrades”Since 2026.4.1rc1, each node shows its own update status in the MOTD (message of the day) when you SSH in:

The notice lists the overall version bump and the roles whose version actually changed between the installed state and the latest release. If nothing changed, the notice is absent.
To re-run the check anytime without waiting for the next login, use the odio-check-upgrade command:
odio@raspodio:~ $ odio-check-upgradeUpgrades available: dev-8e978895 → 2026.4.1rc1Three files back this check:
-
Local state —
~/.cache/odio/state.json, written by the installer after each successful run. Tracks the odios version, install mode, and per-role versions:{"install_mode": "live","odios": "2026.4.1rc1","roles": {"bluetooth": "2026.4.0rc5","branding": "2026.4.1rc1","common": "2026.4.0rc6","mpd": "2026.4.0rc7","mpd_discplayer": "2026.4.0rc7","odio_api": "2026.4.0rc7","pulseaudio": "2026.4.0rc7","shairport_sync": "2026.4.1rc1","snapclient": "2026.4.0rc5","spotifyd": "2026.4.0rc7","upmpdcli": "2026.4.1rc1"}} -
Published manifest — odio.love/manifest.json, generated by CI on each release with the same shape. Each role version is the last odios release that touched that role.
-
Check result —
~/.cache/odio/upgrades.json, written byodio-check-upgradeafter comparing state and manifest. This is what the MOTD reads from:{"current": "dev-8e978895","latest": "2026.4.1rc1","upgrade_available": true,"roles": [],"checked_at": "2026-04-21T19:34:13Z"}
What’s next
Section titled “What’s next”A more user-friendly upgrade flow is being designed: automatic detection in the odio application and targeted role upgrades instead of a full installer re-run. See RFC: Targeted upgrade system for odio for the design and to join the discussion.