Roon Now Playing — A Simple "Always-On" Display Extension

You’re welcome! Would you care to elaborate what you mean with Auto On/Off screen? Currently, the application has no control over the screen. It is just a web page. I can recommend something like FullyKiosk or similar Android Apps that allow you to control the tablet using home assistant (to turn the screen on/off).

Nice work. I wasn’t able to try it though, the app is still “Waiting for Roon Core pairing”. Am I missing something?

Have you authorized the extension inside Roon?

Tried it with a fresh docker install, I can activate the extension now. Roon is connected, zones were added. But I still can’t open the URL.

hi everyone apologies in advance Im a not a computer master pretty basic and curios can use this method using Roon on a synolgy NAS

Hi Arthur,

Thanks for getting back to me.

I installed the container using Docker Desktop on the same machine running my Roon Core. The container is up and running, but the Roon Core extensions menu isn’t showing the authorization request for roon-now-playing.

My docker-compose.yaml is below. Could you take a look and let me know what might be wrong? Also, as a side note, I couldn’t access localhost:3000 when I tried using network_mode: host.

version: ‘3.8’

services:
roon-now-playing:
image: Package roon-now-playing · GitHub
container_name: roon-now-playing
restart: unless-stopped
network_mode: host
volumes:

Persist artwork cache

  • artwork-cache:/app/cache

Persist Roon pairing, client names, and app configuration

  • roon-config:/app/config
    environment:
  • NODE_ENV=production
  • PORT=3000
  • HOST=0.0.0.0
  • LOG_LEVEL=info

Set to ‘false’ to disable Roon and run in external-sources-only mode

- ROON_ENABLED=false

Optional: API keys for AI-powered facts layouts

- ANTHROPIC_API_KEY=sk-ant-…

- OPENAI_API_KEY=sk-…

volumes:
artwork-cache:
roon-config:

Can you share the container logs? Are the ports already being used by another service?

Hi Arthur,

I managed to get it working with Node.js already.

I have an idea, though I’m not sure whether it’s possible. Could we make roon-now-playing display the album artwork from a WiiM device as well? I think many us nowadays own at least one WiiM device, so it could be a useful feature.

Best regards.

I’m happy to hear it.

And yes, it could absolutely. Today, you can already use the API to send any “now playing information”. Unfortunately, this needs to be wired by someone.

I don’t have a WiiM device, otherwise I could possibly write an extension for it. I think it should be feasible and fairly easy though.

Edit: here is the documentation for the API I mentioned roon-now-playing/docs/external-api.md at main · arthursoares/roon-now-playing · GitHub

Roon Now Playing v1.10.0 — Album History, Smart Idle, and Kiosk Controls

Hey everyone,

Roon Now Playing v1.10.0 adds two ways to enjoy recent listening, gives idle displays something useful to do, and makes dedicated touchscreens harder to change by accident. It also improves AI Facts and display reliability.

Album Wall and Album Gallery

Album Wall puts the current album front and center, with recently played albums alongside it. On a living-room TV, track details stay easy to glance at while recent covers show what you have been listening to.

Album Gallery is the artwork-only version: an edge-to-edge cover mosaic without headings, captions, or badges. Each cover remains intact inside its square tile; the viewport may clip the outside edges of the outer covers.

Both layouts keep up to 12 recently played albums per zone, grouped by artist and album name. History builds as you listen after upgrading, survives server restarts, and works with Roon and the External Sources API. Tracks from the same album do not create duplicates.

Smart Idle and Night Dimming

Enable Smart Idle under Admin → Display; it is off by default. After a zone has been paused or stopped for your chosen delay, the display can switch to a clock, a black screen, or another selected layout. Playback wakes it immediately; a tap or click wakes it too.

You can also schedule nighttime dimming using the display’s local time. This darkens the web page only; it does not change the device’s hardware brightness, power state, or sleep settings.

Tap Lock for Kiosk Screens

Every display now has a Disable tap controls setting in Admin and on its screen configuration page. It prevents accidental layout cycling and zone changes on wall-mounted tablets, shared touchscreens, and other kiosk setups. The per-display setting persists, is off by default, and Smart Idle wake gestures still work. Double-taps also now open the zone picker without the first click changing the layout underneath them.

More Reliable AI Facts

Facts layouts now handle malformed responses conservatively across every provider. If generation fails, artwork and track metadata remain visible instead of leaving a black screen. Local LLMs can generate facts without an API key when their server does not require one.

Advanced Facts settings now include Maximum output tokens, defaulting to 1024. Increase it when a response needs more room; the range is 1–65,536, though provider and model limits still apply.

This release also fixes font scaling for Basic text and the Fullscreen idle message, display settings lost on reconnect, and base64 artwork sent through the External Sources API.

How to update

Docker Compose, keeping your existing volumes:

docker compose pull roon-now-playing
docker compose up -d roon-now-playing

To pin this release, use ghcr.io/arthursoares/roon-now-playing:1.10.0 in your Compose file instead of latest.

Manual install:

git pull --ff-only
pnpm install --frozen-lockfile
pnpm build

Then restart the existing service with your usual process manager or service command. If External Sources API key protection is already enabled, keep the current key available: changing protection or rotating the key now requires it.

Thanks and links

Thanks to Leo Lobato for kiosk tap controls and font-scale fixes in PRs #18 and #19, MikeO3 for the detailed local-model report in #14, lmgithu for OpenRouter testing in #14 and the token-limit request in #16, and webbrain-one for the parser discussion and proposal in #21.

I would love to hear how Album Wall and Smart Idle fit into your setup, especially on always-on tablets and TVs. If you run into an odd screen shape, model response, or wake interaction, please share the display size and browser so I can reproduce it.

Edit: The two layouts are still very experimental, so feedback is much appreciated. I will likely do another small release soon with Codex OAuth support, and some revisions to the layouts in general.