-
-
One city, many tastes: Tastegeist plans a separate campaign for each audience a market holds, built on Qloo taste data.
-
The brief studio: describe a product, pick a country, cities or one city. A live Qloo preview shows what it sees before anything is spent.
-
A culture profile per place: what it sounds, looks and feels like, with a palette computed from the titles Qloo ranks highest there.
-
The client report: a shareable page with each audience, its map, concepts, mixtape, test results and media plan, ready to send.
-
Taste zones in Los Angeles: Qloo's heatmap shows where Silver Lake's taste over-indexes. Two neighborhoods, two different audiences.
-
Three campaign concepts per audience. Every line cites the Qloo titles it was built from; uncited lines are rejected.
Inspiration
Walk ten minutes through any city and the culture changes around you: the music drifting out of bars, the posters on the walls, what people wear and read on the train. A city is not one audience; it is many small worlds sitting side by side.
Advertising mostly ignores that. A campaign is planned for "the city", one message for everyone, and it ends up speaking to no one in particular.
I wanted to plan the way culture actually works: start from what people in a place already love, find where that taste lives, and speak to each audience in its own language. Not by guessing or stereotyping, but by listening to real taste signals and showing where every idea came from.
What it does
You describe a product and pick a country, a few cities, or one city in depth. Tastegeist then:
- Finds the audiences. It reads each place's culture through Qloo (music, film, TV, podcasts, brands, books, travel), computes what each place over-indexes on, and clusters places with shared taste into zones, down to the neighborhood.
- Profiles each one. A culture profile per place: its artists (played as a cassette mixtape of 30-second previews), shows, brands, a palette computed from its imagery, its age and gender skew, and a "day in the place".
- Writes three campaign concepts per audience. Every line has to cite the Qloo titles it was built from; lines that cite nothing are rejected before you see them.
- Tests them. A synthetic panel of personas built from the same Qloo data reacts to each concept and to one generic, LLM-only ad. In the Los Angeles demo, 31 of 32 personas stop for the tailored concepts versus 19 for the generic one.
- Plans the media. Budget split by audience strength, a playbook per zone (where to place it, who to partner with, week by week), impressions and reach, a cultural calendar, an A/B test and a measurement plan.
- Hands it over. A shareable client report, an Excel media plan and a one-page PDF.
Everything you see is labelled as Qloo data, computed, or AI interpretation.
How I built it
- Backend: Python and FastAPI. A typed Qloo client (httpx) with a SQLite response cache:
/search, and/v2/insightsfor entities, genre tags, heatmaps, places and demographics, withfeature.explainabilityso every title knows which reference drove it. - The agent: a deterministic pipeline does the maths (rank-based lift per place, clustering into zones, a ledger of each zone's defining titles); Claude writes on top of it. Claude Opus 5.5 writes the concepts from each zone's ledger, Claude Haiku 5.5 names the audiences and voices the synthetic panel. A validator drops any line that doesn't cite the ledger. Each run's steps, Qloo calls and model calls are kept and shown in a "How it was made" tab.
- Frontend: React, TypeScript, Vite and Tailwind; MapLibre and deck.gl for the maps and heatmaps; ECharts; Motion for the landing page.
- Quality: 106 Playwright browser tests (desktop and mobile) and 27 backend tests. Model spend is capped per day, and every Qloo and model response is cached.
Challenges I ran into
- Making the data mean something. With only two neighborhoods compared, every title's lift came out around 1.8x, which says nothing. I switched the explanations to Qloo ranks instead ("#1 film in Silver Lake, not in Venice's top 21").
- Small places. Tested first: Qloo returns no data for small towns like Hallstatt or Giethoorn, so the brief studio now warns before anything is spent.
- Trust. A synthetic panel can stereotype. Quotes that lean on a demographic cliché are withheld, nothing is ever described or targeted by ethnicity, religion, politics, health or sexuality, and personas are labelled as composites.
- Security I found along the way: the shared demos could be edited by any visitor; they are read-only on the server now.
Accomplishments that I'm proud of
- Every concept line traces back to real Qloo titles, and you can see the working behind each number.
- An honest "How sure we are" page: what is strong evidence, what is directional, and what is not measured at all.
- It works end to end: brief, zones, profiles, concepts, test, plan, report, in about a minute per campaign on the live site.
What I learned
- Qloo is most convincing when you show its ranks and overlaps directly, not only a derived score.
- Asking a model to cite its sources, and rejecting lines that don't, makes the output both better and easier to trust.
What's next
- Concepts written in each market's own language.
- Importing real campaign results (Meta, Google) to calibrate the synthetic panel.
- Bring-your-own AI provider, team workspaces and direct ad-platform handoff.
Built With
- anthropic
- claude
- deck.gl
- docker
- echarts
- fastapi
- maplibre
- playwright
- python
- qloo
- react
- sqlite
- tailwindcss
- typescript
- vite

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