Skills demo-video
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.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/0xs4m1337/demo-video" ~/.claude/skills/clawdbot-skills-demo-video && rm -rf "$T"
manifest:
skills/0xs4m1337/demo-video/SKILL.mdsource content
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
for the target appscripts/record-demo.js - 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
scripts/record-demo.jsTemplate 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:
array - define pages and interactionsDEMO_SEQUENCES
- where to save framesOUTPUT_DIR
- skip every Nth frame (lower = more frames)FRAME_SKIP
scripts/frames-to-video.sh
scripts/frames-to-video.shFFmpeg encoding script with presets:
- H.264, good quality/size balance (default)mp4
- Animated GIF for embeddinggif
- VP9, smaller fileswebm
Usage:
./frames-to-video.sh [input_dir] [output_name] [format]
Interaction Patterns
// 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