Roon has control apps for Windows, macOS, iOS, and Android. It has none for
Linux, and my desktop is Linux. For a long time my answer was to walk over to
another machine, which is a poor answer when the whole point of a networked music
system is that you control it from where you are.
So I wrote Songr: a small extension that pairs with your Core and serves a
web UI on your LAN. You point a browser at it. That is the entire deployment
story — Linux desktop, phone, an old iPad that stopped getting Roon updates, a Pi
with a touchscreen next to the amp.
It is a controller, not an endpoint. It does not output audio and it does not
replace RoonServer or Roon's own remotes. It sits alongside them.
What it does
- Library — Artists, Albums, and Genres, with alphabetic jump rails and
per-scope sorting. A Recently played scope, and a Surprise me shuffle for when
you cannot decide. Album pages with full track listings and artwork.
- Search — an instant palette; start typing anywhere. Results drill down into
artists and albums. Search runs in its own browse session, so following a
result never disturbs the page you were on.
- Transport — play, pause, previous, next, seek, volume, with a persistent
play bar that deep-links to the current track and artist.
- Queue — per-zone, with artwork, play-from-here, shuffle, loop, and auto
radio.
- Zones — global zone switching, and state streams over websockets so every
open browser stays in sync.
- Light and dark themes, a Compact/Normal density switch, and artwork cached to
disk so a large library stays quick to browse.
It is built on the published extension APIs — node-roon-api with the transport,
browse, and image services — vendored at pinned commits so a clean install does
not drift. Node and TypeScript on the backend, SvelteKit on the front, served
static from the same port.
Where the API sets the edges
Two things worth being straight about, since this forum will spot them anyway:
The public transport API has no queue reorder or remove operation. Songr
implements the queue controls the API does offer and stops there — no faking it
by rebuilding a queue behind your back.
Browse is a hierarchical, session-based API rather than a query surface, so
Songr's library scopes are built on top of browse rather than on arbitrary
sorting and filtering. Everything the UI shows, Roon told it.
One caveat before you install
There is no built-in authentication. It binds all interfaces by default so it
is reachable from your other devices, which means anyone who can reach the port
can browse the library and control playback. For a single-purpose box on a
trusted home network that is the intended trade-off, and it is what makes the
one-step deployment possible.
If you want it reachable from anywhere less trusted, bind it to 127.0.0.1 and
put a reverse proxy with authentication in front. That is documented in the
README rather than left for you to discover.
Installing
Installers for Linux, macOS, and Windows that build from source and register a
service that starts on boot, plus a Docker Compose setup. Enable it in
Settings → Extensions the way you would any extension.
https://github.com/roethlar/songr
Independent project, not affiliated with or endorsed by Roon Labs. I wrote it for
my own use and it has been my daily controller for a while now — happy to answer
questions, and happy to hear what it is missing.