← All work
Case studyLive · early access2025

youclip.ai

Turning long streams into clips people actually post

youclip.ai takes a one to three hour recording, finds the bits worth clipping, and hands back a batch of captioned shorts you can post the same day. I designed and built the whole thing on my own: the interface, the front end, the back end, and the part that finds the clips.

Visit youclip.ai
Role
Product designFrontendBackendRender pipelineClip-detection
Stack
Next.jsTypeScriptPythonFFmpegAI transcription
What it does

One long stream, a handful of clips worth posting

each scored 0 to 100 for how far it'll travel

0:00end
74
88
61
92
80
67
The problem

Six good moments buried in three hours

Streamers and podcasters end up with hours of footage that maybe holds six good moments. Finding them is slow. You scrub, mark timestamps, cut, crop to vertical, add captions, export, then do it all again. So most people just don't bother, and the clips that would grow their channel never get made. Not because they're hard to make well, but because making them is annoying enough to skip.

The bet
1Import the video
2Look through what it found

That's the bet. People will clip regularly if clipping stops eating their evening.

One person, two rules

Solo build. Product design, front end, the Python engine that renders, the web back end with login and billing, and the logic that finds the clips. One person, not much time, and a render pipeline that has to be right: a clip exported with the caption in the wrong spot is worse than no clip at all, because nobody posts that. So I set two rules for myself.

Reuse one pipeline

instead of building separate ones.

Assume the AI gets it wrong

then catch it, instead of hoping it won't.

Decision 01 · Finding the clips

Find the clips from the words, not the loudness

The obvious way to find “the exciting bit” is the audio: loud spikes, laughter, big cuts. I chose not to build that as the main thing.

What makes a clip go off isn't how loud it is, it's what it means. A quiet, perfectly landed line beats thirty seconds of loud nothing. The real question is whether a moment stands on its own. Would it land for someone who just scrolled onto it with zero context? That's a judgement about meaning. A model reading the transcript can make that call. A loudness meter can't.

Transcribe the videoModel reads the transcriptPick moments that stand alone

For each one it returns a score out of 100, a one-line reason, and a short title.

Meaning > volume
92

“…and that's when I realised I'd been muted the whole time.”

quiet, landed line
34

[crowd noise, overlapping shouting, 30s]

loud nothing

Trade-off: It's only as good as the transcript, it costs tokens, and it's blind to what's funny to watch but silent. Adding the audio back as a second opinion is the obvious next step.

Decision 02 · One pipeline

Clips stay virtual, so there's only ever one pipeline

While you review, a clip is just a start time and an end time sitting on top of the original video. Nothing gets cut. Only when you export does it turn into a normal render job with a trim, run through the exact same pipeline the manual editor uses. Same captions, same templates, same sound effects.

For a one-person project this mattered a lot. A separate render path just for clips would have doubled the amount of code I had to keep correct, alone. Keeping clips virtual means a bug fix or a new caption style shows up everywhere at once, and “open this clip in the full editor” is basically free.

Review: start + end on the originalExport: a trim on the same render job
Quietly proud of
Captions are web pages, not subtitle files

The one bit I'm quietly proud of. Captions and titles get drawn as normal web pages (HTML and CSS) in a hidden browser window, then FFmpeg lays that over the video. Most tools fight the old subtitle format to style captions. Because mine are just web design, I get rich per-language caption styles with the words lighting up in time, and the render code never turns into a mess.

The hard part

Clean clip edges out of a three-hour transcript

This is the bit I'd point to if you asked what was actually hard. Asking a model for highlights is easy. Getting usable, exportable clip edges out of hours of transcript is the real work. You have to stay inside the model's limits, keep the token bill from killing the economics, and catch everything the model gets wrong.

Windows
Score in 30-minute chunks with 2-minute overlap

A three-hour transcript doesn't fit in one go, and cramming too much in makes the answers worse anyway. The overlap is on purpose. A great moment sitting right on the line between two chunks would get cut in half and scored low by both, so the overlap gives it one clean shot inside a single chunk.

Cost
A small, cheap model reading bundled lines

The value is in the work around the model, not in paying top dollar to read three hours of talk. Word-by-word transcripts are huge, so before scoring I bunch the words into short timed lines: roughly a dozen words, or eight seconds, or a natural pause. That's enough for the model to point at a line, at a fraction of the cost.

Assume nothing is safe
Treat the model's answer like it can't be trusted

The model gives back rough numbers. Sometimes clips overlap, sometimes it hands you a two-second scrap or an end time past the end of the video. One function assumes none of it is safe:

  • Pull each clip back inside the real length of the video
  • Snap each edge to the nearest real word boundary within a second
  • Re-check the length after snapping, not before
  • Throw away anything under three seconds
  • Kill overlaps by keeping the higher-scored clip when two collide

Re-checking length after snapping rather than before was a real ordering bug I hit and fixed. All the knobs live in one file, so the quality settings sit in one place.

One more hard bit

Covering captions already burned into the footage

Some footage already has captions burned into the picture, and youclip's own captions have to cover them or you get a double stack. I got this wrong twice. First I hunted sharp edges (fooled by a sweater collar), then bright text (fooled by a window or a face). The fix was to stop guessing what a caption looks like and find the actual letters with a proper text detector already bundled with the app, then confirm it with common-sense rules.

If the model file is ever missing, it skips the step instead of wrecking the frame.

Then confirm it
  • Ignore text near the top of the frame
  • Ignore anything too narrow to be a caption
  • Only count it if it shows up in at least a third of the frames
The smaller calls
A review screen for approving, not building

Clip cards sorted by score, a two-level timeline underneath. The fiddly controls (extend, trim, delete, add a missed moment) are there but out of the way, and anything needing frame-by-frame work is one click into the full editor.

A bulk export that can't half-start

A small queue runs two renders at a time and checks every clip has a price before it starts, so a batch can't get stuck halfway through.

A late declutter pass

Cut 20-plus always-on helper sentences and unified the three modes onto one set of design tokens, on the rule that the controls should speak for themselves.

How it works, in numbers
1-3 hr
input, per recording
2 steps
import, then review
30 / 2 min
scoring window / overlap
3 s
minimum clip length
1
render pipeline, shared
Solo
design, front + back end, engine
See it move
recording · 16:9
The main loop

Import → transcribe → cards fill in, sorted by score

recording · 16:9
The review screen

How little a yes / no takes

recording · 9:16
Bulk export

The queue chewing through two at a time

Where it's at

A real, working AI app, built on my own. A desktop app with a web service behind it for login, token billing and the model calls, plus a Python engine that transcribes, scores, crops and captions.

Private beta, a handful of testers
TBD
One real number goes here. Clips made, hours run through, or time-to-first-clip versus doing it by hand.
What I took from it
What I learned

The model call was the easy part. What makes an AI feature feel like a real product instead of a toy is everything protecting it: snapping the edges, killing overlaps, covering old captions, a batch that won't half-start.

What I'd change

Add the audio back as a second opinion, since reading only the words misses moments that are funny to watch but quiet. And merge the scoring logic that currently runs in both the engine and the web back end, kept in step by hand, which is a bug waiting to happen.

More work