Capture the real Roamgate UI against a real Herdr backend using the public Northstar demo, a fictional task board. Every shot tells one story: add a status filter, test it, and review it.
Use a dedicated OS account (for example demo) or a clean VM with only Bun,
Git, Herdr, Roamgate, and the public repositories. Keep personal projects,
browser profiles, shell/SSH config, and agent transcripts out of it, and use a
neutral hostname and a fresh browser profile. The OS account is the privacy
boundary: Roamgate reads agent history and settings from the user's home
directory, so a separate Herdr session alone is not enough.
Only include the PR status card if gh is already authenticated in that
environment and PR #1 is open with passing checks; do not copy private
credentials just for the card. Set an absolute XDG_STATE_HOME outside every
demo checkout.
Install root dependencies (Contributing), then clone the demo into a new, empty directory:
mkdir -p /tmp/roamgate-demo
git clone --branch main https://github.com/powerfooI/northstar-demo.git /tmp/roamgate-demo/northstar| Scene | Initial state | Use |
|---|---|---|
| Baseline | Clean main clone |
Give a real agent the task from the README. |
| Review | main plus the example implementation as unstaged changes |
Files, diff, preview, annotation, and PR shots. |
For the review scene, run this only in the fresh clone:
git -C /tmp/roamgate-demo/northstar switch --track -c codex/status-filter origin/codex/status-filter
git -C /tmp/roamgate-demo/northstar reset --mixed origin/main
git -C /tmp/roamgate-demo/northstar diff origin/main --statThe diff touches app.ts, index.html, styles.css, tasks.test.ts, and
tasks.ts from PR #1.
That PR is a prepared example; never present it as an agent's work. Record both
remote commit SHAs with the originals.
For sidebar shots, add three more clones:
git clone --branch main https://github.com/powerfooI/northstar-demo.git /tmp/roamgate-demo/documentation
git clone --branch main https://github.com/powerfooI/northstar-demo.git /tmp/roamgate-demo/release-qa
git clone --branch main https://github.com/powerfooI/northstar-demo.git /tmp/roamgate-demo/ui-previewbun test and bun run dev in the Northstar clone run the tests and the board
at http://127.0.0.1:4317. To repeat a scene, use a new destination directory
instead of resetting an existing checkout.
bun run demo:herdr runs Herdr with a clean environment and a dedicated
roamgate-demo session under /tmp/roamgate-demo/config (override with an
absolute ROAMGATE_DEMO_ROOT, the same in every terminal).
Start the server in one terminal:
bun run demo:herdr serverIn a second terminal, create the workspaces. Note the IDs each command returns:
bun run demo:herdr workspace create --cwd /tmp/roamgate-demo/documentation --label Documentation
# demo_docs_pane_id = .result.root_pane.pane_id
bun run demo:herdr workspace create --cwd /tmp/roamgate-demo/release-qa --label "Release QA"
# demo_qa_workspace_id = .result.workspace.workspace_id
bun run demo:herdr tab create --workspace "$demo_qa_workspace_id" --cwd /tmp/roamgate-demo/release-qa --label Tests --no-focus
# demo_qa_pane_id = .result.root_pane.pane_id
bun run demo:herdr workspace create --cwd /tmp/roamgate-demo/ui-preview --label "UI Preview"
bun run demo:herdr workspace create --cwd /tmp/roamgate-demo/northstar --label Northstar --focus
# demo_tab_id = .result.tab.tab_id, demo_pane_id = .result.root_pane.pane_id
bun run demo:herdr tab rename "$demo_tab_id" Implementation
bun run demo:herdr pane rename "$demo_pane_id" Implementation
bun run demo:herdr pane split --pane "$demo_pane_id" --direction down --ratio 0.65 --cwd /tmp/roamgate-demo/northstar --no-focus
# demo_checks_id = .result.pane.pane_id
bun run demo:herdr pane rename "$demo_checks_id" Checks
bun run demo:herdr pane run "$demo_checks_id" "bun test"For the desktop overview, install Pi in the capture account with its Herdr integration and run idle Pi sessions (no model calls) in three panes:
XDG_CONFIG_HOME=/tmp/roamgate-demo/config \
PI_CODING_AGENT_DIR=/tmp/roamgate-demo/pi-agent \
herdr --session roamgate-demo integration install pi
bun run demo:herdr pane run "$demo_pane_id" "PI_CODING_AGENT_DIR=/tmp/roamgate-demo/pi-agent PI_OFFLINE=1 PI_TELEMETRY=0 pi"
bun run demo:herdr pane run "$demo_docs_pane_id" "PI_CODING_AGENT_DIR=/tmp/roamgate-demo/pi-agent PI_OFFLINE=1 PI_TELEMETRY=0 pi"
bun run demo:herdr pane run "$demo_qa_pane_id" "PI_CODING_AGENT_DIR=/tmp/roamgate-demo/pi-agent PI_OFFLINE=1 PI_TELEMETRY=0 pi"Wait until Herdr reports agent=pi. In the Implementation pane, enter /new,
then !git --no-pager diff origin/main --stat to show the real diff summary
above the passing tests in Checks. For mobile, run
git status --short && bun test --dots in Checks. Rerun commands after changing
viewport size, and keep only one capture client attached.
Build and start the bridge:
bun run build:web
mkdir -p /tmp/roamgate-demo/runtime-state
XDG_STATE_HOME=/tmp/roamgate-demo/runtime-state bun server/src/index.ts --host 127.0.0.1 --port 8799 \
--socket-path /tmp/roamgate-demo/config/herdr/sessions/roamgate-demo/herdr.sock \
--client-socket-path /tmp/roamgate-demo/config/herdr/sessions/roamgate-demo/herdr-client.sockOpen http://127.0.0.1:8799, log in, and remove any token from the URL before capturing. To start over, stop the bridge and run:
bun run demo:herdr server stop
bun run demo:herdr session delete roamgate-demo --jsonAgent, history, working-status, and Last step shots need a real agent run.
In a fresh main clone, start a supported agent in Implementation and give it:
Read README.md. Add All, To do, In progress, and Done status filters to Northstar. Combine status with title search. Show an accessible empty result with a Clear filters button. Preserve the static HTML preview, add focused tests, and run them. Leave the changes uncommitted.
Use that run's own changes, test output, and transcript together; never pair an unrelated transcript with PR #1's code. Keep the session for later captures.
Dark theme, default accent, English UI, 100% browser zoom. Desktop viewport 1600 x 1000 and mobile 390 x 844, both at DPR 2, so originals are 3200 x 2000 and 780 x 1688 PNGs. In Chrome DevTools' device toolbar, pick Responsive, set the size and DPR 2, and use More options > Capture screenshot (viewport, not full page). Verify it is a real PNG of the right size with no browser chrome. JPEGs, converted, or upscaled images are not acceptable.
For the annotation shot, add Keep the status filter combined with title search. Clearing both filters should restore all six tasks. on new line 27 of
tasks.ts, pin the review panel, and leave the comment as a draft.
| Asset stem | Layout and selection | Ready condition |
|---|---|---|
roamgate-desktop-changes |
Nested sidebar; Pi in Implementation above Checks; Inspector right (~55%); Working tree, tasks.ts |
3+ workspaces and 2+ agent rows visible; Pi running; five files loaded; tests finished. |
roamgate-desktop-files |
Nested sidebar; expanded Inspector; Files, index.html Preview scrolled to Release checklist |
Styles loaded; heading, filters, and all six cards visible. |
roamgate-desktop-annotations |
Nested sidebar; tasks.ts unified diff with the draft |
Correct line and full comment visible. |
roamgate-desktop-history |
Agent History, all types enabled | The real task and its test tool call visible. |
roamgate-desktop-ranger |
Ranger pinned beside Northstar | A real answer with sources, using only demo workspaces. |
roamgate-mobile-changes |
Mobile Changes, Working tree, tasks.ts |
Key changed function readable. |
roamgate-mobile-terminal |
Mobile Checks pane with Composer and shortcuts | Real Git status and test summary visible. |
roamgate-mobile-files |
Mobile Files, index.html Preview |
Heading, filters, and first card readable. |
roamgate-mobile-ranger |
Mobile Ranger chat | The same real conversation with input and model controls. |
For Ranger, connect a model in the capture environment, allow only the demo workspaces, and ask it to summarize Northstar's uncommitted changes and test output. Never fabricate messages, tool results, or task runs.
Wait for content to settle rather than sleeping a fixed time. Do not crop, upscale, or sharpen; recapture instead.
Before publishing, check full size and README size for crisp text, and inspect
paths, hostnames, URLs, prompts, authors, and transcripts for anything private.
Keep originals outside the repo; compress losslessly without resizing (use
TinyPNG only with explicit permission, and do not call it lossless). Save
approved PNGs to docs/images/ with width="3200" height="2000" (desktop) or
width="780" height="1688" (mobile) on img tags, then run bun run build:site.
The README uses docs/images/roamgate-handoff.gif; the homepage uses
roamgate-handoff.mp4 with a roamgate-handoff.webp poster. Render a 13-second
English sequence at 1920 x 1200 and 15 fps from the original desktop Changes,
mobile Changes, and mobile Terminal captures, composited into device frames. It
illustrates a handoff; it is not a live recording. Export the GIF with a shared
palette, the MP4 as H.264, and the poster as lossless WebP, then check the full
loop at native and README sizes before replacing all three files.