LibrePortal/CLAUDE.md
librelad 133f54cd4f docs: correct the lp-shot auth note — it signs its own session
The previous note was wrong: it said lp-shot needs a session handed to it
in the environment and that agents should ask the maintainer for one.

It doesn't. The backend keeps {username, passwordHash, jwtSecret} in
frontend/.auth.json and mints cookies as jwt.sign({sub}, jwtSecret), so a
tool on the host signs the same token /api/auth/login would issue — no
password anywhere (the stored one is a bcrypt hash). The env overrides
are only for shooting a remote instance.

Also note the boot-splash wait, since a splash in the PNG now means boot
actually stalled rather than the tool firing too early.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 22:05:51 +01:00

1.9 KiB

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.