Keshav Pillarisetti

Building Pulse — a music player I actually want to use

I have a lot of music downloaded locally. FLAC files, MP3s, stuff I've ripped from CDs, tracks I've grabbed from various places over the years. And for a long time I just accepted that playing it on my phone was kind of a bad experience.

The apps that exist for this either look like they were designed in 2012, charge a subscription for basic features, or just don't handle metadata well. I'd open one and see a sea of "Unknown Artist" entries. Album art would be missing or wrong. The experience was rough enough that I'd often just reach for Spotify instead, even when I had the files locally.

So I built Pulse.

What it is

Pulse is an open source Android music player built entirely in Kotlin. The core idea is simple: play your locally downloaded music, but make it feel like using a proper streaming app. That means album artwork, lyrics, correct artist and track metadata — the full experience, without a subscription.

To pull this off, Pulse fetches open-sourced metadata automatically. Point it at your music folder, and it goes and finds the right artwork and lyrics for each track. If you've got a song that came in with a blank title and no cover, Pulse figures it out and fills it in. The end result feels like Spotify — but it's your files, offline, for free.

Why Kotlin, why Android-only

I chose Kotlin because it's the modern standard for Android development and I wanted to build something that felt native — not a cross-platform wrapper. Native apps handle audio better, integrate more cleanly with system media controls, and just feel right on the platform.

Android-only was a deliberate call, not a limitation I plan to fix later. iOS has strict sandboxing that makes local file access genuinely painful. The kind of music library management I wanted to build works much more naturally on Android, where you have direct access to the filesystem. Building for both platforms would have meant compromising the experience on both.

What building a real Android app taught me

I'd done web development for a while before starting Pulse, and the mental model shift was significant. On the web, you're mostly thinking about layout, state, and network requests. On Android, you're thinking about lifecycles, permissions, background services, and how the OS can kill your process at any moment.

Audio playback in particular is more complex than it looks. You need a foreground service to keep music playing when the app is in the background. You need to handle audio focus — what happens when a notification comes in, or someone calls, or another app wants to play sound. You need to wire up media session controls so the lock screen and earbuds work properly. None of this is hard once you understand it, but there's a lot of it.

It also made me appreciate how much invisible work goes into apps I use every day. The polish in something like Spotify represents years of edge-case handling. Pulse is nowhere near that yet, but building it gave me a much clearer picture of why that polish is hard to achieve.

What's next

The core is working — playback, metadata fetching, artwork, lyrics. What I want to add next is smarter library management: auto-detecting new files, handling duplicates gracefully, and a better search experience across large collections.

It's open source and on GitHub if you want to follow along or contribute.