Engineering · April 30, 2026 · 9 min read

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 algorithm has to be honest about what it's optimizing for.

The nine signals

Every candidate beat that lands in front of you was scored against these:

+25
Followed-producer boost
If the beat is from a producer you actively follow, it gets the strongest single push in the system. We bias hard toward "the producers you already trust just dropped something," because that's the strongest signal of "you're going to like this."
+12
Genre / vibe match
We aggregate the genres + vibes from your last ~50 saves and check overlap. Two-tag overlap → +12, one-tag → +6, none → 0. Strong but not overwhelming.
+10
BPM band match
If the beat falls inside ±5 BPM of your most-saved tempo band (computed from a rolling 30-day window), it gets the bonus. We tried tighter (±2) and looser (±10) — ±5 was the sweet spot for "in the pocket without being identical."
+8
Key match (v8)
v8 added Camelot-wheel awareness. If the beat is in the key you most often save, it gets +8. If it's in a Camelot-adjacent key (relative major/minor or one step on the wheel), +4.
+6
Saved-not-played boost
A v8 addition. If you saved a beat but never opened the player on it, that beat's siblings (same producer, same vibe) get a small boost — the assumption being you saved it for later, and we want to nudge you back to it.
+4 → 0
Recency decay
Newer beats get a small bonus that decays exponentially over 30 days. We don't want a 2-year-old beat with a million views to permanently dominate the feed; recency keeps it fresh without ignoring back-catalog gems entirely.
−12
Seen penalty
If you've already opened the player on a beat in the last 30 days, it gets penalized so you don't see it again. Scaled — small penalty for one play, large for repeated plays. Keeps the feed feeling fresh.
−15
Producer diversity guard
If you've already seen 3+ beats from the same producer in this batch of recs, the next one from them gets a heavy penalty. Stops a single prolific producer from monopolizing your feed.
10%
Exploration slot
10% of every batch is intentionally not personalized — it's drawn from popular catalog beats outside your normal lane. The algorithmic equivalent of "look up." This is what stops the feed from collapsing into an echo chamber.

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."

Simplicity is the discipline of saying no. Every signal we don't add is a signal we don't have to tune.

What we don't do (and why)

Plenty of things could go in the algorithm but don't:

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:

  1. 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.
  2. 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.
  3. 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.

Try StudioMode

14-day Pro trial — no card required.

🎧 Open StudioMode
© 2026 StudioMode