One of these is required. The rest degrade — and degrading means the page says what is missing, never that it quietly publishes something weaker and lets you assume it is complete.
Capture
RequiredDriving the app and photographing it. This is the walk.
Satisfied by
Playwright ChromiumLocal tool
The default. The only backend that does video and a pinned clock.
npx playwright install chromium
A Chrome on port 9222Local tool
The way past an SSO or MFA gate: it reuses a browser a human already signed into.
iOS SimulatorLocal tool
Real MobileSafari. The only backend where lvh − svh is the actual URL-bar height.
Android platform-toolsLocal tool
adb screencap and screenrecord against an emulator or a tethered device.
Without it
Nothing can be walked. This is the only hard requirement.
Writing
OptionalPersona bios, step descriptions, captions, findings, the narration script.
No key needed — the agent running the walk already does this.
Satisfied by
The agent running the walkNo key — the agent does it
Always available, by definition. This is why the system asks for no key to produce prose.
OpenAI text modelNeeds a key
Only for the unattended scripts that run with no agent in the loop. Override the model with OPENAI_TEXT_MODEL.
OPENAI_API_KEY
Without it
Nothing degrades when no key is set — the agent writes it.
the skill, inline · pnpm persona:story (script only)
Generated illustration
OptionalPersona portraits, scene-setters, moment shots and the shared stipple plates. All invented, all labelled 'illustration' in the UI, none of it evidence.
Satisfied by
The agent running the walkNo key — the agent does it
A host that can generate an image writes the plate directly to public/walkthroughs/<slug>/personas/ and no provider is configured at all.
OpenAI image modelNeeds a key
One key, one endpoint. The default model is checked against /v1/models rather than remembered — ids move, and a stale one fails only at generation time. Override with OPENAI_IMAGE_MODEL.
OPENAI_API_KEY
Without it
A persona card renders as a typographic panel carrying the two facts that actually identify one — where they enter the product, and how many of their journeys have been walked — and the journey masthead simply omits the portrait. Every page still works, and none of them claims a face that was never drawn.
pnpm persona:art · pnpm persona:moments · pnpm creatives
Narration
OptionalThe spoken track on a persona story video.
Satisfied by
OpenAI gpt-4o-mini-ttsNeeds a key
Chosen automatically the moment OPENAI_API_KEY is present. The same key as illustration — there is only one.
OPENAI_API_KEY
Local Kokoro modelLocal tool
Weights download on first use to ~/.cache/walkthrough-studio. No key, no account. The ffmpeg on PATH must also have been built with text rendering — Homebrew ships builds without libfreetype, and the story renderer burns its caption into the frame.
needs uv, ffmpeg on PATH
Without it
The story video is not rendered. The journey page it summarises is unaffected, and the walk's own screen recording is still attached to it.
pnpm persona:story · pnpm tts:sample
Target-app credentials
OptionalReaching gated features in the app being walked.
Satisfied by
A $VAR placeholder in projects.jsonNeeds a key
projects.json is committed, so it names the variable and .env.local holds the value.
Without it
The gated feature is recorded as pending with the reason, and a finding is filed. It is never unblocked by editing the app.
any walk against an app with an auth gate