Tim Neilen    Now    Books    Quotes   

We only wanted some clips

Written with AI

One evening on a family trip to K’gari (Fraser Island), I asked Claude to compare the AI clipping services on the market. My nephew Entae and I wanted to turn Minecraft streams into short vertical clips, and the sensible move was to pay someone who already does that.

The comparison came back clear enough. OpusClip and Vizard are the best of the generalists, which charge $1 to $7 USD per hour of source video. The stream-focused tools are cheaper. None of them reliably clips gameplay. One reviewer summed OpusClip up as an AI that “listens. It doesn’t watch.” Gameplay streams were the whole point.

Three hours later we were building our own.

Six days in, it’s a clipping app with logins, per-user branding, a monthly budget cap, an automated deployment pipeline, a narrated compilation builder and a 30-day posting plan that pulls its own YouTube stats every Monday. None of that was the plan. There wasn’t a plan.

Two builders and a Minecraft server

The app is called the Entae clipper, which tells you who it was for.

Entae has been vibe coding for a while, and he knows DonutSMP - a Minecraft server with its own crowd of streamers and YouTubers - far better than I do. He brought the ideas, the eye for what makes a clip land, and a willingness to watch an awful lot of them. I brought twenty years of running systems and well over a year of working with agents - chat models heavily at first, then my coding harness since 2025. The harness did most of the typing.

The shared interest did the rest. It’s much easier to keep going at 11pm on a holiday when someone else is waiting on the next clip.

Two things came out of it. Glazed Recaps is a DonutSMP fan channel on YouTube Shorts, with longer cuts made for TikTok. I run it on behalf of my son, I own the accounts and do the posting, and it’s his to take over eventually. Entae uses the clipper for his own clips, in his own branding.

Nobody decided to build a product

Paste a link, get vertical clips with captions. That was the first night. The same night it got a benchmark, because I wanted to know whether it was picking good moments or just confident ones. (That benchmark changed the design - more below.)

By day three it had grown a lot. Minecraft streams are a facecam in a corner and a game filling the rest of the frame, and squashing that into 9:16 loses one or the other. So it learnt to find the facecam and stack the streamer above the game. We also learnt that face detection fires on Minecraft villagers, which I’d never have guessed. It got a hard $10 USD monthly cap on API spend, logins and roles so Entae could use it with his own jobs, a clip editor, and an end-to-end review by a separate agent that came back with a list of fixes, including making that budget cap airtight. Encoding moved onto the machine’s integrated GPU, which took one clip from 272 seconds to 108. The first Glazed Recaps Shorts went live.

Day four was mostly posting. More Shorts went up before breakfast, and the public site promptly fell over: one aborted video download had wedged the connection between the reverse proxy and the clipper. Switching that link from HTTP/2 to HTTP/1.1 fixed it, and it hasn’t happened since.

Day five was the busiest. Titles that credit whoever actually did the thing. A branded look - a glaze band with drips across the seam between facecam and game, carrying the clip’s hook. Covers picked by Claude. Ranked compilations with an AI narrator. Branding for every user, so Entae’s clips get his own look. And CI/CD: every push tested on GitHub, and every change to main deployed by a runner on the machine at home.

Day six: a posting plan that spreads creators out so the channel isn’t wall-to-wall DrDonut, and a weekly stats pull to show what’s working.

Each step was small, and each was obvious once the last one existed. Stack six days of that and a toy starts to look like a product.

I set one rule early that shaped all of it: whenever a decision would change what got built or which paid service got used, Claude had to stop and ask. Those questions changed the plan more than once - the transcription provider, the budget, where it runs. Some of it was steered from my phone.

The timeline

My coding harness keeps a transcript of every session, so I had it count. Over six days I sent 86 prompts (what I typed, not my answers to Claude’s questions), and the repo took 55 commits.

Eighty-six prompts sounds like nothing, and on its own it’s misleading. Each one landed on a stack of context the AI already had: how I like systems built, plain JavaScript with no build step, locked dependencies, private by default with a login in front, hashed passwords and a CSRF check on every write, a strict content security policy, a hard spend cap, Australian spelling and plain English. None of that was in the 86 prompts. It lives in standing instructions, skills and notes I’ve built up and refined over years, and before that in twenty years of learning what goes wrong with systems. The prompts steer. The context does the heavy lifting.

Commits understate the start: the first two days went in as one snapshot on day three. The busiest hour was 5 to 6pm on Thursday, with nine prompts and six commits. The longest gap, 24½ hours, started on Wednesday morning. The prompt I sent most, nine times, was some form of “Status?”.

  • Sunday 1 November (6 prompts, 0 commits): compare the clipping services, then build a site that takes YouTube, Twitch, TikTok and “Kik” (Kick) links. First clips and the benchmark that night.
  • Monday (8, 0): watch every clip back (“half of it is of their feet”), diagrams for Entae, how it frames facecam and game, and a deploy plan with a login for him.
  • Tuesday (22, 23): “Do the whole thing please.” A $10 USD cap, an end-to-end review, a 30-day plan, TikTok-length cuts, a clip editor, a brand kit and GPU encoding.
  • Wednesday (3, 2): “Is the clipper site offline?” An HTTP/1.1 fix, a strategy summary for Entae, and the session closed.
  • Thursday (33, 23): titles that credit whoever did it, a glaze band clear of the iPhone notch, covers, CI/CD approved from my phone, compilations, and “add more parallelism”.
  • Friday (14, 7): per-user branding, a narrator for the funny compilation, longer moments so the reactions land, and a re-plan with less DrDonut. Then this post.

What’s under the hood

It isn’t open source, but I’m happy to share how it fits together, so this is the stack.

  • My coding harness, running Claude Opus, as the main engineer. Two long sessions plus 30 subagents, many of them in parallel: research (eleven notes on competing clippers and how new Shorts channels grow), features (the compilation builder, per-user branding, a UI overhaul) and that end-to-end review.
  • The app itself is FastAPI and plain JavaScript with no build step, on SQLite.
  • yt-dlp fetches the video. Long streams are never downloaded whole: audio first, then only the sections that become clips.
  • ElevenLabs Scribe v2 transcribes, with word timings, speaker labels and tags for laughter, applause and cheering.
  • Reaction signals go on top: loudness spikes, Twitch chat spikes, and YouTube’s Most Replayed heatmap where a video has one.
  • Jev, the small judgement model from TypeSafe, scores every 45-second window of the transcript on four questions: does it stand alone, does it pay off, is it funny, does it hook immediately. Code blends that at 35% with 65% reactions and takes the best clips that don’t overlap.
  • Claude Haiku, through OpenRouter, writes the titles, hooks and descriptions. It works from transcripts labelled by speaker, so a title doesn’t pin a friend’s joke on the streamer. It also picks each cover from a numbered contact sheet of eight frames.
  • OpenCV face tracking handles the framing, and ffmpeg renders on the integrated Intel GPU.
  • ElevenLabs voices narrate the ranked compilations: a top 3 for Shorts, a top 5 for the longer TikTok cut.
  • GitHub Actions runs 144 tests on every push, and a self-hosted runner deploys.
  • Every paid call goes into a spend ledger, and a job that would break the monthly cap doesn’t run.

Let the audience vote

On the first night I scored the picking against YouTube’s Most Replayed data - the curve showing which seconds viewers go back and rewatch. Four comedy compilations, clips chosen without seeing the curve, then scored on how much more rewatched the chosen clips were than the video’s average. A score of 1.0 means no better than average. Random picks scored 1.01.

How the clips were picked Score
Claude Sonnet reads the transcript and chooses 0.96
Audience reactions, with Sonnet judging 1.31
Audience reactions, with Jev judging 1.45
Laughter tags alone, no model at all 1.68

A capable model reading the transcript did slightly worse than chance. The cheapest signal in the stack - where people actually laughed - beat everything on that score. It missed more of the very biggest moments, which is why the default blends reactions with Jev instead of using laughter alone, and Jev does its judging for under one US cent per hour of video, against about 19 cents for Sonnet.

Four videos is a tiny sample, and I wouldn’t call it research. It was enough to change the design. The audience picks the moments, and the models get the jobs they’re good at: judging a shortlist and writing the words.

The numbers

As at 6 November:

   
Time Six days, 1 to 6 November
Commits 55 - the first two days went in as one snapshot on day three
Code About 15,800 non-blank lines: 10,168 Python, 2,075 of tests, 1,666 JavaScript, 921 HTML, 780 CSS, 196 shell
Coding harness 2 sessions, 30 subagents, about 1 billion tokens
Video processed 51 source videos, about 98 hours
Output 611 moments picked, 353 clips rendered, 7 ranked compilations
API spend $25.53 USD - transcription $22.87, LLM calls $1.41, Jev $0.64, voices $0.61
Glazed Recaps 13 Shorts, 7,914 views, clips from about two dozen DonutSMP creators

The token figure looks absurd and mostly isn’t. 977 million of it is cache reads - the same context read again on every turn. The part the model actually wrote - code, reports, replies and its own reasoning - is 3.7 million tokens. That’s only my side of it: we used a mix of AI tools, and Entae has his own access to the codebase to vibe code on.

The API spend is the number I like most. Transcription is nearly 90% of it. Spread across 98 hours of video it comes to about 26 US cents per source hour, against $1 to $7 USD for the generalist clippers and around 50 cents for the cheapest stream tools. That leaves out the machine at home, my time, and about another $10 USD of benchmarking on the first night that ran before the ledger existed. It’s still cheap.

What I’d tell myself on night one

Watch the clips. Every job reported success. Sitting through the clips showed face detection locking onto villagers and posters, a guessed facecam box blurring the actual subject of a stream, and titles giving the streamer credit for other people’s moments - DrDonut was watching a fan get trapped for 24 hours, and the title said he got trapped. No test would have caught any of it. Every one of those fixes started with watching the clips.

Run evals, then run more evals. Most of that first-night $10 USD went on benchmarks, and there have been plenty since. It still gets things wrong. The transcript keeps hearing DonutSMP as “DonutSP”, and a player called CrestMC came out as “BreastMC” in a burned-in caption - caught by a check before it went up, fixed by reading the name off the in-game chat. Evals tell you how often it’s wrong. Watching tells you how.

Put the budget in before you need it. The cap went in on day three, and it’s why a toy calling four paid APIs has never produced a surprise. I’ve raised November’s cap once already. Raising it on purpose is a very different feeling from finding out afterwards.

The feed decides. Five of the first thirteen Shorts found an audience, with 1,290 to 1,857 views each. The other eight are under 80. Same pipeline, same branding, same week, and I can’t yet tell you why. The clipper makes a good clip cheap. It can’t make anyone watch it.

What’s next

I’m keeping Glazed Recaps going, and it’s turned into a race to see how many views we can rack up. I’m going deep on one account with lots of creators. Entae is going the other way, splitting his clips into a channel per streamer. The posting plan runs into early December, and the weekly stats will say whether YouTube’s October push against channels that mostly re-upload other creators’ videos is going to bite a clip channel like this one.

It could become a product. It already has the bones: logins, roles, per-user branding, a budget per month. It would need proper separation between customers’ data and a lot more testing on content that isn’t Minecraft - picking from Twitch streams is still its weakest area. That’s a question for after November.

If you’re building something similar, I’m genuinely happy to talk through how it fits together and which models do which job.

We only wanted some clips. The clips turned out to be the easy part.