Skip to content

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 only

The 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.

  1. Iterate with E2E_DEMO unset until the PNGs look right.
  2. Record with E2E_DEMO=1 (and E2E_DEMO_VIDEO=0 only if you want pacing without a camera).
  3. Do not drop shot for 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.

Released under the MIT License.