Inspiration

We built three apps on Qloo for this hackathon: Busk Map, GhostQ and Front Room. All three kept hitting the same wall: the artists people care about right now, new releases and local scenes, often aren't in Qloo yet, or aren't usable as a taste signal. Each app started growing its own fallback code. Instead, we built one layer every app could share: point your Qloo base URL at it, keep your own key, and when Qloo has no answer for an artist, get one anyway, filled in from open sources and clearly labelled.

What it does

Built for Qloo. NotOnQ is a working prototype of a feature for Qloo itself, not a separate product. It shows how Qloo could still answer for artists it doesn't have yet. Built into Qloo, the same flow would run on Qloo's own licensed sources and taste graph, and every gap it fills is a signal of what Qloo could add next.

NotOnQ is a drop-in proxy for the Qloo API. Your app, or Qloo's own MCP harness, changes one base URL. Qloo answers first, unchanged. When Qloo has no artist by that name, or can't use it as a taste signal, NotOnQ fills one in from open sources, labels it, and keeps the request working.

  • Ask (the home page). Ask a music question in plain words. Qloo's own MCP harness answers first, unchanged. Jev, our judge, checks whether that answered the question. If it didn't, NotOnQ asks Qloo again, then fills in the rest from MusicBrainz, Wikidata, Wikipedia, Last.fm and Deezer. When Qloo answers by itself, its answer is the answer. When we fill in, our answer comes first in amber, with Qloo's unchanged answer right under it, so the difference shows at once.
  • Same shape as Qloo. A filled-in artist comes back in exactly Qloo's response shape, after Qloo's own results, with a UUID, a label in short_description and a notonq block saying what we did. Nothing Qloo returned is removed or reordered.
  • Taste answers through similar artists Qloo knows. Recommendations, heatmaps, audiences and demographics for a filled-in artist are Qloo's own answers for similar artists it knows, labelled. When those have no audience data, we use Qloo's audience for their genre, and say so.
  • A source on every value. Every filled-in field cites where it came from, with licence and retrieval time.
  • The Ledger. Every call through NotOnQ and every Ask question, grouped into visits, live (Neon Realtime pushes each new call; nothing polls). Filter by where we filled in or where Qloo answered alone, by app and by kind, and replay what happened. Every view is a shareable link.
  • Proof. Every number is counted from runs in the Ledger, across every app or one. Our benchmark is just another app ("benchmark") asking real questions.
  • For developers. REST and MCP docs, OpenAPI, and llms-full.txt to point your AI at.

What the benchmark shows (production, 28 Oct):

  • Of 20 artists with a release in the last 14 days (ListenBrainz), 9 weren't usable in Qloo. Of 20 Last.fm chart artists, 1 wasn't.
  • NotOnQ filled in 7 of them (the other 3 share their name with other artists, so NotOnQ asks which one instead of guessing). All 7 got similar artists Qloo knows, so taste questions still get Qloo answers; 86% got where they're from, 71% got genres.
  • Of 75 Ask questions, Qloo answered 38 by itself and NotOnQ filled in 37.

How we built it

  • Qloo first, always. NotOnQ forwards every request to Qloo with the caller's own key and only steps in when Qloo's answer shows a gap: no artist by that name (new to Qloo), or an artist Qloo rejects as a signal (not yet a taste signal), or an empty era/genre list.
  • Filling in. MusicBrainz (identity, home, aliases), Wikidata and Wikipedia (links, description), Last.fm and Deezer (similar artists, listeners, fans), OpenStreetMap Nominatim (places given as coordinates), Spotify's public oEmbed (Spotify IDs Qloo lacks). Similar artists are matched to Qloo by MusicBrainz ID, then by exact name, so Qloo can answer taste questions for them.
  • Ask. Qloo's own MCP harness (@qloo/qloo-harness), unchanged, run twice: straight to Qloo, then through NotOnQ. Claude (Haiku, through the Vercel AI SDK and AI Gateway) drives the harness; Jev scores each part of the question.
  • The Ledger and Proof. Every request is recorded with its steps; Qloo's own data is never stored, only counts. Live updates use Neon Realtime: the page subscribes to one tiny live query and fetches just the rows that match its view.
  • Stack: Next.js 16, React 19, TypeScript, Tailwind and shadcn/ui, Zod, Vitest, Neon Postgres and Neon Realtime, deployed on Vercel with a release workflow (semantic-release, version-checked deploys).

Challenges we ran into

  • Finding similar artists Qloo knows. Last.fm's similar artists often have no MusicBrainz ID, and Deezer's best match can sit sixth in the list. We split the lookup budget between Last.fm by name and Deezer related artists.
  • Similar artists with no audience data. For some new artists, the only similar artist Qloo knew had no demographics. NotOnQ now uses Qloo's audience for their shared genre and labels it as such.
  • Never hiding what Qloo said. Ask shows Qloo's own answer unchanged, every time, next to ours.
  • Live without polling. Our first live Ledger polled the database every second behind a WebSocket. Neon Realtime let us push only when something changes.

Accomplishments that we're proud of

  • A real drop-in: Qloo's official MCP harness works through NotOnQ with one base URL change.
  • Every number on Proof can be traced to the runs behind it.
  • Everything we add is labelled and sourced; nothing Qloo returned is changed.

What we learned

  • The gap is real and measurable: new releases are far more often missing than chart artists.
  • Taste answers through similar artists are useful, but only when they're labelled as such.
  • An answer you can check beats an answer you have to trust.

What's next

  • Inside Qloo. The same fill-in flow as a Qloo feature, running on Qloo's own licensed sources, so every app on Qloo gets it without a proxy.
  • Busk Map, GhostQ and Front Room on NotOnQ (GhostQ's integration is built and waiting to ship).
  • One gap engine for every request shape, not just artists.
  • Telling Qloo which artists are asked for most and still missing, so they can be added.

Built With

Share this project:

Updates

Submission history