Files
diskless-workstation/serving/kiosk-app
2026-06-19 04:00:47 +00:00
..
2026-06-18 12:03:45 +00:00
2026-06-18 12:03:45 +00:00
2026-06-18 12:03:45 +00:00
2026-06-19 04:00:47 +00:00
2026-06-18 12:03:45 +00:00
2026-06-18 12:03:45 +00:00
2026-06-18 12:03:45 +00:00
2026-06-18 12:03:45 +00:00
2026-06-18 12:03:45 +00:00
2026-06-18 12:03:45 +00:00
2026-06-18 12:03:45 +00:00

Fleet Kiosk App

A cyber sci-fi spaceship monitoring & control terminal — the page the diskless kiosk (weston + Chromium) loads at boot. Replaces the old single static serving/http/kiosk/index.html test page.

Built with Svelte 5 + Tailwind CSS v4 + Vite, served as a static bundle from its own nginx, and reverse-proxied at /kiosk/ by the main serving nginx (../http/default.conf). Fully self-contained — no CDNs or web fonts — so it renders on the air-gapped boot LAN (the stack's dnsmasq sinkholes external call-home).

Pages

Top navbar with five views, each with dummy telemetry:

  • BRIDGE — overview tiles, systems status, subsystem load, event log
  • REACTOR — core output/temp/containment, power distribution, fuel cells
  • NAVIGATION — heading/velocity, tactical radar plot, flight plan, FTL drive
  • LIFE SUPPORT — atmosphere mix, per-deck environment, recyclers
  • COMMS — channels, signal bars, message traffic

Routing is hash-based (#/power, #/nav, …) so deep links stay client-side and the proxy needs no SPA-fallback rewrite. A shared 1 Hz clock and small random-walk "jitter" helpers make the static data feel live.

Develop

npm install
npm run dev      # http://localhost:5173/kiosk/

Build the container

It builds as part of the serving stack:

cd ..            # serving/
docker compose build kiosk
docker compose up -d
# main nginx serves it at http://${SERVER_IP}/kiosk/  (kiosk_url default)

The container publishes on 127.0.0.1:${KIOSK_APP_PORT:-8088}; the host-network main nginx proxies /kiosk/ to it. To point the diskless kiosk here, keep the Packer kiosk_url=http://boot.fleet.lab/kiosk/ default (resolved to the serving host by the stack's dnsmasq).

Replacing the dummy data

All fictional telemetry lives in src/lib/data.js. A future runtime agent could swap these constants for a fetch() to a fleet API; the components only read from that module.