Inspiration

Until recently, I did not know that a festival's headline slot can be cancelled on the night, or that the lineup is then rebuilt from only the acts who can come. Having learned this recently, I think it is a problem.

When an act cancels at the last minute, organizers ask four questions, according to a July 2025 report by the Belgian broadcaster RTBF (translated from French): who is free, who is nearby, who can be there within 48 hours with their team and gear, and above all ("Et surtout"), who can replace the artist without striking a false note.

The first three are logistics, answered on the phone. The fourth is about audiences: will the people who bought tickets for the cancelled act, and for the rest of the bill, still want to come? Streaming popularity does not settle it; the music analytics company Chartmetric wrote in a press release that such metrics "were never designed to predict whether a fan will actually buy a ticket." A plausible name from a chatbot is not evidence either. Qloo's affinity measures how strongly the fans of one act tend to like another, weighted to a city, which is closer to the fourth question.

The answer is needed within hours, and the audience's verdict shows up in refunds. Sam Fender was due to headline Rock Werchter on 5 July 2025; he withdrew the night before, and Yungblud took the slot (NME). After Queens of the Stone Age cancelled in 2024, Mempho's producer told Pollstar that less than 72 hours passed before Jack White was announced, and that refund requests were "very few". In April 2024, six acts, including headliners Deep Purple and Placebo, left the Australian festival tour Pandemonium Rocks. Ticket prices fell from the A$250–275 that early buyers had paid to A$190 (A$165 in Brisbane), and ticket holders were offered A$70 back (CHOICE); Australia's consumer regulator says a change to a headline act can entitle buyers to a full refund (ABC). The insurance broker Gallagher reported in 2024 that cancellations for artist-related reasons, such as burnout, are increasing (Gallagher).

What it does

Lineup Rescue is for the night a lineup breaks, not for planning one weeks ahead. The booker enters the city, the lineup by stage and time, the cancelled act, the ticket types, and their phone list of possible replacements (for each: available? able to arrive within 48 hours with crew and gear? travel hours, notes). Then it:

  • excludes acts that fail these checks, in code so the model cannot override them, and shows why;
  • finds each act in Qloo's catalog, accepting only a unique exact match and asking the booker otherwise;
  • ranks the feasible acts against the cancelled act's audience and against the remaining lineup's audience in the festival city, and checks local heat (the areas of the city with the strongest affinity for an act);
  • tests promoting an act already on the bill and filling the slot it frees;
  • returns up to three plans with evidence and caveats, a draft post and email to ticket holders, and a checklist per ticket type of what to verify (drafted by the model, which never invents refund terms);
  • shows the same language model without Qloo, side by side, so it is visible what the Qloo evidence changes.

It books and sends nothing, and it does not predict availability, fees or ticket sales; a short-notice replacement may need the full fee rather than a deposit, according to the festival-industry site Festival Pro (December 2025). Qloo affinities describe what groups tend to like, not what one person will do. Higher values mean a stronger taste association; they are not probabilities. The two audiences are never merged into one score, so the booker sees both. Missing evidence stays unknown.

How I built it

Lineup Rescue is a new project, started on 2026-10-21 during the Submission Period. The code, research and drafts were produced by AI coding assistants (OpenAI Codex and Anthropic Claude) under my direction; I chose the problem and the name, created or copied the API keys, approved the repository and the deployment, and decided the open questions along the way. It is an agentic tool. The phone-list checks and name resolution run in code first. Then a language model (Claude Haiku 5.5) runs a bounded tool-use loop. It decides which Qloo lookups to make and chooses the plans: which act to swap in, whether a promotion is worth changing two slots, and how to weigh the two audiences against the booker's notes. It also writes the rationale, the announcement drafts and the ticket checklists. If it cannot finish, fixed rules take the top two acts against the cancelled act's audience and the best-scoring promotion, with template text.

Qloo calls (server-side; the Qloo API key never reaches the browser). The app uses artist entities only, because the booker's question is how one act's audience will take another act in one city:

  1. /search (types=urn:entity:artist, take=5) turns act names into artist IDs.
  2. /v2/insights (filter.type=urn:entity:artist) ranks only the phone list (filter.results.entities) against an audience defined by a set of acts (signal.interests.entities) in the city (signal.location.query): first the cancelled act, then all remaining lineup acts together. To test a promotion, lineup acts become the options; then the candidates for the slot that the promoted act leaves are ranked against the promoted act's audience.
  3. /v2/insights (filter.type=urn:heatmap, filter.location.query) returns local heat for each finalist.
  4. The model submits decisions and draft copy only (submit_rescue_plan). The server re-checks every plan, fetches any missing ranking or heat, and writes the evidence itself, so the evidence numbers come from Qloo.

One live run, redacted (Qloo IDs shortened; 2026-10-22; the demo's preloaded festival in Austin, TX, described under Testing instructions): two phone-list acts were excluded before any Qloo request. The eight remaining names (the cancelled act, three lineup acts, four feasible candidates) all resolved by exact match. Against the audience of the cancelled act (The Killers, 9F1FC72B…) in Austin, TX, Yeah Yeah Yeahs scored 0.961, Vampire Weekend (already on the bill) 0.954 and Cage the Elephant 0.949. The plans: two direct swaps, and Vampire Weekend promoted with Young the Giant in its slot (0.968 against Vampire Weekend's audience, a different audience from the scores above). The model writes the plans afresh each run, so they vary; the Qloo scores were the same on two deployments and in direct API calls hours later. The page's Tool trace lists every model turn and tool call with shortened IDs, status, result count and milliseconds.

LLM-only comparison (LLM: large language model): the same model and scenario without the Qloo tools or the catalog check ("LLM-only guess; no audience data"). In the Austin run it made Phoenix its first plan and promoted Spoon. Qloo returned no affinity for either act against The Killers' audience in Austin (it scored 5 of the 7 acts), so the Qloo column built its plans from acts with measured fit.

Stack and data: Next.js and TypeScript with the Anthropic SDK; no database. Only public act names, Qloo IDs and the city go to Qloo; the booker's notes go only to the model, and the page asks users not to enter personal data. Qloo responses are cached in server memory only; repository fixtures are synthetic.

Code (MIT open-source license): https://github.com/Driedsandwich/lineup-rescue

Challenges I ran into

  • Rate limit. The hackathon key allows 10 requests per second, and looking up every name at once made a 24-act test scenario fail in 1.5 s. Requests now share a queue (at most 8 per second, below the limit) and wait out HTTP 429 ("too many requests") responses.
  • A fuzzy catalog. Search returns look-alike names: a made-up band name returned five catalog artists with "Collective" in their names, and Common did not list the rapper among its five options. So the app never picks for the booker; an act left unresolved is not scored.
  • Heatmap support. urn:heatmap is in Qloo's Insights API reference but not in the developer guide's list of types; it works on the hackathon key, and its map cells (geohashes) are summarized as areas.
  • A live model in a public demo. If the model hits its usage limit or its 40-second budget, the fixed rules above build plans from the same Qloo scores instead, and the page says so.

Accomplishments

Measured on 2026-10-22 with live Qloo data and the live model, unless noted:

  • The Austin sample returned three plans in 20–23 s in two runs on the hosted demo, with no tool errors. The first live run used 17 Qloo requests; the key's monthly quota is 50,000.
  • The 24-act scenario returned three plans in about 34 s on the hosted demo. Two different 24-act scenarios sent at once, as two judges might, to the same code on a local machine finished in 30–36 s.
  • 11 of 12 act names taken from news reports about recent festivals matched Qloo's catalog exactly, so in that sample most names needed no manual choice; the twelfth, Common, returned only look-alikes.
  • A replay of four 2025 replacements (direct Qloo calls on 2026-10-26): for each cancelled act, 12 other acts named in 2025 festival news were given to Qloo as options against that act's audience, and Qloo scored 5 to 8 of them. Among the scored acts, the act the festival actually chose came 1st twice, 2nd once and 6th of 7 once. The pool is small and mixed in genre, so this is a sanity check, not an accuracy figure.
  • 210 offline tests pass (checked again on 2026-10-30), and a smoke test (a quick end-to-end check) runs the real request path with and without Qloo, without network access.

What's next

Next, I plan to ask festival bookers and promoters to try it on past cancellations and compare its plans with their own decisions, and to replay more public cancellations in the same way as the four above.

Not established yet:

  • Better booking outcomes: no user study or controlled comparison has been run yet.
  • Coverage of smaller acts beyond the 12 names tested, and same-name artists: a unique exact match is accepted without asking, even if it is a different artist with that name.
  • Close scores, such as 0.949 to 0.961 above, do not by themselves show that one act is clearly better.
  • Local heat is coarse: in the Austin run, every finalist's top area scored 1.000, so it adds geographic context but does not yet separate the finalists.
  • Promotions still need set length, rider, contracts, fees and changeover checked by people.

Testing instructions

Open https://lineup-rescue.vercel.app on a desktop or phone; no login or install. It stays free until the Judging Period ends (November 5, 2026, 11:45 pm ET). The top bar should read Live Qloo and Planner / live LLM (the model that writes the plans). The preloaded Austin, TX festival is fictional; real artist names are used only to look up public taste data.

  1. Press Rescue with Qloo (about 20–35 s). Each plan has meters for the cancelled act's audience, the remaining lineup and local heat; excluded phone-list acts show their reason.
  2. Press Compare with LLM-only (about 15 s more). Differences between the two columns are highlighted.
  3. For an ambiguous name, open Edit scenario, rename a phone-list act to Common and run again. In a test on 2026-10-22 the rapper was not among the five options; whatever appears, none is assumed. Pick one and press Apply choices & re-run, or leave it unresolved and the act is not scored.
  4. Expand the announcement drafts, the ticket-type checklists and Tool trace.

Limits: 10 live runs per 10 minutes and 40 per UTC day for each client (one IPv4 address or one IPv6 /64; judges who share one public address share the limit), counted separately on each server instance. The steps above make at most three runs that use Qloo (one in step 1, and one or two in step 3); the LLM-only run in step 2 does not use Qloo. Past those limits, the page uses neither Qloo nor the model and answers with fixed-rule plans without audience data, and says so. The page returns an error for malformed or oversized input, a Qloo outage, or a run past the 50-second request deadline; usage limits do not cause errors.

Run locally with Node 22: git clone https://github.com/Driedsandwich/lineup-rescue, cd lineup-rescue, npm ci, npm run dev, then open http://localhost:3000. Without keys it uses synthetic data; with QLOO_API_KEY and ANTHROPIC_API_KEY set on the server, live data.

Built With

Share this project:

Updates

Submission history