Inspiration

Small bands route their own tours, and most of them pick cities by gut feel, by where friends live, or by copying a bigger band's route. Then they spend weeks emailing rooms that were never a fit for their audience.

What it does

  • Ranks 138 US touring cities by where the artist's taste audience over-indexes, using Qloo's heatmap.
  • Routes a loop a van can actually drive: every leg within two driving days, no two shows within 50 miles of each other (the usual radius clause), and a drive home at the end.
  • For every stop, finds small rooms that fit the artist, local acts the same audience listens to, and record stores, cafes and bookshops for posters, plus a pitch email to copy.
  • Profiles the audience: demographics, brands and podcasts it over-indexes for, and acts it loves everywhere, which makes a shortlist for package tours.
  • A chat agent edits the plan with the same tools ("drop Richmond and replan", "is Boise worth it?").

How I used Qloo

Every city, room, act, brand and podcast on the page comes from a Qloo request. Without Qloo the app is a map and a travelling-salesman loop.

  • /search (artists, take 5): matches the artist, and asks "which one?" when the top result isn't the name typed.
  • /search (localities): finds the home city, US only, shown as "City, State".
  • /v2/insights heatmap over a MULTIPOLYGON of small boxes: ranks the cities, three calls cover all 138.
  • /v2/insights places with venue tags in a union and big-room tags excluded: rooms per stop. Same call with shop tags: poster spots.
  • /v2/insights artists with the headliner's genre tags, a popularity cap and signal.location: local acts per stop. The same call without a location gives acts this audience likes everywhere.
  • /v2/insights demographics, brands and podcasts: the audience profile.

An 8-show plan makes 33 Qloo requests and a 14-show plan makes 51. The "Under the hood" panel on the page lists every one with the parameters it sent, so any pick can be checked against the request that produced it.

How I built it

Plain JavaScript on Cloudflare Workers with no build step, Workers AI (Llama 3.3 70B) for the chat agent, and Leaflet with OpenStreetMap tiles for the map. Qloo responses are cached for a day, so a repeat plan comes back in under a second.

Challenges I ran into

  • Ranking cities with the heatmap. A city boundary entity as filter.location returned a 500, the whole-US grid is 2.3 MB and ignores take, and all 138 cities in one polygon hit a 414. What worked: a MULTIPOLYGON of small boxes around each city center, split into three calls.
  • 10 ms of CPU on the free plan. One stop's places are a few hundred KB of JSON. The heavy steps call back into the same Worker through a service binding, so each one gets its own CPU budget.
  • Parameters that change nothing. Some parameters were accepted but didn't change the results, so I kept a parameter only after diffing its output against the same call without it. The genre filter on local acts passed (Trixie Mattel dropped out as an opener for MJ Lenderman; Lydia Loveless, SUSTO and Palehound came in). Others failed and were left out.
  • Arenas tagged as live music venues. Excluding big-room tags removed most of them, and a check on the description catches the rest. It reads the description, never the name: Hardcore Stadium in Cambridge is a small DIY punk room.
  • Ambiguous names. "Wednesday band" matches Band of Horses first, so the planner stops after one request and asks which artist was meant instead of planning a tour for the wrong band.

What I'm proud of

Every pick on screen traces back to a Qloo request you can open and read. And the whole thing runs end to end on free plans.

What I learned

Taste affinity isn't ticket demand. Qloo can say where an artist's audience over-indexes compared with a baseline, but not how many people will buy a ticket on a Tuesday. That changed the labels across the page: "Qloo affinity" and "Fanroute rank" sit side by side so it's clear which number comes from Qloo and which is my own ordering, the chat agent is told never to turn affinity into a fan count or a probability, and the page says plainly what the numbers don't establish.

What's next for Fanroute

Room capacity data so rooms can be matched to draw, cities outside the US, and calendar export for the routed dates.

Built With

Share this project:

Updates

Submission history