codeswithroh/pitch-video

Agent skill: record yourself reading your pitch, get a launch-ready demo video. Cut to your words, captioned, scored, lip-synced — and verified. First try.

Python

1

4 commits

updated Oct 12, 2026

See the code

See what people are saying

SourceMessageScoreDate

I recorded my hackathon pitch once on my webcam and had Claude Code edit the entire demo video. Raw take vs. what it made (r/ClaudeAI)

Last week I had to submit a 2 minute demo video for a Solana hackathon. Video editing always eats a whole evening for me, so I tried something different: I read my script once into my laptop webcam and asked Claude Code to make the video from that. The clip is the first 20 seconds: my raw take,…

0

Oct 12, 2026

README

English · 简体中文 · 繁體中文 · 日本語 · 한국어 · Español · Português (Brasil) · Français · Deutsch · Русский · हिन्दी · Bahasa Indonesia · Tiếng Việt · Türkçe

Pitch Video logo

Pitch Video

Record yourself reading your pitch. Your agent turns it into a launch-ready demo video.

Talking head in → cut, captioned, scored, lip-synced product demo out. First try.

skills.sh Claude Code skill Works with ffmpeg MIT license

Quick start · What you get · How it works · Showcase · Why it works first try · FAQ · Docs

npx skills add codeswithroh/pitch-video



A raw talking-head recording on the left turns into a finished product demo on the right: gameplay footage, a face bubble, burned-in captions

Hackathon submissions, launch videos and investor demos all want the same thing: you, explaining, while the product does the talking. Making that by hand means hours in an editor: trimming ums, syncing footage to sentences, captioning, finding sound effects, and then discovering your lips are 300 ms off.

Pitch Video is an agent skill that does the whole edit. Hand your agent the recording (and your script and app, if you have them). It transcribes you, trims the dead air, speeds you up 1.1× without the chipmunk effect, films your product with a scripted browser, cuts every shot to the exact words you say, adds captions, a face bubble, an animated explainer, cinematic sound effects and a ducked music bed. Then it measures its own output (lip sync, audio drift, loudness, voice clarity) and refuses to hand you a broken file.

Everything runs locally with ffmpeg, whisper.cpp and Playwright. No uploads, no subscriptions, no timeline editor.

Quick start

0. Or let your agent do everything

Copy this into Claude Code (or any coding agent):

Install the pitch-video skill from https://github.com/codeswithroh/pitch-video
(run its install.sh), then make a pitch video from my recording at ~/Movies/my_pitch.mov.

1. Install the skill

npx skills add codeswithroh/pitch-video

or, for Claude Code directly:

curl -fsSL https://raw.githubusercontent.com/codeswithroh/pitch-video/main/install.sh | bash

The installer copies the skill to ~/.claude/skills/pitch-video (and ~/.agents/skills/pitch-video for other agents) and builds the shared toolbox: a Python venv, Playwright Chromium, the Whisper small.en model and a face-landmark model. Restart your agent afterwards.

2. Record yourself

Read your script to the camera. Landscape, face and shoulders, quiet room. Pause for a breath between sections. Stumbles are fine; re-read the line.

Need a script? Ask your agent: "Write me a 2-minute pitch-video script for this repo using the pitch-video story shape."

3. Ask your agent

Make a pitch video from ~/Movies/my_pitch.mov.
The script is docs/pitch-script.md and the app runs at http://localhost:5173.

Your agent plans the scenes from what you said, films your app, renders, verifies and hands you out/demo.mp4 plus a smaller demo_small.mp4 for uploads.

What you get

Gameplay with face bubble and captionZoomed-in proof shot with caption
FeatureWhat it does
Pause trimmingCuts dead air and keeps natural breaths, with longer beats at scene changes and holds you choose ("Until now." … beat).
1.1× pacingTighter delivery with pitch preserved. Picture and voice are sped up together, so sync stays exact.
Cut-to-the-word visualsEvery scene and shot is anchored to a phrase you say, so the footage changes exactly on the line that introduces it.
Scripted product footageGenerates a Playwright film script for your app: headed Chrome, a 30 fps CDP screencast and a timestamped event log to cut against.
Face bubbleAuto-framed from face landmarks, rounded, accent-bordered. Hidden on full-frame and end-card shots.
Captions that are rightPer-chunk Whisper timing, then word-aligned to your script, so "Virev" becomes VRF and **bold** in the script becomes highlighted words.
Explainer animationsHTML diagrams whose beats are keyed to your narration (CUES.find(c => /sealed/.test(c.text))).
Cinematic sound23 synthesized SFX (riser, boom, whoosh, lock, chime, glitch…), auto-placed on cuts and cards and ducked under every spoken word. Optional music bed.
Verification gateLip-sync measurement, A/V drift check, decoded-sample audit, per-line voice-over-background dB, EBU R128 loudness and a contact sheet. Ships only on PASS.

How it works

Pipeline: your video, script and product go in; the skill aligns, transcribes, trims, films, cuts, overlays, scores and verifies; demo.mp4 comes out

The whole edit lives in one readable file, project.json. Scenes start on phrases, shots switch on phrases, and sound cues fire on phrases or on recorded app events:

{
  "speed": 1.1,
  "scenes": [
    { "title": "The hook", "start": "Every onchain game", "shots": [
      { "speaker": true },
      { "from": "If it lives", "rec": "main", "t": 9.8 } ]},
    { "title": "The problem", "start": "fog of war", "shots": [
      { "rec": "main", "t": 18.8, "card": "problem" },
      { "from": "Until now", "title": "UNTIL NOW." } ]},
    { "title": "How it works", "start": "Every position is sealed", "shots": [{ "anim": "diagram" }] }
  ],
  "sfx": [{ "sound": "denied", "phrase": "null", "edge": "end", "offset": -0.4 }]
}

See the full project.json reference and the pipeline walkthrough.

Showcase

Nightfall: a hackathon pitch for an onchain battle royale

Contact sheet of the Nightfall demo video

A 2:25 talking-head take became a 1:53 demo with 10 scenes, 18 shots, a live-gameplay proof sequence, an animated architecture diagram and 40+ sound cues. Verification measured 0 ms voice drift across every window, 0 ms lip-sync offset and ≥14.6 dB voice-over-background on every line.

Watch it on YouTube · project.json · script

Five seconds of the Nightfall demo: dark arena, torchlight, caption, face bubble

Made something with Pitch Video? Open an issue with a link and we'll add it here.

Why it works first try

This skill was extracted from a real edit that took many painful iterations. Every failure became a rule the skill now enforces:

  • "My lips don't match." QuickTime and phone files often start audio about 150 ms after video. The skill re-aligns explicitly before anything else.
  • "Sync drifts later in the video." Cuts land on the 30 fps frame grid, by frame number and matching audio-sample number. Nothing accumulates.
  • "My voice stops before my mouth does." One combined ffmpeg graph silently dropped 9 seconds of audio samples (loudnorm emits 192 kHz). Picture and sound now render in separate passes, every branch is resampled to 48 kHz, and the verifier decodes the final file to prove the sample count.
  • "Captions feel late." Whole-file Whisper timestamps lag. Per-chunk transcription lands captions on the exact speech boundaries.
  • "Effects drown me out." Sound effects duck −9 dB under every spoken line, heavy hits are low-passed if they touch speech, and the final boom lands after your last word.
  • "Footage looks blurry." Playwright's built-in recorder is low-bitrate VP8. The skill uses a CDP screencast from headed, GPU-on Chrome.

The full list is in docs/lessons.md.

Requirements

  • macOS or Linux, with ffmpeg, whisper-cli (whisper.cpp), Node.js 18+ and Python 3.10+.
  • macOS: brew install ffmpeg whisper-cpp node python
  • About 1 GB of disk for the toolbox (Chromium, Whisper model, venv), shared across projects.

FAQ

Which agents can use it?

Any agent that loads SKILL.md skills and can run shell commands: Claude Code, Codex, Cursor, Gemini CLI and others via npx skills add. The scripts are plain Python, Node and ffmpeg, so you can also run the pipeline by hand.

I don't have a script. Does it still work?

Yes. Captions come straight from Whisper and your agent proofreads them. A script just makes jargon and product names exact, and lets you mark emphasis with **bold**.

My product isn't a web app.

Use any footage: screen recordings, simulator captures or images. Drop frames into shots/<name>/ with a stamps.json, or use image shots. The web filming template is a convenience, not a requirement.

Can I use my own music?

Set "music": "path/to/track.mp3". It is looped, normalized low and side-chain ducked under your voice. Use "none" for silence.

Vertical video for TikTok, Reels or Shorts?

Not yet: output is 1920×1080. 9:16 is the top item on the roadmap.

Does anything get uploaded?

No. Transcription, rendering and analysis all run on your machine. Your agent sees the transcript and the timeline, and its model provider has its own data policy.

Documentation

Contributing

Issues and PRs are welcome, especially new SFX, caption themes, vertical output and showcase videos. See CONTRIBUTING.md.

License

MIT. The Whisper and MediaPipe models are downloaded from their upstream sources and keep their own licenses.

agent-skills
claude-code
demo-video
ffmpeg
hackathon
pitch-deck
playwright
skills
video-editing
whisper

codeswithroh/pitch-video

Agent skill: record yourself reading your pitch, get a launch-ready demo video. Cut to your words, captioned, scored, lip-synced — and verified. First try.

Python

1

4 commits

updated Oct 12, 2026

See the code

See what people are saying

SourceMessageScoreDate

I recorded my hackathon pitch once on my webcam and had Claude Code edit the entire demo video. Raw take vs. what it made (r/ClaudeAI)

Last week I had to submit a 2 minute demo video for a Solana hackathon. Video editing always eats a whole evening for me, so I tried something different: I read my script once into my laptop webcam and asked Claude Code to make the video from that. The clip is the first 20 seconds: my raw take,…

0

Oct 12, 2026

README

English · 简体中文 · 繁體中文 · 日本語 · 한국어 · Español · Português (Brasil) · Français · Deutsch · Русский · हिन्दी · Bahasa Indonesia · Tiếng Việt · Türkçe

Pitch Video logo

Pitch Video

Record yourself reading your pitch. Your agent turns it into a launch-ready demo video.

Talking head in → cut, captioned, scored, lip-synced product demo out. First try.

skills.sh Claude Code skill Works with ffmpeg MIT license

Quick start · What you get · How it works · Showcase · Why it works first try · FAQ · Docs

npx skills add codeswithroh/pitch-video



A raw talking-head recording on the left turns into a finished product demo on the right: gameplay footage, a face bubble, burned-in captions

Hackathon submissions, launch videos and investor demos all want the same thing: you, explaining, while the product does the talking. Making that by hand means hours in an editor: trimming ums, syncing footage to sentences, captioning, finding sound effects, and then discovering your lips are 300 ms off.

Pitch Video is an agent skill that does the whole edit. Hand your agent the recording (and your script and app, if you have them). It transcribes you, trims the dead air, speeds you up 1.1× without the chipmunk effect, films your product with a scripted browser, cuts every shot to the exact words you say, adds captions, a face bubble, an animated explainer, cinematic sound effects and a ducked music bed. Then it measures its own output (lip sync, audio drift, loudness, voice clarity) and refuses to hand you a broken file.

Everything runs locally with ffmpeg, whisper.cpp and Playwright. No uploads, no subscriptions, no timeline editor.

Quick start

0. Or let your agent do everything

Copy this into Claude Code (or any coding agent):

Install the pitch-video skill from https://github.com/codeswithroh/pitch-video
(run its install.sh), then make a pitch video from my recording at ~/Movies/my_pitch.mov.

1. Install the skill

npx skills add codeswithroh/pitch-video

or, for Claude Code directly:

curl -fsSL https://raw.githubusercontent.com/codeswithroh/pitch-video/main/install.sh | bash

The installer copies the skill to ~/.claude/skills/pitch-video (and ~/.agents/skills/pitch-video for other agents) and builds the shared toolbox: a Python venv, Playwright Chromium, the Whisper small.en model and a face-landmark model. Restart your agent afterwards.

2. Record yourself

Read your script to the camera. Landscape, face and shoulders, quiet room. Pause for a breath between sections. Stumbles are fine; re-read the line.

Need a script? Ask your agent: "Write me a 2-minute pitch-video script for this repo using the pitch-video story shape."

3. Ask your agent

Make a pitch video from ~/Movies/my_pitch.mov.
The script is docs/pitch-script.md and the app runs at http://localhost:5173.

Your agent plans the scenes from what you said, films your app, renders, verifies and hands you out/demo.mp4 plus a smaller demo_small.mp4 for uploads.

What you get

Gameplay with face bubble and captionZoomed-in proof shot with caption
FeatureWhat it does
Pause trimmingCuts dead air and keeps natural breaths, with longer beats at scene changes and holds you choose ("Until now." … beat).
1.1× pacingTighter delivery with pitch preserved. Picture and voice are sped up together, so sync stays exact.
Cut-to-the-word visualsEvery scene and shot is anchored to a phrase you say, so the footage changes exactly on the line that introduces it.
Scripted product footageGenerates a Playwright film script for your app: headed Chrome, a 30 fps CDP screencast and a timestamped event log to cut against.
Face bubbleAuto-framed from face landmarks, rounded, accent-bordered. Hidden on full-frame and end-card shots.
Captions that are rightPer-chunk Whisper timing, then word-aligned to your script, so "Virev" becomes VRF and **bold** in the script becomes highlighted words.
Explainer animationsHTML diagrams whose beats are keyed to your narration (CUES.find(c => /sealed/.test(c.text))).
Cinematic sound23 synthesized SFX (riser, boom, whoosh, lock, chime, glitch…), auto-placed on cuts and cards and ducked under every spoken word. Optional music bed.
Verification gateLip-sync measurement, A/V drift check, decoded-sample audit, per-line voice-over-background dB, EBU R128 loudness and a contact sheet. Ships only on PASS.

How it works

Pipeline: your video, script and product go in; the skill aligns, transcribes, trims, films, cuts, overlays, scores and verifies; demo.mp4 comes out

The whole edit lives in one readable file, project.json. Scenes start on phrases, shots switch on phrases, and sound cues fire on phrases or on recorded app events:

{
  "speed": 1.1,
  "scenes": [
    { "title": "The hook", "start": "Every onchain game", "shots": [
      { "speaker": true },
      { "from": "If it lives", "rec": "main", "t": 9.8 } ]},
    { "title": "The problem", "start": "fog of war", "shots": [
      { "rec": "main", "t": 18.8, "card": "problem" },
      { "from": "Until now", "title": "UNTIL NOW." } ]},
    { "title": "How it works", "start": "Every position is sealed", "shots": [{ "anim": "diagram" }] }
  ],
  "sfx": [{ "sound": "denied", "phrase": "null", "edge": "end", "offset": -0.4 }]
}

See the full project.json reference and the pipeline walkthrough.

Showcase

Nightfall: a hackathon pitch for an onchain battle royale

Contact sheet of the Nightfall demo video

A 2:25 talking-head take became a 1:53 demo with 10 scenes, 18 shots, a live-gameplay proof sequence, an animated architecture diagram and 40+ sound cues. Verification measured 0 ms voice drift across every window, 0 ms lip-sync offset and ≥14.6 dB voice-over-background on every line.

Watch it on YouTube · project.json · script

Five seconds of the Nightfall demo: dark arena, torchlight, caption, face bubble

Made something with Pitch Video? Open an issue with a link and we'll add it here.

Why it works first try

This skill was extracted from a real edit that took many painful iterations. Every failure became a rule the skill now enforces:

  • "My lips don't match." QuickTime and phone files often start audio about 150 ms after video. The skill re-aligns explicitly before anything else.
  • "Sync drifts later in the video." Cuts land on the 30 fps frame grid, by frame number and matching audio-sample number. Nothing accumulates.
  • "My voice stops before my mouth does." One combined ffmpeg graph silently dropped 9 seconds of audio samples (loudnorm emits 192 kHz). Picture and sound now render in separate passes, every branch is resampled to 48 kHz, and the verifier decodes the final file to prove the sample count.
  • "Captions feel late." Whole-file Whisper timestamps lag. Per-chunk transcription lands captions on the exact speech boundaries.
  • "Effects drown me out." Sound effects duck −9 dB under every spoken line, heavy hits are low-passed if they touch speech, and the final boom lands after your last word.
  • "Footage looks blurry." Playwright's built-in recorder is low-bitrate VP8. The skill uses a CDP screencast from headed, GPU-on Chrome.

The full list is in docs/lessons.md.

Requirements

  • macOS or Linux, with ffmpeg, whisper-cli (whisper.cpp), Node.js 18+ and Python 3.10+.
  • macOS: brew install ffmpeg whisper-cpp node python
  • About 1 GB of disk for the toolbox (Chromium, Whisper model, venv), shared across projects.

FAQ

Which agents can use it?

Any agent that loads SKILL.md skills and can run shell commands: Claude Code, Codex, Cursor, Gemini CLI and others via npx skills add. The scripts are plain Python, Node and ffmpeg, so you can also run the pipeline by hand.

I don't have a script. Does it still work?

Yes. Captions come straight from Whisper and your agent proofreads them. A script just makes jargon and product names exact, and lets you mark emphasis with **bold**.

My product isn't a web app.

Use any footage: screen recordings, simulator captures or images. Drop frames into shots/<name>/ with a stamps.json, or use image shots. The web filming template is a convenience, not a requirement.

Can I use my own music?

Set "music": "path/to/track.mp3". It is looped, normalized low and side-chain ducked under your voice. Use "none" for silence.

Vertical video for TikTok, Reels or Shorts?

Not yet: output is 1920×1080. 9:16 is the top item on the roadmap.

Does anything get uploaded?

No. Transcription, rendering and analysis all run on your machine. Your agent sees the transcript and the timeline, and its model provider has its own data policy.

Documentation

Contributing

Issues and PRs are welcome, especially new SFX, caption themes, vertical output and showcase videos. See CONTRIBUTING.md.

License

MIT. The Whisper and MediaPipe models are downloaded from their upstream sources and keep their own licenses.

agent-skills
claude-code
demo-video
ffmpeg
hackathon
pitch-deck
playwright
skills
video-editing
whisper