Location + house name are now KIOSK_URL query params (zip geocoded to coords + place + timezone). Drop the hardcoded 55331/America/Chicago language; record the defaults and how to point a screen at another house. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6.1 KiB
Kiosks (wall displays)
Full-screen web kiosks on the two Nest compute nodes, each driving its attached display (DP/HDMI) via Chromium. Run as Kubernetes pods on the msp001 cluster (the Nest site). Infra/build/troubleshooting: see fritzlab skill msp001.md + the fritzlab/kiosk repo.
Location + house name are query params on KIOSK_URL, so
one page serves any household: ?zip=<us-zip>&name=<House%20Name>. name sets
the eyebrow + tab title; zip is geocoded once at load (Zippopotam.us) → lat/lon
- "City, State" place line, and Open-Meteo runs
timezone=autoso the clock follows that zip's timezone. No params → Hawks Nest / Minnetrista 55331 /America/Chicagodefaults (bad zip falls back to these too). To point a screen at a different house, setKIOSK_URL=https://kiosk.vino.network/?zip=...&name=...per pod via GitOps (see for the apps-repo edit + hard-refresh).
"Update the kiosk page" = edit the page content, NOT the KIOSK_URL: edit
html/index.html (or 404.html) in that repo, commit + push to main → the
Publish Gitea Action (site-publish) syncs to the bucket in ~30s. Verify with
curl -s https://kiosk.vino.network/.
How screens actually pick up a new deploy: the Chromium kiosk fetches the
URL ONCE at pod start and never re-polls on its own (entrypoint.sh only
re-fetches if cage/chromium exits or the pod restarts) — Cache-Control: must-revalidate alone does NOT update a running screen. So the PAGE must
self-reload. index.html polls its own ETag every 5m and location.reload()s
only when it changes (no periodic flashing). Any new kiosk page MUST carry that
ETag-poll snippet, else the screens stay on the old content until a pod restart.
kubectl --context msp001 get pods -n kiosk (want 1/1 Running). On-screen page check needs a screenshot via Chromium CDP (localhost-only) — see fritzlab msp001.md . Blank-screen causes: (1) cage logs Swapchain for output ... failed test on repeat → dirty DRM/GBM state from an UNCLEAN prior exit; (2) getty@tty1 re-took DRM master (re-mask on the node); (3) page down (Chromium holds last-good frame).
Restart kiosk pods GRACEFULLY — never --force/--grace-period=0. A hard kill stops cage from dropping DRM master, leaving the next cage with a dirty swapchain → black. Use kubectl --context msp001 delete pod -n kiosk -l node=host101 (or rollout restart deploy -n kiosk). The image self-heals a wedged swapchain in-pod (entrypoint kills+relaunches cage after 5 swapchain failures) and a tcpSocket:9222 liveness probe restarts a dead Chromium — but a clean shutdown is still the first line of defense. Recovery for an already-black screen = one graceful delete. (Diagnosed + hardened 2026-06-01.)
Want a dashboard, photo slideshow, or Home Assistant wall panel instead of a website — just point KIOSK_URL at it (e.g. https://home.vino.network). home-assistant for HA URLs.