Demo Video Creator
Create polished product demo videos by automating browser interactions.
Overview
- •Plan the demo sequence (pages, interactions, timing)
- •Record frames using Playwright CDP screencast
- •Encode to video with FFmpeg
Quick Start
Prerequisites
- •Clawdbot browser running (
browser action=start profile=clawd) - •App accessible via browser (localhost or remote)
- •FFmpeg installed for encoding
Recording Workflow
- •Start the Clawdbot browser if not running
- •Navigate to the app manually or via
browser action=open - •Customize
scripts/record-demo.jsfor the target app - •Run:
node scripts/record-demo.js - •Encode:
bash scripts/frames-to-video.sh
Planning a Demo
See references/demo-planning.md for guidance on:
- •Structuring demo sequences
- •Timing and pacing
- •Interaction patterns
- •What makes demos compelling
Scripts
scripts/record-demo.js
Template Playwright script that:
- •Connects to Clawdbot browser via CDP
- •Starts screencast capture (JPEG frames)
- •Executes demo sequence (navigation, clicks, hovers, typing)
- •Saves frames to output directory
Customize for each demo:
- •
DEMO_SEQUENCESarray - define pages and interactions - •
OUTPUT_DIR- where to save frames - •
FRAME_SKIP- skip every Nth frame (lower = more frames)
scripts/frames-to-video.sh
FFmpeg encoding script with presets:
- •
mp4- H.264, good quality/size balance (default) - •
gif- Animated GIF for embedding - •
webm- VP9, smaller files
Usage: ./frames-to-video.sh [input_dir] [output_name] [format]
Interaction Patterns
javascript
// Navigation
await page.goto('http://localhost/dashboard');
await page.waitForTimeout(2000);
// Click element
await page.locator('button:has-text("Create")').click();
await page.waitForTimeout(500);
// Hover (show tooltips, hover states)
await page.locator('.card').first().hover();
await page.waitForTimeout(1000);
// Type text
await page.locator('input[placeholder="Search"]').fill('query');
await page.waitForTimeout(500);
// Press key
await page.keyboard.press('Enter');
await page.keyboard.press('Escape');
// Scroll
await page.evaluate(() => window.scrollBy(0, 300));
Tips
- •Timing: 2s on page load, 0.5-1s between interactions, 1.5s to show results
- •Frame skip: Use 3-5 for smooth video, 8-10 for smaller files
- •Quality: 85-90 JPEG quality balances size and clarity
- •Resolution: Browser window size determines output resolution
- •Loops: GIFs should loop seamlessly - end where you started