Podcast app journey 2

We are getting somewhere

Back in November of 2025 I took an overnight flight to Bengaluru, India for a work trip. It was an amazing experience but most importantly during the late hours of the night, in the dimly lit cabin of the beautiful Boing 777, I got my colour scheme inspiration.

The dreamy deep purple colour of the dark cabin combined with the coral light in the toilets of all places looked perfect.

The theme for AudioWeave started taking shape. The aesthetic of an overnight flight really clicked with me, the podcast app is taking you on a journey in a silent cabin with only the droning noise of the engines coming through your noise cancelling headphones. A journey of sorts through the mundane commuting or chores around your house.

Being a sucker for the aesthetic, I should have spent weeks in Figma. But I’m a dev, I have an IDE waiting for the next keystroke. I jumped straight into Jetpack Compose. Since I already had the layout concepts from my failed Flutter experiments, translating those into Kotlin felt surprisingly fluid.

I wanted the UI to feel like that cabin: dark, focused, and out of your way.

The colour palette, excuse the use of AI but i’m really rubbish at design

So with the screens ready I had to think long and hard about bits that I missed from other podcast players and define all the areas that I wanted the app to be different. The core values if you like:

Manifest

  • Privacy Focused: No trackers, no data-brokering. It’s a tool, not a spy.
  • True Offline-First: Thumbnails and metadata shouldn’t vanish just because you’re in a tunnel. If the app has seen it once, it should remember it.
  • The “Anti-Lock-in” Policy: Easy OPML imports and exports. Your data is yours; you’re just using my interface to listen to it.
  • Anti-Clutter: Auto-hiding trailers and promotional “spam” that clogs up subscription feeds.
  • The Digital Archivist: The ability to pull MP3s out of the app’s sandbox and into your own storage for posterity.
  • Clip & Share: Turning a long-form medium into shareable, bite-sized insights.

The technical implementation

At its heart, the app architecture is fairly standard. It’s backed by a Room (SQLite) database that acts as the source of truth for your subscriptions and that all-important where was I? episode progress. I went with a classic Repository pattern, it doesn’t care if it’s parsing a badly formatted RSS XML (and believe me I found a lot of them during this phase) feed from the iTunes API or fetching a cached episode from the local disk. It just works.

On paper, Google’s Media3 library is the unified future of Android playback. In reality, it’s a sprawling beast that reminds you exactly why audio is hard. Integrating the MediaSession so that your play button actually works, handling audio focus so a rogue notification doesn’t deafen you, and ensuring the background service doesn’t get nuked by Android’s aggressive power management… it’s a lot. There were many nights where I sat in my bedroom office staring at the screen, wondering why a play button was the most complex thing I’d ever built.

But once it clicks? It’s satisfying. There’s something deeply rewarding about seeing your custom app working, and the biggest reward was when I first used the app and trusted it enough to download a full season of my favourite podcast to listen on a plane. I don’t do movies on flights myself, so I took a gamble with my own coding – and it worked. It has since accompanied me many times whilst commuting to the office through the crap network stability around Waterloo Station or the blank spots in the “beautiful” journey through the Central Line.

Just look at how far we’ve travelled…