The kiosk page is now an iOS-Weather-style animated sky (sun/moon arc by time-of-day, accurate moon phase, dawn/dusk glow) reflecting Open-Meteo weather_code + wind: clear/partly/cloudy/fog/drizzle/rain/sleet-ice/snow/ blizzard/storm/hail + stars + lightning. Refresh the reference summary + keywords (index entry was also pending). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.5 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.
"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.