Desktop app · local AI · shipped installer
A Windows app that turns a multi-hour stream recording into a short clip, built so a nine-year-old can finish one without help. Drop in a video, let it find the good moments for you, add your own words and sounds, and the MP4 lands in your Videos folder. The moment-finding runs on your own machine first, and gets smarter if a grown-up adds an API key.
It is a desktop app, so there is no web demo to click. What follows is the build, the engineering decisions, and the test evidence.
Built July 2026 · self-directed
The problem
Clipping software is built for adults who already know what a codec is. A nine-year-old in my house wanted to cut funny moments out of long stream recordings and kept getting stuck: timelines that need frame-accurate dragging, export dialogs asking for a bitrate, and cloud tools that want an account and an upload before they will do anything. The real problem was not the cutting. It was that finding the good moment in a four-hour recording is the boring part, and every tool made you scrub for it by hand.
There was a second constraint I cared about more. A kid's tool should not quietly ship a family's home videos to somebody's server, and it should not stop working the day a subscription lapses.
What it does
The AI part, and why it is optional
With no API key, moment-finding still works. It is a loudness scan with a z-score peak picker, entirely offline. Add a key in the grown-up settings and a second stage turns on: short audio slices around each candidate are transcribed locally with a bundled whisper.cpp build, and only those text snippets go to Claude, which ranks the candidates and writes a short kid-friendly title for each. The video itself never leaves the machine.
The part I am most pleased with is how little the model is trusted. It answers into a schema, and the timings it returns are then clamped in code to within ten seconds of the candidate the audio scan actually found, no matter what it said. If it refuses, times out, hits the token ceiling, or returns something unparseable, the call returns null and the app falls back silently to the offline result. The user never sees an error about a feature they did not ask for. That invariant is written down as a project rule: the no-key path must always work end to end, and must never regress.
The key itself is encrypted at rest with Electron's safeStorage, lives in exactly one module, and is never passed to the renderer.
Engineering decisions worth naming
clippa://media/<token> protocol. Every IPC message is runtime-validated with Zod in both directions against one shared schema file, and senders are checked too.How it is verified
The suite runs unit tests and real export checks against a fixture set chosen for the places video pipelines actually break: HDR PQ, MKV/Opus, MPEG-2 transport streams, variable frame rate, 90-degree rotated, odd dimensions, square and tall, non-zero and shifted start timestamps, a file with no audio track, and a filename mixing Japanese, Cyrillic and a #.
On top of that there is an end-to-end self-test that drives the real renderer — open, probe, play, seek, thumbnails, decorate, export, cancel, find-moments — and exits non-zero on any failure. It runs against the packaged executable, not just the dev build, so "works on my machine" is not the standard. One of its assertions is a security check: it searches the IPC response for anything shaped like a Windows drive path and fails if a raw path ever leaked to the renderer.
The rule I held myself to: a milestone is only done when unit tests are green, the fixture exports verify, and the packaged smoke test passes.
Directing the AI, not just prompting it
This was built quickly with AI-assisted development, which is exactly why it carries a short AGENTS.md of durable rules at the repo root. Every constraint above lives in it as one line: no shell spawns, both-direction IPC validation, no raw paths in the renderer, never fork preview and export, the fallback must never regress, never fabricate progress. The value is not documentation. It is that an agent working on the tenth milestone cannot quietly undo a decision made in the second one, and that a passing test suite is what gets to call something finished.
Twelve milestone commits, then six packaged releases from 0.1.0 to 0.1.5 as it got real use and the rough edges came back.
The story · STAR
Situation
A nine-year-old wanted to make clips from long stream recordings. Every available tool assumed an adult editor, an account, and an upload, and none of them solved the actual chore, which is finding the good moment in a four-hour file.
Task
Build a desktop app a child can finish a clip in without help, that works fully offline, keeps the video on the machine, and gets better rather than broken when an API key is present.
Action
Built it in Electron with React and TypeScript over a hardened main process: Zod-validated IPC in both directions, opaque media tokens instead of file paths, and no shell spawns. Wrote a two-stage moment finder, an offline loudness and peak-picking pass followed by an optional local whisper.cpp transcription feeding a Claude ranking call whose output is schema-checked and clamped in code before it is trusted. Made the AI stage fail silently back to the offline result by design. Backed it with 82 tests over a codec-edge-case fixture set plus an end-to-end self-test that drives the packaged binary, then shipped NSIS and portable installers.
Result
A working, installed Windows app its actual user can operate alone, across six releases. It is the clearest example I have of treating a model as an untrusted component inside a product that still has to work when the model is not there.
Built with
Status & honest limitations
Working, installed, and in real use. Tests and fixture exports pass, and the packaged installer and portable build are both verified.
npm ci and the fetch scripts before it will build.Self-directed project, built with AI-assisted development.
Design note
The interface is deliberately loud and round: big targets, plain-language labels, confetti when a clip saves. Anything that looks irreversible is phrased as a question a child can answer. The hardest design constraint was not visual. It was refusing features that would have made the app more impressive to an adult and less finishable by a kid. No auto-captions, no sound library, no bitrate field.