It might be that you have to run the docker container as a network:host see this line in the docker_compose.yaml, you have to uncomment it.
Hm.. it has been a bit tricky to debug this. I might get around installing a simulator at some point, but that seems low priority right now
sorry!
Totally understandable, makes perfect sense to focus on providing more value to modern devices. Which you’ve done a great job at already, love the designs!
yeah, at least for me on rPI that was required to get it working (did it via command line, but still the same config)
Forget my feature request. Everything I needed is already described in your GitHub documentation. I’ve created my own layout based on FactsColumnsLayout. I’ve reduced the AI text font size and increased the Now Playing text size. It’s great to be able to modify any aspect of the display. ![]()
Please make a PR if you create a new layout! ![]()
Roon Now Playing v1.7.0 — Self-Service Onboarding & Roon-Optional Mode
Hey everyone! Excited to share a big update to Roon Now Playing — the always-on display extension for Roon (and now, any music source).
What’s new since v1.5.1
v1.7.0 — Self-Service Onboarding
The problem: Setting up a new display meant finding its ID in the admin panel, manually selecting a zone, and configuring the layout. If you had multiple screens, this was tedious.
The fix: Displays now onboard themselves.
When you open a new screen, instead of “Waiting for Roon Core…” you get a clean welcome screen with:
- A friendly name auto-assigned by the server (e.g.,
gentle-fox-17,calm-falcon-3) - A QR code linking directly to that screen’s config page
Scan the QR from your phone, pick a zone, choose a layout — done. The display updates instantly. No IDs to copy, no admin panel required.
Per-screen config page — Each display gets its own page at /admin/screen/gentle-fox-17 (or whatever its name is). It’s a focused, mobile-friendly UI showing just the settings for that one screen: zone, layout, font, and background. Perfect for configuring from your phone after scanning the QR.
Names persist across reconnects and server restarts. If you don’t like the auto-generated name, rename it to something like “Living Room” or “Office” from the admin panel or the config page itself.
v1.7.0 — Roon is Now Optional
Thanks to a contribution from @leolobato, you can now run the app without Roon at all. Set ROON_ENABLED=false in your environment and the app skips Roon discovery entirely, running in external-sources-only mode.
This is great if you’re using the External Sources API to push now-playing data from Spotify, Plex, Home Assistant, or any other source. No Roon hardware needed.
Home Assistant Integration
For those running Home Assistant — there’s now a custom integration that connects to your Roon Now Playing server and exposes each named display as a controllable device in HA. Each screen gets:
- Select entities for layout, font, background, and zone
- Binary sensor for connection status (online/offline)
This means you can automate your displays: switch to minimal layout at night, dim the lights when a screen connects, change layout based on what’s playing — all through HA automations.
Install via HACS as a custom repository: roon-now-playing-hass
v1.6.0 — Typography & Testing (in case you missed it)
- Configurable typography — All layouts now expose CSS custom properties for font sizes and line heights. Easy to tweak for your specific display size (especially useful for 4K TVs vs tablets).
- E2E visual testing — Added Playwright-based screenshot tests across all 9 layouts and multiple viewports (1080p, 4K, iPad, etc.) to catch visual regressions.
- Better font scaling — Improved
clamp()values for 4K displays and tighter line heights for smaller screens.
How to Update
Docker:
docker pull ghcr.io/arthursoares/roon-now-playing:latest
docker compose up -d
Manual:
git pull
pnpm install
pnpm build
pnpm start
Links
- GitHub: GitHub - arthursoares/roon-now-playing
- Release: Release v1.7.0 — Welcome Screen & QR Onboarding · arthursoares/roon-now-playing · GitHub
- External API Docs: roon-now-playing/docs/external-api.md at main · arthursoares/roon-now-playing · GitHub
- Home Assistant Integration: GitHub - arthursoares/roon-now-playing-hass: Home Assistant integration for Roon Now Playing displays
Feedback welcome — especially on the QR onboarding flow. Would love to hear how it works with your setup!
Great project, was building the same, but not there yet.
Any help you would need on additional features?
I’m open to suggestions, but I haven’t thought of any others to add. What do you have in mind?
Great project, it works fabulously on Mac/PC.
It works differently in portrait mode on iPhone and iPad. Under the same layout(“detailed”), for iPhone in portrait mode, it looks like this:
But for iPad in portrait mode, it looks like this:
It looks like it’s still optimized for landscape mode(cover art on the left, text on the right) rather than portrait mode (cover art on top, text at the bottom). In this case, the cover art is not centered and maximized like what it shows on iPhone. Is there a way to fix this?
Roon Now Playing v1.7.3 — Font Scaling, Better Contrast & iPad Fix
Hey everyone! A few quality-of-life updates since v1.7.0, mostly focused on making displays look better across different screen sizes and lighting conditions.
What’s new since v1.7.0
Font Scale Controls (v1.7.1)
The problem: Different displays need different text sizes — a 4K TV across the room needs bigger text than a tablet on a nightstand, but the old typography settings were one-size-fits-all.
The fix: There’s now a font scale slider in the admin panel under Display Settings. It applies globally to all screens, and you can also set per-screen overrides if one display needs a different scale than the rest. Changes apply instantly via WebSocket — no refresh needed.
Responsive Typography (v1.7.1)
All layouts have been migrated to container query-based typography using design tokens. Text now scales fluidly based on the actual display size rather than relying on fixed breakpoints. This means your 4K TV, 1080p monitor, and iPad all get appropriately sized text without manual tweaking.
Adaptive Text Contrast (v1.7.3)
The problem: On albums with light-colored artwork, white text could become hard to read — especially on the Ambient and Detailed layouts where the background is derived from album art.
The fix: Text and progress bar colors now adapt using WCAG contrast ratios. When the background is too light for white text, the app automatically switches to dark text. This happens dynamically as tracks change, so you always get readable text regardless of the album artwork.
iPad Portrait Layout Fix (v1.7.3)
If you’re running a display on an iPad in portrait mode, you may have noticed it was showing the landscape layout (cover art on the left, text on the right) instead of the stacked layout (cover art on top, text below) that phones get. This was because the iPad’s ~820px width exceeded the 768px breakpoint. Fixed by making the layout decision based on viewport shape (aspect ratio) rather than just width.
Other Fixes (v1.7.1–v1.7.3)
- Docker persistence — Roon pairing and client names now persist properly across Docker container restarts
- Admin panel — Fixed duplicate screens appearing when a device reconnects (e.g., after network hiccups or HMR reloads)
- Facts layouts — Fixed scrolling text not starting at the top, text wrapping to single words, and column overflow on narrow screens
- Font scale race condition — Fixed a duplicate watcher that could cause intermittent font scale glitches
How to Update
Docker:
docker pull ghcr.io/arthursoares/roon-now-playing:latest
docker compose up -d
Manual:
git pull
pnpm install
pnpm build
pnpm start
Links
- GitHub: GitHub - arthursoares/roon-now-playing · GitHub
- Release: Release v1.7.3 — iPad Portrait Fix & Adaptive Text Contrast · arthursoares/roon-now-playing · GitHub
- External API Docs: roon-now-playing/docs/external-api.md at main · arthursoares/roon-now-playing · GitHub
- Home Assistant Integration: GitHub - arthursoares/roon-now-playing-hass: Home Assistant integration for Roon Now Playing displays · GitHub
Feedback welcome — especially on how the adaptive contrast looks with your library. If you find an album where the text is still hard to read, let me know!
After updating to the latest version (1.7.3), the cover art in iPad portrait mode is centered but not maximized:
This is what it looks like using roon-web-stack by @nihiluxnihiluxnihiluxnihiluxnihiluxnihiluxnihiluxnihiluxnihiluxnihiluxnihiluxnihiluxnihiluxnihiluxnihiluxnihilux (in which the cover art is maximized):
It seems the “iPad Portrait Layout Fix (v1.7.3)”only works for “detailed” layout. When you switch to “Ambient” mode, it still looks like this:
Two suggestions:
- Personally a maximized cover art is absolutey prefered. I also understand not everyone is obsessed with large cover art, how about introducing a “Cover Art Scale” slider (just like “Font Scale”) to Admin panel?
- The multiple layouts is definitely a plus; how about adding a list of checkboxes to Admin panel so users can select their preferred layouts for cycling through? For example, if one only wants cycle through “detailed”, “ambient”, and “fullscreen”, then all he/she needs to select are these three checkboxes.
First of all, thanks for putting this out there! It fits my use case perfectly.
One thing I noticed is that none of the Gradient backgrounds work with the Basic layout. Is this a known limitation or is it something that can be fixed?
Glad to hear, Jeremy.
The Basic Layout was made for old devices. The way I’m building the gradients requires browser technologies that are not compatible with those older devices. So it serves more as a fallback! ![]()
What is your experience with AI facts about recently released or lesser known albums/tracks?
Since the llm i‘m using doesn‘t support web search, it hallunicates in that cases like crazy.
@FunkBrother
I ended up rewriting my prompt to deal with obscurity and not make up stuff… I have a lot of non-mainstream music old and recent.
Your welcome to it and anyone else…
### Roon Now Playing Facts Prompt v1.2 Lite (Liner Notes Tone)
##### Disclaimer: Shared as-is for informational purposes only—use at your own risk with no guarantees or liability.
Generate {factsCount} concise, interesting facts about this music:
Artist: {artist}
Album: {album}
Track: {title}
Context:
- Well-known → use specific, detailed facts
- Obscure/limited info → use contextual, style-based insights (no guessing)
Focus:
- Recording or production details (if known)
- Collaborations, influences, musical connections
- Distinctive style, genre, or characteristics
Guidelines:
- Each fact must be a short, single concise sentence
- Clear, concise, display-friendly
- Prefer verifiable details; if unsure, generalise
- No repetition, filler, or obvious facts
- No numbering or list prefixes in output
- Avoid using quotation marks inside facts; use plain text instead
- Each item must be plain text
Tone:
- Refined, liner-notes style
- Confident, editorial phrasing
- Concise with light descriptive colour
- No conversational tone or humour
Rules:
- Do NOT invent facts, dates, quotes, or achievements
- Ensure each fact is distinct
Fallback:
- If little is known, provide genre, style, and musical context
- Never return empty output
IMPORTANT:
Return ONLY a valid JSON array of strings.
Strict format rules:
- Output must start with [ and end with ]
- Each fact must be a properly quoted string
- Each item MUST be separated by a comma
- Prefer output on a single line to reduce formatting errors
- Do NOT include trailing commas
- Do NOT output objects, keys, or nested structures
- Do NOT include unescaped quotation marks inside strings
- Ensure the full JSON array (including closing ] and all quotes) is completed before ending the response, even if facts must be shortened
No extra text, markdown, or commentary.
Example:
["Fact one.", "Fact two.", "Fact three."]
Configuration Note:
Optimized for local ollama hosting mistral:7B on a dual GPU configuration.
Facts per Track set to 4.
Edit: Update to make more strict character checks to eliminate black screens.
Hi all ![]()
New release: v1.9.0. This one focuses on how the display looks on large screens, plus some new AI options.
What’s new
- Text now scales properly with your screen. Several of you pointed out that titles and AI facts looked too small on big TVs (especially 4K) — that’s fixed. Typography now scales smoothly from tablets up to 1080p and 4K, so everything stays readable from across the room.
- Redesigned Facts Carousel. The rotating fact is now shown as large type directly on the blurred artwork (the old small “card” is gone), with a compact now-playing strip at the bottom. Much easier to read from the couch.
- Bigger album art in the Basic layout. On larger displays the cover now fills the space instead of being capped at a small size (the older‑browser/legacy layout still stays compatible).
- New AI providers/models for Facts:
- OpenAI GPT‑5 family (GPT‑5, GPT‑5‑mini, GPT‑5‑nano)
- Current Claude models — Claude Haiku 4.5 (new default), Sonnet 4.6, Opus 4.8 (the old default model had been retired)
- Refreshed OpenRouter options
- Fixes & cleanup: smoother per‑screen config page (removed a background process that was spamming errors when a screen was offline), and self‑hosters’ runtime config/credentials are no longer at risk of being committed.
Thanks to everyone who reported the text‑size issue on TVs — that feedback drove the biggest change here.
Updating (Docker):
docker compose pull && docker compose up -d
or
docker pull ghcr.io/arthursoares/roon-now-playing:latest
As always, feedback and screenshots from your setups are very welcome ![]()
I improved the facts significantly by adding web search results about Artist/Album/Track to the LLM prompt. Since I didn’t want to modify Roon Now Playing code, I’ve created a separate LLM proxy and configured it in RNP as Local LLM. The proxy uses my local web search server (SearXNG) to get 10 search results about the current track and appends them to the LLM prompt. Much better facts. Especially about current or lesser-known releases, which aren’t part of LLM training data.
Furthermore, the proxy allows me to use my Opencode Go subscription as a provider, which isn’t supported by RNP.
Additionally, I’ve changed the prompt to your version.
The discontinued Meta Facebook portal devices have been given a new life with the ability to treat them almost like an Android tablet. I have the 15" rotating version acting like a cover art display on my desk. It’s working great with your Now Playing app. The view I use has the player name in the bottom left. Would love the ability to add some audio format info next to it - like the info Roon shows - ‘icon for source (Qobuz, library, etc)’, format (flac, etc), sample rate, and bit depth. Here’s a pic of the 15" portal plus in the portrait orientation -
btw, this is running Home Assistant - with the Now Playing as a dashboard that starts and stops (screen off and screen off) when the player is playing. Start a track in Roon - the screen turns on showing the Now Playing screen - pause or stop the track and 5 seconds later the screen goes dark. Works like a charm.
Thank you Arthur for your hardworking.
I would like to ask, is it possible that you can add the auto On/Off screen function?





