1 Wallboard
David Spitzer edited this page 2026-10-14 15:04:05 -07:00

Wallboard

This page mirrors docs/wallboard.md in the repository. Update both together.

/wall is a view built for a wall-mounted screen. It shows as much of your lab as will fit on one display, with healthy things quiet and problems loud. It needs no mouse or keyboard.

Wallboard with three issues

Wallboard, all normal

Blue means normal, red means a problem. A problem pulls the whole board toward red: the status card turns solid red and names the issues, and the affected panel gets a red border. Shape and words carry the meaning as well as color (an offline node says OFFLINE, an overdue backup says OVERDUE), so the board still reads for people who cannot tell the colors apart.

What is on the board

Panel Data comes from Shows
Status All integrations Issue count and the issues, in full sentences. "All normal" otherwise.
Timeline Server-side status history The most recent status changes.
Compute Proxmox Cluster CPU and memory, per-node CPU and memory bars, guests running.
Storage Storage Health Every volume: usage bar, free space, temperature, healthy disks.
Backups Proxmox Oldest and newest guest backup, coverage, failures. A guest backup older than 26 hours or a guest with no backup turns it red.
Network UniFi Clients, devices and access points online, WAN line, clients per network.
Downloads qBittorrent, SABnzbd Speeds, active counts, errors and failures, free space, a one-minute speed graph.
Media Plex, Seerr, Kavita, Navidrome Who is watching what, pending requests, library sizes.
Services Uptime Kuma Up to 40 monitors; problems turn solid red.

A panel whose module is not configured says so instead of showing fake numbers. Some details need data the dashboard does not collect yet (WAN throughput as numbers, backup jobs and replication, TrueNAS disk temperatures); they will appear as those integrations grow.

Opening it

There are two ways in.

Signed in. Browse to https://your-dashboard/wall while logged in. Good for a laptop or a quick look.

With a display key. A wall screen has nobody to type a password, so you can give it a read-only key:

  1. Generate a long random value (at least 24 characters). For example, on any machine with Node: node -e "console.log(require('crypto').randomBytes(24).toString('hex'))".
  2. Set it as DASHBOARD_DISPLAY_KEY on the dashboard container and restart it.
  3. Open https://your-dashboard/wall?key=THE-KEY once on the display. The page stores the key in that browser and removes it from the address bar. After that, /wall alone works, even after a reboot.

What the key can and cannot do:

  • It only opens the live data connection. It cannot read or change settings, users, backups or any admin page.
  • Guessing is rate limited, and a key shorter than 24 characters is ignored.
  • Anyone who has the key can see your lab status (service names, alert text, host names, capacity). Keep the dashboard on your LAN, or behind your reverse proxy's access rules, and treat the key like a password. To revoke it, change the variable and restart; the display will show NOT AUTHORIZED until you give it the new key.

Setting up the screen

The wall needs something that can run a current browser and stay awake. A mini PC, an Intel NUC or a Raspberry Pi 4 or 5 works well. Smart-TV built-in browsers tend to sleep, drop connections or run old browser engines, so they are not recommended.

Open the page in kiosk mode:

# Linux or Raspberry Pi OS
chromium-browser --kiosk --noerrdialogs --disable-infobars "https://dashboard.example.lan/wall"

# Windows (put a shortcut in shell:startup)
"C:\Program Files\Google\Chrome\Application\chrome.exe" --kiosk --noerrdialogs "https://dashboard.example.lan/wall"

Double-click the page to toggle fullscreen if you are not using kiosk mode. Turn off the PC's screen saver and sleep so the display stays on, and use the TV's own power schedule if you want it off overnight.

Screen size and viewing distance

The board is laid out on a fixed 1920 x 1080 canvas and scaled to the screen, so the same layout fills a 4K TV (scaled 2x, much sharper) or any other size. On a screen that is not 16:9 it is centered with empty bars rather than stretched.

Packing a lot onto one screen means the smallest text is small. This table shows how the smallest text (20 px on the canvas) reads at a given screen size and distance. The big numbers are two to three times larger and stay readable farther away.

Screen 2 m 3 m 4 m 5 m
55" comfortable readable, strain too small too small
65" comfortable readable, strain too small too small
75" comfortable comfortable readable, strain too small
85" comfortable comfortable readable, strain too small

"Comfortable" means the smallest text subtends at least 14 arcminutes, "readable" 10 to 14. If your seat is far from the screen, buy a bigger TV rather than shrinking the text. The mockup in design/wallboard-max.html has a calculator for any size and distance.

When something goes wrong

A wall display that quietly shows old data is worse than none, so it refuses to look healthy when it cannot be trusted:

  • If no new data arrives for 20 seconds the "updated Ns ago" label turns red.
  • After 90 seconds a full-screen NO LIVE DATA message covers the board. It reconnects automatically with a growing delay, up to 30 seconds between attempts, and the board returns on its own.
  • If the key or session is refused, it shows NOT AUTHORIZED.

Burn-in

The whole board drifts a few pixels every 15 minutes or so, which helps OLED and plasma panels. It is subtle but not a guarantee; use your TV's pixel-shift or screen-care features too.

Demo mode and screenshots

DASHBOARD_DEMO=ok or DASHBOARD_DEMO=warn makes the server show synthetic data only (a six-node cluster, five NAS volumes, a Plex stream and so on). It never contacts a real service. Use it to preview the wallboard, try changes to the UI, or take screenshots without exposing anything real. Never set it on a real deployment.

DASHBOARD_DEMO=warn DASHBOARD_DISPLAY_KEY=an-example-key-of-24-chars-or-more npm start
# then open http://localhost:3000/wall?key=an-example-key-of-24-chars-or-more

All the images in the README and these docs are produced from demo mode by one script:

npm run build
npm run docs:screenshots

It needs Chrome or Edge installed (set CHROME_PATH to use another browser) and writes into docs/images/.