Clipper
We replaced our clip-cutting subscription with five scripts that run on a laptop. No watermark, no per-seat plan, and a caption colour we actually control. One stage calls a paid API. Everything else — transcription, silence removal, reframing, rendering — is local and free at the margin.
Stage 3 · Tighten
Dead air is measured between word boundaries, not by listening for quiet. The transcriber already knows exactly when each word starts and stops, so a cut can never clip the soft consonant off the front of a word the way an energy-based pass does.
The pipeline
Each stage is a pure function that reads and writes JSON, so any one of them can be re-run, swapped or inspected without touching the others.
transcript.json words + speakers
faster-whisper small, int8, on the CPU, with word-level timestamps. pyannote labels who is speaking — skip that and stage 4 loses the thing that makes it look edited.
candidates.json ranked in / out points
The whole transcript goes to Claude once — not once per clip — and 5–8 ranked candidates come back with hook, payoff and standalone scores. This is the only stage that costs anything.
edl.json a cut list, not a render
Silences measured between word boundaries, never from an audio energy pass, so a soft consonant is never clipped off the front of a word.
track.json a crop rect per frame
YuNet finds the face; four filters in series decide where the camera goes. On a speaker change it cuts instead of panning.
clip.mp4 + POST-BRIEF.md
One ffmpeg pass: cut, crop, scale to 1080×1920, burn word-level captions through libass. Then a brief telling you what to check.
Stage 4 · Reframe
Finding the face is the easy half. Cropping straight to the detection gives you a jittery handheld look that reads as amateur, so four filters sit between the detector and the crop.
When faces are found in fewer than 30% of sampled frames, the source is not a talking head. Tracking switches off entirely and the frame is pillarboxed against a blur. This is not a nicety: crop a slide and you cut the numbers off the edge.
Stage 2 · the only invoice
Picking the moments is a reading-comprehension job, so the whole transcript goes out once per source and ranked candidates come back. Per-token rates below are August 2026 list prices; the dollar columns apply them to this pipeline’s actual prompt shape.
| Model | In $/M | Out $/M | 3-min source | 60-min source | 100 × 60-min |
|---|---|---|---|---|---|
| Claude Sonnet 5 in use | $2.00 | $10.00 | $0.0104 | $0.0410 | $4.10 |
| Claude Haiku 4.5 | $1.00 | $5.00 | $0.0052 | $0.0205 | $2.05 |
| Grok 4.6 | $2.00 | $6.00 | $0.0072 | $0.0378 | $3.78 |
| Grok 4.3 | $1.25 | $2.50 | $0.0035 | $0.0226 | $2.26 |
| Gemini 3.7 Flash | $0.75 | $3.75 | $0.0039 | $0.0154 | $1.54 |
| Gemini 2.5 Flash-Lite | $0.10 | $0.40 | $0.0004 | $0.0020 | $0.20 |
Token counts estimated from the real prompt: a 60-minute source is about 16,500 tokens in and 800 out. Gemini’s rate is introductory and doubles on 1 January 2027.
Yes, Gemini Flash and the cheaper Grok tiers cost less per token. Over a hundred hour-long sources the whole spread is about four dollars. The subscription this replaced cost more than that every month, so the model choice is a quality decision now, not a cost one — and the pipeline reports what each run actually spent.
Scope
The expensive parts of the product we replaced are the parts we do not need.
It is a command line tool. The interface is the costly half of the thing we cancelled.
At this volume it runs in a session and finishes before a queue would have booted.
Nothing on the market is validated. Rank your own variants and measure real retention after posting.
Speech recognition is solved. We use the solved thing.
Running it
# let it pick the moments clipper run source.mp4 -o out/ # or cut a window you already know, skipping the paid stage clipper run source.mp4 -o out/ --manual 62:118 --title "Token budgeting" # every clip lands with a brief telling you what still needs a human eye out/01-token-budgeting.mp4 out/01-token-budgeting.POST-BRIEF.md