Learning portal · Automated video production

Shoot all day. Let the machine edit.

This is the full teaching version of the content pipeline we run for the onboarding road trips: how to turn a folder of raw footage into edited cuts, captioned shorts, a thumbnail, and a post draft — automatically, on your own computer, with free tools.

No subscriptions, no cloud uploads, no gatekeeping. If you can copy files into a folder and paste commands into a terminal, you can run this. Source is open: github.com/TheCryptoAnarchist/based-content-pipeline (MIT).

Course contents
  1. The idea — two folders and a machine between them
  2. The toolchain — what each tool actually does
  3. How the pipeline thinks — the six stages
  4. The retention playbook — the numbers that matter
  5. Set it up — from zero to first cut
  6. Learn from every run — the receipts
  7. Limits — what this doesn't do yet
  8. Make it learn — the machine learning plan
Lesson 1

The idea — two folders and a machine between them

The problem this solves: you shoot content all day, then lose the night to editing — or worse, the footage never gets cut at all. Editing is the bottleneck between shooting and posting.

The fix is a mental model so simple it fits in one sentence: an inbox folder for raw material, an outbox folder for finished work, and a pipeline that runs whenever the inbox gets a new day.

inbox/2026-07-11/               outbox/2026-07-11/
  clip001.mp4                       daily-cut.mp4        # the long cut
  clip002.mp4                       mid-1.mp4, mid-2.mp4 # 3-6 min chapters
  interview.wav                     shorts/short-N.mp4   # ~12 per hour of footage, + 9:16
  photos/*.jpg                      thumbnail.png
  music/*.mp3                       tweet.txt            # draft — a human always posts
                                    report.json          # why it made every choice

Everything else — transcription, moment selection, cutting, captions, music — is just what happens between those two folders. One hour of footage in, roughly a dozen 30-second shorts, two or three mid-length videos, and one long daily cut out.

Design rule the whole system obeys: the machine drafts, the human decides. Nothing is ever posted automatically. The last step is always you watching the cut and deciding it's good.
Lesson 2

The toolchain — what each tool actually does

Three free tools do all the work. Learning what they are is worth more than any subscription clipper, because they're the same tools every "AI video editor" SaaS is wrapping and charging you monthly for.

FFmpeg — the knife

ffmpeg is the command-line tool that reads, cuts, converts, and writes basically every audio/video format that exists. Every trim, every concat, every caption burn, every 9:16 crop, every music mix in this pipeline is one ffmpeg command. It has been free and open source for 25 years.

Whisper — the ears

Whisper is a speech-to-text model that runs on your own machine — no cloud, no per-minute billing. It turns the day's audio into a timestamped transcript, down to individual words. That transcript is the backbone of everything: it's how the machine knows what was said and exactly when.

Python + Pillow — the hands

A few hundred lines of readable Python decide what to cut and drive ffmpeg. Pillow (Python's imaging library) draws the caption graphics and the thumbnail. No frameworks, no build step — you can read the entire codebase in one sitting, and you should.

Why local instead of a SaaS clipper: your raw footage never leaves your machine, it costs $0 per video forever, and when you want it to behave differently you change a config value instead of writing a support ticket.
Lesson 3

How the pipeline thinks — the six stages

1. Ingest — know what you have

ffprobe (ffmpeg's inspector) examines every file and classifies it: videos, voice recordings, music (anything in a music/ subfolder), and photos. Files are ordered by their real shoot time from camera metadata, not filename — so the day reassembles in the order you lived it.

2. Transcribe — turn sound into data

Whisper transcribes every clip with word-level timestamps. From here on, the pipeline doesn't work with video — it works with text that knows where it lives in the video. That's the core trick of all automated editing.

3. Select — find the moments

Every transcript segment gets a score: how densely the person is talking (excitement), whether it hits your configured keywords (for us: "wallet", "first time", "no way"), and punctuation energy. Top-scoring moments expand into 21-35 second windows for shorts; the best material becomes chapters and the daily cut.

Honesty checkpoint: this is a heuristic, not taste. It finds moments where someone is excited and talking fast — which on the road is usually the moment a first wallet opens. It will sometimes be wrong, which is why outputs are drafts.

4. Edit — cut, caption, mix

FFmpeg cuts the selected ranges, normalizes loudness to the broadcast standard (EBU R128, −16 LUFS), concatenates, and burns captions. Shorts get kinetic captions — word-by-word, all-caps, active word highlighted — because that style measurably holds attention (numbers in Lesson 4). If you dropped music in the folder, it's mixed under the speech with sidechain ducking: the music automatically dips whenever someone talks, exactly what a human editor does by hand.

The daily cut opens with a cold-open hook — the single strongest 8 seconds of the day — before going chronological. Shorts also get rendered as 1080×1920 verticals with captions in the platform-safe center zone.

5. Thumbnail — the first frame

The frame at the hook moment, with your title and brand strip drawn on. On X the first frame does the thumbnail's job, so the hook frame and the thumbnail are the same decision.

6. Draft the post — never send it

The strongest transcript line becomes the tweet's hook, your standing receipts get appended, and the draft lands in tweet.txt. Optionally a local AI rewrites it against a voice guide. It is never posted automatically.

Lesson 4

The retention playbook — the numbers that matter

The pipeline's defaults aren't vibes — they come from sourced research on what holds viewers (full document with every citation: docs/RESEARCH.md). The short version:

3 secondsis the decision window — ~71% of viewers decide whether to keep watching by then. Clips holding >65% retention at 3s earn 4-7x more impressions. The hook is the highest-leverage edit that exists.
+15-25%watch time from word-by-word "kinetic" captions vs static subtitles. Current best practice: 2-4 word all-caps chunks held 600-900ms, active word highlighted in one accent color.
~28sthe short-form sweet spot in 2026 — long enough to pay off a hook, short enough to finish (completion rate is a ranking signal).
2-4smax time between "beats" (a cut, a zoom, a caption change). Dead air is jump-cut out entirely.
−18 dBmusic bed level under speech (floor −15, ceiling −25). Louder reads amateur; ducking under speech reads produced.
900×1400the safe zone on a 1080×1920 vertical — outside it, platform UI (buttons, captions, progress bar) covers your text. Captions live center-screen, not bottom.

For street-interview / IRL content specifically: lead with the reaction, not the setup. The genre-standard structure is answer-first — show the "no way, this is real?" moment, then let the context unfold.

Lesson 5

Set it up — from zero to first cut

Step 1 — install the tools (macOS; Linux equivalents in the README):

brew install ffmpeg fswatch
pip install openai-whisper pillow

Step 2 — get the code and make your folders:

git clone https://github.com/TheCryptoAnarchist/based-content-pipeline
cd based-content-pipeline
cp config.example.toml config.toml

Step 3 — edit config.toml. The knobs that matter most:

Step 4 — first run. Start with a dry run to see the cut plan without rendering:

python3 pipeline.py ~/Movies/inbox/2026-07-11 --dry-run   # prints the plan
python3 pipeline.py ~/Movies/inbox/2026-07-11             # renders everything

Step 5 — automate it. ./watch.sh watches the inbox and runs the pipeline automatically when a new day-folder finishes copying. Drop the card, walk away. First Whisper run downloads the model (~500MB, one time); a day of footage takes roughly real-time-or-faster to transcribe on Apple Silicon.

Lesson 6

Learn from every run — the receipts

Every run writes two files that turn the pipeline into a teacher:

That's the transparency philosophy applied to software: don't trust the pipeline, verify what it ran.

Lesson 7

Limits — what this doesn't do yet

Lesson 8

Make it learn — the machine learning plan

The v0 selector is a formula. The endgame is a model that learns your taste and what your audience actually watches — and the discipline comes straight from our trading desk, where we learned it the expensive way: the model comes second, the labels come first. We once wired a classifier into a strategy before we had good labels; it confidently filtered the wrong things and got killed within a week. Never again.

The flywheel (live now)

The honesty gates (non-negotiable)

Once deployed, the loop keeps turning: the model picks, you rate, it retrains, the picks get better. Later feature upgrades — audio energy, laughter detection, visual scene features — slot into the same flywheel without changing the discipline.

Kill criterion, stated up front: if at 300+ labels the model still can't beat the heuristic on held-out days, we keep the heuristic and say so on the build log. A formula that works beats a model that doesn't.
← Build log Source on GitHub Learn options trading instead →