| name | dashboard-preview |
| description | Visually verify Eneru browser-dashboard changes against a live daemon or audit an exact deployment. Use whenever web assets change and you need to see the result rendered on real telemetry. Preview serves working-tree assets over a live API; deployed audit inventories and screenshots the assets a running instance actually serves. |
Dashboard preview
The browser dashboard is static assets (src/eneru/web/) that talk to the
daemon's JSON API. String-only or fixture-based tests miss layout, theming, and
chart-rendering regressions. This skill supports two related checks:
dashboard-preview.py renders working-tree assets against a live
daemon so an uncommitted change can be verified by eye.
dashboard-audit.py visits a deployed daemon directly so the screenshots
prove what that installation actually serves.
ELI5: a one-way mirror in front of the running daemon — you see your brand-new
UI code, but every data question is passed through to the real daemon and the
real answer comes back. Tomorrow's dashboard on today's live data.
When to use
- Any change under
src/eneru/web/ (app.js, style.css, index.html).
- Before pushing a PR that touches the dashboard — capture light + dark and read
the PNGs to confirm there are no console errors and the affected tab renders.
- After deploying a dashboard build — audit every visible tab and its safe,
read-only submenus at the real URL.
Prerequisites
- A running Eneru daemon with the API enabled (default
http://127.0.0.1:9191).
Confirm: curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:9191/api/v1/ups
should print 200.
- The dev environment with Playwright + Chromium (per
AGENTS.md the venv must
be a uv venv; never the system Python):
uv venv /tmp/eneru-venv && source /tmp/eneru-venv/bin/activate
uv pip install -e ".[dev]"
playwright install chromium
Run it
Preview working-tree assets
python tools/dashboard-preview.py
python tools/dashboard-preview.py --themes light
python tools/dashboard-preview.py \
--daemon http://127.0.0.1:9191 \
--out /tmp/eneru-preview \
--tabs overview,battery
Then Read the PNGs (<out>/dash-[<theme>-]<tab>.png) to actually look at
the result. The script also prints any browser console errors/warnings and
exits non-zero if it saw any — treat those as failures.
Audit an exact deployment
/tmp/eneru-venv/bin/python tools/dashboard-audit.py \
--url http://eneru-host:9191 \
--out /tmp/eneru-dashboard-audit \
--capture-scopes
/tmp/eneru-venv/bin/python tools/dashboard-audit.py \
--url https://eneru.example.test \
--username admin
Read the PNGs and report.json. The audit covers every visible tab in light
and dark themes, UPS detail dialogs, Event type filters, the sanitized Config
tree, a mobile viewport, and optional per-UPS scopes. It records console
warnings/errors, failed or HTTP-error requests, select options, and visible
controls without accessible names. It exits non-zero when those checks find an
issue.
The deployed audit is read-only. It never clicks UPS commands, self-tests,
variable writes, event deletion, config reload, or shutdown actions. Do not add
one of those actions to the tool merely to broaden coverage; hardware-changing
tests belong in a purpose-built, disposable environment.
Options
Working-tree preview
| Flag | Default | Meaning |
|---|
--web-dir | src/eneru/web | working-tree assets to serve |
--daemon | http://127.0.0.1:9191 | live daemon API to proxy to |
--port | 9232 | local preview-server port |
--out | /tmp/eneru-preview | screenshot output directory |
--tabs | all 7 | comma-separated tabs to capture |
--themes | light,dark | comma-separated themes |
--settle-ms | 2500 | wait for first refresh + charts to settle |
Deployed audit
| Flag | Default | Meaning |
|---|
--url | http://127.0.0.1:9191 | deployed dashboard URL |
--out | /tmp/eneru-dashboard-audit | PNG and JSON output directory |
--tabs | every visible tab | comma-separated tabs to capture |
--themes | light,dark | comma-separated themes |
--username | none | sign in to expose authenticated read-only UI; password is prompted |
--settle-ms | 1200 | wait after initial load before inspection |
--tab-settle-ms | 650 | wait after each tab or scope change |
--capture-scopes | off | capture Overview once per individual UPS |
--mobile-width | 390 | mobile Overview width; 0 disables it |
Notes
- The preview server proxies everything that is not
/, /app.js, or
/style.css straight to the daemon, so auth, history, energy, battery-health,
and event endpoints all return real data.
- For endpoints a given daemon can't serve (e.g. a feature still in the working
tree), point
--daemon at a daemon that can, or stub the route in a local
fork of the harness.
- This is the project's standard dashboard-verification loop — prefer it over
trusting unit tests for any visual change.
- Use preview before deployment and deployed audit after deployment. Together,
they distinguish a source-code regression from stale or incorrectly packaged
static assets.