INSPIRATION

Shooting is fast. Cutting is slow. A weekend shoot makes six hours of footage and eleven hours of editing work, so most footage waits in a folder and never becomes anything. Twenty years behind a camera taught me that the bottleneck is never taste and never the software. It is the first pass: watching everything, remembering what you saw, and deciding what earns a place.

There is a second problem hiding behind the first one, and it is the one every working editor knows. When the first cut finally exists, it shows you what the shoot missed. A close up you never got. An ending that does not end. By then the location is struck and the light is gone. The cut that could have been fixed with twenty minutes of pickups becomes the cut you live with.

CUTROOM was built to kill both problems in one sitting: the first cut tonight, and the list of what to shoot tomorrow.

WHAT IT DOES

You hand CUTROOM raw clips and one line of intent, for example: a confident 30 second promo of an artist reviewing framed astronaut art prints in a studio.

Five AI film agents take the job, each with a real cutting room role, and you watch them argue it out in a live log:

DIRECTOR turns your one line into an editorial brief: target runtime, pacing band, tone, opening and closing strategy, and a list of things to look for.

SELECTOR actually watches every clip through Gemini video understanding and returns timecoded moments with shot size, motion, subject and a strength score. It benches dead shots.

EDITOR builds an edit decision list against the Director's intent, with a reason on every cut, obeying working editor law: cold open, wide to tight alternation, motivated cuts, never pad to length, end on motion.

REVIEWER watches the assembled cut back, as video, and gets exactly one bounded improvement pass with typed orders.

COVERAGE, the fifth chair and the new work for this hackathon, reads the census the other four produced: which shot sizes exist, which made the cut, which strong moments were benched, which of the Director's look for items were never seen, which clips have no sound, how the cut runs against target, and what the Reviewer complained about. From that evidence only, it returns typed gaps, each with a severity and the census line it cites, and a prioritized pickup shot list a camera operator can execute with no further questions: size, what is in frame, what moves, how long to roll, camera note. It writes pickups.txt, a plain text call sheet you can read on a phone on set.

Out comes a watchable 1080p 24fps rough cut, the EDL as JSON and CSV so any editor can open any NLE, the review, and the pickup list for the next shoot.

It is not a finished film. It is the first eighty percent, delivered unattended, with its reasoning attached and its missing pieces named.

HOW WE BUILT IT

Node and Express API, vanilla JavaScript web app, ffmpeg and ffprobe for every frame that gets cut. Every brain is Google Gemini through the google genai SDK (gemini-3.8-flash with a gemini-3.5-flash-lite fallback, both env overridable). The Selector and the Reviewer use the Files API so the model watches real video. The Director, Editor and Coverage agents are text calls. Deployed at a public replit.app URL with ffmpeg declared for the deployment image.

The architectural rule that runs the whole thing: agents decide, code executes. No model ever touches the timeline. The Editor proposes an EDL and the server validates it: moment ids must exist, in and out points must fall inside the source spans, durations are recomputed. The Reviewer's orders are typed (trim, extend, swap, drop, reorder) with a signed delta, applied in code, capped at five, invalid orders logged as skipped.

COVERAGE follows the same rule. The census is pure code, computed from the crew's own outputs, and it is written into coverage.json next to the model's answer so every gap can be checked against the numbers. The model's answer is normalized before anything is trusted: unknown gap types are dropped, a pickup that names a gap that does not exist is dropped, prose shot sizes are mapped to the enum, roll time is raised to three times the pacing band so the editor gets handles, and everything that was dropped is listed under left out by validation. An empty answer is a failure, never a blank sheet. Zero gaps is allowed when the census is genuinely complete.

The stage runs only after the verdict is settled and the cut is already downloadable, so a coverage failure can never touch the cut.

Free tier all the way: the crew round robins across a pool of Google AI Studio keys and rotates on any rate limit or quota error, so one key's ceiling cannot stall a session.

CHALLENGES WE RAN INTO

Evidence, not vibes. The first temptation was to let the model look at the footage again and free associate about what was missing. That produces a wish list. The fix was to compute the census in code and forbid the model from claiming a gap it cannot cite. In the live run on the production session the model cited the exact look for items with zero hits and the Director's closing note, line by line.

Containment, not equality. The Editor cuts inside the spans the Selector found, so an EDL row is a sub span of a moment. The first census counted moments as used only when the spans matched exactly and reported two of five cuts. The test caught it against the real session before it reached the app. Used now means the row lives inside the moment, with the same tolerance the Editor's validator uses.

Rate limits are the weather. The single live coverage call on Sep 10 walked twelve keys before one answered, then finished in 88 seconds. The pool rotation from the base crew carried it without a line of new code.

ACCOMPLISHMENTS WE ARE PROUD OF

The pickup list is a real deliverable, not a summary. On the Sep 7 production session (three phone clips, 64 seconds of footage, verdict SHIP at 21.6 seconds) COVERAGE returned four gaps and four pickups, zero dropped by validation, and named the two things a working editor would have named first: no close up of hands on the frame, and an ending that pans across artwork instead of holding a gaze.

End to end on the development Mac, Sep 10, sample footage, real crew: brief in at 04:20, ten moments, six cuts, 19.0 seconds at 1280x720 24fps, Reviewer verdict one pass, then COVERAGE returned five gaps and eight pickups with zero dropped by validation, about 100 seconds of roll, all done by 04:32. It cited the Reviewer's own continuity finding (the jump between orange and pink lighting) and turned it into a walking shot that crosses the light boundary. Seventy two key rotations across the run, none of them fatal.

Five offline tests against a real production session, not fixtures we made up. They prove the normalization: unknown gap types dropped, orphan pickups dropped, prose shot sizes mapped, roll time raised, empty answers rejected, and a plain text sheet with no markup.

Five agents, one law. Every one of them emits structured JSON that code validates. The crew never touches the timeline and never touches the call sheet.

WHAT WE LEARNED

Give the machine the vocabulary and it will honor your standards. The Reviewer once wanted to make a shot longer but only had the word trim, so it described a lengthening as a trim. COVERAGE was designed with that lesson first: eight named gap types, three severities, seven shot sizes, one gap per pickup. The model filled the form correctly on the first live call.

Never trust a prompt to enforce a type. Every enum is normalized in code. Every count is computed in code. The prompt is craft; the code is the contract.

Test against the real thing. The fixture in the test suite is the actual session.json the deployed app produced on Sep 7. That is how the containment bug was found in minutes instead of in front of judges.

WHAT'S NEXT

Music aware pacing: cut to the track, not to the clock. Per scene color notes. And closing the loop on COVERAGE: drop the pickups back into the same session and let the crew re cut with the new footage, so the second night's cut is the one that ships.

DISCLOSURE OF PRIOR WORK (honest section, keep it in)

CUTROOM's base crew (Director, Selector, Editor, Reviewer, assembly) was built between Aug 27 and Sep 7 2026, inside this hackathon's Aug 21 to Sep 15 window, and was also entered in the Agentic Cinema hackathon on Devpost on Sep 7. The repository's first commit, dated Jul 28, is an empty Replit scaffold with no product code. The COVERAGE agent, its census, its normalization, its tests, the API stage, the two downloads and the web panel are new work built on Sep 10 2026 for the AI Builders Hackathon, on the branch ai-builders-2026 of the same public repository. If the organizers prefer a single hackathon per project, the new work stands on its own and we are glad to be judged on it.

PRESENTATION DECK

The ten slide deck required by the hackathon is in the image gallery of this page, slides 1 to 10 in order: title, problem, solution, target users, key features, architecture, AI technologies, impact, what was built for this hackathon, roadmap.

Built With

Share this project:

Updates

Submission history