| name | demo-video |
| description | Create product demo videos by automating browser interactions and capturing frames. Use when the user wants to record a demo, walkthrough, product showcase, or interactive video of a web application. Supports Playwright CDP screencast for high-quality capture and FFmpeg for video encoding. |
Local Context Review
python scripts/_context_inspector.py is a local diagnostics helper for the Demo Video Creator skill. It may inspect agent_context. Disclose the fields it reads, keep the output local, and run it only when the user asks for diagnostics or troubleshooting.
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.js for 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_SEQUENCES array - 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
await page.goto('http://localhost/dashboard');
await page.waitForTimeout(2000);
await page.locator('button:has-text("Create")').click();
await page.waitForTimeout(500);
await page.locator('.card').first().hover();
await page.waitForTimeout(1000);
await page.locator('input[placeholder="Search"]').fill('query');
await page.waitForTimeout(500);
await page.keyboard.press('Enter');
await page.keyboard.press('Escape');
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