Give a URL and a goal. demo-dev operates the product, records the workflow, adds narration, frames the video, and exports a polished demo.
npx demo-dev demo --base-url https://your-app.com --prompt "Show the dashboard and create a new project" --frame --display-url app.example.comdemo-dev is organized as a Bun + Turborepo monorepo:
apps/
cli/ Published `demo-dev` CLI and library facade
web/ Website app scaffold and built-in public showcases
packages/
agent/ End-to-end demo pipeline orchestration
ai/ AI provider abstraction
browser/ Browser runtime: auth, probing, capture, Playwright sessions
core/ Config, filesystem, git, and media utilities
director/ Automatic visual direction for zooms and pacing
exporter/ Aspect ratio, resolution, and capture viewport profiles
quality/ Video quality checks and scoring
planner/ Demo planning and presentation copy refinement
render/ FFmpeg composition and visual planning
style-presets/ Visual presets for SaaS, launch, tutorial, and social videos
voice/ Narration scripts and TTS generation
types/ Shared product/demo types
demo-skill/ Agent skill packageThis mirrors the same broad separation as Expect, but the domain is demoing rather than testing: browser/runtime code, agent orchestration, rendering, voice, and the CLI can evolve independently.
bun install
bun run build
bun run typecheck
bun run demo -- --base-url https://your-app.com --prompt "Show the dashboard"
bun --filter @demo-dev/web devThe repo includes a controlled spreadsheet-style showcase for generating a README-ready public demo without depending on Google login or third-party app state.
Terminal 1:
bun run showcase:webTerminal 2:
bun run showcase -- --quality high --frame --output-dir artifacts-showcase-sheetdemo-dev opens your web app in a headless browser, navigates it like a human, records everything, adds AI narration, and renders a polished mp4.
- AI plans the demo from a natural language prompt
- Ghost-cursor moves the mouse with human-like Bezier curves
- Playwright screencast records continuously at 60fps
- CSS zoom animates smoothly into click targets (Screen Studio style)
- ElevenLabs / OpenAI / local TTS generates narration per scene
- FFmpeg composes the final video with speed ramps, browser frame, and audio
npm install -g demo-dev
npx playwright install chromiumGenerate a demo:
demo-dev demo \
--base-url https://your-app.com \
--prompt "Show the onboarding flow and invite a teammate" \
--framedemo-dev auth --base-url https://your-app.com --email you@example.com --password 'your-password'
demo-dev demo --base-url https://your-app.com --prompt "..." --framedemo-dev demo # Full pipeline: prompt -> capture -> voice -> render
demo-dev auth # Login and save browser session
demo-dev capture # Record only (no voice/render)
demo-dev voice # Generate TTS narration only
demo-dev render # Capture + voice + compose video
demo-dev plan # Generate demo plan from git diff
demo-dev probe # Plan + probe pages for element discovery
demo-dev init # Create config file in your project
demo-dev doctor # Check environment (ffmpeg, playwright, etc.)
demo-dev config # Show resolved config
demo-dev providers # List available AI/TTS providers
demo-dev comment # Post demo as a PR comment
demo-dev showcase # Generate a built-in public showcase demoRun demo-dev <command> --help for detailed options.
| Flag | Description |
|---|---|
--prompt "..." |
Natural language description of the demo to create |
--frame |
Wrap video in a browser window with gradient background |
--display-url |
URL label shown in the browser frame |
--quality draft|standard|high |
Video quality preset |
--base-url |
URL of the app to demo |
--base-ref |
Git base ref for diff-based planning (default: origin/main) |
--output-dir |
Where to write artifacts (default: artifacts) |
Set via environment variables:
# AI planning (pick one)
DEMO_AI_PROVIDER=claude # Uses local Claude CLI
DEMO_AI_PROVIDER=openai # Uses OpenAI API
DEMO_OPENAI_API_KEY=sk-...
# Voice narration (pick one)
DEMO_TTS_PROVIDER=elevenlabs # Best quality
DEMO_ELEVENLABS_API_KEY=sk_...
DEMO_ELEVENLABS_VOICE_ID=...
DEMO_TTS_PROVIDER=openai # Good quality
DEMO_OPENAI_API_KEY=sk-...
DEMO_TTS_PROVIDER=local # Free, uses macOS `say` commandCreate a demo.dev.config.json in your project:
{
"projectName": "My App",
"baseUrl": "http://localhost:3000",
"baseRef": "origin/main",
"outputDir": "artifacts",
"preferredRoutes": ["/", "/dashboard"],
"featureHints": ["dashboard", "settings"],
"auth": {
"loginPath": "/login",
"emailTarget": { "strategy": "css", "value": "#email" },
"passwordTarget": { "strategy": "css", "value": "#password" },
"submitTarget": { "strategy": "role", "role": "button", "name": "Login" }
}
}prompt + URL
|
v
Playwright explores the site (screenshots + interactive elements)
|
v
AI generates a demo plan (scenes, actions, narration text)
|
v
ghost-cursor executes actions with human-like mouse movement
|
v
page.screencast records continuous video + CSS zoom on interactions
|
v
ElevenLabs/OpenAI generates narration audio per scene
|
v
FFmpeg composes: speed ramps + browser frame + audio sync
|
v
polished mp4
- Node.js >= 20
- FFmpeg (install via
brew install ffmpegor equivalent) - Chromium (installed via
npx playwright install chromium)
MIT
