A control panel that wraps two Zigbee2MQTT instances and a code-server in persistent iframe tabs, so
the whole Zigbee setup is reachable from one page. Tabs backed by a Kubernetes deployment get a
restart button that triggers a rollout restart, and the panel streams each tab's live status —
running, restarting, error — over Server-Sent Events, so the tab icons stay in sync without a
refresh. The tabs come from a YAML file supplied at APP_TABS_CONFIG; there is no database and no
persisted state.
backend/— Flask. Serves the tab configuration, triggers the rollout restarts and publishes the status events to the browsers over its own SSE stream. OIDC authentication, off by default in development.frontend/— React 19 + TypeScript + Vite, with an API client generated from the backend's OpenAPI spec, covered end to end by Playwright.
The repo builds and runs inside a KubeCoder environment, which supplies the Python and Node toolchains. From the repository root:
kc project setup # install dependencies and seed the .env files
kc project build # build the frontend
kc project test # backend pytest, frontend Playwright
kc project lint # ruff, mypy and vulture; eslint, tsc and knip
scripts/dev.py # the dev stack: frontend :3200, backend :3201backend/README.md— running the service alone, and its HTTP API.frontend/README.md— the Vite toolchain notes the app was scaffolded with.CLAUDE.md— orientation for a development session.