video-recording
Record high-quality browser verification videos using WebReel. Two-phase workflow: test with agent-browser to collect CSS selectors, then record with WebReel for polished output.
What this skill does
# Video Recording (WebReel)
Record polished browser verification videos using a **two-phase workflow**:
1. **Phase 1 — Test & collect selectors** (agent-browser): Run your scenario interactively, validate every element, and collect CSS selectors.
2. **Phase 2 — Record** (WebReel): Build a config from your selectors, then render a scripted video with smooth cursor, timing, and encoding.
For WebReel config format, step types, config patterns, and troubleshooting, load the `webreel` skill. **You MUST follow the config patterns defined in the `webreel` skill** — especially moveTo before every click, pause 5x multiplier, charDelay 120+, and clickDwell 500.
---
## Phase 1: Test & Collect Selectors (agent-browser)
Before recording, you MUST run the full verification scenario with agent-browser and collect CSS selectors for every element you will interact with in the video.
### 1. Navigate and test
```bash
agent-browser open http://localhost:3000
agent-browser click @e1
agent-browser wait 500
agent-browser scroll down 300
```
### 2. Discover CSS selectors for each interactive element
For every element you click, type into, hover, or scroll, find a stable CSS selector:
```bash
agent-browser eval "JSON.stringify((() => { const el = document.querySelector('[data-testid=submit-btn]'); return el ? {tag: el.tagName, text: el.textContent?.trim()} : null })())"
```
**Selector priority** (most stable → least stable):
1. `[data-testid="..."]` — test IDs are the most reliable
2. `[role="..."] + text` — ARIA roles with text matching
3. Semantic HTML — `button`, `a[href="..."]`, `input[name="..."]`
4. Stable classes — `.nav-item`, `.submit-button` (avoid generated hashes like `.css-1a2b3c`)
5. Scoped selectors with `within` — for repeated components
### 3. Track selectors as you go
Keep a running list of selectors as you test. Example:
```
- Login button: button[data-testid="login-btn"]
- Email input: input[name="email"]
- Password input: input[name="password"]
- Submit: form .submit-button
- Dashboard nav: nav a[href="/dashboard"]
```
### 4. Validate selectors
Before moving to Phase 2, verify each selector resolves:
```bash
agent-browser eval "document.querySelector('button[data-testid=login-btn]')?.tagName ?? 'NOT FOUND'"
```
---
## Phase 2: Record with WebReel
Once your test passes and you have all selectors, build a WebReel config and record.
### 1. Build config
**IMPORTANT:** Load the `webreel` skill and follow its config patterns. You MUST use moveTo before every click, 5x pause multiplier, charDelay 120+, and clickDwell 500. Configs that skip these produce unwatchable videos.
```bash
scripts/twill-video-build-config '{
"url": "http://localhost:3000",
"output": "verification.mp4",
"viewport": { "width": 1920, "height": 1080 },
"clickDwell": 500,
"steps": [
{ "action": "pause", "ms": 5000, "description": "Initial view (~1s on screen)" },
{ "action": "moveTo", "selector": "button[data-testid=login-btn]" },
{ "action": "pause", "ms": 3000, "description": "Cursor dwells (~0.6s)" },
{ "action": "click", "selector": "button[data-testid=login-btn]" },
{ "action": "pause", "ms": 5000, "description": "Show form (~1s)" },
{ "action": "type", "text": "[email protected]", "selector": "input[name=email]", "charDelay": 120 },
{ "action": "type", "text": "password123", "selector": "input[name=password]", "charDelay": 120 },
{ "action": "moveTo", "selector": "form .submit-button" },
{ "action": "pause", "ms": 3000 },
{ "action": "click", "selector": "form .submit-button" },
{ "action": "wait", "selector": "nav a[href=\"/dashboard\"]", "timeout": 5000 },
{ "action": "pause", "ms": 10000, "description": "Show dashboard (~2s on screen)" }
]
}'
```
### 2. Preview (optional)
```bash
webreel preview
```
### 3. Record
```bash
scripts/twill-video-record webreel.config.json $TWILL_SCREENSHOTS_DIR
```
This runs `webreel record`, copies the output to `$TWILL_SCREENSHOTS_DIR`, and prints the final path as JSON.
### 4. Upload and share
## NEVER record a video without sharing it
**If you record a video, you MUST upload it AND include it in your final answer. No exceptions.** A video that is recorded but not shared is wasted work — the user never sees it, integrations never receive it, and the recording was pointless.
### Upload
```bash
curl -s -X POST -H "Authorization: Bearer $TWILL_API_KEY" \
-F "file=@$TWILL_SCREENSHOTS_DIR/verification.mp4" \
"$TWILL_SCREENSHOT_UPLOAD_URL"
```
The response is JSON: `{ "url": "<public-url>" }`. Save the URL — you need it for both outputs below.
### Include in your final answer (REQUIRED)
ALWAYS include the video in your final answer using markdown image syntax — the Twill UI renders `.mp4` URLs as inline video players. This is how the user and integrations (GitHub, Slack, Linear) see your work:
```

```
### Include in the PR description (REQUIRED if opening/updating a PR)
Paste the `.mp4` URL as a **bare URL on its own line** — no markdown syntax. GitHub only renders inline video players from bare URLs:
```
https://storage.googleapis.com/.../verification.mp4
```
Do NOT use `` or `[](url)` in the PR body — GitHub renders those as broken images.
### Self-check before finishing
Before writing your final answer, verify:
- [ ] Video was uploaded (you have a public URL)
- [ ] Video appears in the final answer as ``
- [ ] If a PR was created/updated, video URL is in the PR body as a bare URL on its own line
Related in Image & Video
watch
IncludedWatch a video (URL or local path). Downloads with yt-dlp, extracts auto-scaled frames with ffmpeg, pulls the transcript from captions (or Whisper API fallback), and hands the result to Claude so it can answer questions about what's in the video.
physical-ai-defect-image-generation
IncludedUse when the user wants to orchestrate defect image generation, run associated setup, or handle outputs on OSMO. The Day 0 path handles cold-start with USD-to-ROI, image-edit augmentation, and AnomalyGen to create initial PCBA datasets. The Day 1 path performs inference and labeling on real images. This skill helps with first-time asset setup, creation of finetuning checkpoints, and configuring deployment. Trigger keywords: defect image generation, dig workflow, dig pipeline, defect image detection workflow, aoi pipeline, aoi anomalygen, usd2roi anomalygen, day 0 pcba, day 1 pcba, day 1 real-photo alignment, day 1 manual roi, metal surface anomaly, glass defect, anomalygen finetune, setup_pcb, setup_metal, setup_glass, setup_pretrained, dig setup, dig datasets, dig pretrained checkpoint, dig image-edit endpoint.
accelint-react-best-practices
IncludedReact performance optimization and best practices. ALWAYS use this skill when working with any React code - writing components, hooks, JSX; refactoring; optimizing re-renders, memoization, state management; reviewing for performance; fixing hydration mismatches; debugging infinite re-renders, stale closures, input focus loss, animations restarting; preventing remounting; implementing transitions, lazy initialization, effect dependencies. Even simple React tasks benefit from these patterns. Covers React 19+ (useEffectEvent, Activity, ref props). Triggers - useEffect, useState, useMemo, useCallback, memo, inline components, nested components, components inside components, re-render, performance, hydration, SSR, Next.js, useDeferredValue, combined hooks.
elevenlabs-agents
IncludedBuild conversational AI voice agents with ElevenLabs Platform using React, JavaScript, React Native, or Swift SDKs. Configure agents, tools (client/server/MCP), RAG knowledge bases, multi-voice, and Scribe real-time STT. Use when: building voice chat interfaces, implementing AI phone agents with Twilio, configuring agent workflows or tools, adding RAG knowledge bases, testing with CLI "agents as code", or troubleshooting deprecated @11labs packages, Android audio cutoff, CSP violations, dynamic variables, or WebRTC config. Keywords: ElevenLabs Agents, ElevenLabs voice agents, AI voice agents, conversational AI, @elevenlabs/react, @elevenlabs/client, @elevenlabs/react-native, @elevenlabs/elevenlabs-js, @elevenlabs/agents-cli, elevenlabs SDK, voice AI, TTS, text-to-speech, ASR, speech recognition, turn-taking model, WebRTC voice, WebSocket voice, ElevenLabs conversation, agent system prompt, agent tools, agent knowledge base, RAG voice agents, multi-voice agents, pronunciation dictionary, voice speed control, elevenlabs scribe, @11labs deprecated, Android audio cutoff, CSP violation elevenlabs, dynamic variables elevenlabs, case-sensitive tool names, webhook authentication
humanizer
IncludedHumanize AI-generated text by detecting and removing patterns typical of LLM output. Rewrites text to sound natural, specific, and human. Uses 28 pattern detectors, 560+ AI vocabulary terms across 3 tiers, and statistical analysis (burstiness, type-token ratio, readability) for comprehensive detection. Use when asked to humanize text, de-AI writing, make content sound more natural/human, review writing for AI patterns, score text for AI detection, or improve AI-generated drafts. Covers content, language, style, communication, and filler categories.
generating-mermaid-diagrams
IncludedSalesforce architecture diagrams using Mermaid with ASCII fallback. Use this skill when generating text-based diagrams for Salesforce architecture, OAuth flows, ERDs, integration sequences, or Agentforce structure. TRIGGER when: user says "diagram", "visualize", "ERD", or asks for sequence diagrams, flowcharts, class diagrams, or architecture visualizations in Mermaid. DO NOT TRIGGER when: user wants PNG/SVG image output (use generating-visual-diagrams), or asks about non-Salesforce systems.