Video
Record video after the stills look right. E2E_DEMO=1 turns on Playwright recordVideo unless E2E_DEMO_VIDEO=0. The docs walk records desktop, tablet, and mobile unless E2E_DEMO_DEVICE picks one.
Output (relative to the Playwright cwd):
test-results/e2e-demo/stills/<stamp>/ # E2E_DEMO unset (or E2E_DEMO_VIDEO=0)
screenshots/ # teaching stills from shot
test-results/e2e-demo/video/<stamp>/ # E2E_DEMO=1 with video on
docs.webm # headed path — one file per persona id (lowercased)
walk.mp4 # headed path only — stitched focused chapters
manifest.json
transcript.txt
transcript.json
test-results/e2e-demo/stills/latest.txt
test-results/e2e-demo/video/latest.txt
test-results/playwright/ # Playwright failure dumps onlyThe fast path writes a stamp (transcript + stills) and skips recordVideo. Stamps accumulate. Playwright only cleans test-results/playwright. Pass E2E_DEMO_CLEAN=1 to wipe prior walks.
--headed is for live watching. The file is the page (overlay, cursor, viewport), headed or headless.
Setup so the recording does not freeze
Same walk as stills. shot stays on the teaching clicks. Playwemo does not hold the ring, write a still, or call page.screenshot() while the camera is rolling. Holding for a storyboard pose freezes the picture. Teaching PNGs come from the stills run.
- Iterate with
E2E_DEMOunset until the PNGs look right. - Record with
E2E_DEMO=1(andE2E_DEMO_VIDEO=0only if you want pacing without a camera). - Do not drop
shotfor the video run. Do not take a raw Playwright screenshot while the camera is rolling.
The gold ring pulses, then the click lands when that pulse is done, then a short pause. There is no held-ring beat on film. Stills CI still freezes CSS so the storyboard PNG is the held ring.
Stills and video are two runs. The storyboard pose (held ring, before the click) is not in walk.mp4.
Stitch
ffmpeg cuts each chapter from that persona’s webm (-ss after -i so WebM keyframe-seek does not land on standby), pads to an even viewport, and concats to walk.mp4. Without ffmpeg, persona webms still land; stitch logs a warning and skips walk.mp4.
Chat / PR copy
When artifactsDir exists (default /opt/cursor/artifacts), runDemoWalk copies walk.mp4 there. Override with E2E_DEMO_COPY_WALK=/absolute/path.mp4.
A Cursor Cloud Agent can put that file (and the stills) in the thread. See Cursor.