How the StudioMode recommendation algorithm works (v8)
The For-You feed isn't magic. It's a stack of small, deliberately tuned signals — followed-producer boost, recency decay, key-match bonus, a guard against producer spam, and an exploration slot for the algorithmic equivalent of "look up." Here's everything that goes into picking the next beat.
Why this needs explaining
Every recommendation system makes promises it can't keep. "Personalized for you" usually means "engagement-maximizing for us." We didn't want to build that. The whole point of StudioMode is to be a discovery layer loyal to the buyer — the artist — and that means the algorithm has to be honest about what it's optimizing for.
So this post walks through the entire recommend_for_user RPC. Every knob, every weight, every guard rail. It's a long post because simplicity is hard. There's no secret sauce. Just nine signals and the discipline to tune them.
The nine signals
Every candidate beat that lands in front of you was scored against these:
Final score is the sum (after the diversity guard caps any one producer). Then we sort descending and paginate. That's it.
The hard problems
Cold start
A new user has no save history, so every signal returns 0. Cold start
is solved by the onboarding flow: pick 3-5 artists you sound like,
we map those to genre / BPM / mood signatures (the
artist_signatures table) and use those as your synthetic
taste profile until you've made enough saves to override it. After
~10 saves the synthetic profile gets phased out.
The producer-spam problem
Without the diversity guard, the algorithm trends toward "your top 3 producers, forever." A user with 20 saves of Internet Money beats will see Internet Money, Internet Money, Internet Money, Cash Cobain, Internet Money. The −15 penalty after 3 same-producer beats in the same batch breaks that loop. Empirically it kicks in for the top 5% of users; everyone else's diversity is naturally fine.
The new-user-with-niche-taste problem
Some users save almost exclusively in one BPM band — say 73-78 BPM jersey club. The algorithm correctly nails that lane, but the catalog has, at any given time, maybe 200 beats in that exact band. Once we run through them, the user starts seeing repeats penalized by −12 and the feed gets sparse. v8 handles this with the sparse- fallback escape: if the candidate pool drops below a threshold, we relax the BPM band match from "exactly your band" to "within 15 BPM."
What we don't do (and why)
Plenty of things could go in the algorithm but don't:
- Collaborative filtering ("users who saved this also saved..."). We tried it. It doesn't help because save patterns are too sparse — most beats have <30 saves total. CF works at scale; we don't have scale yet.
- Producer popularity boost. Tempting because "more saves means it's good." But that creates a runaway dynamic where popular producers always win. Letting saves earn placement organically (via the followed-producer signal once you opt in) is healthier.
- Time-of-day bias. "Show chill beats at night, hyped beats in the morning." Sounds smart, but in practice users save what they save regardless of time. Adding the signal hurt more than it helped.
- Paid placement of any kind. Never. The whole point.
The exploration slot is the most important slot
If you remember nothing else from this post: the 10% exploration slot is what separates a recommendation system from a confirmation-bias machine. Without it, you'd never discover a producer you hadn't already heard. Every great StudioMode save story I've heard from a user starts with "I would never have searched for this on my own." That's the exploration slot doing its job.
What's coming in v9
We're working on three things for v9:
- Save-velocity awareness: if a beat is getting saved fast right now, push it harder. /trending-now is the public surface; v9 wires it into the personalized feed.
- Drop-in matching: if you're between sessions and you've been writing on a 142 BPM beat, we'll lightly bias toward 142 BPM for the next session — picking up where you left off rather than starting cold.
- Negative signals from real-time feedback: a 👎 currently nudges the algorithm; v9 makes it stronger and faster. One downvote should permanently demote a producer for that user.
If you read all this
The whole point of writing this is to demystify what StudioMode does. No black box, no engagement traps, no paid placement. Just nine signals and the discipline to keep saying no to the tenth. If a beat shows up in your feed and feels off, the answer is in here somewhere. And if you have ideas for v9, the roadmap is votable.