Inspiration
A headliner's team usually already has a shortlist of possible openers. The question they argue about is a trade-off: who brings the tour closer to the audience it wants to grow into without clearly losing the fans it already has? Gut feel answers that with confident stories. We wanted an answer that can be checked.
What it does
Undercard ranks the same shortlist twice with Qloo: once for the headliner's audience and once for 1–3 target reference artists.
- Trade-off map: every act is plotted at its two ranks. A fixed, public rule (the best rank on the act's weaker side, then the rank sum) picks which act to review first, and the rule is drawn on the chart as a shaded square.
- Brief with sources: a language model explains the trade-off from the evidence, and every claim is labeled Qloo, Rule or General knowledge. The model cannot change the pick.
- Ask Undercard: a follow-up agent decides whether a question needs new Qloo data, then looks up artists, ranks the shortlist for another audience or compares two audiences (up to 6 calls), and lists every call it made. It can explore but cannot change the audit.
- Veto and re-plan: vetoing an act reranks the original pool and re-queries the explanation for the new priority only; editing the references runs a real new query. Every change is labeled.
- Honest gaps: Undercard stops on ambiguous or unknown names, refuses to pick from a partially ranked pool, and flags exact ties.
- Save and share a signed, read-only brief. No database, no accounts; a tampered link is rejected.
How we built it
- Next.js 16 and TypeScript, with the official
@qloo/qloo-harnessMCP server (qloo mcp) as a long-lived stdio process. All Qloo calls go through one paced queue with visible rate-limit retries. - The audit pipeline is server-owned: resolve names, rank both sides, check coverage, apply the rule, then explain.
- AI SDK structured output writes the brief. Ask Undercard is an AI SDK tool loop over the same Qloo queue; its context comes from a signed token, it sees ranks and tags but no similarity scores, and its rankings are labeled exploratory.
- Run state and shared briefs are HMAC-signed tokens. The app runs on a small VPS behind a Cloudflare Tunnel, with a scheduled health check that verifies both API keys.
Qloo tools and why
| Tool | Question it answers here |
|---|---|
qloo_describe |
Which Qloo entity is this name, or is it ambiguous? |
qloo_rank |
Within this pool, how does each act rank for this audience? (two calls: headliner side, target side) |
qloo_compare_audiences |
Which audience tags do the headliner or references share with the priority act? |
A redacted request → result example is in the README.
Challenges we ran into
- Scores from different calls are not comparable, so only within-pool ranks are used.
- A complete ranking does not mean an act is a good fit, so "no selection" is a first-class answer.
- After a veto, the old priority's explanation must never stay under the new priority.
- A cold 10-act pool can burst past Qloo's 5 requests/second limit; Undercard retries and says so.
- Some artists are not in Qloo at all, so "none of these" became an answer.
- An early follow-up agent swapped an act's two ranks when reading JSON, and compared similarity scores from different calls. Spelling each act's ranks out in one line and hiding scores from the agent fixed both.
Accomplishments that we're proud of
In the Phoebe Bridgers → Olivia Rodrigo case, the model alone picked Gracie Abrams or Clairo. Qloo ranks them last and second-to-last with Phoebe's own fans, and Undercard shows exactly that on one chart.
Behind it is a with/without-Qloo comparison on 5 cases frozen before the first API call (3 held out), with the same model, list and follow-up, run in three rounds with every output published. Qloo contradicted the model-only pick with checkable evidence in 2 of 5 cases, added little in 2, and exposed a limit of the rule in 1.
What we learned
The value is in the two-sided trade-off and in explicit gaps, not in audience-tag overlap, which is mostly generic. A deterministic rule makes a model's answer checkable, and it also makes the rule's blind spots visible.
What's next for Undercard
Letting the team weight the two sides, and per-reference comparisons (which need a rank call per reference).
Known limitations
- Audience affinity is not ticket demand, booking feasibility or personal preference; ranks are valid only within their pool.
- Candidates, fees, dates and willingness come from the team and are not checked.
- The headliner and references are proxies for audiences; shared affinity does not prove new fans will come.
- Qloo coverage is limited in the hackathon environment; missing or unranked artists are flagged, never guessed.
- Ask Undercard answers are model-written and were spot-checked by the author, not systematically evaluated.
- Author testing only, no user research. Demo cases are hypothetical and use public artists.
Try it
- Live app: https://undercard.wangbohan.biz (a live audit takes 30–60 s; one runs at a time)
- Saved runs that open instantly, with Ask Undercard available: Phoebe Bridgers → Olivia Rodrigo · Khruangbin → psych / bedroom-pop
- Code and validation outputs: https://github.com/Xio-Shark/undercard
Built With
- cloudflare
- deepseek
- mcp
- next.js
- qloo
- react
- tailwindcss
- typescript
- vercel-ai-sdk
- zod
Log in or sign up for Devpost to join the conversation.