<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="https://elezea.com/wp-content/themes/elz_2023/styles/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:slash="http://purl.org/rss/1.0/modules/slash/" >
  <channel>
    <title>Elezea by Rian van der Merwe - RSS Feed</title>
    <atom:link href="https://elezea.com/2025/12/vibe-coding-for-pms/feed/" rel="self" type="application/rss+xml" />
    <link>https://elezea.com/2025/12/vibe-coding-for-pms/</link>
    <description>A personal blog about product, technology, and interesting things that are worth sharing.</description>
    <lastBuildDate>Thu, 02 Apr 2026 17:43:52 +0000</lastBuildDate>
    <language></language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <generator>https://wordpress.org/?v=6.9.4</generator>
          <item>
        <title>Building a music discovery app (and what I learned about Product)</title>
        <link>https://elezea.com/2025/12/vibe-coding-for-pms/</link>
        <pubDate>Fri, 19 Dec 2025 00:25:38 +0000</pubDate>
        <dc:creator>Rian van der Merwe</dc:creator>
        <guid isPermaLink="false">https://elezea.com/?p=10701</guid>
        <description>
          <![CDATA[How a side project combining Last.fm, AI, and Cloudflare Workers helped me gain technical depth and sharpen product thinking.]]>
        </description>
        <content:encoded>
          <![CDATA[<p>I miss liner notes. In the age of infinite streaming and algorithmic playlists I find myself longing for the days when you’d flip open a CD case and actually <em>read</em> about the music you were listening to. Who produced this? What’s the story behind the album? Why does this track feel different from everything else they’ve made?</p>
<p>Spotify and Apple Music are great at giving you <em>more</em> music. They&#8217;re less good at helping you understand <a href="https://www.theverge.com/column/815744/music-recommendation-algorithms">why you might love something</a>, or what to explore next. So I built my own solution—and then rebuilt it twice.</p>
<h2 id="theproblemiwastryingtosolve">The problem I was trying to solve</h2>
<p>My relationship with Last.fm goes back to 2007. In case you’re not familiar, <a href="https://www.last.fm/">Last.fm</a> is a service that “scrobbles” (tracks) everything you listen to, building a comprehensive history of your musical life. It’s become a wonderful archive of my taste evolution over nearly two decades.</p>
<p>Last.fm is great at telling you <em>what</em> you listened to. It’s less useful for helping you understand <em>why</em> you might love something, or <em>what else</em> you should explore. Spotify and Apple Music’s algorithmic playlists are fine, but they often feel like they’re <a href="https://amzn.to/4ji9qEx">optimizing for engagement</a> rather than genuine discovery.</p>
<p>I wanted a tool that would:</p>
<p><span id="more-10701"></span></p>
<ul>
<li>Show me context about the artists and albums in my listening history</li>
<li>Help me discover music through similarity and connection, not just popularity metrics</li>
<li>Give me that “liner notes” depth I was craving</li>
<li>Work with my existing Last.fm data (18 years of listening history is a lot to throw away)</li>
</ul>
<p>So I started building, first by copy-pasting from GPT–4 (the olden days!), and most recently with <a href="https://antigravity.google/">Antigravity</a>&nbsp;+ Claude Opus 4.5 (we’ve come a long way since 2023). Here’s where it all stands today…</p>
<h2 id="listentomore:threeiterationsandcounting">Listen To More: three iterations and counting</h2>
<p><strong><a href="https://listentomore.com">Listen To More</a></strong> is the core project—a music discovery platform that combines real-time listening data with AI-powered insights.</p>
<p>The first version was simple: a personal dashboard that pulled my Last.fm data and displayed it nicely. Functional, but limited. The second version added some AI summaries using OpenAI’s API. Better, but still rough around the edges.</p>
<p>The current version—iteration three—is a complete rebuild focused on speed and multi-user support. What started as “a thing I made for myself” is now something anyone can use. Sign in with your Last.fm account, and you get:</p>
<ul>
<li><strong>Rich album and artist pages</strong> with AI-generated summaries, complete with source citations (so you know the AI isn’t just making things up)</li>
<li><strong>Your personal stats</strong> showing recent listening activity, top artists and albums over different time periods.</li>
<li><strong>Weekly insights</strong> powered by AI that analyze your 7-day listening patterns and suggest albums you might love</li>
<li><strong>Cross-platform streaming links</strong> for every album—Spotify, Apple Music, and more</li>
<li><strong>A Discord bot</strong> so you can share music discoveries with friends</li>
</ul>
<p><img decoding="async" src="https://file.elezea.com/ltmore-top2.png" style="display: block; margin-left: auto; margin-right: auto" title="" alt="" width="" border="“0""></p>
<p>The tech stack is <a href="https://hono.dev/">Hono</a> on <a href="https://workers.cloudflare.com/">Cloudflare Workers</a>, with D1 (SQLite) for the database and KV for caching. The whole thing is server-side rendered with vanilla JavaScript for progressive enhancement. Pages load in about 300ms, then AI summaries stream in asynchronously.</p>
<p>I chose this stack partly because <a href="/resume/">I work at Cloudflare</a> and wanted to understand our developer platform better. More on that later.</p>
<h2 id="extendingtheecosystemwithmcpservers">Extending the ecosystem with MCP servers</h2>
<p><strong>MCP</strong> stands for Model Context Protocol. In plain terms, it’s a standard that lets AI assistants (like Claude) connect to external data sources and tools. Think of it as giving an AI the ability to actually <em>use personalized data</em> rather than just answer questions based on pre-training.</p>
<p>I built two MCP servers to extend my music discovery ecosystem:</p>
<h3 id="last.fmmcpserver">Last.fm MCP Server</h3>
<p>Available at <a href="https://lastfm-mcp.com">lastfm-mcp.com</a>, this server lets AI assistants access your Last.fm listening data. Once connected, you can have conversations like:</p>
<ul>
<li>“When did I start listening to Led Zeppelin?”</li>
<li>“What was I obsessed with in summer 2023?”</li>
<li>“Show me how my music taste has evolved over the years”</li>
</ul>
<p>The AI can pull your actual scrobble data, analyze trends, and give you personalized insights. It supports temporal queries (looking at specific time periods), similar artists discovery, and comprehensive listening statistics.</p>
<h3 id="discogsmcpserver">Discogs MCP Server</h3>
<p><a href="https://github.com/rianvdm/discogs-mcp">This one</a> connects to <a href="https://www.discogs.com">Discogs</a>—the massive music database and marketplace that’s especially popular with vinyl collectors. If you have a Discogs collection, the MCP server lets AI assistants:</p>
<ul>
<li>Search your collection with intelligent mood mapping (“find something mellow for a Sunday evening”)</li>
<li>Get context-aware recommendations based on what you own</li>
<li>Provide collection analytics and insights</li>
</ul>
<p><img decoding="async" src="https://file.elezea.com/lastfm-mcp-example.png" style="display: block; margin-left: auto; margin-right: auto" title="" alt="" width="" border="“0""></p>
<p>Both servers run on Cloudflare Workers and use OAuth for secure authentication. They’re open source if you want to poke around or deploy your own.</p>
<h2 id="whatilearned">What I learned</h2>
<p>I’m a Product Manager, not an engineer. But I’ve found that having more technical depth broadens the scope of things I am able to contextualize—and makes me more confident in my interactions with engineers. Here’s what building these projects reinforced for me:</p>
<ul>
<li><strong>Side projects are a low-stakes learning environment.</strong> When you’re building for yourself, there’s no pressure to ship by a deadline or meet someone else’s requirements. You can experiment, break things, and iterate freely. I tried approaches that would have been too risky to propose in a work context—some of them broke the site spectacularly, others worked beautifully.</li>
<li><strong>There’s no substitute for using your own product.</strong> I use these tools every day. That constant exposure surfaces issues and opportunities that you’d never catch in a quarterly review or user interview. The feature prioritization becomes obvious when you’re feeling your own friction.</li>
<li><strong>Building with your company’s tools is invaluable.</strong> I now have deep, practical knowledge of Cloudflare Workers, D1, KV, and the rest of our developer platform. When I’m talking to customers or evaluating feature requests, I’m drawing on real experience, not just documentation. I can empathize with the developer experience because I’ve lived it.</li>
<li><strong>The fun matters.</strong> I keep coming back to these projects because I genuinely enjoy working on them. The satisfaction of solving a problem you personally care about is different from the satisfaction of shipping something at work. Both are valuable, but the former is what sustains a side project through the inevitable rough patches.</li>
</ul>
<h2 id="whatsnext">What’s next</h2>
<p>I have a list of features I’d love to add—better recommendations, more sophisticated listening pattern analysis, maybe even integration with other music services. But I’m also learning to pace myself. These projects aren’t going anywhere, and part of the joy is the slow, steady improvement over time.</p>
<p>If you’re curious, you can check them out here:</p>
<ul>
<li><strong><a href="https://listentomore.com">listentomore.com</a></strong> — The main music discovery platform</li>
<li><strong><a href="https://lastfm-mcp.com">lastfm-mcp.com</a></strong> — Connect AI assistants to your Last.fm data</li>
<li><strong><a href="https://github.com/rianvdm/discogs-mcp">Discogs MCP Server</a></strong> — Connect AI assistants to your Discogs collection</li>
</ul>
<p>And if you’re a PM thinking about starting a technical side project: do it. Pick something you personally care about, use tools you want to learn, and give yourself permission to build slowly. The lessons transfer in ways you won’t expect.</p>
          <br>
          <br>
          <hr>
          Thanks for still believing in RSS! Get in touch <a href="https://elezea.com/contact">here</a> if you'd like.]]>
        </content:encoded>
                      </item>
      </channel>
</rss>