Inspiration
Every comic has a bit that killed in one city and got silence in the next. Every best man has a joke that half the wedding didn't get, and every professor has a game-show analogy that's older than the students in the lecture hall. Colleges once published a list every fall of things the incoming class had never heard of, so faculty would stop making references that died in the room.
A language model can't fix this on its own. It knows what Love Island is. It doesn't know that the 55-and-over crowd at a Cedric the Entertainer show in St. Louis has never warmed to it, that Waffle House is Atlanta's own, or what a 26-year-old opener could say instead. Those are questions about who likes what, and where, which is what Qloo's taste graph answers.
What it does
You bring a script (a tight five, a toast, a lecture, a keynote, ad copy) and say who's listening: a preset room like a college crowd or a wedding reception, or the fans of a specific comedian, band, show or podcast, plus the cities on the tour.
- Every name it leans on, found. Claude reads the script the way a writer would: a song counts as its artist, a catchphrase as its show, "Central Perk" as Friends, and each name comes with the job it does in its line.
- A call for this room, and for each city. Each name gets lands, risky or won't land, with the Qloo numbers behind it: how alive it is in culture today, how this room's age groups like it compared with the average adult, and where each city on the tour ranks it among 24 big US metros. Switch cities and the marks change: Kai Cenat is a top-two name in Atlanta and a weak one in St. Louis.
- Stand-ins that play the same part. For a name that would miss, a Claude agent searches Qloo with its own tools and only offers stand-ins that measure better for this crowd, then rewrites just the words that change. Take one and the line updates in place as a tracked change. The agent also knows when to leave a name alone: when the joke is that this crowd wouldn't know it, it says so.
- A crowd made of someone's fans. Pick "fans of Cedric the Entertainer" and Qloo supplies that audience's age mix (53% are 55 or older) and the cities where they cluster (St. Louis, Atlanta, Dallas).
- Local material. Places and artists this crowd favors in each tour city, for an opener or crowd work.
- Claude's guess next to Qloo's numbers. Before seeing any data, Claude calls every name blind, and the page shows where the guess and the measurement part ways.
- Where people write. A Google Docs sidebar marks the names in the document itself and writes a chosen stand-in into the text. An MCP server gives agents the same checks:
check_script,compare_rooms,find_swaps,score_reference,fans_of,crowd_hooksandlist_rooms.
The site opens on a real check: a young comic's set read for Cedric the Entertainer's fans in St. Louis and Atlanta.
How we built it
- Next.js 16 and TypeScript on Vercel. An analysis streams progress to the page as it goes; live stand-in searches run as separate requests so each has the host's full time limit. Upstash Redis holds a shared Qloo response cache and the rate limits.
- Claude Opus 5.5 through the Anthropic SDK for the language work: structured-output extraction, choosing between ambiguous Qloo candidates (it may decline rather than measure the wrong thing), the blind gut calls, and the stand-in agent. The agent is a tool loop with five tools (find candidates, look up a name, find genre tags, check, submit), a validator that rejects unchecked or unconvincing stand-ins, and a wrap-up rule so it always submits what it has before its turn and time limits.
- Qloo's Insights API, through code that does all the math:
/searchand/entitiesto pin each name to the right entity;/v2/insightswithfilter.type=urn:demographicsfor each entity's lean by age group, weighted by the room's age mix into one room index;/v2/insightswithfilter.type=urn:heatmapover aMULTIPOLYGONof small boxes on the tour cities and 24 big metros, ranked in one response, for the city calls;/v2/insightswithfilter.type=urn:entity:*,signal.interests.entities(the original, plus the performer for a fans room),signal.demographics.age,filter.popularity.min,filter.tagsandfilter.exclude.entitiesfor stand-in candidates, and/v2/tagsto narrow by genre;urn:entity:placewithfilter.locationand artists withsignal.locationfor local material; and the performer's own demographics and heatmap to build a fans room.
- Deterministic calls. Plain rules turn the numbers into verdicts. Qloo's age index says how much a group enjoys something, not whether it has heard of it, so a household name this crowd is cool on is risky, and won't land is kept for faded or niche names the crowd doesn't care about. A city's top three moves a name up a step; its bottom four moves it down, except for names everybody knows.
- The Docs sidebar is an Apps Script bound to a document that frames the site and relays a handful of document operations over
postMessage, checked against the expected origins. - The examples replay recorded model output and are measured again on Qloo every time, so they're instant and current.
How we checked it
We tested on 21 scripts that were actually performed (presidential correspondents' dinner speeches with the transcripts' laughter marks, commencement speeches and TED talks, stand-up excerpts checked against each comedian's own fans, published wedding toasts), none of which we wrote or tuned on.
- Finding the names: 89.1% recall and 98.6% precision against references annotated blind by someone else; 90.9% of the kinds of things Whoosh measures.
- Do the calls track laughs? Lines whose name we called lands got a laugh 68% of the time, risky 58%, won't land 25% (95 measured references, so a sanity check rather than proof).
- Is Qloo telling us anything the model doesn't know? Claude's blind call and Qloo's numbers disagreed on 78 of 227 names, and Claude called 6 of the 14 names Qloo marks as misses safe.
- 10 of 10 stress cases pass (instructions planted in a script, lyrics, a Turkish script, private names, politicians), and 98 unit tests cover the rules, the agent against a scripted model, and the Docs script against a stand-in for Apps Script.
Challenges we ran into
- Liking isn't knowing. Qloo measures affinity, not recognition, so the first version called household names "won't land" with any room that was cool on them. Separating presence (popularity) from liking (the age index) fixed it.
- The right entity. "Canvas" is a learning platform, a restaurant and a dozen businesses; "Buc-ee's" exists in Qloo only as individual stores. Exact matches go through on their own and everything else goes to Claude with permission to say "none of these."
- Cities on one scale. Heatmap values only mean something inside one response, so every city check asks about the tour and a fixed panel of big metros together and ranks them.
- Stand-ins that keep the joke. Early agents swapped a real person's quote onto someone else, or replaced a Gen Z streamer with an older comedian in a joke that was about the generation gap. The agent now never changes a fact, keeps a name when its strangeness to the room is the point, and keeps its rewrite true to the sentences around it.
- Time limits. A thorough stand-in search can take minutes; searches run as their own requests and wrap up before the turn and time budgets run out.
Accomplishments that we're proud of
- On real performed scripts, names we call lands got laughs nearly three times as often as names we call won't land.
- A room can be made of a specific performer's fans, which is what an opening act actually needs.
- The tool explains itself: every call shows its numbers, every stand-in shows why it fits, and Claude's own guess sits next to the data.
- It meets writers where they write (the web, Google Docs) and agents where they work (MCP).
What we learned
A model is very good at language and confidently wrong about taste: on one reference in three, its guess about how a room would take it disagreed with the measurement. The best results came from letting each side do what it's good at: Claude reads, matches and rewrites, and Qloo's numbers make the call.
What's next
- More rooms and countries for localizing ad copy, subtitles and game dialogue.
- A Google Docs add-on on the Marketplace, plus Slides for keynotes.
- A writers'-room plan for comics, speechwriters and agencies, and an API for AI writing tools that want to check their own drafts before a human reads them.
Built With
- anthropic-sdk
- claude
- google-apps-script
- model-context-protocol
- next.js
- qloo
- react
- tailwindcss
- typescript
- upstash-redis
- vercel
- vitest
- zod
Log in or sign up for Devpost to join the conversation.