It's been months of work, and now it is LIVE! 👇
Go try out the Podhome Podcast Player app. It's great for discovering new shows and have a great listening experience.
✨ A super-modern podcast experience is here.
🎧 Podhome App is now live on iOS & Android:
✅ Discover new podcasts
✅ Sleek dark & light modes
✅ Smooth playback, even on the go
✅ Chapters, Transcripts, Live Listening, People, Clips, Show Recommendations and more
🚀 Built for podcast fans who want more than just another player.
📲 Get it on Apple: https://t.co/7MB5BF0D1F
📲 Get it on Android: https://t.co/JFMpUOtFot
👉 Read more: https://t.co/Kxo29ALOTG
An update on my podcast app building adventures:
- My backend is zooming along. I'm always up-to-date with podping messages and the rest I pull. This is running solid, and recovers well when it crashes or when I deploy a new version
- I used Azure AI Search to create search indexes for podcasts, episodes and people. I have been tweaking these in the last few days and exposing them through APIs that I will consume in my app. Seems to work well so far, but let's see
- I have been trying to get a basic app running and that succeeded today! after a lot of trying, I finally switched my workflow to JetBrains Rider (which is very fast) and .NET MAUI Blazor Hybrid. This means that I can create my UI with Blazor (HJTML, CSS, JavaScript), which I'm very familiar with. Best of all, this work solidly on mobile so far and does not lag in performance. I still need to do a lot more testing to see if this delivers what I need, but this seems to be the right direction.
More colorful updates will follow. Apologies for the radio silence.
@jbogard I use it for @podhome, just because I know my way around it (after using it for many years). Finding details however, is nearly impossible. But it works for what I'm doing right now
Rolling out to our Podhome servers right now: More Analytics improvements.
✅ See episode performance at a glance
✅ Download analytics data as CSV
✅ New chart that shows device category (like Apple iPhone)
Power you podcast journey with https://t.co/HuIqZvAu9X
Nice upgrade to our #podcast analytics, AND the option to re-use episodes in other shows and A/B test their performance.
Now back to building my podcast app :-)
We just released 2 nice upgrades:
1️⃣ You can now see the performance of your episodes over their first 24hrs and 7, 30, 90 and 180 days
2️⃣ You can duplicate episodes to other shows you have access to. We copy everything related to the episode, like transcripts, clips, people, chapters and more
2️⃣🅰️ In analytics, you can see how the duplicated episodes do across your podcasts
Go check out your analytics now!
Not using the most modern #podcast #hosting platform yet? Sign up for a 30-day free trial at https://t.co/R0RGEgrmaQ
2,5 weeks into building the backend for my podcast app. I’m not working on it fulltime as I’m working on @Podhomefm for our awesome customers.
I now run two databases, a writable one and a read-only replica. This works sooo much better for performance.
I run my podping listener in one Function App (Linux, B2 size), and the feed puller in another Function App (Linux, B3 series), because ai found that running it all in one Function app didn’t fit memory-wise. These functions pull RSS feeds into memory to parse them, which is heavy.
I’m monitoring the behavior to see if I can scale anything back and fix errors when I run into them.
One example is that a feed contained items (episodes) with a duration of -1 seconds. I parse this into a C# TimeSpan, which works, but fails when I save it to the database. Just stuff like that.
This backend serves two purposes:
1️⃣ discovery: show users podcasts and episodes they might be interested in
2️⃣ notifications: notify users when a new episode is published for a podcast they are interested in (I still need to build the notification mechanism)
Next is more for discovery, before I start with the client app. I want to create an API that I can use to search for podcasts, episodes, people and topics. Ideally this works with my own data, and the Podcast Index API as augmentation (if I don’t have the results myself, so that users can always find a podcast)
BONUS: currently I save every (unique-ish) person that I find in a feed. This will be the basis for a Person API that I can also use for @Podhomefm to let podcasters search and select people to add to their show and episodes. When this works well, I’ll open this API up for open use.
EP 134 Death & Friends
Audio in bio
This week, I want to catch up with you all and share some deeply personal experiences. I've been going through a tough time emotionally, dealing with the death of my father, Kevin McCormick, who passed away on August 1st. It's been a rollercoaster of emotions, and I want to share this chapter of my life with you. In this episode, I also discuss a full-circle moment where I prayed with my dad, a prayer he used to say with me when I was a child. It was a deeply moving experience that I will cherish forever.
Later in the episode, I share a conversation I had with Kyrin Down from the Mere Mortals podcast. Kyrin also lost his mother this summer, and we had the chance to meet up at a convention called Vee Con in California. It was a unique experience to connect with someone who was going through a similar loss.
Thank you for listening to this deeply personal episode. I hope it resonates with you and offers some comfort or insight if you're going through a tough time. Remember, it's important to keep your heart open and look for opportunities to connect with others, even in difficult times.
More work on the backend for my podcast app today (after a lot of backend work for @podhome).
I now have the Podping worker running. This uses https://t.co/ZZAEgzPwBO to retrieve "Podping" blocks from the Hive blockchain and process them for updates.
Each Podping contains one or more Uris to podcast RSS feeds that have been updated. I first thought to take this as truth and use Podpings to let users know that something in the feed has updated. But that is not good enough. I want to let users know what specifically has updated. New episode? A Live episode started? Which one? So for every podping I run my RSS parser to go through the RSS feed, update it in the database and see what is new. That takes a lot of processing power as some podpings contain many Uris to RSS feeds (for instance when Buzzsprout fires a batch of new episodes).
I first tried to use Azure Durable Functions to make this scale, like I do with the pull updates for RSS feeds. But that was not the right choice here. Because I want to Podping listener to run always. And Durable Functions are meant to have an ending. If not, they are rehydrated and run again, which results in duplicate instances running.
So I ended up with a TimerTriggered Function that, every 5 minutes, checks if my Podping listener is still running. If not, it starts it again with the next Hive blockId that I need to process.
When podpings are found, I create an Azure Service Bus Queue message for each block to update, containing the Uris to fetch and parse. Each Queue message triggers a QueueTriggered Function that does the parsing. This can fan out to many Functions running in parallel, and seems to fit very well with my €45 / month Linux App Service Plan.
I've been running this for most of the day now, and it seems to be able to keep up. Although I see some lags where it lags a couple of minutes when it needs to process many feeds at once. The bottleneck is the database, which is clear to me. I'll let this run this weekend, so that Azure SQL Database can figure out which queries can benefit from which indexes, and see how the performance profile is after that.
Exciting stuff. Next is to figure out what the client (app) architecture is going to be.