← Work

Independent · Designed + built

Timed, editable subtitles
for a long confidential file

I needed captions timed to the frame, for a long video I could not send away. Existing tools handed back untimed text, locked the result, or drifted halfway through. So I designed one and wrote it.

Scope
Sole designer and builder.
Year
2026
Context
Independent. One production job that became a product.
Stack
Electron · React · TypeScript · FFmpeg · whisper.cpp · Qwen · Gemini + OpenAI

Why I built it

What a video editor actually needs is captions that are timed to the frame, editable afterwards, and exportable in a format an edit suite will take. The consumer tools either hand back a wall of untimed text or lock the result behind a subscription, and the models that transcribe beautifully for two minutes start drifting somewhere in the middle of a long recording. I needed it to hold a long file, keep the timings, and work in more than one language.

I started this for one production job. Then I needed it again, and at that point it had to become a product rather than a script I keep patching.

The long-file problem

Sending an hour of audio in one piece is what makes a model start inventing. So the app splits the audio into chunks and gives each one a twenty-second overlap with the chunk before it. Chunking sounds like an engineering decision. It is the product decision: it is the difference between a tool that works on a two-minute clip and one that works on the thing people actually get paid to edit.

From a video to timed subtitles

From a video to timed subtitlesAudio is cut into overlapping pieces, transcribed locally or in the cloud, stitched, gap-healed, then edited and exported. The video stays on the machine.Cloud · if you turned it onGemini or OpenAI, over a tested keyaudio pieces uptimed text backON YOUR MACHINE● THE VIDEO STAYS HEREYour videoor audio fileFFmpeg cuts the audiooverlapping pieces, so themodel keeps its placeLocal Whisperaudio never leaves.Cloud is the other door.Stitchedone timed fileGap healingskipped bits found and redoneEditlist, timeline, versions, translateExport or renderSRT · VTT · ASS, or burned in

A folder you can move

Each job is a folder, defaulting to Documents. The media is copied in, so the identity of the project is the folder, not a path that breaks the moment you take it somewhere else. Drop a video, an audio file, a subtitle file, or a project. Or start from scratch.

Home: drop a file, or pick up a project from the list.

Home