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 affinity is normalised to 1 inside each city. Only affinity_rank compares 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

Share this project:

Updates

Submission history