ClipForge
namiciLab — in-house product
Status: In development at v0.1.0. Milestone 1 — import, transcribe, detect, caption and export — runs end to end.
Desktop app that turns long-form video into short vertical clips — transcribe it, let an LLM pick the moments, reframe to the speaker, burn in captions, export.

ClipForge turns a long recording into the short vertical clips that TikTok, YouTube Shorts and Reels want. Import a video, transcribe it, let a language model find the moments worth cutting, reframe them to follow whoever is speaking, burn in animated captions, and export the batch.
The challenge
Every stage of that pipeline is slow, and most of them can fail. Transcribing ninety minutes of audio, asking a model to judge which passages are worth clipping, tracking a speaker across a frame, and encoding a dozen exports are all minutes-long jobs against third-party tools that go down, change their pricing, or turn out to be the wrong choice six months later. Do it naively and the window freezes on the first import — and every provider you picked becomes permanent.
The approach
The core of the application depends on nothing at all: no Electron, no Node built-ins, just entities and interfaces. Every capability with more than one plausible implementation sits behind one of those interfaces, which is why there are five interchangeable highlight providers and three transcription backends rather than a hard-wired vendor. The real payoff is the plugin system: a plugin is simply a bundle that registers more implementations of the ports that already exist, so no plugin needs a new extension point invented for it — and that is what keeps the plugin API small enough to stay stable between versions.
The build
Nothing expensive runs inline. Probing, transcription, detection, tracking and export all go through a job queue: the interface enqueues work, gets an id, and subscribes to progress. That indirection buys cooperative cancellation, priority scheduling, deduplication — twenty cards asking for the same thumbnail produce one ffmpeg process — and progress throttling, because forwarding every ffmpeg update across the process boundary drops more frames than the encode does. A single typed contract describes every message crossing that boundary, and the renderer is given nothing beyond it: no filesystem, no module loading, just the allow-listed channels. Prompt text lives in Markdown files rather than in code, so tuning the highest-leverage part of an AI product never requires a rebuild.
Built with
Electron
Desktop shell, packaged for Windows, macOS and Linux
React + TypeScript
Renderer interface, on Radix and Tailwind
ffmpeg
Probing, filmstrips, filter graphs and encoding
Whisper
Transcription — hosted, whisper.cpp or faster-whisper
OpenAI · Claude · Gemini · Ollama · Qwen
Interchangeable highlight-detection providers
What the build covers
- Video import with ffprobe metadata, thumbnails and filmstrips
- Transcription across three interchangeable backends — hosted Whisper, whisper.cpp and faster-whisper
- LLM highlight detection across five providers — OpenAI, Claude, Gemini, Ollama and Qwen — returning scored, ranked candidates
- Automatic vertical reframing, driven by speaker tracking and a crop planner, with drag-to-adjust
- Burned-in captions: style presets, cue line-breaking and ASS subtitle generation
- Batch export through constructed ffmpeg filter graphs, with GPU encoder detection
- Job queue giving cancellation, priority scheduling, deduplication and progress throttling
- Plugin host with manifest validation, a sandboxed loader, a registry and a marketplace browse-and-install flow
- Licensing with device activation and a 30-day offline grace window; secrets held in the OS keychain
- User-overridable prompt templates, authored in Markdown rather than compiled in
- Packaged for Windows, macOS and Linux
Got an Idea?
Let's shape it into something people love to use.