efrain.fm

efrain.fm

efrain.fm is a personal music discovery interface. You arrive at a chat window, ask for a song by mood, genre, decade, whatever — and get a Spotify embed with my commentary on it.

You get my actual written notes on the song, nothing AI-generated. The collection spans 1930s jazz to contemporary electronic, all personal favorites. Friends and family can get my recommendation whenever they want one.

Reflections
Reflections
Reflections

The rings

The concentric circles rising from the bottom of the screen are referencing a few things at once. A record's grooves seen from above. A broadcast tower sending signal. Radio waves. Orbits. None of these meanings were picked over the others. They all fit, and that felt right for this experience where maybe music is finding you.

The breathing animation runs on a 10-second cycle, like relaxed breathing. Stars rotate in the background on an 18-minute cycle, dimming and brightening as they go. The interface feels alive without being too busy.

Unlocking grooves

The input placeholder reads "Let's find a groove…" referencing a track on a vinyl record. The whole thing is built on words and images that mean more than one thing at the same time. I'm currently building audio messages that play before certain songs, making things even more personal. The rings represent 9 unlockable songs — one from each cluster in my collection. As you discover them, the rings will look different, subtly marking your progress.

But what if they type…

The harder design work wasn't the interface, I got a prototype up in 20 minutes. The challenge was the conversation design. A chat interface can feel magical and free but there are many questions to answer:

  • When do you offer choices, when do you go quiet? 

  • What happens when your input has no matches? 

  • How do you prevent too many misses in a row? 

  • What happens when everything matching has already played? 

These answers shaped the feeling of the experience, maybe even more than the visuals.

The system redirects instead of guessing. Because no match feels better than the wrong match.

The matching system went through two rewrites. The final version uses a weighted trait vocabulary scored locally in JavaScript — because a binary tag system doesn’t capture intensity or contrast. A song can be mostly something, or barely something, and that difference matters. Claude Haiku extracts intent from free text, scores it against the traits, and a minimum threshold keeps weak matches from surfacing. 

Take me to the bridge…

Some connections can't be scored by a model, they're just stored as bridges in code. Kanye samples Gil Scott-Heron, and Gil Scott-Heron samples him back. "Disco Infiltrator" by LCD Soundsystem has a section that sounds unmistakably like "The Great Curve" by Talking Heads. Some Bright Eyes songs sit remarkably at home next to The Cure. These bridges make the automatic responses feel more human, because I put them there and an algorithm never would.

This one was genuinely fun to build — and I'm still building it. The voice messages are next.