-
12 southern markets ranked from one Qloo heatmap per city, run in parallel while the map lights up.
-
Stop 1, Austin: the room fans already like, local acts who share the crowd, pre-show spots. Every number is a Qloo affinity.
-
Who shows up: age skew versus average, taste tags, and the brands this crowd over-indexes on (urn:demographics, urn:tag, urn:entity:brand).
-
Follow-up: 'Swap Miami for Nashville'. New Qloo calls, a re-ranked route, and an honest push back when the swap scores lower.
-
The promoter memo: 'Qloo shows' is measured, 'I read this as' is the agent. 57 Qloo calls, all logged in the run sheet.
Inspiration
Touring is where live acts earn, and routing a tour is still guesswork plus streaming counts. Streams say where people press play. They do not say which 400-cap room those people drink in, which local openers they already follow, or which brands would pay to be on the bar tab. Managers, booking agents, touring comedians and podcasters make these calls on gut feel today.
Hometown is a tour-routing agent that measures the crowd instead of guessing. Name an act. It finds the cities where that act's crowd already over-indexes in Qloo's taste graph, then builds the night in each one: the room fans already like, the local act who should open, where the crowd eats before the show, and which brands would sponsor the run. It locks a drivable route and writes a promoter-ready memo.
Live: https://hometown.shrikar84.workers.dev (real Qloo data, no sign-in) Demo video (2 min): https://hometown.shrikar84.workers.dev/demo.mp4 Source (MIT): https://github.com/sarchak/hometown
Why it only works with Qloo
An LLM alone can list big cities. It cannot say that fans of a specific act cluster in one part of Austin, that those fans have affinity for a specific venue, which local artists share that crowd, or which brands they love. Each of those is one Qloo call. Remove Qloo and the product is a city list.
| Question the agent answers | Qloo call |
|---|---|
| Who is this act | GET /search across artist, person, podcast, brand, tv_show |
| Where does the crowd live | GET /v2/insights with filter.type=urn:heatmap, once per candidate city, up to 30 in parallel |
| Which rooms fit | filter.type=urn:entity:place with signal.interests.entities, filter.location=POINT(hotspot) and venue tags resolved from /v2/tags |
| Where to eat before the show | same, with restaurant and bar tags |
| Who should open | filter.type=urn:entity:artist (or person, podcast) with signal.location.query=city |
| Who would sponsor | filter.type=urn:entity:brand |
| Who is the crowd | filter.type=urn:demographics and filter.type=urn:tag |
| Is the act rising | GET /v2/trending, weekly, last six months |
A typical five-stop tour is about 12 tool calls and 60 to 70 Qloo requests. Every one of them is shown in the run sheet, with the exact Qloo inputs, so a judge can tell Qloo's numbers from our interpretation.
How we built it
A Cloudflare Worker (TypeScript, no framework) hosts an OpenAI tool-calling agent with eight coarse tools: resolve_act, rank_markets, plan_city, crowd_profile, find_sponsors, momentum, find_tag, finalize_tour. The browser receives server-sent events for every tool call and result, so the map lights up city by city as heatmaps return. Follow-ups ("swap Miami for Nashville", "comedy clubs instead", "who should open in Denver") call only the tools they need, and the agent pushes back with the Qloo numbers when a swap scores lower, then does what you asked.
Market score is a blend of the affinity rank of a city's 15 hottest heatmap cells and the city-wide mean, scaled 0 to 100. The Worker caches every Qloo GET for a week, rate-limits itself to four concurrent Qloo calls with backoff, and never exposes the key to the browser.
What we learned about the Qloo API
- Heatmap
affinityis normalised to 1 inside each city. Onlyaffinity_rankcompares across cities, so that is what the market score uses. - Austin returns 732 heatmap cells for Khruangbin; Omaha returns 23. Cell count and rank together separate a real market from a blip.
- Place entities carry a neighbourhood in
properties.geocode.name, so the memo names a neighbourhood only when Qloo does. - Household-name acts score 98 to 100 in every big city. Niche and mid-size acts are where the ranking earns its keep, and where touring decisions are actually hard.
Challenges
The key arrived with nine days left, so the whole product was built against a synthetic mock layer and then recalibrated on real responses in one afternoon. The real data changed the score formula, the tag IDs, the image fields and the concurrency model.
Responsible use
Signals are public acts, places and brands. No personal data is sent to Qloo. Results are aggregate affinities and are labelled as such in the UI and in every memo: affinity is a measure of taste fit, not a ticket demand forecast.
What's next
Ticket-count calibration against real tour grosses, a promoter-facing export, and routing by drive time instead of straight-line order.
Built With
- cloudflare-workers
- javascript
- leaflet.js
- openai
- qloo
- server-sent-events
- typescript
Log in or sign up for Devpost to join the conversation.