Menu
Projects

Interactive demoMock API

Music Analysis Chat

A roster workspace built to answer one question: when an agent replies about music data, what should come back instead of a paragraph? Six artifact types, four surfaces, and a mock API that always returns the same shapes.

The workspace on open: a sidebar of recent threads and campaign projects, the chat column, and five suggested starting points

It runs in the browser with no key and no backend. Ask it about saves, social, creators or outreach and it answers from a fixture.

What an answer should look like

A roster workspace for a label, built to rehearse rich agent output in a domain I already know well.

In simple terms

A workspace for a record label, built out of interviews rather than out of an idea.

I sat with people at a label about what actually goes wrong when they try to put AI into their daily work. The pattern was consistent: the tools answer in paragraphs, and the job is not made of paragraphs. The questions are narrow and they repeat. How did this release convert. Who is posting with the sound. Who should we send the brief to. Each of those has a known answer type, and prose is the wrong shape for all of them, which is exactly what a chat box hands you by default.

The other half of what they told me is that nobody trusts an answer they cannot check. A number in a sentence is a claim; the same number in a table you can sort, next to the rows it came from, is evidence.

So this is not a chatbot that knows about music. It is an argument about response shape: for a question with a known answer type, the agent should return the artifact that answers it, and the sentence should be the caption on that artifact rather than the answer itself.

The impact. It reframes what an agent gives back as something you act on and can verify, rather than something you read and have to trust, which is the difference between a demo that impresses a label and a tool that survives contact with their week.

Why it exists

I spent years around music data: save rates, playlist adds, which clip is driving which conversion. The questions people actually ask of it are narrow and repetitive. How did this release convert. Who is posting with the sound. Who should we send the brief to. None of those are answered well by a paragraph of prose, which is what a chat interface gives you by default.

So this is not a chatbot with music trivia in it. It is an argument about response shape: for a question with a known answer type, the agent should return the artifact that answers it, and the prose should be the caption rather than the payload.

The rule the fixture enforces

Every reply is a short piece of text plus an ordered list of blocks, and the block types are a closed set. A question about conversion returns stats and a chart. A question about social returns stats, embeds, and a next-step row. A question about creators returns a roster with engagement and price on every card.

Because the set is closed, the surface can be built once and trusted. Nothing has to parse markdown at render time and guess whether a table was meant; the agent picked a type, and the type has a component.

The artifacts

Six block types, rendered here by the same components the demo uses, holding the same payloads the fixture returns. These are the real thing, not pictures of it.

Headline numbersstats
Total Saves
312K
+18%
Save Rate
6.4%
+0.6pp vs avg
Top Song
7.8%
So U Kno
Playlists
847
The first thing back on almost every question. Four to six cells, each with a value, an optional delta, and an optional benchmark underneath, because a number without its comparison is the thing people misread.
One series, one questionchart
Saves by Song (K)
142
So U Kno
68
Gunk
58
Blow Out
44
Is U
Deliberately the least capable chart I could ship: labelled bars, one series, no axes to read. Anything richer invites the agent to answer a question nobody asked.
Ranked comparisoncomparison
Save Rate by Artist
Skee Mask
Ambient
8.3%
198K saves
Four Tet
Electronic
7.9%
445K saves
SHERELLE
Jungle
7.0%
94K saves
Caribou
Electronic
6.5%
210K saves
Overmono
UK Bass
6.4%
312K saves
Yaeji
Electronic
5.8%
287K saves
For anything that is really a ranking. Each row carries the label, the sub-label that says why it ranks there, and the raw figure, so the bar is a reading aid rather than the only evidence.
Creator rostercreators
👩🏽
Juana Skiles@jskiles_xtiktok
UK BassRaveDance
214K
followers
8.2%
eng rate
$280
est. cost
👨🏻
Ramon Witting@bratramontiktok
RaveTokLocal Scene
95.5K
followers
6.8%
eng rate
$150
est. cost
👨🏼
Gilbert Baumbach@gillybbinstagram
House FanClub Culture
47.8K
followers
9.1%
eng rate
$120
est. cost
The answer to who should we contact. Followers alone is the wrong sort key, so engagement, location and asking price sit on the card and the reply leads with the bracket that converts rather than the biggest account.
Drafted outreachemail
Fromcollab@yourlabel.com
To6 creators (bulk)
SubjectOvermono — New Release Promo Collab
Hi {{creator_name}}, We've been following your content and think you'd be a great fit to help promote Overmono's upcoming release. Here's what we're looking for: - 1 TikTok using the sound "So U Kno" - Post within 7 days of release - Creative freedom on concept Compensation: {{rate}} Brief & assets: {{collab_link}} Let us know if you're interested! Best, Team
A draft with its merge fields still showing. The agent is proposing a send, not performing one, and leaving the placeholders visible is how the draft says so.
Source postssocial
🎬
TikTok
So U Kno — Overmono
🎧
@dj_overmono
Unreleased clip from the studio — new one coming soon
182K4.2K31K
2.4M views2d ago
~ 12.4K creates
📸
Reel
🎵
@overmono_
Live at Printworks. The bass was different that night.
94K2.1K12K
890K views4d ago
🎬
TikTok
So U Kno — Overmono
🔥
@bassfanatic
POV: Overmono drops So U Kno at 3am #UKBass #rave
156K3.8K28K
1.1M views1w ago
~ 12.4K creates
Cited evidence, in the shape people already read it. A claim about a sound trending is worth very little without the three posts it came from, and the sound name on the card is what ties the clip back to the catalogue row.

Four surfaces, one set of blocks

Chat is where a question gets asked, but it is a bad place to keep an answer. So the same blocks compose into three other surfaces: an analytics view over the whole roster, an artist view per act, and a projects view where a campaign collects the artifacts it produced. A long answer also opens in a side panel with its full body, its table, and its own follow-up row, so a deep dive stops competing with the thread it came out of.

Artists can be pulled into a question with an @ mention, which is the whole context model: the thing being asked about is named, not inferred.

Why the API is a fixture

Nothing behind it is real. The API is one function that matches keywords in the question and returns a hand-written payload after a short delay. That is the point: the work here is the response contract and the surface that renders it, and a real model would only add a source of variance to a thing being judged on its shape.

It also means the demo has no key, no backend and no rate limit, so it still runs exactly as built.

What I would keep

The closed block set, and the rule that prose captions an artifact rather than carrying the answer. Both survived into how I build agent surfaces now: name the answer types first, build a component per type, and let the model choose among them instead of formatting freehand.

The demo is still here and still runs. It is filed under the write-up rather than beside it because the interesting part is not that a chat window works: it is the list of things the agent is allowed to hand back.

Open the demo