/SKILL.md
Automatically generate screen recordings with AI narration to demonstrate PR changes. Use this skill when you need to create a demo video showing UI changes from a pull request. Triggers: /demo, demo video, PR demo, screen recording, show changes, demonstrate PR
npx skillsauth add jaobrown/demo-changes demoInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate screen recordings with AI narration to demonstrate your PR changes.
Follow these steps in order. You (Claude) generate the test and narration directly - no templates needed.
npx tsx lib/cli.ts check-prereqs
Returns JSON with status for:
devServer: Whether the dev server is respondingffmpeg: Whether ffmpeg is installed (needed for video composition)elevenLabsKey: Whether ELEVEN_LABS_API_KEY is set (optional, for narration)If devServer is false, ask the user to start their dev server first.
npx tsx lib/cli.ts analyze-diff --staged
Or for specific commits:
npx tsx lib/cli.ts analyze-diff --commits=HEAD~3..HEAD
Returns JSON with:
uiRelevant: Whether changes affect UIsuggestedRoute: Route to navigate tochangedComponents: Component names that changedsuggestedActions: What to demonstrateIf uiRelevant is false, inform the user and stop.
For monorepos or projects with non-root Playwright configs:
Glob("**/playwright.config.ts")
Note the paths for Step 5.
Based on the analysis, write a Playwright test that demonstrates the UI changes.
Use vanilla Playwright only - import from @playwright/test, not custom fixtures.
Save to temp/demo-recording.spec.ts:
import { test } from "@playwright/test";
test("demo: updated modal copy", async ({ page }) => {
await page.goto("http://localhost:3000/home");
await page.waitForLoadState("networkidle");
await page.waitForTimeout(1500);
await page.click('[data-testid="add-repo-button"]');
await page.waitForTimeout(800);
await page.waitForSelector('[role="dialog"]');
await page.waitForTimeout(3000); // Let viewers see the changes
});
Guidelines:
page.waitForTimeout() (1-3 seconds between actions)Write natural narration as a JSON array. Save to temp/narration-script.json:
[
{ "text": "This pull request updates the copy in our add repository modal.", "startTimeMs": 0 },
{ "text": "Let me show you - I'll click the add button here.", "startTimeMs": 2500 },
{ "text": "And here's the modal with our updated messaging.", "startTimeMs": 5500 }
]
Guidelines:
npx tsx lib/cli.ts cleanup
npx tsx lib/cli.ts record temp/demo-recording.spec.ts
For monorepos, pass discovered config:
npx tsx lib/cli.ts record temp/demo-recording.spec.ts --config=apps/web/playwright.config.ts --test-dir=apps/web/tests
Look for videoPath in the JSON output under --- RESULT ---.
If ELEVEN_LABS_API_KEY is set:
npx tsx lib/cli.ts narrate temp/narration-script.json
Look for audioPath in the JSON output.
npx tsx lib/cli.ts composite <video-path> [audio-path]
Example:
npx tsx lib/cli.ts composite temp/test-results/video.webm temp/narration.mp3
Or without audio:
npx tsx lib/cli.ts composite temp/test-results/video.webm
Look for outputPath - this is the final MP4 in output/.
Edit config.json in the skill directory:
{
"baseUrl": "http://localhost:3000",
"voiceId": "21m00Tcm4TlvDq8ikWAM",
"videoDimensions": { "width": 1280, "height": 720 },
"outputDir": "output",
"tempDir": "temp",
"recordingTimeout": 60000
}
21m00Tcm4TlvDq8ikWAM - Rachel (default, conversational)EXAVITQu4vr4xnSDxMaL - Bella (warm, friendly)ErXwobaYiN019PkySvjV - Antoni (professional)Start your dev server: pnpm dev or npm run dev
brew install ffmpegsudo apt install ffmpegchoco install ffmpegCheck your API key: echo $ELEVEN_LABS_API_KEY
Video will work without it (just no narration).
Check temp/playwright-output.log for errors.
For tighter Claude integration, an MCP server is available with typed tools:
pnpm run mcp-server
Tools: demo_check_prerequisites, demo_analyze_changes, demo_discover_test_environment, demo_save_test_file, demo_save_narration_script, demo_record_video, demo_generate_audio, demo_composite_final_video, demo_cleanup
Configure in your MCP settings to use these instead of CLI commands.
tools
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
data-ai
Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some waiting on outside answers, and others rolling into a later summary.
data-ai
Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some waiting on outside answers, and others rolling into a later summary.
data-ai
OpenProse VM skill pack. Activate on any `prose` command, .prose files, or OpenProse mentions; orchestrates multi-agent workflows.