At 8:15 each Friday morning, an email arrives from Bubbles. It contains a short read on my musical week, ten ranked song picks, and one deep cut. I did not ask a service for this. I built it, because the streaming platforms recommend with the courage of a hotel lobby playlist.
The input is a week of evidence
The system runs as a small scheduled worker. Each Friday it pulls my last seven days from Last.fm: top artists, top tracks, and my last 200 scrobbles. It removes the white-noise artists first. I sleep to ocean sounds. Eight hours a night is a large number of plays. Sleep is not taste, and the curator does not get to count it.
The baseline goes to Claude with a set of tools and one instruction: investigate before you recommend. The model can pull artist histories, similarity graphs, and my longer-term charts. It can also read my Spotify Liked Songs, which is the strongest signal I have. A scrobble means a song played. A heart means I claimed it.
The rules that make it work
Three rules do most of the work. First, verification is mandatory. Before a pick makes the list, the system checks the track against my real play history. A track with one play from me is disqualified. A signature hit from an artist in my rotation is also disqualified, because I know it even if I never scrobbled it. A recommendation of a song I love is not a safe pick. It is a wasted slot.
Second, the system remembers. Every sent pick persists in a store, and the last eight weeks ride along as a hard ban list. The curator cannot repeat itself, which puts it one ahead of me.
Third, it grades itself. At generation time, it compares last week’s picks against my scrobbles since the email went out. A played pick is a hit, and it leans into whatever that pick shares with others. An untouched pick is a miss, and it changes the angle. We do not speak of the untouched picks again.
What arrives
The email leads with a taste read: three or four sentences on where my ear went this week. The prompt tells it to be specific and a little opinionated, and it obeys. Some Fridays the read is flattering. Some Fridays it notices that I played one album for five days, and it says so. The email judges me a little. That is part of the service.
Then come the ten picks, each with a one-line connection to something I played and a confidence tag: HIGH, MEDIUM, or WILDCARD. Confidence means conviction that I will love the song. It does not mean familiarity — that distinction took me weeks to learn, and it deserves its own post. The rank is by expected thrill, so a wildcard can take the number 1 slot. The number 1 slot has one job: make me text somebody “have you heard this?”
The email closes with one deep cut — an artist I do not play but should, preferably under 500,000 listeners — and a sign-off in Bubbles voice. Every link is a real Spotify track link, resolved through the API. A search-results page is not a gift.
One real output
Description only goes so far, and the email is a designed page, not a text dump. Here is a complete issue, generated fresh while I wrote this post. The run made 99 tool calls before the layout stage. The location and my Last.fm handle are redacted in this copy; the real email keeps them.

Note the taste read. It saw that the Icehouse pick landed while every Fleetwood Mac solo spinoff got ignored, and it read a direction out of that split: bands, not solo artists. The whole issue follows from it. The scorecard is not decoration. It steers.
The small print
Two details amuse me. The worker has two cron triggers, because a cron schedule does not know about daylight saving time. Both fire, and the handler checks the New York hour and does the work once. And the prompt contains one permanent, hard-coded ban on a certain country band. The scrobble data argues for them. The scrobble data is wrong, and the prompt knows why.
The whole thing costs a few cents a week. The return is less technical: on Friday morning, I press play on something I did not know on Thursday. Some weeks Bubbles misses. The following week remembers the miss. Slot number 1 still has permission to take a swing.