Storylane and Navattic make you author a demo screen by screen. I built an agent that takes a live URL and produces three things from one crawl: a narrated MP4 (Gemini TTS, burned-in subtitles), a click-through guided tour, and a free-roam offline sandbox stitched from the app's real captured DOM. It installs as a Claude Code, Codex, or Cursor skill.
The hard part is clicking real buttons on someone's production SaaS without nuking data or dropping the session. My coverage engine stamps a stable id on every clickable, re-finds each target after a fresh page load by position and identity, and fails closed on any mismatch. 37 destructive-label patterns and 20 auth-URL keys never get clicked; icon-only elements with no accessible name are treated as uncertifiable and skipped.
Built solo in about three weeks — a Python crawl-and-render core with a browser-side capture layer.
The hard part
Clicking production buttons without breaking anything
To capture a real app you have to click real buttons — and a wrong click deletes a record or logs you out. My coverage engine stamps a stable id on every clickable, then re-finds each target after a page reload by both position and identity, failing closed on any mismatch. A never-click policy of 37 destructive-label patterns (delete, revoke, deactivate…) and 20 auth-URL keys is matched across path, query, and fragment, and anything without an accessible name is skipped as uncertifiable.
Highlights
- Shipped 3 outputs from one crawl: a narrated MP4 (Gemini TTS + burned-in subtitles), a click-through tour, and an offline sandbox of real captured DOM.
- Built a never-click safety policy — 37 destructive-label patterns and 20 auth-URL keys matched across path, query, and fragment; pages with password fields are never captured.
- Wrote a 273-line DOM serializer that freezes a hydrated SPA into one self-contained HTML file, inlining CSSOM-only rules and stripping hidden and password values so no session tokens leak into shared bundles.
- Killed the audio click at every slide boundary by re-rendering the video in one ffmpeg concat-filter pass instead of per-slide AAC segments joined with -c copy.
- Held ~40 screens in ~10 minutes at $0.05–$0.15 per deep sandbox with URL-template clustering and layered wall-clock, screen-count, and per-page click budgets.
Stack