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.

MIT licensed: GitHub - roethlar/songr · GitHub

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.

Hello @Michael_Coelho, thanks for your work.

I ran a quick test on Windows 11 using the following commands:

npm install
npm --prefix ui install
npx --yes concurrently "npm run dev" "npm --prefix ui run dev -- --host"

On the client, I see this message:

Showing a limited library listing while the catalog prepares. 
Counts are approximate and album actions are unavailable.

What should I do ? Should I wait a bit ?
I am available to provide further details.

Yes, the initial setup takes a bit to load large libraries. If it takes too long or doesn’t update, you can open an issue on Github. That way it will be tracked and you’ll get notified when it’s addressed.

I appreciate you taking the time to try it out!

Thank you @Michael_Coelho for your reply.
I will continue testing and let you know if I encounter any problems.
Is it possible to do this without a GitHub account?

I’m not sure, honestly. Probably not. Send me a DM if you want to report anything. If it’s appropriate, I’ll create the GH issue so it’s public and everyone can see the fix.

1 Like

Release 1.0 now includes a desktop app. That + Roon Bridge = Linux desktop client

It’s hefty. Electron adds about 100mb. Though that version can also act as a server over the network, so it’s an all-in-one binary.

Hello @Michael_Coelho, thanks for your message.
I’ll try the new version.