![]()
The company once ran an AI agent contest, and video understanding was one of the bounty topics. More than 150 teams entered. Our tool made the top eight. The top three all had directly visible business value; ours was more exploratory, so eighth was where it stopped.
It was a real company project. The data, models, and evaluation took serious work. We came away with a place on the leaderboard and a cash prize, which did fund a stretch of good meals.
The company code is still around, but it is tied to the business and awkward for personal use. Later I wanted a simpler version: no evaluation suite and no long tuning loop. Drop in a video and tell me what it says.
That became KOMA, and I put the code on GitHub. The first version was small and only had to solve how I watched one video.
KOMA first answered one question
The first KOMA was a small web app. Drop in a local video or paste a Douyin or Bilibili share link, and it would resolve the video, then run a short pipeline:
- FFmpeg extracts a small set of frames
- ASR turns the audio into sentence-level subtitles with timestamps that jump back into the video
- A vision model reads the frames and returns a summary, tags, and rewatch highlights
- The player puts the subtitles, keyframes, and highlights back on the timeline
Link resolution was more annoying than the models. Douyin short links and popup URLs had to be traced back to a real share page; Bilibili and other sites took different routes. I eventually handed everything possible to yt-dlp. If the app still could not get the video, it reported the failure instead of pretending the analysis had worked.
At the time, subtitles were grouped into sentences. ASR returned word timestamps, which were combined using punctuation and pauses. With a public service URL configured, speaker diarization could add “Speaker N” labels to conversations.
The first version was only this big. It hard-coded a few limits: 15 minutes, 500MB, one frame every six seconds, and at most 12 frames.
There was no long-video queue and no history. Intermediate audio was deleted after analysis, while the original video, results, and frames expired together after 20 minutes.
This was not a multi-user service. It was a temporary way for me to inspect one video, close the page, and let the files disappear.
![]()
KOMA now keeps the result
KOMA did not stay a temporary way to inspect one video. Each job now has a result page that can be revisited, and the browser that submitted it keeps a personal history. Chapters, keyframes, subtitles, and tags share one timeline; clicking any of them jumps back to that point in the video.
When a summary is not enough, I can describe what I want extracted and export the result as JSON, CSV, Markdown, SRT, or TXT.

This is a KOMA concept illustration, not a screenshot of one release. The project will keep changing, and I do not want this post chasing every button.
The first half records the earliest KOMA. The 15-minute limit, 20-minute cleanup, and “read it and forget it” behaviour were true then; they are not a description of the current product. The latest code and feature list are on GitHub (opens in a new tab).