Loading...
Loading...
Create and record scripted browser demo videos with webreel. Generates MP4, GIF, or WebM recordings with cursor animation, keystroke overlays, and sound effects from a JSON config. Use when the user wants to record a demo, create a browser video, edit a webreel config, generate a screen recording, preview a demo, or work with webreel in any way.
npx skill4agent add vercel-labs/webreel webreelnpm install webreel# Scaffold a config
npx webreel init --name my-demo --url https://example.com
# Edit webreel.config.json with your steps
# Preview in a visible browser (no recording)
npx webreel preview my-demo
# Record the video
npx webreel record my-demonpxdevDependenciesvideos/outDirwebreel.config.jsonwebreel init
webreel init --name login-flow --url https://myapp.com
webreel init --name hero -o hero.config.json--name--url-o, --outputwebreel record # all videos in config
webreel record hero login # specific videos by name
webreel record -c custom.config.json # custom config path
webreel record --watch # re-record on config change
webreel record --verbose # log each step
webreel record --dry-run # print resolved config only
webreel record --frames # save raw JPEGs to .webreel/frames/webreel preview
webreel preview hero --verbosewebreel composite
webreel composite herowebreel validate
webreel validate -c custom.config.jsonwebreel.config.json.ts.mts.js.mjs-c| Field | Default | Description |
|---|---|---|
| - | |
| | Output directory for rendered videos |
| | Base URL prepended to relative video URLs |
| | Default viewport |
| - | Cursor and HUD overlay theme |
| - | Sound effect settings |
| - | Array of step file paths prepended to all videos |
| - | Default delay (ms) appended after each step |
| - | Cursor dwell time (ms) before a click |
videos| Field | Default | Description |
|---|---|---|
| required | URL to open (absolute or relative to |
| inherited | Override viewport |
| - | CSS zoom factor |
| - | Selector or text to wait for before starting steps |
| | Output path ( |
| | Thumbnail config, or |
| inherited | Step files to prepend |
| inherited | Override theme |
| inherited | Override sound effects |
| inherited | Override default delay |
| inherited | Override click dwell |
| | Frame rate |
| | Encoding quality (1-100) |
| required | Array of step objects |
{
"videos": {
"hero": { "url": "...", "steps": [...] },
"login": { "url": "...", "steps": [...] }
}
}webreel record hero loginactionlabeldelaydescription| Action | Key fields | Purpose |
|---|---|---|
| | Wait for a duration |
| | Click an element |
| | Type text into an input |
| | Press a key combo (e.g. |
| | Drag between two elements |
| | Scroll the page or an element |
| | Wait for an element to appear |
| | Move cursor to an element |
| | Navigate to a new URL |
| | Hover over an element |
| | Select a dropdown value |
| | Capture a PNG screenshot |
textselectorwithintextselectorwithin{ "action": "click", "text": "Submit" }
{ "action": "click", "selector": "#submit-btn" }
{ "action": "click", "text": "Submit", "within": ".modal" }viewport{ width, height }desktopdesktop-hdlaptopmacbook-airmacbook-proipadipad-proipad-miniiphone-15iphone-15-pro-maxiphone-sepixel-8galaxy-s24{
"theme": {
"cursor": {
"image": "./cursor.svg",
"size": 32,
"hotspot": "center"
},
"hud": {
"background": "rgba(30, 41, 59, 0.85)",
"color": "#e2e8f0",
"fontSize": 48,
"fontFamily": "\"SF Mono\", monospace",
"borderRadius": 12,
"position": "top"
}
}
}cursor.imagecursor.sizecursor.hotspot"top-left""center"hud.position"top""bottom"// steps/dismiss-banner.json
{
"steps": [
{ "action": "wait", "selector": ".cookie-banner", "timeout": 5000 },
{ "action": "click", "selector": ".accept-btn", "delay": 300 }
]
}{
"include": ["./steps/dismiss-banner.json"],
"videos": { ... }
}videosviewportthemedefaultDelay$VAR${VAR}output.mp4.gif.webm{ "output": "demo.gif" }waitFordelay--watchcomposite--verbose--dry-runzoompreview