Content design · Content engineering · Concept
Create a vibe
"Play breakup music" sounds simple. It isn't a field in any music catalog. Someone has to decide what it means, what else people call it, when it's ambiguous, and what the system says when it isn't sure. This is that work, end to end.
- Role
- Content design and content engineering (solo concept)
- Built with
- Claude, as a working partner for research, code and checks
- Deliverables
- Vocabulary, flow and copy, fixed text, golden set, tests, working prototype
Unaffiliated concept. Not an Apple product. Songs and artists in the prototype are fictional.
Where this comes from
My day job is content design for a clinician-facing AI assistant that answers drug questions. Most of the hard problems there aren't about tone. They're about identity and precision: working out which drug someone means, when an abbreviation means two different things, and what the system is allowed to say when it can't help.
I can't share that work. So I rebuilt the same thinking in a domain anyone can read: music. The methods carry over directly; none of the data, code or details do.
| Healthcare AI problem | The music version |
|---|---|
| An abbreviation that means two drugs should ask, not guess | "Breakup" means three different playlists, so it asks |
| Short abbreviations fuzzy-matching unrelated drug names | Slang matching the wrong vibe, so every label maps to exactly one vibe, enforced by a test |
| Search ranking is a deliberate business choice | "Based on: My taste / Popular right now / Classics" makes it the listener's choice |
| Safety messages must be true every time they appear | Fixed text for limits, like playing music at a business |
| Crisis messaging that over-fires labels people | A sad mood gets sad songs, never a hotline |
| A clinically reviewed golden dataset | A golden set of 23 requests, run as tests against the prototype |
1. A vocabulary, not a list of moods
Everything starts with a controlled vocabulary of 18 vibes in four facets: mood (how it feels), theme (what it's about), activity (what you're doing) and setting (where, and with whom). A request can combine them: "sad songs for a road trip" is a mood plus an activity.
Each vibe follows the shape of SKOS, the W3C standard for controlled vocabularies: a preferred label, alternate labels, and a broader term. It also carries plain-language levels for energy, positivity, tempo and lyrics, and a rule for when to ask.
- Label
- Over it
- Also called
- moving on · empowered breakup · petty breakup songs · revenge songs
- Broader
- Breakup
- Feels
- High energy, high positivity, mid to fast tempo
Lead with the listener's words. A catalog would call this vibe "Empowered breakup." People say "I'm over it." The label is what people say; the catalog term becomes an alternate label.
2. Ask instead of guess, but only when it matters
A vibe marked ambiguous must come with a question and real options. "Breakup" asks "Still in it, or over it?" and offers Sad breakup, Over it, and Missing them. Guessing wrong is worse than asking.
But a question is a cost, so the system only asks when the answer changes what plays:
- Context can answer it. "Breakup songs for the gym" doesn't ask: the gym only fits the high-energy option. See it
- The listener may have answered already. "Breakup songs but I'm over it" plays immediately.
- Some words are held out on purpose. "Vibes," "lit," "emo," "throwback" and "venue" never map to one vibe silently. It's the same idea as keeping error-prone drug abbreviations off an alias list. See it
- Relative words depend on the listener. A throwback for one person is current for another, so "throwback" asks "From when?" and never guesses from age.
3. Precision: every claim needs a source
Running at a pace
People think in pace ("a 10-minute mile"). Music is measured in beats per minute. The label I wanted was "10-minute mile · about 170 BPM," but only if a source supported it.
- A 2025 study of experienced runners found an average of 169 steps per minute at a 10-minute mile (Leacox et al., Int J Sports Phys Ther).
- Research on running to music matches one beat per step (Buhmann et al., 2018, PLoS One).
- But pace barely moves cadence: 10:00 to 7:00 per mile only changes it by about 9 steps. People vary far more than that.
So the label says "about 169 BPM", and Faster / Slower buttons in small steps do the real work. A common running-blog shortcut (songs at half your step rate) didn't make it in: I couldn't find research behind it. See it · Sources
Playing music at a business
My first draft of this line was wrong in three ways, and fixing it is the clearest example of the precision this work needs.
| First draft | After checking the terms | |
|---|---|---|
| Trigger | "Public venue" | Commercial use. The service's terms say "personal, noncommercial" and never mention venues. |
| Claim | "I can't make a playlist" | Untrue: it can. The limit is where it's played. |
| Unclear words | "Venue" went straight to the limit | "Venue" asks first: "Is this for a business?" A wedding at a venue is private. |
"Apple Music is for personal, noncommercial use, so it isn't licensed for playing at a business. For that, look for a business music service that includes a public performance license."
4. Fixed text that's true every time
Some lines appear in many situations: too few matches, songs unavailable in your region, clean versions only. Each one is written so it's true in every case where it shows, not just the one I pictured.
- "I found 4 songs that fit. Want me to loosen the occasion?" Uses the real count and offers a fix, instead of padding with songs that don't fit.
- "Some songs aren't available where you are, so I left them out." True whatever the reason. Doesn't guess which.
- "Pick a song, a mood, or an occasion to get started." When there's nothing to go on, nothing is invented.
5. A mood is never a crisis
"Sad girl music" and "songs for when I want to cry" get sad songs. Matching the mood is the help. Answering a mood with a hotline labels the listener, and people who've had it happen say it makes them feel worse.
Only an explicit statement of risk gets a support line, worded as an offer, with music still available. The trigger is narrow on purpose, and the golden set tests both sides.
6. Content engineering: rules that hold
Content decisions break quietly when a system grows. So the important ones are written down as checks:
| Content design decides | Content engineering makes it hold |
|---|---|
| Vibe names in the listener's words | Preferred and alternate labels in the vocabulary |
| When to ask instead of guess | An ambiguous vibe fails the check unless it has a question and real options |
| One meaning per label | A label that points to two vibes fails the check |
| Held-out words stay held out | Adding "vibes" to any vibe fails the check |
| The prototype says what the content says | The vocabulary file generates the prototype's data; all copy lives in one file |
| Expected behavior | A 23-request golden set, run against the prototype as tests |
The tests caught my own gaps. Running the golden set against the prototype found three things I'd missed:
- "Wedding reception" wasn't in the vocabulary, so it didn't register as a party.
- When nothing in a request was recognized, the prototype quietly played a generic mix. It now says so and asks.
- "Chill but not sleepy" passed by luck: "sleepy" wasn't a label for Sleep, so the "not" did nothing. The test now checks that Sleep is actually ruled out.
What's next, and the limits
- The catalog is fictional. Energy and positivity levels would need calibrating against real audio features.
- "Classics" needs a real definition the data can check. The working one: from the chosen era, and still widely played today.
- Licensing varies by country. The business line was checked against US terms only.
- The vocabulary is a v0. It would grow from real requests, with the checks keeping it consistent as it does.