Roon Controller — Lightweight native macOS remote, looking for beta testers

Hi @Bertrand_CLECH ,

so you got caught on Friday 13th :slight_smile: Good to hear, the root cause had been found.

However, something is wrong with the version 1.2.1 as well.

When opening the dmg, I see the infamous stop sign indicating an app incompatible with the OS version (MacOS 26.3) and fore sure, it can’t be opened after being copied to Applications.

I hope, this is an easy fix and looking forward to digging deeper into it tonight!

Roland

Hello Roland,

In a terminal, did you try: xattr -cr "/Applications/Roon Controller.app"

Thank you !

Bertrand

Hi Bertrand,

yes, I tried that, but no luck.

I also get the explicit message, that the app isn’t compatible with this version of MacOS. Same on MacOS 15.7.4. Probably the information on compatible/minimum macOS version is missing or corrupt in this build?

Roland

Roland,

Thanks for the quick feedback — and yes, Friday the 13th got me good :slight_smile:

The stop sign is unexpected. The Release build on my side produces a proper universal binary (arm64 + x86_64) with a deployment target of macOS 12.0, so it should run fine on your MacBook
Pro 2020.

Could you run this in Terminal to check what’s actually inside the binary you downloaded?

file “/Applications/Roon Controller.app/Contents/MacOS/Roon Controller”

This will tell us if the DMG contains the correct universal binary or if something went wrong during the build/packaging step. If it says arm64 only, that’s the culprit.

I’ll rebuild and re-upload a fresh DMG in the meantime.

Hi Betrand,

luckily it’s my home office day, so i can try this quickly and get the following output:

/Applications/Roon Controller.app/Contents/MacOS/Roon Controller: Mach-O 64-bit executable arm64

Obviously the intel binary is missing.

Hope this helps!

Regards, Roland

:record_button: Hi Roland,

Thanks for running that file command — that confirms it: the v1.2.1 DMG contained an arm64-only binary, which explains the stop sign on your Intel MacBook Pro.

I’ve just published v1.2.2 with a verified universal binary (x86_64 + arm64, deployment target macOS 12.0). I also fixed the version mismatch you spotted earlier — the extension now correctly reports 1.2.2 to Roon Core instead of being stuck at 1.1.1.

Download: Release v1.2.2 · renesenses/roon-controller · GitHub

After copying to /Applications:
xattr -cr “/Applications/Roon Controller.app”

If you want to double-check before launching:
file “/Applications/Roon Controller.app/Contents/MacOS/Roon Controller”
It should now show Mach-O universal binary with 2 architectures: [x86_64] [arm64].

Looking forward to your testing tonight!

Hi Bertrand,

I did a quick test to see if the app now opens properly. it does on both intel and AppleSilicon and reports v 1.2.2.

But other than that, not much seems to have changed since v 1.2.0, see the following screenshot:

Maybe the stale binary sneaked in again?

BTW: It looks the same with v 1.2.1 (aside from the version number) which opens on the MacMini M1, just not on the intel MacBook.

EDIT: could you share a screenshot from your Mac showing how it should look like with v1.2.2?

Regards, Roland

@Bertrand_CLECH

That’s great for me too, thank you very much.

I’m really sorry, but I don’t have time to test it further; I’m preparing for a trip.

I should have more time when I get back.

1 Like

Roland,
Here is the requested picture:

I will release new release before 6pm CET.

Best regards,

Bertrand

v1.2.3 is the latest and available build.

Hi Bertrand,

thanks for the new build, this fixes alot of issues! Here are my findings, related to the numbering scheme in Post 38:

resolved issues first:

#2 Roon Mode Homepage “Recently played” empty state: fixed
#8 Version number: fixed
#9 Roon Mode Homepage “Recently played”, click album for album details: fixed
#12
Startup view preference (homepage / las view): fixed
#13 Genre navigation breadcrumb in Roon Mode: this looks fine now, can’t go back any further than “Genre” anymore to avoid messing up the layout.
#14 Genre grid view: I see the grid view for sub-genres (shaded cards). Album artwork is shown for albums once you reach Albums level. Same for Artists. This is just fine.
#17 More-Button in purple box on Roon Mode homepage: now works as expected. History view for “recently played”, Album view for “recently added”. However, Album view is still alphabetical, not sorted by date added. Maybe this is just not possible with RoonAPI. Regarding items in “recently added”, see open issues.
#19My Live Radio” translated to german: fixed

open issues from the list in Post 38:

#1 Profile Switching:

  • Works in Player mode (via Browse Library > Settings) → individual playlists from different profiles are shown after profile switc h
  • Doesn’t work via settings menu (checkmark changes after multiple tries, but doesn’t change active profil e)
  • Roon Mode still shows local user name and is stuck on one profile even when profile is changed in player m ode

#3 open settings via gear icon: Still not working, both in Roon Mode and player mode. Access settings via menu or cmd+, works. There’s second gear icon in Player mode in the top right corner of the window title. This doesn’t work eit her.

#4 Category Layout when accessed via stat b oxes:

  • Artis ts OK
  • Al bums OK
  • Tracks show wron g layout
  • Composers show wron g lay out

#5 Seek position sync: There are several cases for seek position sync, most of them work, on e doesn’t:

  • Update RoonController position when locally changed in Mac OS “now playing” dialog: OK
  • Update Mac OS “now playing” seek position when changed in local RoonCo ntroller: OK
  • Update RoonController seek position when remotely changed on other controller vi a RoonAPI: OK
  • Update Mac OS “now playing” seek position when remotely changed on other controller: local RoonController updates seek position via RoonAPI (see above) but doesn’t publish the update to Mac OS “now p laying” dialog

#6 “Album” column in different view s in Roon Mode:

  • Removing Colum in single album view: not resolved, i t’s still there.
  • Filling column with album name in tracks view: not resolved, it’s still empty

#7 Window resizin g in player mode:

Still doesn’t work in extreme cases, e.g. when resizing to minimum height and width and just increase width or toggle the sidebar. Not a big issue though.

now for unclear issues from Post #38:

#10 Roon library favorites (heart toggle):
I’m still uncertain about this new function. I see a heart toggle in “now playing” view both in Roon mode and player mode, but it doesn’t do anything when clicked (filled/unfilled), neither does it reflect the actual favorite status in the Roon Library (i.e. track favorites don’t show the filled heart).

This is only track favorites though. I can’t find album favorites anywhere.
How is this supposed to work? Does it reflect the Roon Library favorite status, or is it local favorites in RoonController like playback history?

here we go for “Roland’s Bugs” from Post 39:

#1 and #2 (Profile name and profile switching in Roon Mode): still doesn’t work for me

#4 gear icon, see above, doesn’t open settings.

#5 recently added sorted by date added: doesn’t work for me. In the current version I see three random albums in the purple box, all not recently added. Anything I can do to trigger the mentioned “full album scan” to refresh the list? Maybe a manual “rescan” button would help?

And some more suggestions (starting with #20 to avoid confusion with # from post 38):

General:

#20 Display settings from “Library→Settings” are missing in the RoonController Settings dialog. Would be nice, if they could be accessed from there.

#21 Why do Player mode and Roon Mode use different sidebar styles? This is especially apparent in MacOS 26 where Player mode uses the new LiquifGlass overlay and Roon Mode does not.

#22 make access to library search easier by adding a search field in title bar both for player and Roon mode (very MacOS style). At the moment, you need to browse explicitly to Library → search to search the library and get a clunky separate window to enter your search.
Or add a search field in Roon Mode homepage that starts a library search if it’s not possible to put it in the title bar.

#23 The search field in the library browser is limited to the current browse level and this way acts more like a filter than a search, I recommend to change the description to “filter results” or similar just as in Roon mode for the playlist filter.

Player mode:

#24 Qobuz view from Qobuz button: the new carousel layout looks strange when limited to the sidebar (looks great in Roon mode though!). I would prefer to open the list view just the way it opens when browsing to Qobuz from Library top level. Makes more sense in limited space.

Roon mode:

#25 There’s no need to go back to the top browse level. Every top categories are accessible through the side bar.
The Genre view is exemplary in this regard, you can’t navigate further back than Genre and there’s no home button in the top right to directly jump to the top level.
I recommend doing this for every view (Live Radios, Qobuz / Tidal, tags, Artists, Albums, Tracks, composers).
The “Playlists” views shouldn’t go up any further than Playlist either.
This also solves many problems with messed up layouts when you browse back to top level and enter another category through the browser instead of the sidebar. It’s just not possible anymore.

#26 Moving the Queue button from the sidebar to play status bar. I know, this is copy/paste from the Roon layout, but it’s “Roon” mode after all. An the queue really isn’t part of the library anyways.

#27 The sidebar is missing the history. In Player mode, there’s a separate button, in Roon mode you can access history only via recently played → more. Of course the logical place would be beneath tags.

#28 in general I would recommend re-ordering the sidebar entries according to the layout in the Roon app. This way everybody feels at home right away. For example

Search section:

  • Home page
  • Genres
  • Qobuz / Tidal
  • Radio Favorites
  • Tags
  • History

Library Section:

  • Albums
  • Artists
  • Tracks
  • Composers
  • My live Radios

Again, a long post, but I hope this is helpful.

I think, the RoonController app already has reached a quite mature state in a short time. I really like it!

Best Regards, Roland

Two more thoughts:

a) Files in Library/Caches:

It seems, the following folder and files belong to RoonController:

  • RoonImages
  • playback_history.json
  • track_images_keys.json
  • known_albums.json
  • sidebar_cache.jsom
  • streaming_secttions_cache.json

So it would be nice to move them into “com.bertrand.RoonController” in Order to keep everything in place or add the prefix “com.bertrand.RoonController” to make it possible to properly delete caches when un-/re-installing (no stale cache files).

EDIT: deleting these files alongside with the files and folders found by AppCleaner helps with a clean start and solves the issue of RoonController showing the local username instead of the Profile name on startup in Roon Mode!

b) “Recently added” Albums:

I believe, I was misunderstanding before and do unterstand now how this works.

RoonController keeps track of known albums (most likely in known_albums.json) and periodically rescans the Library for new Albums (not in known_albums.json) and puts these in “recently added”.

This means, only Albums that have been added since the initial library scan pop up in “recently added”, right?

In This case, I have three feature suggestions:

  1. When clicking on “more” with “recently added” selected in the purple box, don’t open the standard Albums view but instead a list of recently added albums (just like playback history)
  2. Add simple editing features like “delete” to complety empty the list and context sensitive (right click) abilities to remove individual albums from the list, that don’t belong there
  3. (Luxury feature) In Albums view add ontext sensitive (right click) abilities to manually add an Album to recently added in order to manually recreate the most recent additions in case RoonController missed those or they just have been added before initial library scan.

Probably a list file “recently_added.json” (just like “recently_played.json”) is needed for this to keep track of the list separately.

I hope this makes sense!

As always, best regards, Roland

Thank you really for your feedbacks Roland. I hope to be able to deal with during this week-end.

Hi Bertrand,

some more input regarding the issues with profile switching in Roon mode and gear icon:

In Roon mode, it is not possible to change the profile via library browser since the layout ist messed up (see screenshot). Maybe this is the reason, why it doesn’t work via Settings menu either (?).

In Player mode, the layout is right and switching profiles works fine:

My recommendation regarding the gear icon would be to open library → settings in the library bowser in both modes instead of trying to open the settings dialog from the menu.

Profile switching could be removed from the settings dialog in the menu then. What do you think?

Hi Bertrand,

I’m currently testing with multiple zones playing simultaneously. There are Problems with updating seek position when switching between zones, some examples:

  • Zone ist paused when being switched to:
    • Seek position shows 0 although it’s paused in the middle of the track
    • Press play and its starts to count for a few seconds and stalls again
    • After 20 sec it updates to the correct seek position and continues counting but stalls again after a few seconds
    • This repeats 2 or three times until the seek position keeps counting
  • Zone is playing when being switched to:
    • Seek position shows 0 although it’s in the middle of the track
    • After 20 sec it updates to the correct seek position and continues counting but stalls again after a few seconds
    • This repeats 2 or three times until the seek position keeps counting

My guess is, that RoonAPI updates seek position every 20 sec when playing and the seek position timer has issues to catch up. When in pause, the seek position might not be updated by RoonAPI and therefore get’s lost when switching between zone. Is it possible to actively request the current seek position through RoonAPI to update immediately upon zone switching?

EDIT: Additional observations and suggestions:

  • When switching zones, the OS “now playing” dialog stays on the zone selected before until somthing happens (track skip, play pause, seek adjust). I think this is expected behavior, but it would be nice if an update of the OS “now playing” dialog could be forced when switching zones in RoonController.
  • Show selected Zone name next to Zone icon in the bottom right in Roon Mode. Otherwise it’s unclear, which zone is currently selected.

Hi Roland,

Quick release following Nepherte’s feedback (post #20) asking for tooltips on icon buttons.

What’s new

Tooltips on all icon buttons across the app (~35 buttons) — just hover to see what each button does:

  • Transport bar: Previous, Play/Pause, Next, Mute/Unmute, Select zone
  • Home page: scroll arrows, MORE, Play overlay
  • Library browse: Back, Library home, Clear search, Play now, all Play overlays (grid, list, streaming, radio)
  • Player view: transport, Shuffle, Repeat, Roon Radio, Mute/Unmute, Volume -/+
  • Now Playing view: Shuffle, Repeat, Roon Radio, favorite hearts
  • Radio favorites: Export CSV, Clear all favorites, Delete
  • History: Clear history

Tooltip text is in English and auto-localizes through the app’s translation system.

Source badges (Tidal/Qobuz/Library)

After investigating, this is unfortunately not feasible: the Roon API doesn’t expose any source or provider field in BrowseItem,
NowPlaying, or PlaybackHistoryItem. There’s no way to know whether an album comes from Tidal, Qobuz, or the local library. Noted as
an API limitation in the TODO.

Download

Hi Bertrand,

a quick review of release 1.2.4 gives following results:

  • ToolTips look fine
  • settings gear icon now works, opens RoonController settings dialog
  • Layouts of Titles view and Composers view have been fixed when accessed via standard boxes
  • profile switching in RoonMode still doesn’t work both in
    • RoonController → settings and
    • Library → Settings → Profiles. This still shows the wrong layout (Album view), making it impossible to switch profiles.
  • Album column has been removed from “Titles” view. Does RoonAPI really not provide this information? This would be sad.
  • Album column still is present in single Album view where it should be removed as being unnecessary/redundant
  • The seek time progress bar actually got worse and now stalls and updates only in 20 sec intervals even in single zone playing mode and even when pause/play is issued in the local RoonController.
  • Seek time progress bar even gets out of sync between bottom bar and now playing view. In this example, I just pressed “play now” on the Album, no other interaction from other controllers or local controller. Both progress bars were stalled:

Also I’m still puzzled about the whole heart toggle / favorites function. Maybe you could share a few screenshots on how it’s supposed to work?

EDIT Additional Info on the seek position issue:

I’m not 100% sure, but it seems, the sheer presence of other zones than the one being currently selected seems to cause this, even if there’s nothing playing in the other zones.
Definitely reproduceable is the following: If you disable a zone that is not playing in Roon while music is playing in another zone, the seek position bar of this zone stalls in RoonController.

However, in any case it now seems to update only in 2-5 sec intervals, not continously counting 1 .. 2 .. 3 .. 4 as before.

A wild guess, but maybe the seek position interpolation algorithm that makes a nice animation for large seek position changes is doing more harm than good? Probably a more simple approach with a local timer simply increased 1 sec per sec while a zone is in playing state, paused while a zone is paused, reset to 0 on track skip / new track and adjusted to the reported position on seek position updates from RoonAPI (either pulled or pushed) would do better?

Best Regards, Roland

It is a simple feature that allow to save the metadata of a radio’s track. After saving all the tracks you want to get back, it is possible to export them as csv file.

Hi Bertrand,

Ok, i see and will try this out. I don’t use Roon to listen to the radio. I have got a radio for that purpose both in the house and the car :slight_smile:

EDIT: tried it, works. Nice feature to quickly save data on interesting new titles for later!

What about the heart toggle feature for “Roon Library Favorites (Browse API)” mentioned in the release notes of v1.1.1?

I found this on GiHub and can’t make much sense out of it:

Add heart toggle for Roon library favorites via Browse API

Show heart button for all tracks (not just radio). For seekable tracks,
use Browse API search to find the album and toggle “Add to Library” /
“Remove from Library” action. Automatically check library status on
track change. Multilingual action title matching (10 languages).

I figured this might give a filter option to show only your favorite albums / tracks in album / track view as defined by the heart toggle in Roon Library. But this seems to be impossible, see:

https://community.roonlabs.com/t/is-there-a-way-to-get-programmatic-access-to-my-favorites/279401/13

However, you can achieve the same by adding all favorite albums to a tag (“Album Favorites” for example) and access the tag in RoonController - done.

Regarding other test scenarios you requested feedback on:

a) Use of a network streamer / RoonReady device instead of local USB:

I extensively tested with the Matrix Audio mini-i pro 3 today (Roon ready device) and can tell there’s no difference to other zones. Playback control works fine. Volume control works fine either direction RoonController > mini-i and mini-i > RoonController). This was kind of to be expected as this is handled through RoonAPI as for any other zone and therefore should be transparent.

b) Grouped zones:

I tried with the Matrix Audio mini-i pro 3 and a local (system out) on the Mac. Zone name corresponds to what Roon shows (Mini-i Pro 3 + 1). Again this works fine for playback controls. Volume control has two issues:

Also is there a feature planned to group/ungroup zones through RoonController? According to RoonAPI “documentation” this should be possible.

And from using RoonController more and more, I have one feature request:

Also the above screenshot shows one bug consistently present in all views: The number of items (in this case Titles in the album) reported is always +1 than the actual number of items. This might be due to the fact that the playback options are also returned as a list item through browse api alongside with the tracks and therefor the total list count is always +1 (?)

Best Regards,

Roland

Hello Roland, I will try to solve your issues as soon as possible. Many thanks!

I am looking for a new job and have interviews. Sorry
Best regards,

Bertrand