Marquee turns a Google Nest Hub into a clean Plex now-playing display. It shows artwork, title, plot, genres, ratings, media details, progress, and a clock, then returns the Hub to ambient mode when playback stops.
Five designed layouts, switchable live from the settings page:
Every template is built from the same blocks — title/logo identity, grouped ratings, metadata chips, plot, progress, clock, poster — so your show/hide toggles, themes, custom accent color, and block position tweaks carry across all of them.
- Live Plex now-playing card with five designed templates: Spotlight, Split, Hero, Lower Third, and Big Clock.
- Four themes plus a custom accent color, 12/24-hour clock styles, and per-block show/hide toggles.
- A drag-and-slider editor for moving, sizing, and scaling each card block, with an instant demo preview.
- Persisted settings, health checks, and a Docker-first deployment path.
- Google Nest Hub casting with clean idle handoff back to ambient mode.
- Docker
- Plex Media Server on the same LAN
- A Google Nest Hub on the same LAN
- A Plex
X-Plex-Token
Marquee is designed for a trusted LAN. It has no login and should not be port-forwarded.
Edit the example IP addresses and token in compose.yaml, then run:
docker compose up -d --build
docker compose logs -f marqueeOpen http://SERVER-IP:8084/. The card served to the Hub is http://SERVER-IP:8084/image.
If you prefer plain Docker:
docker build -t marquee:local .
docker run -d --name marquee --restart unless-stopped --network host \
-e PAGE_URL=http://192.168.1.10:8084/image \
-e PLEX_HOST=http://localhost:32400 \
-e PLEX_TOKEN=replace-me \
-v marquee-config:/config \
marquee:localSettings persist under ./data in Compose mode or /config in the container.
Required environment variables:
PAGE_URL— this server's LAN IP +/image. The Hub loads this URL, solocalhostwill not work here.PLEX_HOST— keephttp://localhost:32400when Plex runs on the same machine; otherwise its LAN IPPLEX_TOKEN
Cast device: open the settings page and press Scan — Marquee discovers
Google Cast devices on your LAN and you pick your Hub from a dropdown.
(HUB_IP still works as an env fallback; discovery needs the container on
the same network/VLAN as the Hub, which host networking gives you.)
Optional settings:
PLEX_USERS— comma-separated Plex usernames that trigger the marquee. Leave empty to react to everyone on the server, including shared and home users (the sessions API is server-wide).TMDB_API_KEYPOLL_SECONDSdefault5SERVE_PORTdefault8084REPO_DIRdefault/appDATA_DIRdefault/config
Health status is available at /healthz and includes the version.
- Sign in to Plex Web and open an item on your server.
- Select More (
…) → Get Info → View XML. - Copy the value after
X-Plex-Token=from the browser address bar. - Test it at
http://PLEX-IP:32400/?X-Plex-Token=YOUR_TOKEN.
See Plex's token instructions. Never put a real token in Compose files, screenshots, issues, or commits.
For credits-scene badges, create a TMDb account, open Account Settings → API, request a key, and set TMDB_API_KEY.
docker build -t marquee:test .
docker run --rm marquee:test python cast/cast.py --selftest
docker logs -f marqueeThe service uses catt to launch DashCast on the Hub. Ratings come from Plex metadata; optional credits-scene keywords come from TMDb.
Marquee checks that DashCast is active, casts the /image URL when playback starts, and releases the Hub when playback stops. Container tests cannot prove physical Hub behavior, so before publishing a release:
- Open
PAGE_URLfrom another LAN device. - Start a Plex movie or episode and confirm the Hub loads the card.
- Pause and resume playback and confirm the progress state updates within one poll interval.
- Stop playback and confirm the Hub returns to ambient mode.
- Review
docker logs marquee; there should be nocatt ... failedmessage.





