A self-contained example that records a demo video of Argo's own showcase page.
example/
├── app.html # Argo showcase page (the thing being demo'd)
├── demos/hello-world.demo.ts # Playwright script with narration + overlays
├── demos/hello-world.scenes.json # Scenes manifest (voiceover + overlay cues)
├── argo.config.mjs # Argo configuration
└── package.json # Dependencies
# Install dependencies + Playwright browsers
npm install
npx playwright install webkit
# Start the page server (in a separate terminal)
npm run serve
# Validate scene names match (optional dry run)
npm run demo:validate
# Record the demo video
npm run demoThe finished video will be in videos/hello-world.mp4.
- Brewing — Kokoro generates voiceover clips from
hello-world.scenes.json - Rolling — Playwright opens the showcase page, scrolls through sections, shows overlays
- Mixing — Voiceover clips are placed at each scene's recorded timestamp
- Cutting — ffmpeg merges the screen recording + narration into an MP4
Demo script (demos/hello-world.demo.ts):
- Imports
testfrom@argo-video/cli(not@playwright/test) - Uses
narration.mark('scene-name')to define scene boundaries - Uses
narration.durationFor('scene-name')for timing based on voiceover length - Uses
showOverlay()/withOverlay()for on-screen annotations - Uses
showConfetti()for the mic-drop moment
Scenes manifest (demos/hello-world.scenes.json):
- Each
scenemust exactly match anarration.mark()call textis spoken only (never displayed) — use phonetic spelling for tricky wordsvoice:af_heart(female, default) oram_michael(male)speed: 0.9-1.0 works well for narrationoverlay: optional sub-object defining what appears on screen for this scene
Config (argo.config.mjs):
- Uses
defineConfig()for type-safe defaults webkitbrowser for best video quality on macOSautoBackground: truefor contrast-aware overlays