Inspiration

Somebody is about to spend two years and most of their savings on a film, based on a guess about who will watch it.

That guess has an industry name. It is the comp: the films your pitch says it is like. Sundance's pitch deck guidelines ask for them, and they are clear about why. A creative comp "shows audience interest for your film (no figures)."

So a comp is a claim about an audience. It is also the one piece of audience research every creator makes for free, before the work exists.

Nobody measures the audience behind it.

The measurement exists. It is just sold to somebody else. The Harvard Kennedy School's Shorenstein Center surveyed 14,421 US adults and combined that with data from Nielsen, Parrot Analytics and The Numbers. Their finding:

"Data is not publicly available to small independent film businesses or independent creators, which puts this sector at a disadvantage compared to the large, tech enabled businesses dominating the US media."

The BFI found the same wall in the UK, where audience research on individual titles was "prohibitively expensive for independent distributors."

We know how big the gap is. Shorenstein estimates 76.3M Americans in the addressable audience for US independent film, and 36.7M who watched one in 2022–23. Per-title viewing is low "due to the lack of marketing to bring attention to small titles."

Musicians describe the same problem from the other side. Three surveys of 6,800+ artists agree on the ranking. Each one polled its own users, so read them as testimony, not as a market sample: 74% of 5,039 independent artists earned under $1,000 from music last year, 54% of 300 independent musicians named "getting music heard" as their biggest challenge, and discoverability is the biggest barrier for 35.8% of 1,595 independent rappers.

The supply of new work keeps growing. Nollywood alone makes about 2,500 films a year.

What it does

Whitespace shows you who your idea is for, how sure that is, and what they already love. Before the work exists.

You paste a pitch: a film, an album, a book, a game. The app reads the descriptive words and the work type from it. You confirm the words, then name the comparable titles the industry already asks you for. Then it runs:

  1. Your audience. Fans of the titles you named, built from Qloo's taste data.
  2. The rivals. Audiences Qloo finds next to your pitch. No model suggests these. They are the crowds your work could have reached instead.
  3. The bar. About 20 audiences from other genres in the same medium, scored the same way. Your idea has to beat them.
  4. The verdict. Strong, Mixed, Weak, or Inconclusive, with the ranking and how far the top audience cleared the bar.
  5. The reach plan. For any audience that clears the bar: the interests, people, podcasts and brands that audience already loves.
  6. The proof. The same pitch sent to the same AI with no Qloo data, its titles marked found or not found. Plus every Qloo call the run made, in a drawer you can open.

The ranking matters less than the bar.

"Strong fit" does not mean the app likes your idea. It means the top audience beat a group of people with no connection to your film, by a fixed margin: 0.05 on a 0 to 1 scale. And if that top audience is the one you named, a second test has to leave it standing.

That test removes the comps you supplied and scores every audience again on what is left. If the audience you named drops further than the others do, the run is capped at Mixed fit and the reason is printed on the card. Quietly lowering the verdict would be dishonest in the other direction, so we show why.

So the tool can say something most recommenders cannot: your best fit is not the audience you named. We made that hard to trigger. A rival has to beat your comps by 0.10 on the same scale, not just tie them.

In a published back-test of Get Out, pitched as if it were unreleased, the strongest rival Qloo found was a documentary about African American history and identity. The second was a documentary about a Black woman's murder and the failure of the justice system. Neither has any connection to the comps. The reach plan's podcast list landed on Radiolab and The Infinite Monkey Cage.

That is the crowd the film actually found.

How we built it

Next.js 16, TypeScript, Tailwind and Biome. All Qloo calls go through one place in the code. The scoring and the verdict are plain code you can read, and the same input always gives the same result.

pitch → words and work type → comp titles
      → audiences: yours, rivals, controls
      → shared tag list → remove one comp, rescore
      → scores → verdict → reach plan → evidence drawer

Qloo calls, all GET:

Endpoint Used for
/search Find the Qloo record for a title you typed
/v2/tags Match the words in your pitch to real Qloo tags for that work type
/v2/insights (filter.type=urn:tag) Each audience's taste list. Every score is built from this
/v2/insights (entity types) Find rival audiences, suggest titles from yours, and get reach items
/v2/tags (title labels) The taste labels attached to the titles you named

The core of this product is a measurement, and a language model cannot fake a measurement. Whether one film's fans like grief more than another film's fans do, compared with twenty unrelated audiences, is a fact in Qloo's data. The same is true for matching your words to real tags, matching a title to the right record, and finding the people and podcasts an audience follows.

So the AI has a small job. It turns your pitch into words and a work type, picks which of your titles' labels fit, links leftover words to tastes we already had, writes the chatbot answer, and rewrites the reach text from a fact sheet. It never makes up a tag, a title, a score, an audience or a ranking.

Qloo ranks each audience's tastes. We keep the order and throw away the raw numbers. The first taste gets full marks, the last gets almost none, and every audience is scored as an average across one shared tag list. For the curious, rank r of N scores (N − r + 1) / N.

That rule is checked on every run, not just written in a comment. When a run finishes, every title, id and scoring tag it is about to show is checked against the ids Qloo actually returned. Anything that does not match is removed and listed in the run steps. A judge can open the drawer and confirm the thing they are judging is not a hallucination with a progress bar.

It also behaves like an agent, which is the part we did not plan for. It starts by looking for rival audiences using the words in your pitch. When that search comes back empty, it works out that the question was too narrow rather than the catalog missing, and asks again using your titles. It only builds a group of strangers when the search leaves one available, and it switches to the other comparison group when only one of the two can be measured. A pitch about a software tool is refused before the run makes a single taste call.

Four decisions shaped the rest.

No data is never a low score. A tag missing from a long enough taste list is a zero. A tag missing from a thin or failed list leaves the score entirely, so a bad API response cannot fake a bad fit.

The control group sets the bar. Strong and Mixed require beating a group of strangers by a fixed margin. A tool that always agrees with you is not worth building, so the guard is the product.

We check for a circular win. An audience can come out on top just because you named its titles, so we remove each comp in turn and score everyone again. An audience that only wins on its own comps gives itself away.

Every run is checkable. The drawer holds the calls, not inline citations, because a claim with a footnote next to it is still a claim.

Challenges we ran into

Taste queries need filter.type=urn:tag. Without that parameter the API ignores the title and returns empty lists: a 200 that means nothing. Every taste call failed before we found it.

Tags and taste lists have to be limited to the same work type. Unscoped lists return credit-card and restaurant tags for a movie audience. Unscoped tag search matched slow-burn to a specialty-dish place.

Our first search for rival audiences asked too much. Eight adjectives at once is a question almost no film answers, so a niche pitch came back empty and the run had no rivals to compare against. That was not a gap in the catalog. We had asked a question almost nothing could satisfy. The fix was to ask again using the titles you named. It costs three calls and only fires when the first answer is genuinely empty. An outage is still reported as an outage.

The verdict is easy to get wrong if you let the user's guess win by default. Our first working version made the named audience the favourite whenever scores were close. The control test, the surprise margin and the second test all exist because of that.

We ran on free AI tiers and a monthly Qloo quota. Every model call has a time limit and a backup provider. The reach text falls back to a plain written draft, section by section. A rate limit returns a quota state instead of reporting a title as not found.

Accomplishments we're proud of

Everything on screen is checked. Every title, tag and id traces back to a Qloo call from that run, and the whole call log is in the drawer.

We published a PARTIAL back-test, misses included, in the repo instead of only in the pitch.

Inconclusive is a real answer. If we matched too few words, or the data is missing, or the tag list is too thin, the run says Inconclusive and gives the reason. It never shows a Weak fit that is really a gap in the data. It is the least impressive output and the one that makes the rest worth reading.

One more. A recorded sample at /demo/result replays a real 96-call Qloo run with its evidence, so the demo survives a dead network or an exhausted quota. Every number on it was measured, not written into sample data.

What we learned

Comps are a claim about an audience that nobody had measured. The input was already there, free, and standard practice. The audience was the missing half.

Taste is a better way to group people than demographics. A peer-reviewed study of 3,204 viewers rating 209 films found that the industry's targeting by broad demographic categories "seems off the mark," with age and gender explaining little agreement between viewers. The authors recommended grouping audiences by taste instead.

Getting the audience wrong has a cost. The three music surveys are not a market sample, but they are 6,800 artists putting the same problem first.

Saying "we don't know" costs something to build. Every one in this product is deliberate, and they took longer than the cheerful answers.

What's next

More runs in front of actual creators. Every run is free and every run carries its evidence drawer, so the next step is more of them.

Links

Sources

Built With

Share this project:

Updates

Submission history