Trevor PaughSystems engineer
Trevor PaughProject Chronicles

Chronicles / Clipper Overlord

Active · Sep 2026 to present

Clipper Overlord

A podcast-clipping studio that runs on one home PC: Whisper on a 3090, face- and text-aware framing, auto-designed covers, and one-tap publishing to four platforms.

20 entries Stack Python 3.12 · faster-whisper · OpenCV · ffmpeg · FastAPI · SQLite · Anthropic API · YouTube Data API · Buffer · Cloudflare R2 clipper-site View on timeline

Clipper takes long podcast and interview episodes and turns them into captioned vertical clips. Claude picks the moments, the owner reviews every one of them in a local web app, and approved clips post to a YouTube channel on a fixed daily schedule, with copies to TikTok, Instagram, and Facebook.

It was built in eight days by a manager session dispatching builder, reviewer, and tester agents, almost always through pull requests with a review round. The story is mostly one of tuning against real footage: every change to framing and clip edges answered a specific clip that looked wrong. Then a pivot on day eight narrowed the sources to footage creators hand over directly.

The companion marketing site, clipper-site, is three static pages (home, privacy, terms) written so the Google OAuth consent screen had something to point at. It is folded into this section.

Latest developments

Progress

The public page is not enough

The owner joined a second clipping board and asked for its campaign list to be read by a browser session rather than scraped. The survey found the public list carries only a card per campaign: brand, title, rate, and a lock. The rules, budget, resources, and minimum views live in the signed-in app, which the browser extension cannot reach until the owner allows the site. The read-by-hand guide now sends the session there and makes the block visible. Overnight, under a blanket go, three small merges followed, including a test that failed only when the owner's drive dipped under the free-space floor.

Decision

More boards, each read its own way

Five suitable campaigns out of thirty-six on the first board was not enough, so the owner asked for more boards. A survey found only two others with public listings. One forbids scraping in its terms, so the app will never fetch it; the owner's own browser session will read it instead. The other has no such rule and is read through a paid third-party actor, so the app never touches that site either. Both shipped the same evening, after review caught one board's bad day wiping the other's list. Also today: a daily cap on rules reads, and campaigns mostly in another language are skipped.

Milestone

The overnight run: fifty items, twenty-four merges, nobody watching

At one minute to midnight the owner handed over a fifty-item improvement list, a rollback point, and leave to shut the machine down when nothing more could be done. By seven in the morning twenty-four pull requests had merged, each built by a fresh subagent against the full test suite and, where it mattered, one review round. Two of the biggest features ship switched off until the owner turns them on.

Decision

Read by hand, on a button press

The board that forbids scraping now gets read the agreed way: a button on the Campaigns page starts a Claude session in the owner's own browser, which reads the listings at a person's pace, answers in a fixed shape, and writes the file the finder merges. No tick and no schedule; only the owner's press. The session gets six read-only browser tools and nothing else. Review fixed five things before merge, and the manager held one more tool back: the one that can click and type in a signed-in browser. Also today, the tab named after the first board became Campaigns.

Decision

Vetting campaigns by their rules, not their card

A campaign's board card says little; its real rules often live on another site, a shared document, or a PDF. The owner asked for the finder to read all of it, and named three hard disqualifiers: a page dedicated to the brand, the brand's name required in the account name, or required logos and branding. The reader fetches public pages only, keeps them for a week, and a stronger model does the reading, because the goal is the screen capture that goes to Google.

Progress

Ended campaigns, a restart that works, and the cover safe zone

Three merges across one evening and the small hours. Starting the app now restarts it if one is already running. Campaigns that have ended on the marketplace are flagged in Health with a switch-off button. And the owner's channel screenshots showed cover text trimmed at the top and bottom, so covers now keep their words inside the part of the picture YouTube actually shows.

Decision

Clips from nowhere are held for good

The six o'clock shutdown never took, and half an hour later the owner asked whether clips under review that belong to no campaign should be cleared. Yes. A clear command shipped, review found four other doors a YouTube-era clip could still leave by, and the rework closed them all with one rule: a source outside any campaign is held, the same way paused and removed sources are.

Decision

The reviewer wants a recording, so the YouTube path comes out

Google's API quota reviewer asked for a step-by-step screen recording of the whole workflow within seven business days. The submission from three days earlier described a tool that no longer existed: it still admitted downloading from YouTube and setting a cover on every upload. The owner's answer was to remove the download path from the code entirely, not switch it off, so the reply can say so plainly.

Decision

Shorts covers, by hand after all

The rate-limit fix worked: every cover sent to a Short was accepted. Then every one of them vanished within minutes, while the same JPEG uploaded by hand in YouTube Studio stayed. The API cannot set a Short's thumbnail, by Google's own word. One day after the backfill shipped, Shorts no longer go near it: the app hands the cover over and links into Studio. Long-form videos keep the automatic path.

Decision

Campaign sources only

Clipper now clips only footage that creators hand over directly. Downloading creator videos from YouTube is off by default, and a campaign source hosted on YouTube is never fetched.

Decision

Fixes before features: the covers that never arrived

Only two covers had ever reached YouTube. The publisher sent thumbnails in a burst, got rate-limited, and spent its single retry inside the same burst. Everything else stopped while it was fixed, and the owner's two questions turned a fix into a backfill and an on-demand command. Merged the next morning after one review round.

Milestone

Long-form clips, built in a day

Clips of three to fifteen minutes, rendered in 16:9, reviewed in their own Inbox tab, scheduled into a 3 PM slot, and published to YouTube as regular videos. Five slices merged in one day, each with one review round. Off by default so the owner can trial it on one channel.

Design

Ember: the app takes the site's colours

The app started in teal on purple to match the channel it served. It now uses the orange Ember accent and new logo from clipper-site, and the site dropped its channel-specific references on the same day.

Progress

Covers: a week on thumbnails

About fifteen pull requests on the cover alone: picking a frame automatically, letting Claude judge the candidates, drawing the title in five styles, an Edit cover tool, and setting the YouTube thumbnail only after YouTube finishes processing.

Design

Settings, three ways

A read-only Settings tab became an editable one, then was removed altogether in favour of an Options pane that slides in from the right on every page, a System cog, and Ctrl+K search.

Decision

Cross-posting through Buffer and R2

TikTok, Instagram Reels, and Facebook Reels are reached through Buffer's free plan rather than each platform's own API, with every video served from Cloudflare R2. The posting cadence rose to four slots a day.

Milestone

Going to production, and launching a site to get there

Moving the Google Cloud app to production status needed a homepage, a privacy policy, and terms. So clipper-site was born: three static pages on GitHub Pages. After that, the YouTube token stopped expiring every week.

Milestone

The operator app, in five slices

The 115-line review page gave way to a real local web app: an Inbox with low-res preview renders and quality badges, a publish calendar, a campaign panel, a Health page, and Stats. Built in five slices in one day.

Milestone

The first working pipeline

Download, transcribe, let Claude pick the moments, render 9:16 with captions, review in a 115-line web page, upload. The first real run produced 63 candidates from 9 episodes, and 13 were approved.

Design

Render v3: framing that follows the shot

After reviewing the first batch, the renderer became shot-aware: it detects cuts, picks one framing mode per shot, keeps on-screen text in frame, and trims silence against the actual audio instead of the transcript.

The story, from the beginning

Render v3: framing that follows the shot

After reviewing the first batch, the renderer became shot-aware: it detects cuts, picks one framing mode per shot, keeps on-screen text in frame, and trims silence against the actual audio instead of the transcript.

Read the entry

The first working pipeline

Download, transcribe, let Claude pick the moments, render 9:16 with captions, review in a 115-line web page, upload. The first real run produced 63 candidates from 9 episodes, and 13 were approved.

Read the entry
Sixty-three candidates from nine episodes, thirteen approved. Every one of them taught the renderer something.
The shape of the system as it stands today: everything lives on one PC, and nothing posts without a human approving it.
The shape of the system as it stands today: everything lives on one PC, and nothing posts without a human approving it.

The operator app, in five slices

The 115-line review page gave way to a real local web app: an Inbox with low-res preview renders and quality badges, a publish calendar, a campaign panel, a Health page, and Stats. Built in five slices in one day.

Read the entry
Nothing posts from the calendar. It only tells you what the next tick will do, and lets you move it.
The Inbox: candidates on the left, the preview render in the middle, the clip's cover, badges, and summary on the right. Creator handles and the source episode title are blanked.
The Inbox: candidates on the left, the preview render in the middle, the clip's cover, badges, and summary on the right. Creator handles and the source episode title are blanked.

Going to production, and launching a site to get there

Moving the Google Cloud app to production status needed a homepage, a privacy policy, and terms. So clipper-site was born: three static pages on GitHub Pages. After that, the YouTube token stopped expiring every week.

Read the entry
The Google consent screen for Clipper while the app was still unverified. The account email is blanked.
The Google consent screen for Clipper while the app was still unverified. The account email is blanked.

Cross-posting through Buffer and R2

TikTok, Instagram Reels, and Facebook Reels are reached through Buffer's free plan rather than each platform's own API, with every video served from Cloudflare R2. The posting cadence rose to four slots a day.

Read the entry

Settings, three ways

A read-only Settings tab became an editable one, then was removed altogether in favour of an Options pane that slides in from the right on every page, a System cog, and Ctrl+K search.

Read the entry

Covers: a week on thumbnails

About fifteen pull requests on the cover alone: picking a frame automatically, letting Claude judge the candidates, drawing the title in five styles, an Edit cover tool, and setting the YouTube thumbnail only after YouTube finishes processing.

Read the entry
The Edit cover tool over the Inbox: the title typed one line per box, words to highlight, the five styles, a size slider, and a drag-to-place title.
The Edit cover tool over the Inbox: the title typed one line per box, words to highlight, the five styles, a size slider, and a drag-to-place title.

Ember: the app takes the site's colours

The app started in teal on purple to match the channel it served. It now uses the orange Ember accent and new logo from clipper-site, and the site dropped its channel-specific references on the same day.

Read the entry

Long-form clips, built in a day

Clips of three to fifteen minutes, rendered in 16:9, reviewed in their own Inbox tab, scheduled into a 3 PM slot, and published to YouTube as regular videos. Five slices merged in one day, each with one review round. Off by default so the owner can trial it on one channel.

Read the entry
The Inbox's Long form tab with a test clip: three moments after a title card, each with its source range. The clip and creator are the builder's test data.
The Inbox's Long form tab with a test clip: three moments after a title card, each with its source range. The clip and creator are the builder's test data.

Fixes before features: the covers that never arrived

Only two covers had ever reached YouTube. The publisher sent thumbnails in a burst, got rate-limited, and spent its single retry inside the same burst. Everything else stopped while it was fixed, and the owner's two questions turned a fix into a backfill and an on-demand command. Merged the next morning after one review round.

Read the entry
Can we correct all the videos that don't have covers?

Campaign sources only

Clipper now clips only footage that creators hand over directly. Downloading creator videos from YouTube is off by default, and a campaign source hosted on YouTube is never fetched.

Read the entry
Nothing is fetched from YouTube. The sources are the full episodes creators hand over.

Shorts covers, by hand after all

The rate-limit fix worked: every cover sent to a Short was accepted. Then every one of them vanished within minutes, while the same JPEG uploaded by hand in YouTube Studio stayed. The API cannot set a Short's thumbnail, by Google's own word. One day after the backfill shipped, Shorts no longer go near it: the app hands the cover over and links into Studio. Long-form videos keep the automatic path.

Read the entry
I think you need to do some more research on API uploading of thumbnails for shorts.

The reviewer wants a recording, so the YouTube path comes out

Google's API quota reviewer asked for a step-by-step screen recording of the whole workflow within seven business days. The submission from three days earlier described a tool that no longer existed: it still admitted downloading from YouTube and setting a cover on every upload. The owner's answer was to remove the download path from the code entirely, not switch it off, so the reply can say so plainly.

Read the entry
Get this all ready, use as many subagents as possible.

Clips from nowhere are held for good

The six o'clock shutdown never took, and half an hour later the owner asked whether clips under review that belong to no campaign should be cleared. Yes. A clear command shipped, review found four other doors a YouTube-era clip could still leave by, and the rework closed them all with one rule: a source outside any campaign is held, the same way paused and removed sources are.

Read the entry
Campaigns are the only source of content. As much as possible is automated. Ideally I only open the app and approve clips.

Ended campaigns, a restart that works, and the cover safe zone

Three merges across one evening and the small hours. Starting the app now restarts it if one is already running. Campaigns that have ended on the marketplace are flagged in Health with a switch-off button. And the owner's channel screenshots showed cover text trimmed at the top and bottom, so covers now keep their words inside the part of the picture YouTube actually shows.

Read the entry

Vetting campaigns by their rules, not their card

A campaign's board card says little; its real rules often live on another site, a shared document, or a PDF. The owner asked for the finder to read all of it, and named three hard disqualifiers: a page dedicated to the brand, the brand's name required in the account name, or required logos and branding. The reader fetches public pages only, keeps them for a week, and a stronger model does the reading, because the goal is the screen capture that goes to Google.

Read the entry
The best model for the job.

Read by hand, on a button press

The board that forbids scraping now gets read the agreed way: a button on the Campaigns page starts a Claude session in the owner's own browser, which reads the listings at a person's pace, answers in a fixed shape, and writes the file the finder merges. No tick and no schedule; only the owner's press. The session gets six read-only browser tools and nothing else. Review fixed five things before merge, and the manager held one more tool back: the one that can click and type in a signed-in browser. Also today, the tab named after the first board became Campaigns.

Read the entry
I like this and agree no schedule. Let's test it out. I'd want it to only operate after a button press from me.

The overnight run: fifty items, twenty-four merges, nobody watching

At one minute to midnight the owner handed over a fifty-item improvement list, a rollback point, and leave to shut the machine down when nothing more could be done. By seven in the morning twenty-four pull requests had merged, each built by a fresh subagent against the full test suite and, where it mattered, one review round. Two of the biggest features ship switched off until the owner turns them on.

Read the entry
Do ALL of the items you can do without me.

More boards, each read its own way

Five suitable campaigns out of thirty-six on the first board was not enough, so the owner asked for more boards. A survey found only two others with public listings. One forbids scraping in its terms, so the app will never fetch it; the owner's own browser session will read it instead. The other has no such rule and is read through a paid third-party actor, so the app never touches that site either. Both shipped the same evening, after review caught one board's bad day wiping the other's list. Also today: a daily cap on rules reads, and campaigns mostly in another language are skipped.

Read the entry
Let's add more boards for now. I'd like to increase the chances of finding campaigns that don't require dedicated channels.

The public page is not enough

The owner joined a second clipping board and asked for its campaign list to be read by a browser session rather than scraped. The survey found the public list carries only a card per campaign: brand, title, rate, and a lock. The rules, budget, resources, and minimum views live in the signed-in app, which the browser extension cannot reach until the owner allows the site. The read-by-hand guide now sends the session there and makes the block visible. Overnight, under a blanket go, three small merges followed, including a test that failed only when the owner's drive dipped under the free-space floor.

Read the entry
Anything else you can improve on or complete: you have my authorization to do so.