Inspiration

"Booking our first tour" and "how do I get booked outside my local area" are recurring threads on r/WeAreTheMusicMakers. A Ditto Music survey in January 2025 found that 82% of independent artists say they can't afford to tour, so when a small act finally does, every date has to count.

The obvious data doesn't help. Spotify for Artists shows listener cities, but a few hundred listeners spread over forty cities is noise. Booking tools route by fuel cost and venue capacity, or by "where similar bands already played", which only works once you're on that circuit. None of them start from the one question that matters: where do people with my taste actually live?

No language model knows that. Qloo does.

What it does

You name up to three acts you sound like and pick how many dates you want. A Gemini agent then:

  1. Resolves the acts with Qloo search (with autocomplete).
  2. Scans the country. It pulls one nationwide Qloo taste heatmap for your acts and a second one for a broad mainstream audience, compares them cell by cell, and scores 44 US cities. Cities ignite on the map as they're scored. What lights up is where this taste is over-represented, not just where people live.
  3. Reads the audience. Similar artists, brands and travel destinations the same people like, from Qloo insights across domains.
  4. Routes a drivable tour through the strongest cities and draws it on the map.
  5. Maps every city. A neighbourhood-level taste heatmap, the three strongest pockets (named), live-music venues this audience favours, and pre-show spots (record stores, coffee, cocktail bars).
  6. Explains and acts. A short "why this city" per stop, a collab idea, an exportable tour sheet, and a booking email draft per venue with blanks for what only the artist knows.

Every step streams into a live trace: the model's one-line intent, each tool call, real numbers from Qloo, and timings. Three one-click examples replay real recorded runs instantly.

The result is specific to the sound. Mac Miller's taste peaks in Pittsburgh, Noah Kahan's in Burlington, Vermont, Zach Bryan's in Oklahoma City. Nobody told the agent where those artists are from.

Why it only works with Qloo

Every city, score, neighbourhood, venue, brand and similar artist in Tour Radar comes from a Qloo response. The model only chooses among, orders and explains what Qloo returned, and the server enforces it: submit_plan rejects any city that isn't on the routed plan and any venue Qloo didn't return, with a specific error the model has to fix. In one recorded Kendrick Lamar run the plan was rejected ("detroit is not on the planned route"), and the agent re-routed, mapped the cities it had missed and resubmitted a plan that passed. You can watch it happen in the trace.

Take Qloo away and there is no product left: an LLM alone would invent cities and venues, and streaming stats are too thin for a small act.

How Qloo is used

All calls go to hackathon.api.qloo.com, server-side only.

  • GET /search resolves artist names to entity IDs and powers autocomplete.
  • GET /v2/insights with filter.type=urn:heatmap and a WKT polygon of the contiguous US gives one nationwide heatmap per taste, so cells are comparable across cities.
  • The same request for a mainstream baseline (Taylor Swift, Drake, Morgan Wallen, Bad Bunny, Ed Sheeran) separates this taste from population density.
  • urn:heatmap with filter.location.query=<City, State> gives the neighbourhood glow inside each tour city.
  • urn:entity:place with filter.tags=urn:tag:genre:place:live_music_venue (and record store, coffee and cocktail bar tags) finds the venues and pre-show spots this audience favours.
  • urn:entity:artist, urn:entity:brand and urn:entity:destination with the artist signal provide the cross-domain profile behind the "why" text and collab ideas.

What we learned from the data. Heatmap affinity is a rank percentile inside a single response, and inside a city it tracks overall activity closely (Spearman 0.93–0.97 with popularity in our Portland and New York probes). Shown raw, it just lights up downtowns. So Tour Radar always compares against the mainstream baseline over the same cells:

lift  = affinity(your acts) − affinity(mainstream)        per geohash cell
taste = 0.6 · affinity + 0.4 · clamp(lift + 0.5, 0, 1)

City scores average taste over cells within 40 km; hotspots are the strongest ~800 m pockets, so they line up with the glow you see.

How we built it

  • Backend and agent: FastAPI (Python 3.11) streaming the agent as server-sent events. A plain tool-calling loop on Gemini 3.5 Flash with automatic fallback to lighter models on free-tier quota, and six tools: search_artists, scan_region, taste_profile, plan_route, profile_cities, submit_plan.
  • Route planning: nearest neighbour plus 2-opt over real distances; stops that would split one metro's audience are dropped, and legs over 1,600 km are flagged so the agent can re-plan.
  • Map: MapLibre GL on OpenFreeMap vector tiles with a custom dark style; native heatmap layers for the national and neighbourhood glow; a self-drawing route.
  • Frontend: plain HTML, CSS and JavaScript, no build step.
  • Hosting: Docker on Render's free tier, with a scheduled ping to keep it awake.
  • Respecting the API: throttled below the per-second limit, retries only on 429/5xx, every response cached on disk. A new tour costs about 45 Qloo requests, and baseline heatmaps are shared across all users. Inputs are public artist and city names; no personal data goes to Qloo.

Challenges we ran into

  • Raw affinity mostly measures where people are. The baseline comparison was the fix, and it's the core of the product.
  • Keeping the model honest. Free-text plans drifted, so the final plan became a tool call the server validates against Qloo data, with specific errors the model must fix.
  • Making the data readable. The national glow washed out at first, neighbourhood heat rendered as stripes (Qloo cells are twice as wide as they are tall), and the map redrew every rejected route. Each one needed a careful fix so the map tells the truth at a glance.
  • Free hosting. Long model turns made the proxy drop the live stream; a heartbeat keeps it open.

Accomplishments that we're proud of

  • It answers a real question musicians ask, with data no LLM has.
  • The agent's reasoning is visible end to end, including the moments it gets corrected.
  • It looks like a product, not a proof of concept.

What we learned

Taste data needs a reference point to mean something. And an agent is only as trustworthy as the checks around it: making the server, not the prompt, the source of truth changed the quality of every plan.

What's next

  • Regions beyond the US (London heatmaps already return the same shape).
  • Venue capacity, so a small act isn't pointed at an arena.
  • More candidate cities, including college towns.
  • Shareable tour links, and a date planner that respects real calendars.

Known limitations

  • US only, 44 candidate cities.
  • Taste scores show over-representation relative to a mainstream audience. They are not fan counts or ticket forecasts.
  • Venue capacity isn't in the data.
  • A route can come back a date short of what was asked for.
  • Free-tier hosting and Gemini quota; the examples always work.

Built With

Share this project:

Updates

Submission history