Play Roon to AirPlay speakers and Roon endpoints that live in a different IP subnet — typically across a site-to-site VPN between two homes, two offices, or a home and a holiday flat.
Out of the box, Roon's AirPlay and endpoint discovery only work on a flat local network. The moment your Roon Core sits at site B and the speakers (HomePod, Apple TV, AirPlay-capable Mac, Roon Bridge on a Raspberry Pi, …) are at site A behind a routed VPN, the speakers either don't show up at all in Roon, or they show up but playback silently fails. airoon fixes that.
You run a small daemon on a router (or any always-on Linux box) at each site. The one near your speakers discovers them; the one near your Roon Core re-publishes them on the Core's network as if they were local. The audio stream is proxied transparently between the two sides through a single TCP connection over your existing VPN. To Roon Core, every remote speaker looks like a speaker in the next room.
Working end-to-end across a UniFi Site Magic VPN with Apple TV and HomePod mini on the speaker side, and Roon Core 2.x on the other. Roon Bridge / Roon Ready endpoints are also discoverable through the same daemon.
make build
Cross-compiles inside Docker — no Go toolchain on the host required.
Produces build/airoon-linux-arm64 plus amd64 and darwin variants.
See deploy/udm/README.md for the UniFi UDM
deployment flow (systemd unit, on_boot.d hook, per-side config
templates). On a non-UDM Linux host the same systemd unit applies
with paths adjusted.
Roon assumes a single broadcast domain. Its AirPlay stack picks the
wrong IP address when an mDNS reflector is in the middle, and its
Roon-endpoint discovery on UDP/9003 (SOOD) relies on the UDP source
address of the discovery packet — so a naive UDP forwarder breaks
both. Generic broadcast relays (udpbroadcastrelay,
udp-proxy-2020) handle the multicast plumbing but don't fix the
RTSP/RTP path. airoon does the whole thing in one binary, so you
deploy one service per site and not three.
MIT — see LICENSE.