-
-
Claude Code calls check_scene over MCP: Rival's in Lagos and London, with the Champions League and Formula One as swaps.
-
One picture check, call by call: brand records, lift against Coca-Cola, one heatmap over six city boxes, the pick, the redraw.
-
Fans of SZA and Daniel Caesar, ranked by lift against Beyoncé's fans. Each name opens a receipt with the exact GET.
-
Review for Atlanta: Qloo's candidates hold Chick-fil-A, loved at 0.88. Nando's becomes Chick-fil-A; Atlanta goes 80% to 92%.
-
Gemini reads tennis on the TV. Qloo's brand records file Wimbledon under Stella Artois, so the frame reads Rival's for Heineken.
-
Inside Lagos: the TV reads Rival's at 0%. Room's pick is the Champions League, Heineken's own partner, loved at 0.79.
-
After Keep it, the Champions League fills Lagos: Known 1.00, Loved 0.79. The label turns from Rival's to Fits at 100%.
-
Each city is a room drawn to the box Room sends to Qloo. Each column is one Qloo heatmap cell for SZA; pins are Qloo's places.
Try it in two minutes. Open https://sozoroom.web.app/#map/picture/lagos-bar and press Walk into Lagos. The TV in a Heineken frame reads Rival's, because Qloo's brand records file Wimbledon under Stella Artois. Press Redraw for Lagos: the Champions League, wait about a minute, then press Keep it: Lagos turns to Fits at 100%.
Inspiration
Every campaign carries culture: the sport on the TV, the song in the edit, the name in the line. One campaign now runs in many cities, and each city reads those choices its own way. Qloo already holds each city's taste. Room brings it to the frame, the script and the brief while the work is still cheap to change.
What it does
Picture. Name a brand, pick up to four cities, drop an ad frame or a clip. Gemini reads every cultural element a viewer would notice. Qloo scores each element it holds for the brand in each city: Fits, Rival's, Off-market or Off-brand. A sport in the frame gets the best local alternative. Redraw for a city asks Gemini's image model to change only that box. Room reads the new frame back, checks that everything else held, and then scores it.
The map. Each audience city becomes a room seen from above, walled by the exact box Room sends to Qloo. Each column is one Qloo heatmap cell at its true position, coloured by Qloo entity type. Known stands as the walls, Loved as a glass plane, and Room's 0.45 line runs round every wall, so a verdict reads as geometry. A frame, a line or a Pitch idea walks into its city, and the label turns when the work changes: Rival's to Fits, Inside to Lands. Each floor carries its receipt, the exact GET and its cell count.
Room, for words. Scripts, Word files, decks and PDFs. Every reference gets a verdict per city (Lands, Roast, Inside, Dies, Famous) and a room score, with age bands. Review for a city runs an agent that swaps, drops or keeps each weak reference and shows its trace. Word comes back with tracked changes and the reason in a comment. A Gemini alone switch shows the model's guess beside Room's: on the stand-up sample Gemini alone says Crocs lands in four cities, and Room, reading Loved from Qloo, calls it a roast in all four.
Pitch. One line in: "A debut album for fans of SZA and Daniel Caesar. Out in March. London, Atlanta, Lagos." Qloo reads the fans across nine kinds of culture, ranked by lift against Beyoncé's fans (Smino +0.313, Elden Ring +0.276), maps where they gather (Atlanta and London open, Lagos builds) and names the places (Wax 'N' Facts, Phonica Records, Terra Kulture). Gemini writes up to three ideas, and every name in them is a Qloo record with a receipt.
Tour and agents. Tour runs one script through up to eight stops. Eight MCP tools at https://sozoroom.web.app/mcp give any agent the same checks.
One product. The bar at the top carries the tabs, the cities, the age band and Paper or Map. Work moves across it: a Pitch idea goes to Room with Check the copy, its rollout goes to Tour with Take it on tour, and a kept redraw or an accepted swap turns its label on the map. Every change waits for a person: Accept or Ignore for words, Keep it for a frame. Room opens light, with Dark on a toggle. Every control works from the keyboard, text meets WCAG AA in both themes, and motion follows the reduced-motion setting.
Who it's for. Brand and agency teams taking one campaign to many markets check a key frame or a script before the shoot: the Lagos frame turned from Rival's to Fits with one redraw, read back 60.4 s after the press. Sponsorship teams see whose property sits on screen, straight from Qloo's brand records. Labels, studios and promoters plan a rollout city by city at real venues. Writers take a set on the road and keep the references the joke needs.
How we built it
Two engines, one rule. Gemini reads and writes. Qloo measures. Gemini picks among Qloo's candidates by entity id. In Pitch, Room renders every name from its own copy of the record, and a checker strikes any sentence that names something outside the evidence pack. In Review, Gemini writes the new line around its pick, and Qloo scores the pick before Room proposes it.
Why Qloo. Room takes five answers from Qloo alone: who holds a property (brand records), how far a brand's fans lean toward it against a household name's fans (lift), how much each city loves it on one shared scale (the heatmap), what a city leans toward in place of a weak reference (swap candidates), and where the fans gather (places). The same request returns the same numbers, and Pitch's receipts and the map's Receipts print the exact GET. Gemini supplies sight, recognition and words.
The Qloo workflow. Every call is a GET to hackathon.api.qloo.com, with the key held on the server.
- Resolve.
/search?query=<name>&types=urn:entity:<type>&take=5→ the entity id; loose matches get flagged. - Known and Loved.
/v2/insights?filter.type=urn:heatmap&filter.location=MULTIPOLYGON(<room + 5 anchors>)&signal.interests.entities=<id>&signal.demographics.age=<band>&take=50→ Loved, the median cell per city; presence, the entity's cells over a household name's; the map's floor. - Brand records.
/search?query=Heineken&types=urn:entity:brand&take=5, then each competitor → partnership, competitor_brand and similar_brand tags: ownership. - Lift.
/v2/insights?filter.type=urn:entity:brand&signal.interests.entities=<brand>&filter.results.entities=<24 sports properties>&take=26, then Coca-Cola → the brand's fans minus Coca-Cola's. - Swaps.
/v2/insights?filter.type=urn:entity:<type>&signal.interests.entities=<id>&signal.location=POLYGON(<city box>)&filter.exclude.entities=<id>&take=10, then byfilter.tags→ candidates the city leans toward. - Pitch lanes.
/v2/insights?filter.type=urn:entity:<kind>&signal.interests.entities=<subjects>&filter.popularity.min=0.5&filter.exclude.entities=<subjects>&take=25, then the control → lift in nine kinds; threads from tags. - Places.
/v2/insights?filter.type=urn:entity:place&filter.location=POLYGON(<city box>)&filter.tags=urn:tag:category:place:record_store&signal.interests.entities=<subjects>&take=10→ where the fans gather. - Pins.
/entities?entity_ids=<up to 10>→ venue coordinates on the map.
Verdicts follow fixed lines: Known under 0.15 reads Dies, under 0.45 Inside; a known reference with Loved under 0.45 reads Roast. Picture picks from 24 sports properties pinned to exact Qloo names: the brand's own partners first, then city love plus twice the lift. A pick must read Lands with Loved 0.45 or more. A property held by one of the first six competitors on the brand's Qloo record qualifies only when the brand holds it too.
Gemini's role. Gemini 3.7 Flash reads scripts and frames into structured JSON and plans the agent. Gemini 3.6 Flash estimates recognition for Known and picks among Qloo's candidates. Gemini 3 Pro Image draws Pitch's key visuals and redraws frames from instructions the server builds, and Room reads every drawing back.
One request, two uses. The board and the map share one heatmap. engine.profile() sends it once; floors.put() packs the same cells into a floor, one byte per geohash cell, under the same polygon key. Chip and board print one number, and anything Room has scored draws on the map at zero extra Qloo calls.
Caching and limits. Process memory, then a private Firestore database (45-day TTL), hold Qloo lookups, floors and samples; pasted text stays in server memory. Three Qloo calls fly per instance, starts 150 ms apart, with backoff on 429s. Redraws run 12 an hour per visitor and 150 a day. Cloud Run serves the API at 512 MiB with a 120 s timeout.
One request to result: the Lagos frame
Live run, 19 October 2026. Entity ids cut to eight characters; the key stays on the server.
- Read.
POST /api/scene/read. Gemini returns one element on the TV: "grass court tennis match broadcast", sport tennis, evokes Wimbledon, with its box. - Records.
POST /api/scene/fitwith Heineken and Lagos, London, Dallas, New York.GET /search?query=Heineken&types=urn:entity:brand&take=5lists Formula 1, UEFA Champions League and Rugby World Cup. Competitors' records add Stella Artois: Wimbledon. - Lift. Two calls over the 24 properties,
take=26, with Heineken (BEF33272…) and Coca-Cola (A539C8C9…) as signals. The tennis reads as the ATP Tour: +0.047 against Coca-Cola's fans, 7th of 24. - Ownership. "Wimbledon" matches Stella Artois's partnership. The TV reads Rival's in all four cities: 0% each.
- City love. One heatmap per candidate over
MULTIPOLYGON(((-97.05 32.56, -96.55 32.56, …)), … six city boxes). Picks: Lagos, the Champions League (13244E4E…) at 0.79, Heineken's own; London, Formula One at 0.73, Heineken's own; Dallas and New York, the PGA Tour at 0.55 and 0.51. - Redraw.
POST /api/scene/fix. The server writes the instruction from its own read: change only the TV to a floodlit night football match, plain kits, everything else as it was. New frame in 32.9 s. - Read back. "Drew football. Room reads football (football match broadcast in an illuminated stadium). The other element held, and so did the product." 60.4 s from the press.
- Keep it. Lagos 0% to 100%, Fits, Loved 0.79. London 100%, Fits. Dallas and New York 40%, Off-market, Loved 0.19 and 0.42.
- The map. Room reads the tennis city by city. Inside Lagos the floor draws the Women's Tennis Association, the tennis property Lagos loves most; the board names the ATP Tour, the one Heineken's fans lean toward most. The frame evokes Wimbledon either way, so both read Rival's. After Keep it the floor turns to the Champions League: Known 0.40 to 1.00 (218 cells, then 968, against Coca-Cola's 544) and Loved 0.53 to 0.79.
Challenges
- Heatmaps rank inside the request. Two city requests sit on two scales. Room draws every city plus five anchors (New York, Los Angeles, London, Johannesburg, Lagos) as one MULTIPOLYGON, so all of them share one scale.
- Fame and taste are two measurements. Thin artist records missed home cities; several African artists share one cluster map peaking in Lagos. Known now comes from Gemini, raised where Qloo measures a fan base; for artists with popularity under 0.5, Gemini's estimate stands alone. Loved, age, swaps and picks come from Qloo.
- Names. "Nviiri the Storyteller" once matched a Swedish metal band. Matching is now token- and accent-aware with a 0.65 floor, and swaps search inside each city's own box.
- Rate and time. Three calls in flight drew five 429s in 93 attempts, so starts sit 150 ms apart. Hosting closes a request at 60 s, so the browser drives the agent step by step and each map request runs on a 40 s budget.
Accomplishments
- Fame benchmark. Which of ten cities is a name's home: 55 references, Qloo's map alone 87% (clean artists 67%), Gemini alone 100%, Room 100%. That result set Room's split: Gemini for recognition, Qloo for love.
- Taste pilot, pre-registered. Which of two cities loves an artist more, judged by Apple Music city charts; protocol frozen in a public commit, predictions hashed before scoring. 794 items, 30 clusters, US, UK and Canada: Room's Qloo map 79.9%, Gemini asked directly 86.0%, null controls 50.0%. Inconclusive by the rule set in advance (Holm p 0.072). Qloo's map beats every null (p 0.0004 or less), and item by item the two sit at 81.2% and 81.5%. Room keeps Qloo for Loved: the map places love cell by cell at about a kilometre, by age band, and each number traces to one GET.
- A map drawn from the data. Each wall is a request box, each column a Qloo cell, and every chip matches the board.
- An agent with judgement. For Dallas it keeps Greggs, Coronation Street and Kabza De Small, because the joke needs them.
- Eight live MCP tools. In Claude Code,
check_sceneon the Lagos frame returns the app's verdicts and swaps.
What we learned about Qloo's data
- Heatmap affinity is a rank inside the answer. A cell's affinity equals the share of that answer's cells with a lower affinity_rank (zero error over 2,444, 7,295 and 13,280 cells). The two-city MCP call reads Lagos at 0.77 and London at 0.71, against 0.79 and 0.73 in the four-city room. Compare cities inside one request.
- affinity_rank is fixed per cell. 21,328 of 21,328 cells matched between one box and a seven-city polygon. popularity re-ranks per request area; 4% of cells kept their value.
- One answer holds the whole map. take and page leave a heatmap whole: 63 to 13,280 cells. Rooms of up to 13 boxes return geohash-6, about 0.8 × 0.6 km in London.
- Brand records list partners and rivals. partnership, competitor_brand and similar_brand tags make ownership checkable. Bud Light and Coors Light both list the NFL, so Room keeps a brand's own partnership as its ground and names the sharer.
- Same request, same answer. Lifts repeat with zero spread; every run-to-run shift comes from Gemini's choices.
Limits
- Room scores references Qloo holds: brands, artists, shows, films, books, games, podcasts, people, places and sports properties. Slang, food and memes stay unscored. Tone and sensitive phrasing sit outside the check.
- Inputs are text, Word, PowerPoint, PDF, still frames and up to 16 muted clip frames. Sound stays outside the check. Redraw covers sport, on stills; a clip gets a shot note.
- The sample frames are generated stills with the brand typed in.
- Ownership comes from Qloo's brand records, and records can trail real deals. Michelob ULTRA holds the PGA TOUR's beer rights through 2030; Qloo's Michelob ULTRA record lists Team USA, The Masters Tournament and the NBA. So Room offers the PGA Tour to Heineken in Dallas and New York. Check category deals before you shoot. Heineken's Champions League deal ends in August 2027.
- Affinity describes audiences in aggregate. Every score speaks for the room.
- Qloo's hackathon data runs richest in the US and the UK. In the taste pilot it covered 68% of eligible artists in the US, UK and Canada.
What's next
- Tour rooms on the map.
- Redraw for clips, shot by shot.
- A category-deal layer beside Qloo's brand records.
- Room inside Google Docs, PowerPoint and Final Draft.
Built with
Qloo Insights API, Gemini on Vertex AI, Python, FastAPI, Cloud Run, Firebase Hosting, Firestore, MapLibre GL JS, the MCP Python SDK, plain HTML, CSS and JavaScript.
Try it
Free and open on any desktop or phone. Light theme by default.
- The frame on the map. https://sozoroom.web.app/#map/picture/lagos-bar shows four rooms at Rival's, 0%, with Lagos's pick, the Champions League at 0.79. Press Walk into Lagos, then Redraw for Lagos: the Champions League. About a minute later Room reads the new frame back. Press Keep it, and the label turns from Rival's to Fits at 100%.
- The words. https://sozoroom.web.app/#room/launch-ad scores the launch ad: Atlanta 80%. Press Review for Atlanta; within 30 seconds Room proposes a swap for Nando's (Chick-fil-A in our runs). Press Walk it in, then Accept: Inside turns to Lands and Atlanta reads 92%. Gemini chooses among Qloo's candidates, so a swap or a score can shift a point or two between runs.
- The brief. https://sozoroom.web.app/#pitch/debut-album opens nine lanes ranked by lift. Tap Dijon for its receipt: 0.956 against Beyoncé's fans' 0.807, lift +0.149, with the exact GET.
For agents: claude mcp add --transport http room https://sozoroom.web.app/mcp. To run it yourself, see "Run locally" in the README.
Links
Built With
- css3
- fastapi
- firebase-hosting
- firestore
- gemini
- google-cloud-run
- html5
- javascript
- maplibre-gl
- model-context-protocol
- pypdf
- python
- python-docx
- python-pptx
- qloo
- vertex-ai
Log in or sign up for Devpost to join the conversation.