-
-
Drake: each metro glows with its fan heat and the route draws itself. Atlanta leads: #1 for taste, #9 for population.
-
Type a few letters: Qloo's matches appear live with their real photo, so a tour never starts on the wrong artist.
-
The agent at work (Gemini): every tool call and every Qloo request streams in while it reads 34 US metros.
-
Without Qloo, the same model falls back to the biggest cities. Qloo changes 3 of the 5 stops.
-
A prepared date: the room, an opener, a sponsor, an after-show spot and a crowd brief, each citing its Qloo request.
-
Ask Tourbook: one change in plain words. The agent proposes it with its cost, and the server verifies it first.
-
The Agent tab reads like a console: every tool, its arguments, its timing, and how the plan used Qloo.
-
Drake's poster: the real Qloo photo, the tour label, the stops with their rooms. Every word is set by the app.
-
On a phone it is a real app: dark or light, English or French, with every tour saved in History.
-
Room mode: a venue picks its neighbourhood (Wicker Park, Chicago) and gets the acts its locals already love.
-
Measured live on the deployed app: 5 acts, 0 rejected Qloo parameters, 75/75 sections cited, 60/60 checks.
-
Validate a tour and Tourbook designs its poster: art direction from the act's own Qloo data, around its real Qloo photo.
Try it in 2 minutes (judges)
- Open https://tourbook-q2d9.onrender.com (no sign-up, live Qloo data, always on).
- Click New tour, type Drak: Qloo's matches appear with their real photo. Pick Drake and press Build (under a minute: every tool call and Qloo request streams in while the map reads 34 cities).
- Flip the map to Without Qloo, open Date 1 for its dossier, ask Swap the weakest stop for somewhere in the South, then Validate the tour and Design the poster.
- Also try Room mode (Wicker Park), the Agent tab (a console of every call) and History. One-click demos: Men I Trust, Mark Normand (comedy), Last Podcast on the Left (live podcast), Tycho, Watchhouse (too small for the graph, read through three sound-alikes).
- Works on a phone (light or dark, English or French). Code (MIT): https://github.com/blanco1er/tourbook · Video: https://www.youtube.com/watch?v=5O4NPcu1zE0
New in the final week
- Ask Tourbook. Ask for one change in plain words ("swap the weakest stop for somewhere in the South"). The agent reads the scores, checks the rooms with Qloo and proposes one change with its cost (before/after km, mean score, hidden markets); the server verifies it (a city it never looked up, or a tour outside 3 to 10 stops, is refused) before one tap applies it. Measured: 15 of 15 requests valid, 60 of 60 independent checks pass.
- The right act, every time. Live suggestions with the act's real Qloo photo while you type, an identity line (band or solo, age or active since, genres) and Not them? to pick a homonym; an act Qloo does not know is routed through three sound-alikes.
- A fan heat map. Each metro glows with its fan heat, from the national heatmap call (or from the measured taste affinity when another strategy ranked the cities), and the route draws itself.
- The tour poster. Validate a tour and Tourbook designs its poster: Gemini writes an art direction from the act's own Qloo data (genres, what its audiences like in the tour cities), Gemini 3 Pro Image paints it around the real Qloo photo (never an invented face), and the app sets the tour label, the stops with their rooms and the ticket line itself, so every word is exact. One image per tour, made only on request, capped per visitor and per day.
- Built to be used. History keeps saved tours (with their poster) and room searches on the device; a plan keeps running on the server and the page rejoins it if the phone pauses it; the live agent card and the Agent tab show every step.
Inspiration
Indie tours are routed by population. The default plan for a mid-size act is always the same: New York, Los Angeles, Chicago, Dallas… The biggest rooms, the most competition, the highest costs. Meanwhile the fans of a dream-pop quartet may over-index in Asheville, Boise and Madison, cities no booking agent would put first.
Managers already feel this, but they guess. Tourbook replaces the guess with taste: population lies, taste doesn't.
What it does
Type a headliner (music, comedy or a live podcast) and up to three "sounds like" acts. The Tourbook agent then:
- Finds the hidden markets. It ranks 34 US metros with the Hidden Market Score: Qloo taste affinity against population rank. A city that ranks #2 for taste but #33 for population is a hidden market.
- Preps every date. For the first three stops: the room whose crowd matches (a live-music venue, a comedy club or a theater, depending on the act), a smaller act in the same format whose fans share the taste, a sponsor this crowd already loves, an affordable after-show spot and a crowd brief (the shows, podcasts and local themes to use in the set and the crowd work).
- Proves its work. Every pick cites the exact Qloo request behind it and, when available, how much each input
signal drove it (
feature.explainability). - Shows what Qloo changes. One toggle flips the map and the list between With Qloo and Without Qloo (the same model with no taste data). In our live runs on the five demo acts (the model's own plan varies a little run to run): for a live podcast (Last Podcast on the Left) 10 of 10 markets change, for a comedian (Mark Normand) 4 of 5, for Men I Trust 3 of 5. For acts a model already knows well, the plans converge (Watchhouse 1 of 5, Tycho 2 of 10), and Qloo still adds the dossier evidence.
- Sizes the rooms. Six months of weekly momentum (
/v2/trending) tell you whether to book one size up. - Works for the other side of the market. Room mode lets a venue type its neighbourhood and get emerging acts its locals already love, below a popularity cap it can afford.
Then share the plan as a link, save it as a PDF, or play a 30-second voice briefing ("Here's your tour, boss").
Why it only works with Qloo
Without Qloo, any LLM gives you the population answer. Every Tourbook feature is a Qloo query:
| Need | Qloo call | Key parameters |
|---|---|---|
| Resolve the act and its sound-alikes | GET /search |
query, types |
| Where the fans are | GET /v2/insights |
filter.type=urn:heatmap, signal.interests.entities, national filter.location polygon |
| Who the audience is | GET /v2/insights |
filter.type=urn:demographics |
| Openers in the same format, with their taste fit | GET /v2/insights + GET /v2/analysis/compare |
urn:entity:artist / person / podcast, filter.popularity.max, filter.tags, feature.explainability |
| Room and after-show | GET /v2/insights + GET /v2/tags |
urn:entity:place, filter.location.query, filter.tags, filter.price_level.max |
| Sponsors and crowd brief | GET /v2/insights |
urn:entity:brand, urn:entity:tv_show, urn:entity:podcast, urn:tag, signal.location.query |
| Timing | GET /v2/trending |
filter.start_date, filter.end_date |
| Room mode | GET /v2/insights |
urn:entity:artist, signal.location.query, filter.popularity.max, filter.external.exists |
One full live plan makes 30 to 31 Qloo calls across 5 endpoints (/search, /v2/insights, /v2/analysis/compare,
/v2/trending, /v2/tags) and 7 to 8 filter.type values, with 0 rejected parameters, in about 50 seconds. The app
shows that footprint at the bottom of every plan ("How this plan used Qloo").
How we built it (Technological Implementation)
- Agent. Gemini 3.8 Flash drives a tool-calling loop (about 23 tool calls per plan, independent calls in parallel) with 8 strict, typed tools:
resolve_entity,rank_markets,audience_profile,find_openers,local_picks(room, after-show, crowd brief),sponsor_fit,momentum,llm_only_baseline. The model only sees compact results; every card, number and name in the Tour Book is assembled from tool results only, never from model text, and the model's short summary is instructed to state only facts the tools returned. A guarantee layer completes any dossier the model skipped, and if the model fails mid-run, a scripted planner reads the same conversation and finishes the plan. - Live agent. The run streams over Server-Sent Events: plan steps, every tool call with its arguments, and every Qloo request with its latency and cache status.
- A parameter validator. Qloo ignores invalid parameters silently, which yields plausible but wrong answers. We
keep an allowlist per endpoint and per
filter.type(for example,filter.locationis ignored on artists, so we usesignal.location.querythere) and refuse bad requests before they are sent. A full run has 0 rejected calls; the smoke test enforces it. - Comparable scores. Qloo affinities are relative to each query, so 34 separate city calls are not comparable.
The Hidden Market Score uses one national heatmap call (about 5,000 cells), then scores each metro with the mean
affinity_rankof the cells within 50 km. Per-city strategies exist as automatic fallbacks and are labelled "approx." in the UI.HMS = 100 √ó (0.6 √ó normalised taste strength + 0.4 √ó normalised gap between population rank and taste rank). - Audience proxies. Acts too small for the graph are read through three sound-alikes, aggregated as signals.
- Rate limits and cost. Concurrency cap, minimum interval, retries on 429/5xx that honour
Retry-After, a limiter-wide pause on 429, deduplication of identical in-flight requests, a private server-side cache with no TTL (allowed by the hackathon guide), and a per-IP daily cap on agent runs. - Mock mode with the real shapes. Until the key arrived, a deterministic mock replayed the documented response shapes (including the 400 for an unknown locality and the 403 for an unsupported type), so the same code runs live.
- Stack. Node 20+, Express, vanilla JS, MapLibre GL with OpenFreeMap tiles, Google Gemini (OpenAI-compatible tool calling), hosted on Render. No build step.
Design
Tourbook is built for one person: the manager of an indie act, on a laptop, with a deadline. The first screen says what it does in three lines and offers a one-click demo. The plan reads top to bottom: map, headline numbers, the first three dates as cards, the with/without Qloo proof, all markets, audience and momentum, then the Qloo footprint. Every dossier opens in a sheet with its evidence one click away. On a phone it behaves like a native app: floating glass tab bar, large titles that shrink on scroll, sheets, a full-screen map, a generated PDF in the share sheet. Light and dark themes follow the device, and the whole app (including the agent's own summary) switches between English and French.
Potential Impact
- Artists and managers save money on routing: secondary markets mean smaller guarantees, less competition and rooms that sell out.
- Agents and promoters get a defensible reason for every date, with sources.
- Venues (Room mode) find acts before they blow up.
- Business model: a subscription for agents and venues, plus a booking fee when both sides of a match use Tourbook. The same taste graph serves both sides of the market.
Quality of the Idea
Tour planning is the obvious idea. Tourbook goes past it in four ways: the Hidden Market Score (taste against population, not just taste), audience proxies for acts too small for the graph, a reverse room mode for venues, and a built-in proof that the plan would be different without Qloo.
Responsible use
Only aggregate affinities. No personal data is sent to Qloo. Every result shows its source and never presents an affinity as a fact about an individual ("Not a headcount"). Qloo responses are cached privately on the server and are not in the public repository: all fixtures are synthetic.
Challenges we ran into
- Silent parameter dropping: a request can "work" and still be wrong. Hence the validator.
- Scores that are not comparable across calls. Hence one national heatmap call.
- Heatmap
affinitysaturates at 1 in many cells, so a per-metro maximum made every city tie. The meanaffinity_rankover the metro area keeps both the order and the spread. /v2/analysis/comparereturns shared and distinguishing taste tags, not audience sizes, so the opener card shows a taste fit with the shared tags, never an invented headcount.- Similar-entity queries drift across formats (a true-crime podcast's neighbours included news shows). Openers are
now constrained with the headliner's own genre tags (
filter.tags), and rooms with the right place tag per format. - Gemini 3 requires its thought signature to be sent back with every tool call; the agent loop now preserves it.
Accomplishments we're proud of
- An agent whose every claim is traceable to a Qloo request.
- The with/without Qloo toggle: the value of taste data in one click.
- A tool that also serves venues, not only artists.
What we learned
A 16-request probe on day one settled every open question: the hackathon host and X-Api-Key header, urn:heatmap
over a national polygon (about 1.5 s for 5,000 cells), urn:demographics, feature.explainability, /v2/trending
(flat for many acts over six months) and silently ignored parameters (confirmed: filter.location.query on artists is
ignored without an error, which is exactly why the validator exists). Typical insight calls answer in 0.2 to 1.3 s.
What's next
Routing with real dates and distances, ticket-price bands per city, Europe, a shared workspace for an artist and their agent, and alerts when an act's taste map shifts.
Built With
- css3
- express.js
- gemini
- html5
- javascript
- maplibre
- node.js
- qloo
- render

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