Video Editing with AI
Written exclusively for the in-person [vibe coded] session on 08/06/2026
The Reel Pipeline — Workshop Guide
Turn a folder of phone clips into a captioned vertical video by pasting prompts into a desktop app. You never open a terminal. You never write code. You type into the app, it does the work, you watch.
One requirement: a paid Claude Pro or ChatGPT Plus plan ($20/mo). Free tiers can’t run this.
Everything below is either something to read or a prompt to paste. When you see a grey box, that’s a prompt — copy the whole thing into the app and send it. That’s the entire job.
Part 1 — Before the session (about 30 minutes at home)
Most of this is downloading while you do something else. Works on Mac and Windows.
Start by installing the Claude or Codex desktop app. Sign in, send one message, confirm you get a reply back. That’s the app working.
Now paste this and leave it alone. It sets up everything the pipeline needs, one step at a time, and stops if anything breaks.
I'm setting up a video editing pipeline. Tell me my operating system first,
then install everything I need, one step at a time. Say what you're doing as
you go, and stop if something fails.
1. A package manager if I don't have one (Homebrew on Mac, winget or Chocolatey
on Windows). I'll type my password if you need it — just tell me when.
2. Node 20 or higher.
3. ffmpeg — confirm it was built with libass (I need that for captions).
4. whisper.cpp. Note: the Homebrew formula is called whisper-cpp but the binary
is whisper-cli. Then download the "medium" ggml model and cache it. Tell me
the model file's full path and its size.
5. Make a folder called reel-pipeline in my home directory, go into it, and run
npm create video@latest using the blank template. Let it finish installing
completely.
6. Render the default Remotion template to an mp4 to confirm the whole chain works.
Then print a table: tool, version, install path, pass or fail. If anything fails,
tell me what broke and stop.
It may ask for your password — type it, and don’t panic when the cursor doesn’t move (that’s normal, it’s hidden). A system dialog might pop up asking to install developer tools; click through it.
The whisper model is about 1.5GB and the video files are large. Do this on your home wifi. Thirty people downloading at the venue will not work.
If something fails, don’t fight it. Screenshot the error and send it to me.
Now the one check that matters most. Paste this:
Create a folder called raw inside my reel-pipeline folder, put a small test text
file inside it, then list what's in that folder and give me the full path of the file.
If it lists the file, you’re set. If it says it can’t reach that location, tell me before the event. It’s the one thing I can’t fix on the day.
Last, shoot 4 or 5 clips on your phone. Vertical. One complete thought each. A beat of silence before and after. No rambling, no restarting mid-sentence.
Getting them onto your laptop: AirDrop from the Apple Photos app, not Google Photos. Google re-encodes on export and wipes the timestamps, which scrambles your clip order. Drop the clips into that raw folder. No time to film? Sample clips are in the repo.
Part 2 — In the room
You’ve got an hour. We’re getting everyone to a clean captioned video (that’s Tier 1). Tiers 2 and 3 are yours to run at home — the prompts are here.
First, a ten-second check that your home setup survived the trip. Paste:
Print, one per line: my Node version, the first line of ffmpeg's version, the
full path to my whisper-cli binary, and whether my cached medium whisper model
exists and how big it is.
You want Node 20+, an ffmpeg line, a real path for whisper-cli, and a model around 1.5GB. If any line comes back empty, hand up.
Set up your look
The pipeline needs three small settings files. You don’t make them — the app does. Edit the values in this prompt to taste (your handle, your colors), then paste:
Create three files in my reel-pipeline folder.
First, brand.json — my styling. Use a dark primary color (#1a1a1a), an orange
accent (#FF6B35), white text, the font "Helvetica", and the handle "@yourhandle".
Important: the font must be a system font like Helvetica or Arial, never a web
font — the caption renderer can't load web fonts and they come out as blank boxes.
Second, blurbs.json — little context cards that pop up when I say certain words.
Give it: "hackathon" -> title "Chicago AI Builders", body "Monthly meetup, ~50
builders"; "Codex" -> "Codex", "OpenAI's agentic coding tool"; "Remotion" ->
"Remotion", "React for programmatic video"; "ffmpeg" -> "ffmpeg", "Open-source
media toolkit".
Third, outline.md — a three-act story arc for the advanced version. Act 1
Arrival, anchor phrase "yesterday I went to a hackathon". Act 2 The Insight,
anchor "what broke my brain". Act 3 Takeaway, anchor "try it this weekend".
Give each act a short slide title and one line of body text.
Show me each file when you're done.
Fix rotation first (this is the step everyone skips and regrets)
Phone clips store which way is up as a hidden note, not in the actual picture. Video tools honor that note inconsistently, so clips come out sideways or upside down. We fix it once, up front.
The trap: don’t let it flip the whole folder the same way. Every clip has its own rotation, and a one-size filter turned half of mine upside down. This prompt tells the app to read each clip on its own.
In my raw folder, fix clip rotation so every clip is baked upright.
Read each clip's OWN rotation from its metadata (check the display-matrix
rotation first, then the rotate tag as a fallback). Bake that rotation into the
actual pixels for that clip, then clear the rotation flag. Do this per clip —
never apply one blanket rotation to the whole folder, that flips the ones that
were already fine.
Back up my originals to a raw_original folder first.
Then make me a contact sheet: one frame grabbed from each clip, with the clip's
filename printed on it, all tiled into a single image. Open it so I can see the
whole batch at once. Don't tell me it's done — show me the picture.
Look at the contact sheet. Every clip upright? Move on. Any one sideways or flipped? Jump to Fixes below — it’s one prompt, and catching it now saves you a wasted render.
Make the video (Tier 1)
This is the big one. Paste the whole thing, send it, and give it a few minutes.
Build tier1.mp4 from my raw folder. Output is a postable vertical 9:16 video,
max 60 seconds. The clips are already rotated correctly — do NOT rotate them again.
ORDER: Sort clips by when they were filmed — use the creation timestamp from the
video metadata (the iPhone creation date, then the generic creation time, then
the file's date as a last resort). Lock that order.
PICK THE GOOD ONES: Score each clip 0-100 on audio clarity, sharpness, and
steadiness. (Don't try to score faces — the face-detection library isn't in this
setup.) Drop anything under 40. Keep at least 8 different clips, none used twice,
none longer than 8 seconds, total runtime 45-60 seconds.
TRIM AND FRAME: Trim 0.3s off the start and end of each clip. Pick the strongest
3-6 second stretch. For any horizontal clip, crop it to vertical from the center
— there's no face tracking in this setup, so center-crop everything (vertical
clips need no cropping). Level the audio to -16 LUFS.
CAPTIONS — use whisper.cpp, not the Python Whisper package:
- The binary is whisper-cli (the Homebrew formula is whisper-cpp).
- whisper-cli can't read video files. First pull a 16kHz mono WAV out of each
talking clip, then transcribe the WAV.
- Use the MEDIUM model (not base, small, or large).
- The -ng flag is required — GPU mode crashes, so force CPU with -ng.
- Use -ml 1 to get word-by-word timing.
- Fix these spellings if it hears them wrong: Codex, Claude, Claude Code,
Remotion, ffmpeg, Whisper, OpenAI, Anthropic, hackathon, Reel, CapCut, 9:16.
- Burn the captions on with the system font from brand.json (Helvetica/Arial,
never a web font). White text, black outline, lower third of the frame, max 6
words on screen.
SHOW YOUR WORK BEFORE RENDERING: First write a plain-English manifest — the clip
order, each clip's score and whether it was kept, the final cut list, the
transcript, and total runtime. Then make me a contact sheet: one frame from each
CHOSEN clip in order, filename on each, tiled into one image, and open it. If any
chosen clip looks sideways or badly cropped, stop and tell me which one. Only
after the contact sheet looks right, render the full video.
RENDER: Output tier1.mp4 at 1080x1920, 30fps. Then confirm it's 45-60 seconds,
exactly 1080x1920, has no rotation flag, and the audio isn't clipping. Fix and
re-render if any check fails.
Do this in one run. The only place you pause is to show me the contact sheet.
When it finishes, look at the manifest and the contact sheet before you watch the video. If the manifest reads right (8+ different clips, around a minute, nothing repeated) and the contact sheet is all upright, the video will be right. That’s Tier 1. Most people stop here, and honestly it’s already postable.
The two upgrades (run these at home)
Not part of the hour. Same idea, more polish. Each one is a single paste.
Tier 2 adds filler-word cuts, dead-air removal, a music bed, and pop-up context cards.
Build tier2.mp4 from my raw folder. Do everything Tier 1 does (order, pick,
trim, center-crop, whisper.cpp captions with the medium model and -ng, the
manifest, and the contact-sheet check). Then add:
FILLER: In talking clips, cut "um, uh, like, you know, kind of, sort of, I mean,
basically" when they're filler. Cut any silence longer than 350ms. Slide the
caption timing to match the shortened clips.
PACING AND MUSIC: There's no automatic beat detection in this setup (the library
depends on a Python version that's broken here), so snap b-roll cuts to a
half-second grid for rhythm, and cut talking clips on sentence boundaries. If a
music/bg.mp3 file exists, mix it under everything: duck it to -22 LUFS under
speech, lift to -16 LUFS in the gaps, 250ms fades. If there's no music file,
skip it and say so. Don't fail over missing music.
CARDS: Read blurbs.json. When I say a trigger word, pop a small card in the upper
third for 2.5 seconds with a quick fade in and out, in my brand colors and system
font. Cap it at 3 cards total.
Update the manifest, redo the contact-sheet check, then render tier2.mp4 with the
same final checks as Tier 1.
Tier 3 adds a three-act story, slide overlays, and title and end cards.
Build tier3.mp4 from my raw folder. Do everything Tier 2 does. Then add:
STORY: Read outline.md — three acts, each with an anchor phrase. For each act,
find the talking clip whose transcript contains that phrase; that's the act's
spine. Put b-roll from the same part of the day under it (don't mix morning
b-roll into an afternoon act). Drop the act's slide in as a short title card at
the act's start.
SLIDES: For each act, build a slide in the top third — title in the accent color,
2-3 short bullets in white, both in the system font, on the brand primary color
at 92% opacity, with a soft shadow. Slide it down and fade in over ~280ms, fade
out over ~220ms, hold about 4.5 seconds.
CARDS: A title card for the first 1.5 seconds (brand color, centered title from
outline.md, "Month YYYY" from the earliest clip). An end card for the last 1.8
seconds (brand color, my handle, "Repo in bio", slow zoom).
When slides are showing, keep the talking clip in the bottom 56% and captions in
the lower third. Update the manifest, redo the contact-sheet check, then render
tier3.mp4, targeting 50-65 seconds to fit the cards.
Once one folder works, you can run it across many. Put a bunch of clip folders inside a folder called batch, then paste: “Run the full Tier 3 pipeline on each subfolder inside my batch folder, one at a time, and save each finished video named after its subfolder.” Kick it off before bed. It takes a while — that’s fine, it’s working while you sleep.
When something breaks
Each fix is one prompt. Find your problem, paste the box.
A clip came out sideways or upside down.
One or more clips are still rotated wrong. Re-read each clip's own rotation
metadata, re-bake only the wrong ones upright, clear their rotation flags, and
show me a fresh contact sheet.
Captions are blank boxes.
My captions are rendering as blank boxes. That means the caption font is a web
font the renderer can't load. Switch to a system font — Helvetica on Mac, Arial
on Windows — update brand.json, and re-render.
Captions misspell your brand or tool names.
The captions misspelled some words. Force these exact spellings and re-run the
captions: [list your brand names, tool names, and your own name here].
The captions step errors out or hangs.
Transcription is failing. Two likely causes: you fed whisper-cli a video file (it
can only read WAV — pull a 16kHz mono WAV out first), or GPU mode crashed (the
-ng flag is required to force CPU). Fix both and re-run the captions.
It used the same clip over and over.
The video reuses the same clip. Before rendering, print the final cut list and
enforce at least 8 different clips with none used twice. Show me the list, then
render.
The video came out black or empty.
The output is black or empty. Either the score threshold dropped every clip
(lower it from 40 to 25 and re-run) or the center-crop cut the subject out of a
wide shot (swap that clip for a tighter one, since there's no subject tracking in
this setup). Tell me which it was.
The audio is way too loud or too quiet.
The audio levels are off. Make leveling mandatory: speech to -16 LUFS with peaks
under -1 dBFS, music to -22 LUFS under speech and -16 in the gaps. Measure it,
log the numbers, and re-render.
In Tier 3, slides show up at the wrong moment.
A slide fired at the wrong time. Show me the transcript so I can see the exact
words that were heard, make the act's anchor phrase more specific, and if a
phrase appears twice, use the first one.
The whole thing is crawling.
This is taking too long. Confirm you're on the medium whisper model, not large.
The -ng flag forces CPU on purpose (GPU crashes), so that part can't go faster —
but speed up the final video render by running it across multiple cores.
Ten things I learned the hard way
Skim before your first run.
Shoot vertical from the start. It skips every rotation and crop headache — and with no face tracking here, a center-crop on a horizontal clip can slice your head off.
Film more than you need. The pipeline drops the bad ones. Twenty in, eight used. Film exactly enough and one bad clip sinks the video.
Talk in complete thoughts. It cuts on sentence boundaries. Ramble and it has nothing clean to cut on. One thought per clip, pause before, pause after.
Always look before you render. The manifest and the contact sheet both read in seconds, and they catch the wreck before you burn five minutes making it.
Build it once, run it everywhere. The trap is treating every video as a fresh project. It’s one pipeline, many folders.
The first run will be rough. Nothing gets it perfect on attempt one. Budget real time for the first build; every run after is a couple of minutes of your attention.
Be specific or be ignored. “Make it punchy” means nothing to the app. “45-60 seconds, 8 clips minimum, hard cuts” means something.
Keep your own words in the dictionary. Brand names, tool names, your name. Nothing sinks a video faster than your own product spelled wrong on screen.
Don’t fight the pipeline, fix the input. Bad output is usually a bad raw folder — sideways clips, mumbled audio, bad light. Clean the clips first.
Volume is the whole point. One video? Use CapCut, it’s fine. Fifty? This changes your week. If you post once a month, I’d rather tell you that now than have you feel cheated at the end.


