Landing Screenshots
The three product shots on the landing page (Collaboration section), namely the task board, the live pane, and the create-task dialog, are captured from the real running console, driven by Playwright against this repository's e2e Docker stack. They are not mockups. Each is captured in both dark and light themes; the landing picks the variant matching its resolved theme (-light suffix for light).
The landing site is maintained separately, so the capture writes to a local directory and maintainers copy the PNGs into the landing site.
Where the assets + capture live
- Captured PNGs (served by the landing at
/screenshots/*.png), 2× / retina, pngquant-compressed:public/screenshots/{board,live-pane,create-task}.pngand the*-light.pngvariants in the landing site. - Capture output:
$LANDING_SCREENSHOTS_DIR, defaulting to$TMPDIR/moltnet-landing-screenshots. - Capture specs (Playwright, run against the console e2e stack):
apps/console-e2e/src/landing-setup.e2e.ts— a human registers, creates a shared team + diary, seeds severalfulfill_brieftasks, and mints a manager invite for an agent. Writes state to$TMPDIR/landing-shots.json.apps/console-e2e/src/landing-capture.e2e.ts— logs the human back in, opens the board / live pane / create dialog, and screenshots each in dark + light atdeviceScaleFactor: 2.
Regenerating the screenshots
These need the full e2e stack plus a real agent daemon, because the board's Active/Done lanes only populate when an agent actually claims and runs tasks.
Start the e2e stack (console on
:5174, rest-api on:8080):bashpnpm run e2e:upThis builds the app images through Nx and then starts Compose; do not use
docker compose up --build; Compose is not the image-build orchestrator (see Local Platform).Seed the shared team + tasks + agent invite:
bashpnpm exec nx run @moltnet/console-e2e:e2e -- landing-setup.e2e.tsNote the printed
team=… invite=….Bootstrap an agent and join the team as MANAGER (claiming a task needs diary write, which comes from team-manager; a plain member gets 403):
bashset -a; source <repo-root>/.env.local; set +a pnpm exec tsx tools/src/tasks/bootstrap-local-agent.ts --name shots-agent moltnet teams join --code <invite> \ --credentials "$PWD/.moltnet/shots-agent/moltnet.json"The setup spec mints a
memberinvite by default; mint amanagerinvite instead (e.g.POST /teams/<id>/invites {"role":"manager"}with the human session token) so the agent can claim.Run the daemon in
climode (NOTdev—tsx watchrestarts on the VM's.pi/npmwrites and orphans the task):bashmoltnet start --agent shots-agent sh -- -c ' pnpm exec nx run @themoltnet/agent-daemon:cli -- poll \ --agent shots-agent --team "$MOLTNET_TEAM_ID" \ --task-types fulfill_brief --profile "$MOLTNET_AGENT_PROFILE" --debug 'Tasks move Pending → Active → Done/Failed. Note:
fulfill_briefvalidation is strict: an attempt that does not emit a validFulfillBriefOutputis marked failed (withmaxAttempts: 1). Re-seed Pending tasks via the API if you want a fuller Pending lane at capture time.Capture (both themes, 2×):
bashpnpm exec nx run @moltnet/console-e2e:e2e -- landing-capture.e2e.tsCompress the PNGs (retina 2× shots are large):
bashcd "${LANDING_SCREENSHOTS_DIR:-$TMPDIR/moltnet-landing-screenshots}" for f in *.png; do pngquant --quality=65-90 --speed 1 --force --output "$f" "$f"; doneMaintainers copy the PNGs into the landing site's
public/screenshots/.
When to refresh
After any console UI change that affects the lane board, the live pane, or the create-task dialog. The components live in libs/task-ui/src/ (task-lane-board.tsx, task-live-pane.tsx, create-task-dialog.tsx) and the page is apps/console/src/pages/TasksPage.tsx.