Not in the top 1,000 by GitHub stars
nilbuild/video-demo
Skill to record video demos of your web app with zoom-ins and voiceover
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
767bfb818880 → 767bfb818880
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 767bfb818880
No earlier version was observed for comparison.
Heat
4.1- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
video-demo
When your agent uses it
Films a web app as narrated, zooming, cursor-driven demo videos with retina screenshots, either from a repo it builds and mocks or from a live URL as it is served. Use when the user asks for a demo video, product video, walkthrough, screencast, screen recording of an app or of a URL, hero or landing-page footage, app screenshots for a website, "show off this feature", "record a demo of <url>", or wants to add, re-film, re-narrate or fix a demo scene.
What it loads into context
Frontmatter
116 tokensAlways available to the agent
SKILL.md
2,163 tokensWhen the skill is activated
Reference documents
21,743 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Non-negotiables
- Workflow
- A scene
- Never
- Also
Scripts executed separately
engine/pin-build.mjsengine/playwright.demo.tsengine/run.mjsengine/serve.mjsengine/studio/actor.tsengine/studio/config.tsengine/studio/define.tsengine/studio/overlay.tsengine/studio/preview.tsengine/studio/ready.tsengine/studio/recorder.tsengine/studio/run-id.tsengine/studio/scene.tsengine/studio/stage.tsengine/studio/stitch.tsengine/studio/voice.tspackage.jsonscripts/demoscripts/doctor.shscripts/gaps.mjsscripts/install-voice.shscripts/install.shscripts/probe-fps.mjsscripts/say.shscripts/scaffold.mjstemplate/demo/demo.config.tstemplate/demo/mock.tstemplate/demo/scenes/smoke.scene.tstemplate/demo/ui.ts
Files
.gitattributesasset19 bytes.github/video.svgasset3,829 bytes.gitignoreasset383 bytesLICENSEasset1,069 bytesREADME.mddoc1,644 bytesSKILL.mdcore8,449 bytesengine/pin-build.mjsruns4,144 bytesengine/playwright.demo.tsruns4,909 bytesengine/run.mjsruns5,211 bytesengine/serve.mjsruns3,760 bytesengine/studio/actor.tsruns24,020 bytesengine/studio/config.tsruns13,756 bytesengine/studio/define.tsruns6,063 bytesengine/studio/overlay.tsruns12,316 bytesengine/studio/preview.tsruns7,200 bytesengine/studio/ready.tsruns3,687 bytesengine/studio/recorder.tsruns23,660 bytesengine/studio/run-id.tsruns1,817 bytesengine/studio/scene.tsruns6,180 bytesengine/studio/stage.tsruns5,516 bytesengine/studio/stitch.tsruns11,213 bytesengine/studio/voice.tsruns15,044 bytesexamples/roadmap-search-poster.pngasset191,839 bytesexamples/roadmap-search.mp4asset2,460,206 bytespackage-lock.jsonasset2,234 bytespackage.jsonruns407 bytesreferences/capture.mddoc10,945 bytesreferences/config.mddoc14,619 bytesreferences/mocking.mddoc8,998 bytesreferences/narration.mddoc8,280 bytesreferences/runs.mddoc15,038 bytesreferences/scenes.mddoc10,599 bytesreferences/troubleshooting.mddoc20,754 bytesscripts/demoruns303 bytesscripts/doctor.shruns4,715 bytesscripts/gaps.mjsruns5,880 bytesscripts/install-voice.shruns2,152 bytesscripts/install.shruns4,013 bytesscripts/probe-fps.mjsruns8,880 bytesscripts/say.shruns2,313 bytesscripts/scaffold.mjsruns11,666 bytestemplate/demo/demo.config.tsruns6,177 bytestemplate/demo/mock.tsruns4,171 bytestemplate/demo/scenes/smoke.scene.tsruns1,942 bytestemplate/demo/ui.tsruns1,159 bytes
Read SKILL.md
# Video demo
`scripts/demo` films a web app and writes `demo-out/` into that project's
workspace: per scene an mp4 with voice-over, a poster, retina stills, plus
`full-tour.mp4`, `manifest.json` and `index.html`. All local. The engine runs
from this skill; nothing is installed into the app being filmed.
## Non-negotiables
Each of these cost a run or a user's patience.
1. **A pinned build, never a dev server.** Its module graph belongs to whoever
is editing source. Copy it somewhere private and verify its API base by
reading the bundle. A URL with no repo behind it is `site` mode; a URL onView the complete source on GitHubSkills included
- video-demo
Repository facts
- License
- MIT
- Created
- Sep 17, 2026
- Last pushed
- Sep 21, 2026
- Forks
- 30
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 5, 2026
- No broad tool permissions
- 8 dangerous shell commandsin 3 files: scripts/install.sh:47 scripts/doctor.sh:96 scripts/install-voice.sh:24
- 57 network referencesin 14 files: package-lock.json:15 scripts/install-voice.sh:20 README.md:7 and 11 more
- No hidden or obfuscated text
- No instruction overrides
- 29 executable scriptsin 29 files: engine/pin-build.mjs:1 engine/playwright.demo.ts:1 engine/run.mjs:1 and 26 more
- 3 references to secretsin 1 file: engine/studio/run-id.ts:29
- No requests to vote in Hot
Show all 97 signals by file
.github/video.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" aria-label="Video post" viewBox="-0.0 -30.0 284.0 284.0"><g transform="translate(0.000000,224.000000) scale(0.100000,-0.100000)"><path d="M1366 2052 c-3 -2 -229 -3 -503 -3 -426 1 -
README.md
- Network accessline 7
Given below is a sample video generated using the skill for [roadmap.sh](https://roadmap.sh). - Network accessline 9
https://github.com/user-attachments/assets/c20907c2-89a4-42a8-95d6-271ba3a60b80 - Network accessline 24
/video-demo record a demo of https://example.com - Network accessline 25
/video-demo record the checkout flow on https://example.com, use cash on delivery - Network accessline 26
/video-demo visit http://roadmap.sh and record the roadmap search flow - Network accessline 51
MIT © [Kamran Ahmed](https://kamran.fyi).
engine/pin-build.mjs
- Executable scriptline 1
#!/usr/bin/env node
engine/playwright.demo.ts
- Executable scriptline 1
Executable file
engine/run.mjs
- Executable scriptline 1
#!/usr/bin/env node
engine/serve.mjs
engine/studio/actor.ts
- Executable scriptline 1
Executable file
engine/studio/config.ts
- Executable scriptline 1
Executable file - Network accessline 112
* An origin, not a page. Playwright resolves each entry's `path` against the * origin of `baseURL` and drops anything after it, so a site of * `https://example.com/pricing` with an entry at `/` silently films the home - Network accessline 113
* origin of `baseURL` and drops anything after it, so a site of * `https://example.com/pricing` with an entry at `/` silently films the home * page instead — a wrong film that passes every check, which is the worst - Network accessline 114
* `https://example.com/pricing` with an entry at `/` silently films the home - Network accessline 299
* and `DEMO_PORT` is moot. */ export const BASE_URL = SITE ?? `http://localhost:${PORT}`; - Network accessline 301
export const BASE_URL = SITE ?? `http://localhost:${PORT}`;
engine/studio/define.ts
- Executable scriptline 1
Executable file
engine/studio/overlay.ts
- Executable scriptline 1
Executable file
engine/studio/preview.ts
engine/studio/ready.ts
- Executable scriptline 1
Executable file
engine/studio/recorder.ts
- Executable scriptline 1
Executable file
engine/studio/run-id.ts
engine/studio/scene.ts
- Executable scriptline 1
Executable file
engine/studio/stage.ts
- Executable scriptline 1
Executable file
engine/studio/stitch.ts
- Executable scriptline 1
Executable file
engine/studio/voice.ts
- Executable scriptline 1
Executable file - Network accessline 121
` uv venv --python 3.12 ${join(VOICE_HOME, '.venv')}\n` + ` uv pip install --python ${PYTHON} kokoro-onnx soundfile\n` + ` curl -L -o ${MODEL} https://github.com/thewh1teagle/kokoro-onnx/releases/download/model-files-v1.0/k - Network accessline 122
` uv pip install --python ${PYTHON} kokoro-onnx soundfile\n` + ` curl -L -o ${MODEL} https://github.com/thewh1teagle/kokoro-onnx/releases/download/model-files-v1.0/kokoro-v1.0.onnx\n` + ` curl -L -o ${VOICES} https://github - Network accessline 123
` curl -L -o ${MODEL} https://github.com/thewh1teagle/kokoro-onnx/releases/download/model-files-v1.0/kokoro-v1.0.onnx\n` + - Network accessline 124
` curl -L -o ${VOICES} https://github.com/thewh1teagle/kokoro-onnx/releases/download/model-files-v1.0/voices-v1.0.bin\n` +
package-lock.json
- Network accessline 15
"node_modules/@playwright/test": { "version": "1.62.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz", - Network accessline 16
"version": "1.62.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz", "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==", - Network accessline 17
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz", - Network accessline 31
"node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 32
"version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - Network accessline 33
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 46
"node_modules/playwright": { "version": "1.62.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", - Network accessline 47
"version": "1.62.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", - Network accessline 48
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", - Network accessline 65
"node_modules/playwright-core": { "version": "1.62.1", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", - Network accessline 66
"version": "1.62.1", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", - Network accessline 67
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz",
package.json
- Executable scriptline 1
Executable file
references/config.md
- Network accessline 75
site: 'https://time.fyi',
references/mocking.md
- Network accessline 161
return route.fulfill({ status: 200, body: '{}' }); } return route.continue({ url: `http://127.0.0.1:${port}/turn` }); - Network accessline 162
} return route.continue({ url: `http://127.0.0.1:${port}/turn` }); }); - Network accessline 163
return route.continue({ url: `http://127.0.0.1:${port}/turn` });
references/narration.md
- Network accessline 48
Narration is synthesized locally by [Kokoro-82M](https://github.com/thewh1teagle/kokoro-onnx)
scripts/demo
- Executable scriptline 1
#!/usr/bin/env bash
scripts/doctor.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 94
ok "uv $(uv --version 2>/dev/null)" else warn "uv not found (only needed to install the local voice)" "curl -LsSf https://astral.sh/uv/install.sh | sh" - Network accessline 95
else warn "uv not found (only needed to install the local voice)" "curl -LsSf https://astral.sh/uv/install.sh | sh" fi - Dangerous shell operationline 96
warn "uv not found (only needed to install the local voice)" "curl -LsSf https://astral.sh/uv/install.sh | sh" - Network accessline 96
warn "uv not found (only needed to install the local voice)" "curl -LsSf https://astral.sh/uv/install.sh | sh"
scripts/gaps.mjs
- Executable scriptline 1
#!/usr/bin/env node
scripts/install-voice.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 20
RELEASE="https://github.com/thewh1teagle/kokoro-onnx/releases/download/model-files-v1.0" - Network accessline 22
if ! command -v uv >/dev/null 2>&1; then printf 'install-voice: uv not found. Install it first:\n' printf ' curl -LsSf https://astral.sh/uv/install.sh | sh\n' - Network accessline 23
printf 'install-voice: uv not found. Install it first:\n' printf ' curl -LsSf https://astral.sh/uv/install.sh | sh\n' exit 1 - Dangerous shell operationline 24
printf ' curl -LsSf https://astral.sh/uv/install.sh | sh\n' - Network accessline 24
printf ' curl -LsSf https://astral.sh/uv/install.sh | sh\n' - Network accessline 46
else printf 'install-voice: downloading the fp32 model (~325MB)\n' curl -L --fail -o "$MODEL.part" "$RELEASE/kokoro-v1.0.onnx" - Network accessline 47
printf 'install-voice: downloading the fp32 model (~325MB)\n' curl -L --fail -o "$MODEL.part" "$RELEASE/kokoro-v1.0.onnx" mv "$MODEL.part" "$MODEL" - Network accessline 48
curl -L --fail -o "$MODEL.part" "$RELEASE/kokoro-v1.0.onnx" - Network accessline 54
else printf 'install-voice: downloading the voice pack (~25MB)\n' curl -L --fail -o "$VOICES.part" "$RELEASE/voices-v1.0.bin" - Network accessline 55
printf 'install-voice: downloading the voice pack (~25MB)\n' curl -L --fail -o "$VOICES.part" "$RELEASE/voices-v1.0.bin" mv "$VOICES.part" "$VOICES" - Network accessline 56
curl -L --fail -o "$VOICES.part" "$RELEASE/voices-v1.0.bin"
scripts/install.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 37
printf ' brew upgrade node\n' else printf ' see https://nodejs.org\n' - Network accessline 38
else printf ' see https://nodejs.org\n' fi - Network accessline 39
printf ' see https://nodejs.org\n' - Dangerous shell operationline 47
# sudo prompt, so where root is needed and not already held, it prints the - Dangerous shell operationline 59
elif sudo -n true 2>/dev/null; then - Dangerous shell operationline 73
if [ -z "$as_root" ]; then - Dangerous shell operationline 74
printf 'install: ffmpeg needs root here. Run:\n sudo %s %s\n' "$manager" "$args" - Dangerous shell operationline 79
[ -n "$refresh" ] && $as_root "$manager" $refresh - Dangerous shell operationline 80
$as_root "$manager" $args - Network accessline 84
printf 'install: no package manager found for ffmpeg. Install it from\n' printf ' https://ffmpeg.org/download.html\n' - Network accessline 85
printf ' https://ffmpeg.org/download.html\n'
scripts/probe-fps.mjs
- Executable scriptline 1
#!/usr/bin/env node
scripts/say.sh
- Executable scriptline 1
#!/usr/bin/env bash
scripts/scaffold.mjs
- Executable scriptline 1
#!/usr/bin/env node
template/demo/demo.config.ts
template/demo/mock.ts
- Executable scriptline 1
Executable file
template/demo/scenes/smoke.scene.ts
- Executable scriptline 1
Executable file
template/demo/ui.ts
- Executable scriptline 1
Executable file
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 4 facts
- Contacts astral.sh, which SKILL.md, the README and the plugin manifest do not mentionscripts/doctor.sh:96High confidence
- Contacts astral.sh, which SKILL.md, the README and the plugin manifest do not mentionscripts/install-voice.sh:24High confidence
- Contacts nodejs.org, which SKILL.md, the README and the plugin manifest do not mentionscripts/install.sh:39High confidence
- Contacts ffmpeg.org, which SKILL.md, the README and the plugin manifest do not mentionscripts/install.sh:85High confidence
Signal confidence: 84 facts
- Network access in prose of documentationREADME.md:7Low confidence
- Network access in prose of documentationREADME.md:9Low confidence
- Network access in code of documentationREADME.md:24Low confidence
- Network access in code of documentationREADME.md:25Low confidence
- Network access in code of documentationREADME.md:26Low confidence
- Network access in prose of documentationREADME.md:51Low confidence
- Executable script in code of a file that runsengine/pin-build.mjs:1High confidence
- Executable script in code of a file that runsengine/playwright.demo.ts:1High confidence
- Executable script in code of a file that runsengine/run.mjs:1High confidence
- Executable script in code of a file that runsengine/serve.mjs:1High confidence
- Network access in code of a file that runsengine/serve.mjs:81High confidence
- Network access in code of a file that runsengine/serve.mjs:82High confidence
- Executable script in code of a file that runsengine/studio/actor.ts:1High confidence
- Executable script in code of a file that runsengine/studio/config.ts:1High confidence
- Network access in a comment of a file that runsengine/studio/config.ts:112Low confidence
- Network access in a comment of a file that runsengine/studio/config.ts:113Low confidence
- Network access in a comment of a file that runsengine/studio/config.ts:114Low confidence
- Network access in a comment of a file that runsengine/studio/config.ts:299Low confidence
- Network access in code of a file that runsengine/studio/config.ts:301High confidence
- Executable script in code of a file that runsengine/studio/define.ts:1High confidence
- Executable script in code of a file that runsengine/studio/overlay.ts:1High confidence
- Executable script in a comment of a file that runsengine/studio/preview.ts:1Low confidence
- Network access in code of a file that runsengine/studio/preview.ts:148High confidence
- Network access in code of a file that runsengine/studio/preview.ts:149High confidence
- Executable script in code of a file that runsengine/studio/ready.ts:1High confidence
- Executable script in code of a file that runsengine/studio/recorder.ts:1High confidence
- Executable script in code of a file that runsengine/studio/run-id.ts:1High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueengine/studio/run-id.ts:29Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueengine/studio/run-id.ts:33Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueengine/studio/run-id.ts:39Low confidence
- Executable script in code of a file that runsengine/studio/scene.ts:1High confidence
- Executable script in code of a file that runsengine/studio/stage.ts:1High confidence
- Executable script in code of a file that runsengine/studio/stitch.ts:1High confidence
- Executable script in code of a file that runsengine/studio/voice.ts:1High confidence
- Network access in code of a file that runsengine/studio/voice.ts:121High confidence
- Network access in code of a file that runsengine/studio/voice.ts:122High confidence
- Network access in code of a file that runsengine/studio/voice.ts:123High confidence
- Network access in code of a file that runsengine/studio/voice.ts:124High confidence
- Executable script in code of a file that runspackage.json:1High confidence
- Network access in code of documentationreferences/config.md:75Low confidence
- Network access in code of documentationreferences/mocking.md:161Low confidence
- Network access in code of documentationreferences/mocking.md:162Low confidence
- Network access in code of documentationreferences/mocking.md:163Low confidence
- Network access in prose of documentationreferences/narration.md:48Low confidence
- Executable script in code of a file that runsscripts/demo:1High confidence
- Executable script in code of a file that runsscripts/doctor.sh:1High confidence
- Network access in code of a file that runsscripts/doctor.sh:94High confidence
- Network access in code of a file that runsscripts/doctor.sh:95High confidence
- Dangerous shell operation in code of a file that runsscripts/doctor.sh:96High confidence
- Network access in code of a file that runsscripts/doctor.sh:96High confidence
and 34 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.