# LibrePortal — agent notes ## Verify WebUI changes visually before marking them done After changing anything user-visible in the WebUI (`containers/libreportal/frontend/`), confirm it actually renders correctly — syntax checks and type-correctness don't catch layout or visual regressions. The maintainer's dev environment provides a headless screenshot helper, `lp-shot`, that captures a WebUI route (or a single element, via a trailing CSS selector) to a PNG for review: ``` lp-shot /admin/system # full route -> /tmp/webui-shot.png lp-shot /admin/system /tmp/x.png 12 ".sys-strip" # just one element, crisp ``` Use it (and read the PNG) to self-check UI work instead of assuming it looks right or asking the user to look. Skip it for purely backend/non-visual edits. If `lp-shot` isn't present, fall back to asking the user for a screenshot. Every route except `/` is behind the WebUI login, and `lp-shot` handles that itself — it signs a one-hour session from the `jwtSecret` the backend stores in `frontend/.auth.json`, the same token `/api/auth/login` would issue. No password is involved (the stored one is a bcrypt hash). So no setup: just run it. Override with `LP_SHOT_TOKEN`, or `LP_SHOT_USER`+`LP_SHOT_PASS`, when shooting a remote instance. `lp-shot --help` lists the rest (`LP_SHOT_URL`, `LP_SHOT_VIEWPORT`, `LP_SHOT_SCALE`, …). If a shot comes back as the boot splash, the page wasn't ready — `lp-shot` waits for `#libreportal-loading-screen` to leave the DOM, so a splash in the PNG means boot genuinely stalled. Read the `page error:` lines it prints to stderr. Testing against the live WebUI means updating the running install, not just the repo: `/libreportal-containers/libreportal/frontend/` is bind-mounted into the container, so copying changed files there (owned `dockerinstall:dockerinstall`) takes effect on the next browser load — no rebuild or restart. Diff before you copy; the live tree can hold changes the repo doesn't.