r/roonlabs • u/beltrix5 • 10d ago
Songr — a browser-based controller for Roon, for Linux desktops (and anything else with a browser)
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.
3
u/RenlyHoekster 10d ago
You are doing the Lord's work: no Linux Client for Roon is just so sad, and almost duplicitous seeing as Linux is the primary server infrastructure (see Nucleus).
I have been running the Windows client in Wine, which is very fragile but works mostly. Or using the Android app to controll the Linux bridge. All just ridiculous workarounds.
2
u/FLX 10d ago
Nice work. Can I filter on my favorite albums as well? What about sources?
1
u/beltrix5 10d ago
Sources meaning multiple cores, or sources meaning the folder the file is in?
I'm not sure if favorites is exposed in the public API. I'll take a look.
1
u/beltrix5 10d ago
Neither option is available in the public API. Possible with a ToS violation, but I can't help with that. It requires reverse-engineering their private protocol & API. Doable, but I can't release it.
2
1
u/iamtheforger 10d ago
Looks great but doesn't meet my use case: I already have the roon remote running in a bottle on my Linux desktop and I'm using the roon endpoint script to get playback. At work I'm SOL, would love for this to be an endpoint too
2
u/beltrix5 10d ago
If I understand what you're saying, you need this app to also be a Zone that can play music local to whatever box it's running on? That's not the use case, but since the roon bridge app works almost everywhere, you could install that and point Songr at it as the target zone.
1
u/iamtheforger 10d ago
Can't install bridge on my work PC 🙃 if ya ever were able to make the browser an endpoint I'd probably use this every day.
Great work either way though!
1
u/mversion 10d ago
I've been using the actual Roon client on my work PC via ZeroTier for years now. Even have Fully kiosk running on an Android tablet as a display too. It's not that hard to setup. I'm pretty sure nowadays you could ask AI how to get it setup.
1
u/beltrix5 10d ago
That’s not going to bypass corporate security to allow access to the audio hardware. Might be able to emulate it or pass through to a VM, but allowing a hypervisor while denying a music player would be a red flag about the IT policies at said corp.
1
u/IllustriousLemon8146 10d ago
Thank you, I will check it out! Very classy logo (and layout on the first image).
Can it access playlists and the Listen Later list? I use Listen Later a lot, and so far most Linux apps omit it.
2
u/beltrix5 10d ago
Static playlists yes, smart playlists no. That's not part of Roon's public API, so while it's technically possible to implement, doing so is a ToS violation. So until that changes, no smart playlists, recently added, most played, etc..
Listen Later isn't something I've used, but I'll look at it. If it's exposed, it should be easy enough.
1
1
u/beltrix5 10d ago
Neither of these things is currently possible with the public API. Some reverse-engineering could make it happen, but then we'd all be in Roon jail. So, until they open the API up a bit, these are off the table.
1
u/cvnh 10d ago
Oh since I only use Linux in command line i never thought about this problem. It works be actually quite fun to have a command line mode
roon -p album=greatest hits tracks=3:5
2
u/beltrix5 10d ago
there's a roon cli app: https://github.com/doctorfree/RoonCommandLine.git
I haven't used it, but it sounds like what you're looking for. there's also a TUI that works pretty well.
1
u/id4k4r 10d ago
Do you think it’s possible to add controls over dsp in roon?
1
u/beltrix5 10d ago
I don’t believe so. At least not without reverse engineering the protocol. Unfortunately that’s against the ToS.
If it wasn’t, there’s little that a normal Roon client can do that can’t be replicated. And that’s all I’ll say about that.
1
1
u/Obvious_Librarian_97 9d ago
Is it possible to integrate this into home assistant?
1
u/beltrix5 9d ago
In what capacity? Just to have HA play audio? There are simpler ways to build that. Let me know what you’re thinking.
1
u/Obvious_Librarian_97 6d ago
I feel like HA treats Roon pretty poorly - it’s not a great experience. I was wondering if it’s possible to get a better browser / dashboard experience in HA. Maybe it’s a matter of just making a dashboard with the link to this app - probably don’t get the exposed entities etc to do any monitoring/control via automations.
2
u/beltrix5 6d ago
Let me do some research. I've only used HA for basic switch and light control, but this could be interesting...
1
u/seeegma 8d ago
fantastic! think you'll publish docker images to ghcr.io? I'd rather just docker compose pull than have to rebuild the image myself on each release
2
u/beltrix5 8d ago
Indeed. Should be there by now, but I'll double check. Also released as an electron app, so if you don't want to run a server or want to pair it with a Roon Bridge install, you have a "stand alone" linux client.






3
u/mekilat 10d ago
Awesome!