-
-
Crew chemistry from shared credits, and the limits stated on screen: no availability, no location, no rate.
-
Evidence columns and the agent trace: parse, rank, collaborators, narrate, with per-step timings and the executed SQL.
-
One ranked slate per craft, each showing the ClickHouse funnel behind it: 63,072 directors narrowed to 3 in 233 ms.
-
Every recommendation opens its own arithmetic. Each score component names the ClickHouse column it was computed from.
-
Natural-language crew discovery over 1,295,494 ranked IMDb credits.
-
What the screenplay requires: eight crafts staffable from IMDb credits, and every department the dataset cannot staff, cited by scene.
Reel Crew turns a screenplay into a credit-backed crew plan. ClickHouse ranks. Gemini only parses and narrates. No candidate reaches the screen that did not come out of a SQL result set.
Inspiration
Crew hiring runs on memory and personal networks. A line producer can name perhaps thirty cinematographers. IMDb credits 41,401. The bottleneck is retrieval, not talent.
Asking an LLM reproduces the same bias in fluent prose: it recalls the Western canon and cannot cite a credit. We tested this directly — Gemini scored 8/8 verifiable names on one run and 6/8 on another. It usually knows the famous ones. It never surfaces the other 40,000.
A second constraint shaped the design: no profiles are created for people who never opted in. Reel Crew builds no LinkedIn-style pages. It computes capability summaries from public credits, and every figure links back to the titles that produced it.
What it does
1. Screenplay in, crew requirement out. Scene breakdown extracts location, time of day, and production signals. Eight IMDb-covered crafts get ranked slates. Every other department the script demands is reported, not dropped — a gaffer for the night exteriors, a stunt coordinator for the fight, an armorer because someone loads a gun — each citing the scene numbers that triggered it.
2. One ranked slate per craft. 100-point match score: genre fit (40), track record (25), audience reach (20), recency (15). Every component displays the column it was computed from. A pool of 24 is scored per role so quality can outrank credit volume.
3. Explain any recommendation. Each slate exposes its ClickHouse funnel:
41,401 people credited as cinematographer → 10,475 with matching genre credits → 1,234 past the rating, vote and year floors → 244 with enough matching credits → 24 scored → 3 shown · 180 ms
4. Similarity search. Each person is a 28-dimensional vector of credits per genre, compared with cosineDistance, same craft only. Cosine normalises career length, so a 6-credit DP can match a 30-credit one on the shape of the work. Query "like Jarin Blaschke" returns Julie Kirkwood (The Blackcoat's Daughter), Kiyomi Kuroda (Onibaba, 1964), Shin'ya Tsukamoto (Tetsuo), Decha Srimantra (The Eye). An "only lower-profile" toggle caps candidates at the reference's audience reach — not who is like Blaschke, but who works like Blaschke that I can book.
5. Crew chemistry. A self-join over shared titles scores the assembled unit. It surfaced a real working pair: composer Jakes Bejoy and editor Shameer Muhammed, five films together.
6. Production plan. Stripboard, top-sheet budget, risk register, constraint replanning with before/after comparison, and a persistent project record.
How we built it
ClickHouse — Partner track requirement, used at runtime. Every production query crosses the official read-only mcp-clickhouse MCP server over the MCP protocol, connecting to ClickHouse Cloud. Served from a process pool, since a stdio server holds one conversation at a time.
Google Cloud. google-adk runs the agent as a real Workflow graph (START → parse → search → collaborators → narrate). google-genai calls Gemini 2.5 Flash-Lite for structured brief extraction and narration only. Deployed on Cloud Run, built by Cloud Build, persisted in Firestore.
Ingestion. Four gzipped IMDb TSVs read directly from datasets.imdbws.com using ClickHouse's url() table function — no ETL, no staging bucket. 101,655,603 raw credits in ~52 seconds, denormalised to 1,295,494 rankable rows: 344,752 people, 157,624 titles.
Six queries are the product. Q1 ranked search · Q2 collaboration graph · Q3 profile assembly · Q4 cosineDistance similarity · Q5 role funnel · Q6 crew chemistry.
Measured. Ranked search 153 ms. Collaboration graph 108 ms. Full seven-role crew build, 15 queries: 2.3 s. Six concurrent searches: 4.1 s. ClickHouse accounts for 261 ms of a 3 s search; the remainder is Gemini.
Fallbacks. A deterministic rule-based parser backs the Gemini path, so the product runs with no API key at all.
Challenges we ran into
Collaboration counts were inflated. Ari Aster showed 7 shared films where he has 3 — one person can hold several credited roles on one title. Fixed with uniqExact(tconst).
A SQL alias silently disabled a filter. Aliasing an output column category shadows the table's own column, collapsing WHERE category = ref_cat into ref_cat = ref_cat. A cinematographer search returned writers and producers, and looked plausible enough to ship.
Six concurrent searches took 18.5 s. We assumed ClickHouse and built a connection pool. It changed nothing. The trace showed the handler was async def while every node blocked, running all I/O on the event loop. Moved to worker threads: 18.5 s → 4.1 s.
Em-dash sluglines lost their time of day. INT. CAFE — NIGHT parsed as location "CAFE — NIGHT", time "UNSPECIFIED". Final Draft, Word and PDF exports all emit em dashes, so real scripts silently lost night detection — no gaffer, no night risk, a mis-grouped stripboard.
Accomplishments that we're proud of
101.6 M rows ingested with no ETL pipeline, ranked in under 200 ms. An agent where every claim is traceable to a query and the funnel is visible in the UI. 25 automated tests, including contract tests that pin the concurrency fix and the slugline parser.
And a product that states its own limits on screen: no availability, no location, no rate. It is a research shortlist, not a hiring decision.
What we learned
Recall is biased toward the Western canon. Credit data is not. Three of six ranked candidates — Jishnu Bhattacharjee (Stree 2), Shehnad Jalal (Bramayugam), Ical Tanjung (Impetigore) — never surface from an LLM's memory. A producer does not need help remembering Jarin Blaschke. They need the other three hundred.
We also learned to test the demo before scripting it. We planned to show plain Gemini inventing names, measured it, found it usually correct, and cut the claim.
What's next for Reel Crew
Budget-tier fit — median credit reach is a clean proxy for the production scale a person works at, connecting the budget to the slate. Region and language coverage from title.akas. A production package export for the production office.
Built With
- clickhouse
- clickhouse-mcp
- fastapi
- gemini
- google-cloud
- google-cloud-agent-builder
- google-cloud-run
- imdb-public-datasets
- multi-agent-ai
- natural-language-processing
- python


Log in or sign up for Devpost to join the conversation.