Inspiration

Open-world games ship to dozens of countries, but their cities rarely feel like anywhere real. Ask a language model to "make a Lagos district" and you get the same handful of global brands, tourist landmarks and invented artists, just renamed. The model is guessing what people there like.

Studios fix this with expensive cultural consultants and months of localization passes. I wanted to know whether real taste data could do the first 80% of that job, and do it in a way a producer could audit. Qloo's Taste AI was the missing piece: it knows what people in a place actually listen to, eat, wear, watch and play, and it returns real entities with IDs instead of plausible-sounding text.

What it does

Backlot is a cultural director for game studios. You give it a one-line brief, such as "A 1990s Lagos detective adventure", in one of three modes:

  • Build: create a new world grounded in a real city and era.
  • Localize: adapt an existing world for a new market.
  • Refresh: design a seasonal live-service drop, such as Diwali in Delhi or Día de Muertos in Mexico City.

An agent scouts Qloo for the place, compares it against a similar city to find what is actually distinctive, and then writes quests, radio stations with tracklists, storefronts, NPC profiles, districts and weighted spawn tables. Every generated item links to an evidence record listing the Qloo entities that inspired it, so nothing has to be taken on trust. The whole pack exports to Unity (C# ScriptableObject), Godot (GDScript Resource), JSON and a Markdown style bible.

How I built it

Backend: Node 22, TypeScript, Express and Zod. Frontend: Vite with vanilla TypeScript, streaming the agent's progress live over Server-Sent Events.

The scout agent. Instead of a fixed pipeline, a planning model drives a tool loop over five Qloo-backed tools: discover, compare_locations, search_entities, find_tags and finalize. Every tool call must include a stated reason, its arguments are validated against a schema before anything runs, and the loop has guardrails for stalls, repeated calls and budget.

Distinctiveness. For a target city A and a contrast city B, the agent pulls Qloo's results for both and keeps only what A has and B does not:

$$ D = \lbrace e \in Q(A) \quad \text{such that} \quad e \notin Q(B) \rbrace $$

That set is what NPCs talk about and what the radio stations are built around.

Spawn weights without invented numbers. If Qloo scored every entity in a list, the weight is its affinity a:

$$ w_i = \max\left(1,\ \operatorname{round}(100 \cdot a_i)\right) $$

Otherwise it falls back to rank order, where i is the entity's position in a list of n, and each entry records which source was used:

$$ w_i = \max\left(5,\ \operatorname{round}\left(\frac{100 \cdot (n - i)}{n}\right)\right) $$

A critic pass. Before anything is shown, a deterministic checker drops any generated item whose evidence does not trace back to a real Qloo entity, and only calls a model for repair when it finds violations.

Record and replay. Ten hand-researched demo presets were each run live once and recorded, so judges can replay a full agent run instantly without spending API quota.

Challenges

  • Models are unreliable tool callers. Some described tool calls in prose instead of making them, and others returned JSON that was cut off mid-array. I added parsers for prose tool calls, a salvager that recovers complete items from truncated arrays, and a routing layer that falls back to another model when one misbehaves.
  • Making evidence real rather than decorative. It is easy to attach a "source" label to generated text. Making every quest, NPC and spawn entry point to specific Qloo entity IDs, and rejecting items that do not, shaped the whole data model.
  • Late subscribers to a live stream. A browser that connected after the agent had started missed early events. Jobs now keep their event history and replay it to new subscribers.
  • Security. User text ends up inside generated Unity and Godot code. A crafted city name containing line breaks could have escaped a code comment and injected code into the exported script. Input is now normalized at the API boundary, and the exporters emit proper string literals.
  • Performance. The landing page lagged badly. Profiling traced it to a single full-screen CSS filter over the hero video, not the JavaScript I had suspected.

What I learned

  • An agent becomes trustworthy when its outputs are checkable, not when its prose is confident. Evidence records did more for quality than any prompt change.
  • Real data beats bigger models for cultural specificity. A small model given Qloo's results produced more local worlds than a large model working from memory.
  • Shipping matters as much as building: rate limits, security headers, an instance role instead of stored keys, and recorded presets made it possible to put this in front of judges at all.

What's next

  • Direct import plugins for Unity and Godot instead of generated scripts.
  • Multi-city campaigns that keep characters consistent across markets.
  • A review mode where a studio's cultural consultant can approve or reject items against their evidence.
Share this project:

Updates

Submission history