The problem

Publishers and catalogue owners hold many artists who were huge and are now quiet. One placement in a trailer, a game launch or a returning series can wake one up: Stranger Things did it for Kate Bush in 2022, and the GTA VI trailers did it for Tom Petty and The Pointer Sisters. Sync teams pitch these windows by hand, from memory and contacts.

A sequel is an early signal. The earlier title's audience is already in Qloo's graph, so before the sequel's music is picked we can ask: does that audience already rank this artist near the top?

Sleeper Hit is for the sync team at a publisher or catalogue owner. Recorded-music sync revenue alone was US$641 million in 2025 (IFPI Global Music Report 2026), and publishers earn sync fees on top.

Quality of the idea: what Qloo adds that an LLM cannot

On 26 sequels already out, we ranked about 3,000 well-known artists by the earlier title's Qloo audience rank averaged with popularity. That ranking put the artists each sequel went on to use higher than popularity alone or an LLM did. Audience rank alone pointed the same way but did not clear our bar.

  • Famous artists, the ones this tool pitches. Every top-50 hit of our score and of the LLM was in the most popular third of the pool, where the artists we pitch sit. Within that third our score also beat popularity: AUC +0.09 [+0.02, +0.16].
  • Films and games. AUC +0.10 [+0.05, +0.18] over popularity, and 23 sequel artists in the top 50 against the LLM's 16.
  • A steady audience signal. Close sibling titles (consecutive Twilight films, GTA V and Red Dead Redemption 2, Bridgerton and The Gilded Age) got Qloo artist lists that overlapped 4.4 times more than unrelated pairs. The LLM reached 1.8 times, because it names the same famous artists for most titles.

The method was committed before any song list was collected, and npm run backtest re-runs it.

Technological implementation: how Qloo is used

Qloo measures the audience. Our code ranks the windows and decides. The language model drafts the letter and is the baseline in the tests. A person sends.

  1. /search resolves artists and titles (urn:entity:artist, movie, tv_show, videogame). Only an exact name match, with the expected year for titles, is accepted.
  2. /v2/insights with filter.popularity.min=0.9 builds the pool: the first 3,000 artists Qloo returns.
  3. /v2/insights with the earlier title as signal.interests.entities scores the whole pool in chunks of 50 through filter.results.entities. We checked first that an artist's affinity does not depend on the other artists in the request, so the chunks share one scale.
  4. Our card score averages each artist's affinity rank and popularity rank. The agent knocks only inside the top 20% on that score, and only when the audience itself ranks the artist in its top 20% by affinity, so popularity cannot carry a letter alone (a rule added after review, not backtested).
  5. urn:demographics gives age and gender overlap, used only to break ties.

We also tried /v2/trending (its values have been frozen since mid-October 2025) and urn:tag (too generic to explain a match), and left both out. About 6,370 live Qloo calls went into building and testing.

Request to result (ids redacted):

GET https://hackathon.api.qloo.com/v2/insights
  ?filter.type=urn:entity:artist
  &signal.interests.entities=<GTA V id>
  &filter.results.entities=<50 pool artist ids>
  &take=50

We read results.entities[].query.affinity and popularity, repeat over the pool (2,992 artists scored for GTA V), and rank. GTA V fans rank The Clash No. 1 by affinity; it is No. 109 by popularity; averaged, No. 28, the top 1%. The Clash is quiet, and Universal Music Publishing Group lists its songs, so the agent drafts a letter for a GTA VI launch trailer or TV spot. The same request for Sonic the Hedgehog 3 puts The Clash only in the top 34%, so the agent skips Sonic 4 and says why. On popularity alone it would have written that letter: across the demo roster, 2 of 25 decisions on Oct 24 changed because of Qloo's audience signal.

Data handling. No Qloo response data, entity ids or keys are in the public repo. Responses are cached privately on the server, the browser receives ranks and percentiles only (Works too, which gets artist names in and sends ranks back), and npm run check:public scans the repo before publishing. Works is capped per visitor and per day, and artists already in the cached pool need no new Qloo call.

Design: the product flow

  • Today: a strip at the top lists the five demo artists with today's status (letters ready, sent, not quiet, clearance unconfirmed); click one to open it. Below it is a pitch letter ready to edit, with the evidence beside it: what the window pitches for, Qloo's ranks, clearance with sources, the date marked "announced" or "estimated". Below it, every window the agent skipped, each with a one-line reason and a "Knock anyway" button.
  • Roster: every open window with the demo artists ranked by the card score, and the five best-fitting of 55 quiet catalogue artists from our scan of the 500 most popular artists.
  • Works: paste up to 10 of your own artists, with your share of the song and recording. Each one is scored with the same code as Today, so the same score we backtested, and the letters across the whole list come back ranked best first like a tracklist, each with its reason and a drafted letter. Artists with no letter today are listed with the reason. The list stays in your browser; the server gets the names (and your share) only and keeps nothing.
  • Outbox: "Copy letter", or "Open in email app" for a filled-in draft in your own email program, then "Mark sent" and track the outcome: no reply, passed, on hold, quote requested, placed. Sleeper Hit never sends email itself.
  • Trust: the backtest, its limits and every decision we changed after seeing data.

The agent refuses when it should. The Verve is not quiet (its Wikipedia views hit 2.32 times their 3-year average in July 2025), so it gets no letters. Series premiering within 60 days are treated as locked. In-game music is treated as chosen, so games are pitched for launch trailers and TV spots.

Screenshots are in the gallery and in docs/screenshots/ in the repo.

Potential impact

A sync team can check its quiet artists against every announced sequel in minutes, with the reason for each yes and no on screen. Fees for a known song by an established artist run from $5,000 to $1,000,000 by one licensing company's estimate, with trailers among the higher-paying uses, so one extra placement a year from a sleeping artist would pay for a subscription. That is our plan; we have not yet tested it with a sync team.

Sealed forecast. On Oct 28, 2026 (16:19 UTC) we sealed rankings for 12 upcoming sequels. SHA-256 hashes: pool list ace1faf500641079ca9ab4692a555753bdf3b0c39326360074555545001bc5ae, per-title ranks 1e8f4510c233ad0cc60b5e73766197f3dd91bd3d5df5007f24028f601e356bca, baseline predictions db7e2014f5176e06cd0c177c113addfbf005fed5cbb77377bac2112d93cee7b2 (also in seal/hashes.json and on the Trust tab). The files stay private because Qloo data may not sit in a public repository. Each title is settled after release with the backtest's scorer; final settlement is Jan 31, 2027. Almost nothing can be checked during judging, and we say so.

Limits: what the result does not establish

  • We chose the card score after the backtest. It was the only one of four registered Qloo uses that cleared our bar, so the pass is narrow. The sealed forecast is the test it has not seen.
  • Series and titles newer than the LLM's training cutoff did not show Qloo clearly ahead of popularity. Most sealed titles are one or the other.
  • The backtest checks songs used in the sequels themselves (soundtrack albums and episode lists). The app also pitches trailers and TV spots, where picks follow other rules.
  • Qloo's audience data is current, so fans of an earlier title may already reflect its sequel's songs. That bias favours Qloo.
  • "Quiet" is our rule (English Wikipedia page views plus no studio album in 5 years). Page views measure reading attention, not plays.
  • Qloo stops at the artist; a person picks the song. We have no licensing history, so the app cannot warn that a song has been used too often.
  • The window list is a hand-kept list of announced sequels with sources. Clearance categories set priorities; they are not legal advice.
  • A high rank is a reason to knock, not a prediction that a supervisor will pick the artist.

Try it (for judges)

Open https://sleeper-hit.onrender.com. No login. If the service was asleep, the first load can take a minute or two while it scores the pool.

  1. Today: the first screen is the pitch letter for The Clash and Grand Theft Auto VI, with the evidence card beside it. Click a song to swap it into the letter. Below are the windows the agent skipped, each with its reason.
  2. The artist strip at the top of Today shows all five demo artists with today's status, so you can see who gets letters without switching. Click The Verve: the agent refuses, because The Verve is not quiet.
  3. Roster: every open window with the demo artists ranked, the quiet catalogue artists that fit best, and how many decisions would change on popularity alone.
  4. Back on Today, click "Add to outbox", then open Outbox. "Open in email app" opens the letter as a draft in your email program; "Mark sent" moves it to sent, where the outcome can be tracked. The same artist and window cannot be pitched twice.
  5. Works: the box is filled in with an example list (the shares are made up). Click "Score my catalogue" (it can take a minute). You get every letter across the list, ranked best first with its reason, and the artists that get no letter today, with why. It uses the same score as Today.
  6. Trust: the backtest, its limits and the decisions we changed after seeing data.

Everything you add is stored in your own browser. Sleeper Hit never sends email itself.

Run it from a clean environment

Requires Node.js 22 or newer. No dependencies.

git clone https://github.com/a96020183/sleeper-hit
cd sleeper-hit
cp .env.example .env   # add QLOO_API_KEY, and OPENAI_API_KEY for drafted letters
npm test
npm start              # http://localhost:3000

Without a Qloo key the app runs on an offline mock and says so. The first live start scores the pool, about 370 Qloo calls throttled to 4 a second.

Built With

Share this project:

Updates

Submission history