MusicD Remote - a companion client for Roon

Now that the latest Roon EA build, 1675, fixed the Roon API issue I was able to use Roon logs from the latest production build and this EA1675 build and the advanced logs from my extension to get a better correlation between both softwares.

v1.6.49 - the last update for a minimum of 2 weeks

Update via MusicD Remote

Enjoy

2 Likes

Nice work from you and Claude once again.

Have a great holiday and hopefully when you return, Claude will be equally relaxed and recovered after a hard couple of months working with you.

2 Likes

great work! always wanted a webui remote for roon. love the feature-set! runs solid so far for me after an hour of testing.

one thing, if i may tell you: would be very handy to edit my queue inside the webui.

best & keep the work up!

Matteo

2 Likes

Thank you :folded_hands:

Your wish is my command :+1:

I’ll add this into the queue of development.

Just exploring this. May not be possible :thinking:

The more votes we get for this, it could help

A last-minute treat just before I board my plane.

v1.6.51 - whole library browsing

I did a quick test remotely and it’s there on the Home Screen.

Switching off now.

αντίο φίλοι μου μουσική :waving_hand:

2 Likes

Hi @matteo

I’ve looked thoroughly into this. The Roon API doesn’t allow this as a native feature.

I could emulate the play queue within the UI and I could make it work.

The minor issue is the currently playing track would stutter upon applying the queue.

If it were only the hiccup, I’d build it with a warning. The two harder problems:

  1. The queue only tells us names, not identities. Roon’s API gives us display text - “Harvest Moon / Neil Young” - with no link back to the library item. To rebuild, every track must be re-found by searching for its name, and when your library has the same title on multiple albums (studio/live/remaster/compilation), the rebuild can silently swap in a different recording than the one that was queued. And anything that isn’t a straightforward library track - Roon Radio picks, a Qobuz playlist, internet radio - may not resolve at all, so those entries would just vanish from the rebuilt queue.

  2. It’s slow and can fail halfway. Each re-added track costs ~7–10 Roon round-trips. A 25-track queue is 200+ calls over tens of seconds, and there’s no undo - if the Core hiccups mid-rebuild (or the track ends, or someone touches another remote), you’re left with a half-built queue.

I’ll think over this when on holiday.

I could build it as an explicitly-labelled experimental mode, off by default in Settings, with guardrails - the edit UI only unlocks when every queue item resolves to exactly one library track with high confidence, and it refuses (with a clear message) otherwise. That confines it to the cases where it genuinely works, and the hiccup-on-apply is disclosed up front. Or we wait for Roon to add the API verbs, at which point the full native version (drag handle and all) is a day’s work.

“Vacation — I forget everything.”

1 Like

Home after a great family vacation. A few days before resuming normal life and I have a few hours spare today.

Build 55 brings a few bug fixes and new minor features.

Fixes:
• A regression when navigating between artist discographies and back to random album screens fails to further open albums (highlighted by @GGromadzki on GitHub, big thanks)

New minor features:
• Album icons to show if local, Qobuz or Tidal (WIP)
For this to work with an existing extension running, update and within the extension rescan Roon library and rescan labels.

Confirmed working:
• A last-minute feature added (before going on vacation) to show your whole Roon library works. I’ll work on this soon to give better filtering/focus options.

3 Likes

The update yesterday was to fix a few bugs before today’s planned bigger update.

Big not just because it gets a bump in version numbers.

v1.7 - this has been in the making prior to my vacation in parallel to my main releases.

I’ve always wanted to retain the soul of the existing extensions random album selection screen, and I have. I also saw another purpose for this after someone mentioned Linux.

v1.7 comes a few steps closer (IMO) to being classed as an unofficial solution as a Roon Client for Linux users. There’s still the need for Roon’s official client and/or remotes. I’ll never officially get around this even though a few possibilities ‘do’ exist.

Again, this doesn’t replace Roon official clients/remotes but does give a different take on how to use Roon and with a few extras Roon doesn’t have.

This release isn’t just about function and visual changes. There’s lots of under-the-hood changes to minimise API calls. Finding ways to work around limitations of the Roon API is tricky and time consuming, but rewards come with perseverance. A good number of development changes for progress and reduced regressions have been worked on.

Bragging rights time - my extension has a better & smoother scrolling experience on 120Hz iPhone screens than the official Roon Remote app. This is achieved even with a higher density album view screens. Head to the ‘Library’ screen and scroll with a single swipe and see how it performs.

Progress from here in terms of updates will be much slower. It might be 3 months before another update is pushed out. Quality over quantity.

Enjoy :innocent:

New features & improvements

• Flat interface throughout — Home, album view and Queue: no cards, no watermarks, Roon like layout.

• Release years record where they came from, so your own file tags beat a service’s remaster date.

• Better contrast in both new themes, now machine-checked by the tests.

• Browser chrome colour follows the theme.

• Library Sort & Focus — sort by album, artist, year, plays, last played or random; filter by source, decade and listening history, all combinable. Computed from the extension’s own snapshot, so zero calls to your Core.

• Release years for the Decade filter — harvested at no API cost from your Qobuz/TIDAL favourites and local file tags.

• Artist links on the Now playing screen, matching the album view.

• Four themes — the original dark and light plus Copper dark and Brass light, chosen from a picker with Apply.

Bug fixes

• Wrong artists under “Also appears on” — a substring match, root-caused and eliminated across 13 places.

• Sort and Focus sheets opening underneath the now-playing bar, their buttons invisible and untappable.

• “Most played” sorting backwards; undated albums floating to the top of “newest first”.

• Decade chips counting albums you don’t own.

• Every toast in Settings silently throwing — token saves and the whole Qobuz/TIDAL connect flow reported nothing.

• Unreadable white-on-accent text in three places (2.28:1).

• Artists with punctuation-only or non-Latin names matching the entire library.

Additional

• Test suite from nothing to 291 tests, every fix pinned and mutation-checked — to minimise regressions.

3 Likes

Just gets better and better!

Quality over quantity.

2 Likes

Sneak peek :face_with_peeking_eye:

Playlists - those created using Roon (local, streaming or mixed) and those synced through from Qobuz or Tidal (others not tested)

Smart playlists - these will be the extensions own and created and operate in a similar manner to Roon’s Smart Playlists. These are not transferable as smart playlists but can be added as regular playlists in Roon

Also working on something quite special :shushing_face:

3 Likes

Might be worth renaming this just to avoid confusion for anyone expecting to be playing their Roon Smart playlists.

Development has been really good on this as it would be previously very rare for me to open a web page to play something in Roon, now it is almost a daily habit. Good work @MusicD :clap:t2::clap:t2::clap:t2:

1 Like

As it happens I have already renamed it in the last dev build. It’s now called ‘Live Playlists’

1 Like

Update time - v1.7.45

Before I waffle on about what’s new, I want to tell you how busy I’ve been with this. Usually I’ve been able to get a working build out of Claude each session before I hit a session limit. Not the case here. 45 builds on from the v1.7.0 with 4 to 5 Claude sessions per build. It’s taken about 6 to 9 months in Claude time deliver this update. For me, a week and a lot of cursing Claude.

Here we go: TL;DR (see release notes on GitHub, link below)

Main new features are Playlists, Dynamic Playlists plus some magic and Smart Picks.

Playlists

This is what you think it is. Playlists from Qobuz/Tidal via Roon and those created in Roon from local files. Create a playlist in the extension and play now or add it to your queue works.

Dynamic Playlists

This mirrors Roon’s own Smart Playlists as closely as possible but is the extensions own workings. I cannot expose Roon’s working Smart Playlists to the extension without reverse engineering a lot. I don’t want to go down that Road. Create a Dynamic Playlist in the extension and you can send it to Roon via the queue, then save the queue as the playlist. Prompts will guide you.

The Magic

Playlist sharing. Whether a playlist is from Roon (except Smart Playlists), the extension or a Dynamic Playlist you can share them with other MusicD Remote extension users. Then share the code in a downloadable file or copy/paste into a forum thread, text, email etc and send it. The receiver then imports the code or file and that’s it. Well, not quite. Currently this works if you have the songs in your Roon library. I’m a few builds away from an update to this specifically where it finds the missing songs and adds them. A lot of cogs in this feature.

The Extra Magic

Some may know I have a version of the remote extension for Lyrion Music Server. This shares the same playlist functions and you can share/import between the two Remotes. No other music streaming software, plugin or extension does this.

Smart Picks - needs Qobuz (Tidal TBC)

The constraint that shapes everything: Using Roon’s API like I am means Roon plays only what in its library, and its API has no way to add anything. So a recommendation can’t be played.

The whole flow is: Smart Picks kicks in at 4am → cogs turn → chooses 5 albums by artists not in your library but close to your genre preferences & 1 stretch that’s not like anything you normally listen to → it’s favourited on Qobuz (Tidal TBC) → Roon imports it (when Roon works) → it appears in your library on the next sync in Smart Picks → now it plays.

Once a day, on a timer - can be changed

  1. Read your library (free — no Roon calls). Every album’s credits become an artist profile: how many albums you own by them, and how many plays those albums have.
  2. Fetch the hub list. One request to ListenBrainz returns the world’s 1,000 most-listened artists. This is the pivot of the whole feature, because similarity quality inverts with how famous the seed is. Ask “who’s like Radiohead?” and you get Nirvana, RHCP, Coldplay — useless. Ask “who’s like Bark Psychosis?” and you get Mogwai, Talk Talk, Tortoise, Slint, Labradford. So nothing on the hub list is ever used as a seed, or offered as a pick.
  3. Choose 24 seeds from the obscure end. Non-hub artists, sorted by plays per album owned — four plays across one album is a stronger statement of taste than six spread across twelve. (No play history yet? It falls back to most-owned.)
  4. Walk out. Seeds resolve to MusicBrainz IDs, then ListenBrainz returns similar artists in batches — each result tagged with which seed reached it.
  5. Filter. Drop anything you already own, anything famous, anything you’ve blocked, anything shown in the last 120 days.
  6. Rank by distance, not similarity. This is the part every other recommender gets backwards. An artist reachable from one seed beats one reachable from twelve — because the latter is somebody you’ve had every opportunity to buy and haven’t.
  7. Deal round-robin across seeds. Ranking alone produced a monoculture in testing: five ambient records, all neighbours of one album. Now each seed contributes one pick per round, so five picks are five different corners of your library.
  8. Resolve to a real album. Each pick becomes an actual Qobuz album you can favourite. Capped at 40 lookups, with a 429 abort.
  9. The stretch pick. Genre weights come from your snapshot; a genre at ≤2% of your library is “outside”. MusicBrainz’s relevance order gives that genre’s canonical names — Flamenco → Camarón de la Isla — so it’s a stretch worth listening to rather than just an unfamiliar one.

Design decisions

• No LLM. The reason line is derived from the chain that produced the pick (“Because you play Stars of the Lid”), so it’s always true. A generated sentence would read better and would sometimes be wrong — and a hallucinated album can’t be favourited, it just looks broken.
• Silence is never rejection. Only an explicit “Not for me” blocks an artist, permanently. The premise is albums you’d never reach for, so treating an ignored pick as a no would empty the pool within a week.
• Zero Roon calls. Library analysis reads the existing snapshot; everything else is plain HTTP to ListenBrainz, MusicBrainz and Qobuz.

I started off with LLM but decided upon good old cogs and gears and a lot of time to implement this. The failing part here is Roon not syncing Qobuz/Tidal albums to Roon. Note: this aspect of the extension is still under continuous work and improvements will follow.

2 Likes

Hi @MusicD,
I’ve been “playing around” with @Michael_Coelho’s extension:

I think the shortcuts for navigating the library are a great idea.
It would be cool if you could do something similar ; what do you think ?

This had crossed my mind when I added the Library carousel. It’s expanded view can be manipulated into all sort-by options and it wouldn’t be a simple A to Z, Z to A as it’d also be dates. It wouldn’t take much to add. I’ll add this to the maybe pile.

What is lacking is a text based focus/filter on the library album grid screen.

The home screens search can act as a text based focus/filter.

From Monday I’ll have the time to work on this again. I’ve just finished working on the Lyrion Music Server version. Almost a 1:1 match.

The roadmap is looking like:

UI tweaks - sizing aspects of buttons and placements
Improve Smart Picks stretch pick selector
Library album grid screen - text based focus/filter

The Highlander - There can only be One MusicD Remote :wink:

2 Likes

So good ! :star_struck:

1 Like

Just when I was about to put an update out I found a bug that breaks full screen UI when saved as a PWA :man_facepalming: