Inspiration
Before a film shoots, someone has to read the screenplay and take it apart. That someone is the first assistant director, and the document they produce — the breakdown — is what every other department's schedule is derived from. Every prop, every stunt, every animal, every night exterior gets tagged. Scenes get grouped into shooting days. Cast get counted, not by scene but by day, because that is how actors are paid.
On a feature it takes two to three days of work, by hand, and it is the single most leveraged document in pre-production. Get it wrong and you discover on the day that you've booked an animal handler for a scene with no animal, or that your lead is being paid for a day she isn't working.
It is also, structurally, exactly the kind of work a network of agents should be able to do: read comprehension over a long document, applied consistently, with the results reconciled into arithmetic.
What it does
Upload a screenplay. Stripboard returns:
A breakdown — every scene with its slugline, page eighths, a one-line synopsis, and its production elements tagged across nineteen categories. Every element carries the verbatim quote from the script that justifies it, so a human checks the machine rather than trusting it. A stripboard — scenes grouped into shooting days, colour-coded by the standard production board convention. Company moves and night work are badged, and every day carries a plain-English rationale for why those scenes are together. A day out of days — cast against shooting days in real DOOD notation (SW / W / WF / SWF / H), with hold days totalled separately, because a held day is a day the production pays for and does not shoot. A budget — line items against a visible rate card, each carrying a basis string naming exactly what produced it. Continuity flags — cross-scene risks at three severities.
The two outputs that matter are the stripboard and the day out of days. Those are not invented formats; they are the documents a production office already knows how to read.
How I built it
React + Vite frontend, Python FastAPI backend, SQLite, one process. Agents on google-genai against Vertex AI, gemini-2.5-flash, using structured output with an enforced response schema. Built with Replit Agent, deployed on a Replit reserved VM.
Six stages: parse → split → tag → schedule → budget → qa, streamed to the browser over Server-Sent Events.
The design rule I held to throughout: agents where judgment is needed, deterministic code where correctness is provable.
Three of eight modules call a model. Fountain sluglines are structured text — parsing them with a model would be slower, costlier and less correct than reading them directly. Page eighths and cast days are arithmetic a reviewer can check. Neither benefits from inference.
Element tagging and continuity are different. Is a walk-in door that "hangs open, breathing cold fog" a set-dressing item, a practical effect, or both? Does extinguisher powder in a character's hair in scene 3 survive into scene 4, and are those scenes scheduled on different days? Those need reading comprehension and cross-scene memory.
The result is six model calls for a five-scene script rather than thirty — a breakdown that finishes in seconds.
Challenges we ran into
The one that mattered arrived twice, from opposite directions.
The tagger's prompt says, in plain language, that one person must carry an identical name in every scene, because the day out of days is built by matching those strings. The model mostly complied — which is worse than never complying. MARISOL and MARISOL VEGA both survived, and three stages downstream the cast grid showed five actors for three characters. A wrong document that looked entirely plausible.
So I wrote that rule as code: merge names whose identifying words are a subset of another's, within one category.
Then the opposite failure. A lexical rule cannot see that DOG and SHEPHERD MIX are one animal — they share no words. That is reading comprehension, so I gave it to a model. It promptly over-merged in the other direction, collapsing SEMI into TRUCKER'S RIG — two picture vehicles that pass each other on the same road in the same scene. The prompt explicitly said not to. It did anyway.
The fix was again a rule rather than a request: two names tagged in the same scene, in the same category, are different things. A tagger reading one scene does not name a single entity twice. The model may now propose merges; code refuses any pair that co-occurs. The dog merges. The vehicles cannot.
The other real challenge was scope. I started this contest with a much larger idea and abandoned it. Cutting to one document that production people already recognize was the decision that made the project finishable.
Accomplishments that we're proud of
The continuity agent found something I hadn't:
"Marisol's hair will have white powder from the fire extinguisher discharge at the end of Scene 3. Scene 4 is later the same story night but is scheduled on a different shooting day, requiring careful continuity of the powder or a clear explanation for its absence."
That is a script supervisor's note. It connects an effect in one scene to a scene shot on a different day and understands why that ordering is a problem. In the same pass it also flagged one of the tagger's own mistakes — snow tagged inside an interior kitchen — which is an agent catching the previous agent's error.
I'm also proud of what the tool refuses to do. The scheduler groups; it does not optimise. A real optimiser weighs cast availability, daylight, location holds and turnaround against each other, and a half-built one produces schedules a first AD can immediately disprove. Grouping is what a human does on day one, it is explainable, and every strip carries a rationale you can argue with.
What we learned
Anything downstream arithmetic depends on must be enforced in code, not requested in a prompt. A model that complies ninety per cent of the time with a naming convention produces a document that is wrong in a way nobody notices, because it looks right.
The useful division is not "AI does the smart parts." It is: the model supplies judgment, and code constrains every place a number depends on that judgment. In Stripboard the model may only group names it was handed, may only nominate a canonical from within a group, and never touches an arithmetic result. Every merge and every refusal is logged.
I also learned that failure behaviour is a feature. A stage failing degrades the document; it does not fail the run. A breakdown with no continuity flags is still useful. Every degradation surfaces as a warning rather than a stack trace.
What's next for Stripboard
Scheduling that optimises rather than groups, once cast availability and location holds can be entered as constraints — with the current explainable grouping kept as the default. Import from Final Draft and Movie Magic, and export to the formats scheduling software already reads. Revision tracking: re-run a breakdown against a coloured revision and show what changed, which is where the real recurring labour sits. Learned rate cards, so budget estimates reflect a production's actual quotes rather than a generic range.
Built With
- fastapi
- fountain
- gemini
- google-adk
- google-cloud
- google-genai
- json-schema
- python
- react
- replit
- server-sent-events
- sqlite
- sqlmodel
- typescript
- vertex-ai
- vite
Log in or sign up for Devpost to join the conversation.