A small local-first toolkit stack for building, operating, and safely deploying Linux TV kiosks, local dashboards, signage screens, and appliance panels.
This is the map repo. The actual tools live in focused repositories.
One-line flow: Runtime → Remote → Shell → Widgets → Widget management → Live data → Safe config editing → Guarded deploy.
Bluetooth remote
↓
Linux TV kiosk shell
↓
Widget contracts
↓
Live data snapshots
↓
Guarded local config editing
↓
Guarded deploy
| Layer | Repository | Purpose |
|---|---|---|
| Runtime | linux-kiosk-appliance-runtime |
Canonical runtime layout, service topology, systemd templates, doctor/status, safe install, and smoke tooling. |
| Control Center | linux-kiosk-control-center |
Localhost web control surface for runtime health, service topology, real shell preview, widgets, settings, reports, and safe transaction preview. |
| Remote input | xiaomi-mitv-remote-linux-kiosk |
Use a Xiaomi/MiTV Bluetooth remote as a Linux kiosk/app controller, with lab reports and redacted hardware-validation submissions. |
| Kiosk shell | linux-tv-kiosk-shell |
Vanilla static TV dashboard shell with focus grid, modal details, local data, and remote action bridge. |
| Widget SDK | local-dashboard-widget-sdk |
Contract-first JSON widget manifests, renderer/source contracts, presets, catalog, scaffold, static browser catalog viewer. |
| Widget Manager | local-dashboard-widget-manager |
22 widget types, browser Widget Studio, schema-driven forms, preview, and safe export as config-editor transactions. |
| Live data | local-dashboard-live-data-updater |
Provider-based host-side snapshot generator that writes redacted live.json/live.js and exports config/snapshot JSON Schemas. |
| Config editing | guarded-local-config-editor |
Local transaction bridge: preview, diff, approval phrase, checkpointed apply, rollback, workspace profiles, result schema hook, profile-aware browser demo. |
| Deploy | guarded-kiosk-deploy |
Manifest-based safe deploys for fragile Linux kiosks: validate, plan, checkpoint, exact-file apply, verify. |
A Linux kiosk is not just a web page. A reliable kiosk needs:
- a physical control path that works from a couch or wall-mounted screen;
- a lightweight browser shell that does not require a heavy framework;
- explicit contracts for widgets and panel layout;
- backend-side data collection that avoids leaking secrets into browser code;
- guarded local editing so a UI cannot break config directly;
- deploy tooling that avoids blind
rsyncon a fragile production display.
This stack covers that full lifecycle while staying local-first and simple.
+-------------------------+ +---------------------------+
| Xiaomi / MiTV remote | | local data providers |
| /dev/input/event* | | system/rss/http/command |
+-----------+-------------+ +-------------+-------------+
| |
v v
+-------------------------+ +---------------------------+
| xiaomi-mitv-remote-* | | local-dashboard-live-* |
| writes KIOSK_REMOTE | | writes data/live.js |
+-----------+-------------+ +-------------+-------------+
| |
+----------------+-------------------+
v
+-----------------------------+
| linux-tv-kiosk-shell |
| static browser dashboard |
+---------------+-------------+
|
v
+-----------------------------+
| widget contracts/catalog |
| local-dashboard-widget-sdk |
+---------------+-------------+
|
config changes | deploy changes
v v
+--------------------------+ +---------------------------+
| guarded-local-config-* | | guarded-kiosk-deploy |
| preview/apply/rollback | | plan/apply/checkpoint |
+--------------------------+ +---------------------------+
git clone https://github.com/YURII-YURII86/linux-tv-kiosk-shell.git
cd linux-tv-kiosk-shell
python3 -m http.server 8080Open:
http://127.0.0.1:8080/
git clone https://github.com/YURII-YURII86/local-dashboard-live-data-updater.git
cd local-dashboard-live-data-updater
python3 -m venv .venv
. .venv/bin/activate
pip install -e .
ldlu inspect examples/live-config.json --json
ldlu schema config --output schemas/config.schema.json
ldlu schema snapshot --output schemas/snapshot.schema.json
ldlu run examples/live-config.json --output-json /tmp/live.json --output-js /tmp/live.jsFirst inspect/redact the config, then copy or symlink /tmp/live.js into the shell's data/live.js, then change index.html to load data/live.js instead of data/live.example.js.
git clone https://github.com/YURII-YURII86/xiaomi-mitv-remote-linux-kiosk.git
cd xiaomi-mitv-remote-linux-kiosk
python3 -m venv .venv
. .venv/bin/activate
pip install -e .
xiaomi-remote --lang ru help
LKR_GRAB=0 xiaomi-remote lab --output hardware-validation-report.json
xiaomi-remote submit hardware-validation-report.json \
--output hardware-submission.json \
--markdown hardware-submission.mdAfter pairing the remote and validating key codes, run the daemon against the kiosk root so it writes data/remote-action.js.
git clone https://github.com/YURII-YURII86/local-dashboard-widget-sdk.git
cd local-dashboard-widget-sdk
python3 -m venv .venv
. .venv/bin/activate
pip install -e .
ldw schema --output schemas/contracts.schema.json
ldw typescript --output types/contracts.d.ts
ldw validate examples/widgets examples/presets
python3 scripts/build_catalog_viewer.py
python3 -m http.server 8766 # open /examples/catalog-viewer/
# user-facing widget management
git clone https://github.com/YURII-YURII86/local-dashboard-widget-manager.git
cd local-dashboard-widget-manager
ldwm list
python3 -m http.server 8768 # open /examples/widget-studio/
# shell renderer coverage
node tests/widget_renderer_coverage.jsgit clone https://github.com/YURII-YURII86/guarded-local-config-editor.git
cd guarded-local-config-editor
python3 -m venv .venv
. .venv/bin/activate
pip install -e .
glce preview examples/config/app.json examples/config/tx-set-title.json \
--profile examples/profiles/kiosk-dashboard.profile.json
# profile configSchema validates the resulting plan.after before apply
python3 -m http.server 8767 # open /examples/static-editor/git clone https://github.com/YURII-YURII86/guarded-kiosk-deploy.git
cd guarded-kiosk-deploy
python3 -m venv .venv
. .venv/bin/activate
pip install -e .
gkd validate examples/manifests/static-kiosk.json
gkd plan examples/manifests/static-kiosk.json --source-root examples/sample-app
gkd apply examples/manifests/static-kiosk.json \
--source-root examples/sample-app \
--approve "APPLY static-kiosk-demo TO kiosk-demo" \
--dry-run \
--report-json /tmp/gkd-apply-report.json
./scripts/disposable_ssh_integration.shOnly run gkd apply after reviewing the plan and testing on a disposable target.
Verified across the published repos:
- each repo has a public GitHub repository;
- each repo has at least one release;
- each repo has GitHub Actions CI;
- each repo was fresh-cloned and smoke-tested after its hardening pass;
- each component repo now has a reproducible repository quality gate;
- public examples were sanitized and kept generic.
Still pending:
- real end-to-end hardware validation on a physical kiosk stack;
- real Xiaomi/MiTV remote validation after standalone extraction;
- non-local disposable VM/host validation for
guarded-kiosk-deploy apply; - full integration demo combining all six tools;
- screenshots/GIF/video demos.
Every component repo now has a reproducible ./scripts/repo_quality_gate.sh. See docs/quality-gates.md.
Recommended stack-level docs:
docs/status-matrix.md— current component releases, proof, and gaps.docs/integration-order.md— safe order for assembling the stack.docs/quality-gates.md— per-repo validation gates.
Good fit:
- local TV dashboards;
- browser kiosk mode;
- digital signage;
- local appliance panels;
- Raspberry Pi / NUC / Intel Stick style devices;
- weak Linux hardware where heavy frameworks are undesirable;
- deployments where breaking the live screen is painful.
Not a fit:
- cloud SaaS dashboards;
- full Grafana replacement;
- Android TV network remote control;
- mobile-first remote apps;
- multi-tenant web apps exposed to the public internet.
- Local-first.
- Browser reads bounded snapshots, not secrets.
- Physical remote support is first-class.
- JSON contracts before production UI.
- Preview before apply.
- Checkpoint before mutation.
- Exact-file deploys, not blind sync.
- Honest verification status.
| Repo | Current release | What is now materially stronger |
|---|---|---|
linux-kiosk-appliance-runtime |
v0.1.1 |
Runtime prefix layout, service topology, safe install approval phrase, systemd user unit templates, doctor/status/validate/smoke, disposable cross-repo E2E, quality gate. |
linux-kiosk-control-center |
v0.1.0 |
Localhost Control Center UI, runtime snapshot, real shell iframe preview, widget list, settings, reports, read-only bundle, safe widget transaction preview, screenshot gate. |
xiaomi-mitv-remote-linux-kiosk |
v0.2.8 |
Unified bilingual xiaomi-remote CLI, doctor, profiles, lab, hardware report artifact, redacted hardware submission flow, quality gate. |
linux-tv-kiosk-shell |
v0.2.0 |
Dependency-free DOM smoke validates render/focus/modal/remote bridge behavior. |
local-dashboard-widget-sdk |
v0.2.1 |
JSON Schema export, TypeScript definitions, committed generated artifacts, static browser catalog viewer, quality gate. |
local-dashboard-widget-manager |
v0.1.0 |
22 distinct widget types, examples, ldwm CLI, browser Widget Studio, safe glce transaction export, quality gate. |
local-dashboard-live-data-updater |
v0.2.1 |
Default redaction, inspect/redact, JSON Schema export, systemd user service example, quality gate. |
guarded-local-config-editor |
v0.2.2 |
Workspace profiles with file/op/path allowlists, HTTP enforcement, profile configSchema result validation, and profile-aware static browser demo. |
guarded-kiosk-deploy |
v0.2.1 |
Real rollback command, checkpoint missing markers, apply/rollback JSON reports, disposable localhost SSH/SCP apply+rollback proof. |
See docs/status-matrix.md for the full proof/gap matrix.
- End-to-end demo repository or folder.
- Kiosk stack diagram screenshot.
- Hardware validation notes.
- Real browser screenshots/GIFs.
- Disposable-host SSH deploy validation.
- Real Xiaomi/MiTV remote hardware validation with a physical remote.
- Full combined integration demo.
MIT. Each linked repository has its own MIT license.