Inspiration

🌍 Most AI idea generators tell you what you want to hear. CultureForge is built to disagree with itself.

Everyone has watched an AI confidently invent a "market insight" that nobody can trace. A founder opening a café in Brooklyn does not need another paragraph of fluent guesses. They need to know what the data actually returned, and what would prove the idea wrong.

Qloo's taste-intelligence API made that possible. It returns real cultural signals: tags, places, audience affinities and rankings. So we asked one question:

What if the AI could only say what Qloo returned, and then had to defend its idea against that evidence?

That became our rule: the model may write the words, but it may never invent the facts. 🔒

🎬 Watch the demo video above · 🌐 Try the live studio · 💻 Read the code, both linked under "Try it out".


What it does

You give CultureForge a business idea, a city and an audience. It reads real Qloo taste data, proposes culture-backed directions, cites the evidence behind every claim, and then puts each direction on trial. A direction can come out contested, and that is the point. ⚖️

  • 🧭 Reads the idea. The brief becomes typed components: hybrids, specialisations and disclosed simplifications.
  • 🔎 Retrieves evidence. Qloo find_tags and recommend return up to 10 real places for that audience and city.
  • 🧱 Composes directions. Deterministic rules turn the evidence into proposals, and every proposal names its evidence.
  • 🤖 Investigates. A bounded agent loop (up to 8 plan-act-observe steps) calls only allowlisted Qloo workflows. Every claim must cite an entity ID or tag URN seen in that run.
  • ⚖️ Tests the anchor. Qloo rank and compare_audiences check whether the direction's anchor place really fits.
  • ✂️ Lets the evidence go. Remove any place and the answer is rebuilt from what is left: description, photo, citations and anchor.
  • 🧪 Scenario lab. Change the audience or the city and see exactly what Qloo says changes.
  • 📄 Takes the reasoning away as a PDF report and a decision notebook.

Every screen also says what it cannot claim. The verdict is about anchor fit within the retrieved sample, not demand, rent, competition or willingness to pay. 🎯


How we built it

🐍 Backend. Python, FastAPI and Pydantic, with SQLite for workspaces, metering and the call ledger. Every route that takes a body takes a typed one, so a malformed request is a 422 and never a silent pass.

🔌 Qloo layer. One request builder per workflow, because Qloo rejects fields it does not know. All traffic goes through the Qloo Hackathon Kit harness. A durable evidence store holds each answer for 24 hours, and a failure is never cached.

🤖 Agent loop. Up to eight steps over allowlisted workflows, with server-built requests and observed IDs only. The analysis is validated so that every claim cites an entity ID or tag URN from the run. If validation fails, we fall back to the rule composer and say so.

🧠 Model layer. Vercel AI Gateway is the only transport, and it is server-side only. The model writes bounded direction names and taglines, or selects existing evidence strings. Rules keep every fact, verdict and citation. Unsupported numbers and malformed output are rejected.

🎨 Frontend. React 18, TypeScript, Vite and Tailwind, with MapLibre for the cultural-roots map and Motion for movement, in a "dusk" look with a pixel display face.

🧮 The verdict maths. We refused to invent a fit score. The test uses only ranks, counts and values Qloo returned. Let n be the places Qloo ranked and p the anchor's position, where 1 is best. The band size is k = max(1, ⌊n / 3⌋).

  • Rank check passes when p ≤ k.
  • Rank check fails when p > n − k.
  • Otherwise it is mixed.

With ten places that is positions 1 to 3 against 8 to 10. The verdict is then:

  • contested if the rank check fails
  • supported only if the rank check and the tag check both pass
  • unproven otherwise, because half an answer is not a verdict

A leave-one-out pass removes each other place in turn and re-applies the rule among n − 1 places. If any single removal flips the rank check, confidence drops to low. The policy is versioned (anchor-fit-5) and the version changes whenever its logic or wording does.

🚢 Shipping. Docker on our own Ubuntu server, exposed through Tailscale. A judging profile lifts call-count budgets but keeps timeouts, the 429 cool-down, single-flight and the cache. The 400+ backend tests, plus contract, walkthrough and endpoint checks, cannot reach Qloo or a model.


Challenges we ran into

  1. ⏱️ Qloo is slow and finite. /v2/insights needs about 25 seconds, while the stock client caps requests at 20, so every live request turned into three failed attempts. We wrapped the harness with our own timeouts and a 429 cool-down. A first answer now appears in about eleven seconds (measured, London) while the full report keeps finishing in the background.
  2. 🗺️ A wrongly used location role. Berlin timed out until we isolated it: the same tags, category and count, with a result-location filter instead, returned ten places in under nine seconds.
  3. 🤥 Keeping the AI honest. Letting a model analyse is easy. Making it unable to cite anything Qloo did not return is the hard part, so we validate every identifier against the run's own responses and reject the rest.
  4. 🧾 Removing a place must really remove it. A rebuild that claims to have happened while the removed venue is still the anchor is the worst lie this product could tell. Removal now rebuilds the description, photo, citations and anchor, and the tests pin it.
  5. 🪞 Wording the verdict. We rewrote the evidence-test copy repeatedly so it never says Qloo inferred a profile (CultureForge proposed it) or calls a tag exclusive.

Accomplishments that we're proud of

  • ⚖️ A verdict that can say no. The evidence test can disagree with our own composer, and in the demo the lead direction comes out contested.
  • 🚫 Zero mock data. The studio has no mock path. Without a Qloo key it refuses to answer, and a contract test fails the build if a mock reference returns.
  • ⚡ A first answer in about eleven seconds (measured, London), with the full report completing in the background.
  • 🔗 Every claim traceable. Each direction links back to the Qloo places and tags it rests on, with its claim, its falsifier and its unproven condition stated.
  • 🧪 14 prepared, citable trials you can open straight away, plus 400+ tests that never touch Qloo or a model.
  • 🌐 Live and public. Anyone can open the studio and run it, today.

What we learned

  • 🧠 A verdict has to be able to fail. If every direction passes, the feature is decoration.
  • 🏷️ Say what the check did, not what it sounds like it did. Our ranking request sends a demographic profile and a location, not the audience's cultural tags, so the screen says exactly that.
  • 🕳️ Absence is not proof. A comparison response is a bounded list, so a tag that was not returned is never evidence that other places lack it.
  • 💸 Quota is a design constraint. On-disk caching, single-flight requests and a call ledger kept the demo honest and cheap: a repeated brief costs zero upstream requests.
  • 🛟 Never strand the reader. Every state that can fail has a stated reason and a way forward.

What's next for CultureForge AI

  • 🧩 More conditional recipes and richer category coverage
  • 🌐 More cities and a wider library of held, citable trials
  • 🏢 A licensable layer: workspaces, issued keys, saved explorations and metering (already built on SQLite)

CultureForge AI turns cultural signals into a venture hypothesis you can challenge, and it can tell you when the evidence says no. ⚖️✨

Built With

Share this project:

Updates

Submission history