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

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 767bfb818880c9f38bb02873d3d67141a3e62250

336GitHub stars
13stars in 7 days
1skill in this repository
0commits in 30 days

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

Oct 25, 2026Nov 5, 2026336

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 tokens

Always available to the agent

SKILL.md

2,163 tokens

When the skill is activated

Reference documents

21,743 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Non-negotiables
  2. Workflow
  3. A scene
  4. Never
  5. Also

Scripts executed separately

  • engine/pin-build.mjs
  • engine/playwright.demo.ts
  • engine/run.mjs
  • engine/serve.mjs
  • engine/studio/actor.ts
  • engine/studio/config.ts
  • engine/studio/define.ts
  • engine/studio/overlay.ts
  • engine/studio/preview.ts
  • engine/studio/ready.ts
  • engine/studio/recorder.ts
  • engine/studio/run-id.ts
  • engine/studio/scene.ts
  • engine/studio/stage.ts
  • engine/studio/stitch.ts
  • engine/studio/voice.ts
  • package.json
  • scripts/demo
  • scripts/doctor.sh
  • scripts/gaps.mjs
  • scripts/install-voice.sh
  • scripts/install.sh
  • scripts/probe-fps.mjs
  • scripts/say.sh
  • scripts/scaffold.mjs
  • template/demo/demo.config.ts
  • template/demo/mock.ts
  • template/demo/scenes/smoke.scene.ts
  • template/demo/ui.ts

Files

  • .gitattributesasset19 bytes
  • .github/video.svgasset3,829 bytes
  • .gitignoreasset383 bytes
  • LICENSEasset1,069 bytes
  • README.mddoc1,644 bytes
  • SKILL.mdcore8,449 bytes
  • engine/pin-build.mjsruns4,144 bytes
  • engine/playwright.demo.tsruns4,909 bytes
  • engine/run.mjsruns5,211 bytes
  • engine/serve.mjsruns3,760 bytes
  • engine/studio/actor.tsruns24,020 bytes
  • engine/studio/config.tsruns13,756 bytes
  • engine/studio/define.tsruns6,063 bytes
  • engine/studio/overlay.tsruns12,316 bytes
  • engine/studio/preview.tsruns7,200 bytes
  • engine/studio/ready.tsruns3,687 bytes
  • engine/studio/recorder.tsruns23,660 bytes
  • engine/studio/run-id.tsruns1,817 bytes
  • engine/studio/scene.tsruns6,180 bytes
  • engine/studio/stage.tsruns5,516 bytes
  • engine/studio/stitch.tsruns11,213 bytes
  • engine/studio/voice.tsruns15,044 bytes
  • examples/roadmap-search-poster.pngasset191,839 bytes
  • examples/roadmap-search.mp4asset2,460,206 bytes
  • package-lock.jsonasset2,234 bytes
  • package.jsonruns407 bytes
  • references/capture.mddoc10,945 bytes
  • references/config.mddoc14,619 bytes
  • references/mocking.mddoc8,998 bytes
  • references/narration.mddoc8,280 bytes
  • references/runs.mddoc15,038 bytes
  • references/scenes.mddoc10,599 bytes
  • references/troubleshooting.mddoc20,754 bytes
  • scripts/demoruns303 bytes
  • scripts/doctor.shruns4,715 bytes
  • scripts/gaps.mjsruns5,880 bytes
  • scripts/install-voice.shruns2,152 bytes
  • scripts/install.shruns4,013 bytes
  • scripts/probe-fps.mjsruns8,880 bytes
  • scripts/say.shruns2,313 bytes
  • scripts/scaffold.mjsruns11,666 bytes
  • template/demo/demo.config.tsruns6,177 bytes
  • template/demo/mock.tsruns4,171 bytes
  • template/demo/scenes/smoke.scene.tsruns1,942 bytes
  • template/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 on
View the complete source on GitHub

Skills 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 shell

Automated signals, not a guarantee

Checked Nov 5, 2026

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

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 81
    const server = createServer((request, response) => {   const pathname = new URL(request.url ?? '/', 'http://localhost').pathname;
  • Network accessline 82
    const pathname = new URL(request.url ?? '/', 'http://localhost').pathname;

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

  • Executable scriptline 1
    Executable file
  • Network accessline 148
    <script type="module"> const manifest = await fetch('./manifest.json').then((response) => response.json());
  • Network accessline 149
    const manifest = await fetch('./manifest.json').then((response) => response.json());

engine/studio/ready.ts

  • Executable scriptline 1
    Executable file

engine/studio/recorder.ts

  • Executable scriptline 1
    Executable file

engine/studio/run-id.ts

  • Executable scriptline 1
    Executable file
  • Access to secretsline 29
    [Credential-related source omitted]
  • Access to secretsline 33
    [Credential-related source omitted]
  • Access to secretsline 39
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 24
    // Filming a URL that is already live instead? Replace this whole `build`   // block with one line — `site: 'https://example.com'` — and then delete
  • Network accessline 25
    // block with one line — `site: 'https://example.com'` — and then delete

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

and 34 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.