Reflecting on a Year of Building Petrichor

kushalpandya1 pts1 comments

doublslash // Reflecting on a year of building Petrichor

Reflecting on a year of building Petrichor | doublslash

Reflecting on a year of building Petrichor

July 22, 2026

I spent the last year building Petrichor, an offline music player for macOS, the kind of player I would want<br>to use, and the kind that didn’t exist on the platform. It is the only thing I work on during my weekends when I’m<br>sitting at my desk, and I’m proud of what Petrichor has managed to achieve in the past year, while giving me the kind of<br>creative satisfaction that I haven’t had in a long, long time.

On the work front, I was close to being burned out (for reasons I won’t get into), but this project became a comforting<br>space that I’d look forward to returning to. This essay covers the journey of conceiving Petrichor, building it,<br>marketing it, maintaining it, and eventually spawning another engineering endeavor that I didn’t imagine before.

Petrichor

Background

I’ve been a JavaScript engineer working on web frontends for over 13 years, so writing Mac apps wasn’t something I was<br>familiar with. I’ve built desktop apps in C#.NET a couple of times in<br>the past, so building a platform-native desktop app was still something I’d done and enjoyed.

Playing music has almost always been an offline-first experience for me despite having active subscriptions to both<br>Spotify and Apple Music, as my music collection is largely frozen in time and is rarely updated, although it has evolved<br>over the years to have roughly 3k tracks spread across albums, compilations, and languages. So a feature-rich offline<br>music player would be one of my most-used apps.

I’ve also been an active user of Linux besides macOS, where I used Rhythmbox<br>for years, and while it wasn’t perfect, it still came close to becoming my go-to option. When I moved to using a Mac as<br>a part of my job in 2017, I missed such a music player on the platform until I discovered<br>Swinsian, and it felt like a perfect replacement. However, updates became infrequent, and there<br>was a gap of years between version 2.0 and the more recent 3.0 release.

In 2022, I stepped away from writing code in my job and instead started managing an engineering team, and this was also<br>a time when I noticed Swinsian lagging behind, but I didn’t have the kind of time or mental bandwidth to even imagine<br>building an app I was missing.

In early 2025, after managing an engineering team for close to 3 years, I decided to step down and become an<br>individual contributor again at work because the mental exhaustion I was going through had started affecting me<br>personally. Moving to an IC role freed up my calendar; a 5-day work week didn’t feel like a bottomless pit where a<br>weekend was never enough to recover, and instead, I had this new-found energy to be a builder again. As the industry was<br>undergoing a seismic shift due to the emergence of AI, prototyping an idea had also become exponentially faster, and<br>that’s when I decided to use my evenings and weekends to build Petrichor. While naming is hard, coming up with this<br>name was obvious to me. I’ve grown up in India, where the first rain of the season brings a distinct fragrance, and ever<br>since I learnt about the word representing it, I had to use it right away.

Early Days of Prototyping

Unlike my fresh-grad self, who’d build stuff left and right without giving much thought to design and architectural<br>choices, this was the first project I wanted to take seriously, while making use of all of my learnings from the past<br>decade-plus of engineering experience.

It was March 2025 when the idea started to take shape in my head about what kind of music player I was missing on Macs,<br>and the app I would build to use myself, before ever thinking about putting it out there for others to download and use.

I wasn’t too familiar with the basics of building apps for Mac, although I was following the evolution of Swift, and<br>having covered it on my blog years ago, I knew that if I was aiming to have a<br>true Mac experience, Swift would be it, even at the cost of not being able to use it anywhere else (especially Linux).<br>While conceptualizing, I looked at several existing offline music players available on Mac (besides Swinsian) like<br>Foobar2000, Cog, and streaming music player client apps like<br>Spotify, Apple Music, and Tidal to draw some ideas that translate well into an offline player (not necessarily in the<br>first iteration but eventually).

Role of AI

I want to get this out of the way. I recognize how developers are vibing apps and projects using agentic AI these<br>days, and I’m not claiming that Petrichor is entirely “hand-coded”, but calling it vibe-coded wouldn’t be fair. I use<br>Claude/GPT to prototype features and fix bugs, but not a single line goes into main mindlessly. I’ve learnt enough<br>Swift over the past year to know what should be shipped and what shouldn’t be, even if I’m not following the “best<br>practices” of Swift mac app development. With that established, let’s continue with...

petrichor music building year player years

Related Articles