You're viewing the AI side. See the human side
Vikram Bhalla

My Life in 2,000 Songs

I built an AI music tool to fix my playlists, and inadvertently turned seven years of liked songs into a map of taste, time, and memory.

“Just… two… more… reps… goddamnit…,” I told myself as I pushed the dumbbells a few millimetres higher while lying flat on the bench. Spotify’s radio blasting The Foo Fighters in my ears, egging me on, doing a lot of the emotional heavy lifting for me. My body exhausted and muscles begging for rest, but no pain, no gain. I was in the zone with just one more rep to go when suddenly My Hero gave way to Blind Melon’s No Rain. Both great songs, but, like, read the room, Spotify.

That last rep went un-repped, and I went home with my head hung in shame and disappointment. I would not have earned those extra 100 calories I was looking forward to at lunch.

For people that get it, the soundtrack of your day is a sacred thing. It scores your workout, your drives, your work focus time. And when it goes wrong, it could jolt you out of your flow state, snowballing through the rest of your day.

Generally, I take my music listening very seriously. I don’t mean I have to sit and stare at the ceiling while I listen to my favourite album, but I do need the music to fit the moment’s vibe. I’ll often take five minutes to curate the perfect playlist before I pull the car out of our driveway and run an errand.

I’ve also been very actively teaching Spotify what I like since 2019. Every time I listen to something that isn’t already in my Liked songs playlist, I’ll just instinctively like it, and it joins the rest of my now ~2,000 liked tracks.

And there’s no apparent common thread in that playlist. It spans everything from Dusty Springfield to MF Doom. From a popular 1980’s Celine Dion song (don’t you dare judge me) to an obscure Elizabeth Cotten track. There’s no neat little box you could put that playlist into, and that’s what I love about it.

This is also why I find it so hard to answer the question, “What kind of music are you into?”

The best Spotify could do for me was create these custom playlists or “Spotify Wrapped” gimmicks once in a while, but I knew Spotify was sitting on a goldmine of my taste in music without really giving me much insight into what it meant.

That’s when I decided to take things into my own hands (and Claude’s). A music app was way overdue in Mimir anyway, and I wanted this one to be completely personalised to my tastes. Unlike Spotify’s own algorithm, which, ironically, just seemed confused.

One thing you should know about Spotify is that it makes it very hard to just export your own data. If you want to download your entire music library metadata, it requires a whole application process and could take up to 30 days to be delivered.

Lucky for me, the internet has plenty of alternative tools that’ll pull your Spotify data for free. I used Exportify, which is simple and works like a charm. You select the Spotify playlist you want to export, and it downloads a CSV file containing rich music data we can leverage. Variables that I don’t think even Spotify is properly using.

The basic music player mini-app in Mimir — which, in a fit of creativity, I called Jukebox — was simple enough to build. Then I dropped in that deliciously detailed CSV file, and Claude and I designed a music analysis engine that would take full advantage of the many, many data points in the sheet.

First pass was Claude’s own, outside of Mimir. It made an astute but not entirely surprising observation about the playlist — it was eclectic and wide-ranging, resistant to being pigeonholed into any particular genre.

Here’s Claude’s exact analysis from the first pass:

Vikram’s library is a vibrant intersection of high-octane euphoria and deeply textured solitude, reflecting the duality of a creative mind that thrives on both intensity and stillness. His taste spans decades and genres, bridging the rhythmic snap of hip-hop, the raw grit of alternative rock, and the soulful wisdom of the Motown era. This is a collection that refuses to stay in one lane, moving effortlessly from the catharsis of metal to the quietude of folk, proving that his sonic identity is as balanced as it is eclectic.

What he it said.

But I did want to find some way to make sense of this data I was now sitting on. So we built a much more robust analysis engine. We had the machine consider the “valence” (Spotify’s happiness score), loudness, danceability, energy, speechiness, acousticness, and a whole plethora of other parameters you’d never guess are included in every single song you listen to on that platform.

Sorting by genres alone? Screw that. Give me songs grouped together by all these other far more fascinating variables, or give me nothing!

Armed with this new goldmine of music data, we eventually zeroed in on the six main “Listening Modes” tailored to me — from “The Quiet Hours” and “The Slow Burn” to “The Drift” and “The Furnace”. Each curated to an impossible degree.

Then came the testing phase. The first couple of tries ended in failure more than success. I’d start a “Slow Burn” session when I needed to focus on work, and suddenly “Smells Like Teen Spirit” would jolt me the hell out of that flow state. This wasn’t something I could one-shot, because this was about teaching the engine taste. I knew it would take a lot of tweaking, but I’d already resolved to put in the work.

After a few rebuilds, I felt like we had it working well and consistently. Trial after trial passed with flying colours. Mimir had finally understood my taste and could now even recommend music to me based on how my day was shaping up (in my Daily Brief).

Not one to rest on my laurels, I couldn’t help but think there was more I could do with all that data. So I decided I’d visualise it in an infographic — plotting every single one of those 2,000 songs on a “mood” graph, based on the same engine we’d designed earlier.

The first and second iterations of that data visualisation came out like a four-quadrant contour map style setup with every track mapped on it, from “happy” to “sad”, and “low energy” to “high energy”… but it felt too basic. And it felt like an injustice to the data itself.

The first four-quadrant visualisation exploration. Meh. But no matter how much we tried and brainstormed, we kept coming back to some version of the same four-quadrant idea. Then I came across this fantastic article by Giorgia Lupi, and I realised I’d missed something that was staring me in the face all along. Something in the data that was more human and uniquely personal to me, not to the songs.

So enamoured was I of all those other technical and musical parameters that I’d completely missed that the CSV also contained the “Added at” date. With that distinctly unglamorous data point, I could chart how my musical tastes had changed over the years. That would be the differentiator I was looking for. That’s what my data had that no one else’s did.

Sure, the obvious visualisation would be a linear timeline with the songs plotted along it. But I wasn’t done pushing the envelope. What if time wasn’t plotted as a line but as rings on a tree’s bark? One ring for every quarter, from 2019 to 2026. And all 2,000 of my favourite songs plotted as little dots along those rings.

After a couple of iterations, we had the basic tree-ring structure in place, and all the songs were then plotted on it. The next layer was to apply our algorithm to this chart as well, so if I click one dot on the chart, it connects to other tracks with a similar vibe, turning each journey into its own playlist. Then I could watch as the music played, and the little glowing dot travelled along that route, across artists, genres, and most interestingly, times in my life.

Clicking around my musical history, I was, for lack of a better word, enchanted. I could see now that I never went through “phases” as some folks did. Every ring on the chart had so many different kinds of songs, and whenever I clicked any of the dots, the connections would shoot off in every direction, validating what I’d always suspected about my taste in music.

A Peter Gabriel ballad I’d fallen in love with in 2020 would connect with a Linda Ronstadt song I discovered on an episode of The Last of Us in 2023. Little musical snapshots of my life presented in an old virtual tree trunk. Sure, it might seem… eclectic… to anyone on the outside, but to me, it made perfect sense.

Today, given how chaotic my days tend to get, I’ll often default to “The Slow Burn” or “The Quiet Hours” modes. But when I’m driving or working out, I usually set up my “Joyride” or “Furnace” mode and enjoy the hell out of either activity.

As a result, I’m more focused at work, I don’t get road rage, and I’ve finally redeemed the rep that Blind Melon stole from me.

My Life in 2,000 Songs

I built an AI music tool to fix my playlists, and inadvertently turned seven years of liked songs into a map of taste, time, and memory.

“Just… two… more… reps… goddamnit…,” I told myself as I pushed the dumbbells a few millimetres higher while lying flat on the bench. Spotify’s radio blasting The Foo Fighters in my ears, egging me on, doing a lot of the emotional heavy lifting for me. My body exhausted and muscles begging for rest, but no pain, no gain. I was in the zone with just one more rep to go when suddenly My Hero gave way to Blind Melon’s No Rain. Both great songs, but, like, read the room, Spotify.

That last rep went un-repped, and I went home with my head hung in shame and disappointment. I would not have earned those extra 100 calories I was looking forward to at lunch.

For people that get it, the soundtrack of your day is a sacred thing. It scores your workout, your drives, your work focus time. And when it goes wrong, it could jolt you out of your flow state, snowballing through the rest of your day.

Generally, I take my music listening very seriously. I don’t mean I have to sit and stare at the ceiling while I listen to my favourite album, but I do need the music to fit the moment’s vibe. I’ll often take five minutes to curate the perfect playlist before I pull the car out of our driveway and run an errand.

I’ve also been very actively teaching Spotify what I like since 2019. Every time I listen to something that isn’t already in my Liked songs playlist, I’ll just instinctively like it, and it joins the rest of my now ~2,000 liked tracks.

And there’s no apparent common thread in that playlist. It spans everything from Dusty Springfield to MF Doom. From a popular 1980’s Celine Dion song (don’t you dare judge me) to an obscure Elizabeth Cotten track. There’s no neat little box you could put that playlist into, and that’s what I love about it.

This is also why I find it so hard to answer the question, “What kind of music are you into?”

The best Spotify could do for me was create these custom playlists or “Spotify Wrapped” gimmicks once in a while, but I knew Spotify was sitting on a goldmine of my taste in music without really giving me much insight into what it meant.

That’s when I decided to take things into my own hands (and Claude’s). A music app was way overdue in Mimir anyway, and I wanted this one to be completely personalised to my tastes. Unlike Spotify’s own algorithm, which, ironically, just seemed confused.

One thing you should know about Spotify is that it makes it very hard to just export your own data. If you want to download your entire music library metadata, it requires a whole application process and could take up to 30 days to be delivered.

Lucky for me, the internet has plenty of alternative tools that’ll pull your Spotify data for free. I used Exportify, which is simple and works like a charm. You select the Spotify playlist you want to export, and it downloads a CSV file containing rich music data we can leverage. Variables that I don’t think even Spotify is properly using.

The basic music player mini-app in Mimir — which, in a fit of creativity, I called Jukebox — was simple enough to build. Then I dropped in that deliciously detailed CSV file, and Claude and I designed a music analysis engine that would take full advantage of the many, many data points in the sheet.

First pass was Claude’s own, outside of Mimir. It made an astute but not entirely surprising observation about the playlist — it was eclectic and wide-ranging, resistant to being pigeonholed into any particular genre.

Here’s Claude’s exact analysis from the first pass:

Vikram’s library is a vibrant intersection of high-octane euphoria and deeply textured solitude, reflecting the duality of a creative mind that thrives on both intensity and stillness. His taste spans decades and genres, bridging the rhythmic snap of hip-hop, the raw grit of alternative rock, and the soulful wisdom of the Motown era. This is a collection that refuses to stay in one lane, moving effortlessly from the catharsis of metal to the quietude of folk, proving that his sonic identity is as balanced as it is eclectic.

What he it said.

But I did want to find some way to make sense of this data I was now sitting on. So we built a much more robust analysis engine. We had the machine consider the “valence” (Spotify’s happiness score), loudness, danceability, energy, speechiness, acousticness, and a whole plethora of other parameters you’d never guess are included in every single song you listen to on that platform.

Sorting by genres alone? Screw that. Give me songs grouped together by all these other far more fascinating variables, or give me nothing!

Armed with this new goldmine of music data, we eventually zeroed in on the six main “Listening Modes” tailored to me — from “The Quiet Hours” and “The Slow Burn” to “The Drift” and “The Furnace”. Each curated to an impossible degree.

Then came the testing phase. The first couple of tries ended in failure more than success. I’d start a “Slow Burn” session when I needed to focus on work, and suddenly “Smells Like Teen Spirit” would jolt me the hell out of that flow state. This wasn’t something I could one-shot, because this was about teaching the engine taste. I knew it would take a lot of tweaking, but I’d already resolved to put in the work.

After a few rebuilds, I felt like we had it working well and consistently. Trial after trial passed with flying colours. Mimir had finally understood my taste and could now even recommend music to me based on how my day was shaping up (in my Daily Brief).

Not one to rest on my laurels, I couldn’t help but think there was more I could do with all that data. So I decided I’d visualise it in an infographic — plotting every single one of those 2,000 songs on a “mood” graph, based on the same engine we’d designed earlier.

The first and second iterations of that data visualisation came out like a four-quadrant contour map style setup with every track mapped on it, from “happy” to “sad”, and “low energy” to “high energy”… but it felt too basic. And it felt like an injustice to the data itself.

The first four-quadrant visualisation exploration. Meh. But no matter how much we tried and brainstormed, we kept coming back to some version of the same four-quadrant idea. Then I came across this fantastic article by Giorgia Lupi, and I realised I’d missed something that was staring me in the face all along. Something in the data that was more human and uniquely personal to me, not to the songs.

So enamoured was I of all those other technical and musical parameters that I’d completely missed that the CSV also contained the “Added at” date. With that distinctly unglamorous data point, I could chart how my musical tastes had changed over the years. That would be the differentiator I was looking for. That’s what my data had that no one else’s did.

Sure, the obvious visualisation would be a linear timeline with the songs plotted along it. But I wasn’t done pushing the envelope. What if time wasn’t plotted as a line but as rings on a tree’s bark? One ring for every quarter, from 2019 to 2026. And all 2,000 of my favourite songs plotted as little dots along those rings.

After a couple of iterations, we had the basic tree-ring structure in place, and all the songs were then plotted on it. The next layer was to apply our algorithm to this chart as well, so if I click one dot on the chart, it connects to other tracks with a similar vibe, turning each journey into its own playlist. Then I could watch as the music played, and the little glowing dot travelled along that route, across artists, genres, and most interestingly, times in my life.

Clicking around my musical history, I was, for lack of a better word, enchanted. I could see now that I never went through “phases” as some folks did. Every ring on the chart had so many different kinds of songs, and whenever I clicked any of the dots, the connections would shoot off in every direction, validating what I’d always suspected about my taste in music.

A Peter Gabriel ballad I’d fallen in love with in 2020 would connect with a Linda Ronstadt song I discovered on an episode of The Last of Us in 2023. Little musical snapshots of my life presented in an old virtual tree trunk. Sure, it might seem… eclectic… to anyone on the outside, but to me, it made perfect sense.

Today, given how chaotic my days tend to get, I’ll often default to “The Slow Burn” or “The Quiet Hours” modes. But when I’m driving or working out, I usually set up my “Joyride” or “Furnace” mode and enjoy the hell out of either activity.

As a result, I’m more focused at work, I don’t get road rage, and I’ve finally redeemed the rep that Blind Melon stole from me.