In 30 seconds
Claude doesn't know what's missing from your shelf. Qloo does. You run an independent record shop. Your till tells you what sold. It never tells you what a customer came in for and left without. Afterglow gives you that list, and this week's order.
- 41 of the 50 artists Austin loves most (Qloo location data) are not among the 500 best-sellers of Waterloo Records, a real Austin shop. Your sales list can't show that demand.
- Four real shops, one order each: for every record store on /real the app names three records the city loves that the shelf lacks. Waterloo: Lizzo, Gary Clark Jr., Willie Nelson.
- Two Claude agents on Qloo: a shop assistant that picks five titles with a Qloo fact behind each, and a restock agent that turns every title it could not find into your next order.
Judge path, 3 minutes
- Open https://taste-layer-alpha.vercel.app/live and press any example. Left: the shopper's agent working through Qloo, step by step. Right: the owner's demand landing. Open "What the agent asked Qloo" to see every call word for word, with copy as curl.
- Open https://taste-layer-alpha.vercel.app/real. Four real shops, how well each shelf fits its city, and this week's order for each record store.
- Back on /live, type your own request. With the judges' link it runs live on Claude and Qloo. If Claude is ever unavailable, the page says so and labels the fallback answer.

Who pays
The shop pays per location per month for a restock list its sales data can't give it. Running cost per shopper request: about $0.015 of Claude Haiku (measured) plus about 14 Qloo calls (our recorded runs use 14 to 15). Every independent shop on Afterglow is a Qloo API customer: a shop with 300 shopper requests a month makes about 4,000 Qloo calls, before the weekly city reading. The market: 3,783 member bookstore locations in the US in 2025 (American Booksellers Association) and a $1.04B US vinyl market (RIAA).
Two numbers, two test sets
- 25 vs 9: on 50 requests we never tuned on, blind labels gave our agent 25 wins and Claude alone 9 (21 vs 12 with a second blind judge).
- 0 vs 15: on all 70 requests (those 50 plus the 20 we tuned on), our agent never put an over-budget title in its top three; Claude alone did 15 times.
Real shops, run through Afterglow
We took the public catalogs of four independent shops (no affiliation) and asked Qloo two questions: does the shelf know its city, and does it fit the shoppers who walk in? Page: https://taste-layer-alpha.vercel.app/real
- Waterloo Records, Austin (500 best-sellers): Qloo knows 192 of 217 artists (88%); 9 of Austin's 50 favourite artists are on the shelf.
- Josey Records, Dallas (first 500 vinyl LPs): 227 of 246 (92%); 8 of 50.
- Newbury Comics, Boston (first 500 vinyl): 281 of 308 (91%); 2 of 50.
Tattered Cover, Denver (30 book best-sellers): 6 of 29 (21%); not read.
Newbury's feed opens with exclusive colour variants, so its slice under-counts regular stock. Tattered Cover is a bookshop: Qloo matched only 6 of its 29 titles by exact name, too few to read the city. We show both rows anyway.
For each record store the page lists this week's order: three records by artists the city loves that the shelf lacks, with the album taken from the free iTunes Search API. That order uses no simulated shoppers, only the city's own taste.
Against our 20 demo shoppers with music tastes (simulated demand), 36 of the 181 records their tastes love most are on Waterloo's shelf, and 7 of 20 would find nothing.
Details
What Claude alone can't do here
Ask Claude what a fan of Joy Division would like, and it will answer well. Ask it which of those things your shop is missing, how many of today's shoppers left without them, or where a record nobody has bought yet belongs on your shelves, and it can only guess. Those three answers come from Qloo:
- The store check. For every request the agent asks Qloo for the ten titles that taste loves most anywhere, and counts what the shop carries. Joy Division and Murakami: 3 of 10 in stock. The Smiths, Gang of Four and Echo & the Bunnymen go on the owner's list.
- The demand ledger. Across 38 demo shoppers, 81.6% of what their tastes love is not on these shelves, spread over 295 titles their tastes love that the shop doesn't carry. The owner's agent turns that into three titles to order.
- The cold start. A title with no sales and no tags gets scored against 36 reference tastes and lands next to its closest titles on the store map. Judas Priest lands beside Iron Maiden and Megadeth.
What it does
Afterglow is a demo culture store with 384 real titles (vinyl, books, films, games, TV box sets) and fictional prices.
The shop assistant. You write the way you'd talk to a clerk: "He's into Joy Division and rereads Murakami every winter." Claude Haiku works through Qloo with six tools and decides what to call: find the tastes (a genre becomes representative works, so "old westerns" turns into The Lone Ranger and Bonanza), score the whole catalog once, check the shelves, look up who the fans are, ask a question when there is nothing to go on, recommend. Five titles across formats come back, and each one carries a fact from Qloo, not just the model's words: "Qloo: #2 of 90 films here for fans of Joy Division." A reason that names a genre the title's own data doesn't support gets rewritten from data.
The owner's agent. Reads the unmet demand, checks who loves each candidate with Qloo demographics, and proposes three titles with the coverage they'd reach (18.4% to 20.0% on the demo demand). Next to each pick the app shows which shopper tastes asked for it, its map section and its audience, straight from the tool data.
Qloo, visible. The shopper sees how Qloo reads the taste ("Post-punk, New wave, Magical Realism" for Joy Division and Murakami), the recipient's age and gender go to Qloo as demographic signals when the message gives them ("my dad, 62"), and a panel lists every Qloo call the agent made, grouped by endpoint and parameters.
Check your own shop. Paste up to 30 things you stock. Qloo resolves each line and the same shopper demand is measured against your shelf: how many shoppers would find something their taste loves, and what to stock next.
The live screen. Shopper on the left, the agent's steps streaming in. Owner on the right, the new demand landing a moment later. Below, the whole store lights up: every cover glows by how much this taste loves it.
The full path. Product pages, a bag with "complete the gift", and a demo checkout that asks "Who is it for?" and shows what the order taught the store.
Trust
No personal data: Qloo describes groups of people with similar tastes, never one person, and the demo keeps a shopper's requests in their own browser. Every pick carries a Qloo fact; a reason that claims a genre the title's own data doesn't support is rewritten from data. Live Qloo calls pause before the monthly quota runs out, and the examples keep working from recorded Qloo data.
How we built it
Next.js on Vercel, Claude Haiku 4.5 with tool use, and these Qloo calls:
| What | Qloo endpoint |
|---|---|
| Find what the shopper named | GET /search (exact name match first, typed search second) |
| Score all 384 titles for a taste, and which taste drove each match | GET /v2/insights with filter.results.entities and feature.explainability |
| Store check: what this taste loves most anywhere | GET /v2/insights without a catalog filter, per format |
| How Qloo reads the taste | GET /v2/insights with filter.type=urn:tag (taste analysis) |
| Who the gift is for | signal.demographics.age and signal.demographics.gender on scoring and the store check |
| Who loves it | GET /v2/insights with filter.type=urn:demographics |
| What a city loves | GET /v2/insights with signal.location.query (the real-shelf page) |
| Taste map and cold start | GET /v2/insights against 36 reference tastes |
| Check your own shop | GET /search per pasted line |
The map uses each title's affinity for the 36 reference tastes, centred per format and clustered (k-means, 9 sections). Caps: 6 model turns and 25 live Qloo calls per request; per-route daily limits; live Qloo calls pause when the monthly quota runs low, and the examples keep working from recorded Qloo data.
How we measured it
A separate blind agent, which saw only the catalog, wrote and labelled 40 shopper requests before we tuned anything; we tuned on the odd-numbered ones only. After all tuning, a fresh blind agent wrote and labelled 30 more. A second blind agent judged every top-three pick the labels did not cover, for both sides, without knowing which side made it.
Against Claude reading the whole catalog as text (same model, no Qloo), on the 50 requests we never tuned on (20 old, 30 new):
| P@3, blind labels | P@3, labels + blind judge | wins / losses | |
|---|---|---|---|
| Afterglow agent | 0.43 | 0.57 | 25 / 9 on labels, 21 / 12 with the judge |
| Claude alone | 0.32 | 0.48 |
On the blind labels the agent leads (difference +0.11, 95% bootstrap interval 0.00 to +0.23; sign test p = 0.009). With the second judge's verdicts added the lead is smaller (+0.09, interval -0.02 to +0.21, p = 0.16): we read that as "at least as good, often better", not as a decisive win. The clearest difference is the budget: across all 70 requests Claude alone put 15 over-budget titles in its top three; the agent put none. Runs of the same agent move by a hit or two, and we publish the latest run, not the best one. An earlier test on a small hand-tagged catalog went the other way (hand tags beat Qloo), and that result is in the repo too.
Claude alone only works because 384 titles fit in a prompt. A real shop with 50,000 titles doesn't, and Qloo scoring doesn't care how big the catalog is.
Challenges
- Qloo never returns the signal itself, so a shop built from Qloo's suggestions was missing Taylor Swift and Miles Davis. We added the seeds back.
- Raw affinity follows popularity: LEGO topped every early list. Per-format percentiles fixed it.
- Typed search mapped "Studio Ghibli" to a photo app. Exact-name resolution first fixed it.
- The model wrote confident nonsense ("The Mule, a modern western"). Reasons now have to match the title's own Qloo tags, and the owner's plan shows facts from tool data instead of the model's summary.
- Qloo recognised about 30% of 300 random Amazon listings, and two in three for music and film. That decided the vertical: a culture store.
Who pays (long version)
The shop, per location, per month: a restock list it can't get from its sales data. The running cost is small enough for an independent store: about $0.015 of Claude Haiku per shopper request (measured on the live agent) plus Qloo calls. The market is wide: the American Booksellers Association counted 3,783 member bookstore locations in 2025, with 605 new independent bookstores opened that year (Shelf Awareness, May 2026), and the record shops sell into a $1.04B US vinyl market (RIAA).
What's next
Day one needs no shopper traffic: a shop pastes its catalog (or we read its public feed, as on /real) and sees which of its city's favourites it doesn't carry or doesn't sell. Shopper requests then add the gifts people came in for, from the in-store tablet or the shop's website chat.
Keep demand per store on a server instead of per browser, send a weekly restock note, and import a full catalog file. The same engine fits a venue: which artists does your audience love that you never book.
Built with
Qloo Taste AI API, Claude Haiku 4.5 (Anthropic API, tool use), Next.js, TypeScript, Vercel, Higgsfield (generated artwork), iTunes Search API and Open Library (catalog data).
Honest limits
The store, prices and demo shoppers are made up; demo demand comes from 38 test shoppers plus your own requests, stored in your browser. One-click examples replay recorded runs of the live agent; typed requests run live. The Waterloo page measures coverage only: we have no blind labels for that catalog, so recommendation quality there is not measured. The Waterloo numbers come from one read of the shop's public catalog feed; only artist names, counts and prices are kept. Cover art thumbnails are in the repository only to illustrate the demo store; they belong to their rights holders.
Built With
- anthropic
- claude
- next.js
- qloo
- react
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.