<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Uncommon Apps]]></title><description><![CDATA[I write about podcasts, programming, and all aspects of running indie mobile apps.]]></description><link>https://www.uncommonapps.nyc</link><image><url>https://substackcdn.com/image/fetch/$s_!x7jk!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd54d0b0-1c31-49f9-adcf-1f5a9781acee_512x512.png</url><title>Uncommon Apps</title><link>https://www.uncommonapps.nyc</link></image><generator>Substack</generator><lastBuildDate>Sat, 22 Aug 2026 05:45:12 GMT</lastBuildDate><atom:link href="https://www.uncommonapps.nyc/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Dustin Bluck]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[uncommonappsnyc@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[uncommonappsnyc@substack.com]]></itunes:email><itunes:name><![CDATA[Dustin Bluck]]></itunes:name></itunes:owner><itunes:author><![CDATA[Dustin Bluck]]></itunes:author><googleplay:owner><![CDATA[uncommonappsnyc@substack.com]]></googleplay:owner><googleplay:email><![CDATA[uncommonappsnyc@substack.com]]></googleplay:email><googleplay:author><![CDATA[Dustin Bluck]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Podcast Apps: A Framework for Dying Slowly with Dignity]]></title><description><![CDATA[Why I'm making the decisions I'm making for Castro]]></description><link>https://www.uncommonapps.nyc/p/podcast-apps-a-framework-for-dying</link><guid isPermaLink="false">https://www.uncommonapps.nyc/p/podcast-apps-a-framework-for-dying</guid><dc:creator><![CDATA[Dustin Bluck]]></dc:creator><pubDate>Thu, 23 Jul 2026 18:33:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LvZD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LvZD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LvZD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png 424w, https://substackcdn.com/image/fetch/$s_!LvZD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png 848w, https://substackcdn.com/image/fetch/$s_!LvZD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png 1272w, https://substackcdn.com/image/fetch/$s_!LvZD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LvZD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png" width="1456" height="660" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:660,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95543,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.uncommonapps.nyc/i/208196304?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LvZD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png 424w, https://substackcdn.com/image/fetch/$s_!LvZD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png 848w, https://substackcdn.com/image/fetch/$s_!LvZD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png 1272w, https://substackcdn.com/image/fetch/$s_!LvZD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84826033-90b9-4ca8-b151-9ec0047aefc4_1720x780.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">There are lots of confounders in this data but the trend is clear. Chart made with Claude.</figcaption></figure></div><p>Independent podcast apps are not growing as a category. This is not a particular secret, but perhaps you haven&#8217;t seen it stated explicitly. It&#8217;s the sort of thing that has to be inferred, but there&#8217;s plenty of available data<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> if you look for it. While the podcasting sector has seen growth, this has occurred almost entirely on platforms like YouTube<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>, and the independent podcast app userbase has mostly just stood still. </p><p>You might have a theory that there&#8217;s a funnel and growth in podcasts *must* ultimately be good for the apps. Like YouTube and TikTok introduce people to the concept of podcasts via shorter videos, and as certain users become more enthusiastic about a particular creator or the whole concept, they migrate to specialty apps to ensure they never miss an episode. I like this theory. It&#8217;s a good story, but I see very little evidence of this happening. Instead, the apps are largely fighting to retain the same cohort of users who have been using podcast apps since ~2015 while the world moves on. </p><p>I can&#8217;t tell you this with absolute certainty. I have no concrete demographic data on my own <a href="https://castro.fm/">podcast app,</a> let alone anyone else&#8217;s. It&#8217;s a big world, so I&#8217;m sure somewhere out there a 21-year-old just downloaded Castro or Pocket Casts for the first time and thinks RSS feeds are awesome (if you are this person, please email me). But every number I can see indicates the userbase is both static and aging. Every new customer I talk to has used some combination of Apple Podcasts, Overcast, Pocket Casts, or Castro for at least the last 5 years if not the last 10. Some podcast apps are definitely doing better than others, and any given app can win users, but we&#8217;re all crabs trapped in the same bucket. </p><p>One might think that the podcast app incumbents are dinosaurs and an AI-forward podcast app aimed at riding current trends has an opportunity. In reality, no new podcast app seems to be gobbling up any substantial <a href="https://livewire.io/transistor-stats-visualized/">market share</a><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> either. I mean why isn&#8217;t something like <a href="https://www.snipd.com/">Snipd</a> moving up in these app rankings? Why hasn&#8217;t any app released after 2020 gained any traction at all? That bothers me a lot more than any metric on Castro.</p><p>It&#8217;s a nice idea that all the &#8220;major&#8221; players are doing something wrong and there&#8217;s a cohort of users waiting to be unlocked. I sincerely hope someone does it, but it hasn&#8217;t happened yet. Waves of new podcast listeners may exist, but they aren&#8217;t downloading episodes via RSS, no matter how many podcast apps are being vibe-coded.</p><p>This is not a happy story I&#8217;m telling you, not for anyone who loves podcast apps like I do. Perhaps there are healthy businesses that get very few new users but instead gracefully age with the ones they have. Ferrari maybe? Buddy, smartphone apps are not one of those businesses. </p><p>That doesn&#8217;t necessarily mean <strong>the open podcasting ecosystem is doomed</strong><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>, but the apps aren&#8217;t doing well and there&#8217;s no reason to think that&#8217;s going to change. I&#8217;m also not going to write a 2000 word diatribe on how it&#8217;s not a podcast unless there&#8217;s an RSS feed. That&#8217;s not my point. The world changes. I&#8217;m just stating the facts plainly so you have context on how I&#8217;m making decisions at <a href="https://castro.fm">Castro</a>. </p><p>So I wanted to share some thoughts about podcast apps and what they should be building. This applies to Castro, but it&#8217;s not really specific to Castro. It&#8217;s certainly not any kind of roadmap or promise. I would rather work on flashy features to capture new users, but, reality being what it is, I have to think about things in terms of both the health of the ecosystem and what will actually help retain existing podcast app users. They&#8217;re the only ones I&#8217;m going to get. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.uncommonapps.nyc/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.uncommonapps.nyc/subscribe?"><span>Subscribe now</span></a></p><h3>On Creator Intent</h3><p>To a creator, the only real thing a podcast app can be said to have over a platform like Spotify or YouTube is disintermediated access to some of their best listeners. By and large podcast apps are just showing exactly what the creator drops in the RSS, and there are vanishingly few places you can get that.</p><p>Now most creators aren&#8217;t thinking about this in these terms, but some certainly are. Some listeners are as well, and it&#8217;s sort of the backbone of the whole medium. Podcast apps basically rely on the <a href="https://podnews.net/article/the-unwritten-contract">trust of the creators</a> to exist.</p><p>I think this whole integrity-of-the-feed stuff should be taken really seriously. Not because I personally care about the sanctity of the RSS feed in my soul, but more that it&#8217;s the only thing we have. Also, as independent apps slowly become relevant to only a small number of hobbyists, those hobbyists are really going to care about the integrity of the feed. I mean trust me, I know those guys.</p><p>This is why I&#8217;m uncomfortable with certain changes others are making. <a href="https://blog.pocketcasts.com/2026/07/07/ai-generated-chapters-are-here/">Generating chapters</a> and transcripts is explicitly messing with podcast content in a way we normally don&#8217;t do, and I worry it runs the risk of compromising the whole enterprise. Creators can provide transcripts and chapters if they wish, but I don&#8217;t see how it&#8217;s appropriate to do it for them. </p><p>In much the same way, I really, really don&#8217;t think we want <a href="https://podnews.net/update/skipping-ad-playe">podcast apps removing ads</a>. If we&#8217;re just going to put our own generated stuff or remove the ads on your podcast, and we&#8217;re 1% of your listeners, which we also won&#8217;t give you any visibility into, I mean what are we doing here exactly? Why would a content creator sign up for that deal? I don&#8217;t think it&#8217;s that hard to imagine major shows not bothering with any of this and only posting directly to YouTube if we aren&#8217;t careful. </p><p>Perhaps generated transcripts are just table stakes and it&#8217;ll be expected everyone will have them, but for now these are not features I&#8217;m going to work on. Creator intent is too important. That&#8217;s not to say I think we should put our head in the sand and ignore generative AI. On the contrary, there&#8217;s probably a lot we could do I haven&#8217;t thought of. I just don&#8217;t think the juice is worth the squeeze on these specific features.</p><h3>Private feeds</h3><p>Paid private feeds are really great for podcast apps. In my mind it&#8217;s the best example of the business really working for everyone. The creator has a direct relationship with your customer, and we&#8217;re just facilitating a better listening experience that the user has chosen directly. I think we should do more with these. The way they work is messy, and at least on Castro we haven&#8217;t put in the time to make them first-class citizens. For instance, there&#8217;s very little connection between a public version of a podcast and its private equivalent. So I end up with two <em>The Rest is History</em> feeds and can barely figure out what I&#8217;ve listened to unless I slog through both or <a href="https://www.uncommonapps.nyc/p/reclaiming-a-decade-of-podcast-listening">somehow connect them</a>. It&#8217;s also really frustrating that there isn&#8217;t an easy way to listen to a public feed in Castro and then just quickly buy the private version for yourself.</p><p>I have a little trouble understanding why private feed providers like Patreon, NY Times, Substack, etc. haven&#8217;t taken a more active interest in preserving the medium as an ecosystem for just this purpose. Lots of people listen to The Daily, only a fraction of those listen on the NY Times app. If your existing customer is not going to be on your app, wouldn&#8217;t you rather they consume an RSS feed you control directly rather than on YouTube? I understand the users have chosen YouTube and Spotify, so companies have chosen them as well, but a little nudging to the open Internet would go a long way. But hey, I&#8217;m sure it&#8217;ll be fine, the pivot to platform video always works out great, right?</p><p>If there&#8217;s another boom left in podcast apps, there&#8217;s a good chance it will be set off because YouTube did something really evil.</p><h3>Customers</h3><p>At least one other thing podcast apps have going for them: their customers are fairly high value, which matters. On the other hand, as listeners they&#8217;re mostly anonymous and don&#8217;t want to be tracked. They&#8217;re difficult to monetize, and they <a href="https://www.theverge.com/news/784429/pocket-casts-ads-lifetime-memberships-complaints">fucking</a> <a href="https://www.reddit.com/r/pocketcasts/comments/1nih9cv/after_the_last_update_theres_ads_everywhere_this/">hate</a> seeing ads... so maybe not that high value. </p><p>I don&#8217;t have any concrete proposals here. This is not something I&#8217;ve thought about a ton, but if there are any sacred oxen to be gored in terms of tracking, we should probably find ways to gore them that users will find acceptable. Anything we could do to make the open podcasting ecosystem more legible to creators and advertisers would have to be the correct tradeoff for the health of the ecosystem. Do you want to listen in your favorite app with the knowledge that your favorite podcast has some idea of who you are and can send you relevant ads, or do you want your favorite app to cease to exist? Them&#8217;s the breaks. </p><h3>Video</h3><p>Video podcasts should be embraced yesterday. There&#8217;s absolutely nothing about RSS that demands it be audio-only. Podcasts have <a href="https://transistor.fm/history-of-video-podcasts/">never</a> even been audio-only. There&#8217;s at least some evidence<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a> that video time is replacing audio. This is only going to get worse. Video is only going to get more prevalent, and there&#8217;s only so much time in the day. If you want to keep the users who are already with you, it&#8217;s a lot better if the video watching is happening in your app.</p><p>I&#8217;m a guy who loves a dumb hill to die on, but anyone still holding out on the only-audio-is-a-podcast hill is bananas. Support video. It&#8217;s one of the vanishingly few things that can help arrest decline. Huge shout-out to everyone who has made <a href="https://podcasting2.org/docs/podcast-namespace/tags/alternate-enclosure">alternate enclosure</a> happen.</p><h2>Accessibility features </h2><p>Mechanically, an aging userbase is going to have increasing need for accessibility support. Things like VoiceOver and larger font support should be prioritized. A well-crafted independent app can agonize over these and incorporate them into the product from day 1. Castro has always taken this seriously and will continue to do so.</p><h3>Consolidation and shared infrastructure</h3><p>I mean it&#8217;s just obvious there should be fewer of them right? I&#8217;m not going to pick which ones have to go, but in a static category with a lowering barrier to entry, you can&#8217;t keep dividing the pie and keep anything meaningful. I don&#8217;t know how to effect this outcome, but apps that don&#8217;t see a long future for themselves should merge into healthier ones or at least on some level share infrastructure. Larger userbases would give apps more leverage and more development resources, which would allow them to build better products and stick around longer. </p><h2>Audio</h2><p>Can we do more with audio? We don&#8217;t want to compromise creator intent, but it just seems like a lot of things could be done in this space. Castro&#8217;s playback code has barely changed over the years, but I&#8217;m still often told it sounds better than many competitors. Audio playback is weirdly neglected for an audio medium. There&#8217;s no sacred cow that precludes us from making things sound better right? It really feels like we should&#8217;ve invested more here.</p><h3>Be frank with the users</h3><p>Look, the only way this software will continue to exist is if people work on it or they pay others to work on it. The people who care about using their super special podcast apps are mostly the same people who cared about them five years ago, and there truly aren&#8217;t that many of us. That&#8217;s why I&#8217;m talking to you here now. I appreciate everyone who uses an indie app. You are my people, and you deserve to know where things stand. We&#8217;re just deciding what to do with the time we have left, but of course that was always true.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.uncommonapps.nyc/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Uncommon Apps! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p><a href="https://www.buzzsprout.com/stats">Buzzsprout</a> shows declining downloads, RAJAR MIDAS linked below shows declining listening, <a href="https://livewire.io/transistor-stats-visualized/">Transistor</a> stats show almost every independent app flat to declining in market share. You can put together historical weekly download numbers from <a href="https://tritonrankers.com/rankers/us/networks-weekly-downloads/2026/6">Triton Rankers</a>, or you can also trawl through historical Apple and Google Play ranking data. All tell roughly the same story.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>https://www.edisonresearch.com/the-infinite-dial-2026/</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Credit <a href="https://podcastindex.social/@js">John Spurlock</a> for compilation and <a href="https://transistor.fm/">Transistor</a> for the stats</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>Ultimately, it might mean that, but let&#8217;s leave that for a future post</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p> <a href="https://www.rajar.co.uk/docs/news/MIDAS%20Spring%202025.pdf">RAJAR MIDAS Spring 2025</a>: </p><blockquote><p>25% of the UK population tune in to podcast episodes in an average week and those listen for around 7.7 hours per person&#8230; 111 million hours are listened to in an average week in the Spring 2025 wave to Podcasts.</p><p>13% claim to watch podcasts weekly.</p></blockquote><p><a href="https://www.rajar.co.uk/docs/news/MIDAS%20Spring%202026.pdf"> RAJAR MIDAS Spring 2026</a>:</p><blockquote><p>25% of the UK population tune in to podcast episodes in an average week and those listen for around 6.4 hours per person&#8230; 93 million hours are listened to in an average week in the Spring 2026 wave to Podcasts.</p><p>16% claim to watch podcasts weekly.</p></blockquote></div></div>]]></content:encoded></item><item><title><![CDATA[Reclaiming a decade of podcast listening history]]></title><description><![CDATA[Tracking my listening across 4 different apps over more than a decade]]></description><link>https://www.uncommonapps.nyc/p/reclaiming-a-decade-of-podcast-listening</link><guid isPermaLink="false">https://www.uncommonapps.nyc/p/reclaiming-a-decade-of-podcast-listening</guid><dc:creator><![CDATA[Dustin Bluck]]></dc:creator><pubDate>Thu, 16 Jul 2026 12:26:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vQkr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ebed9ee-9328-4b28-9298-a997eaa04855_2410x926.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uI6b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uI6b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png 424w, https://substackcdn.com/image/fetch/$s_!uI6b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png 848w, https://substackcdn.com/image/fetch/$s_!uI6b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png 1272w, https://substackcdn.com/image/fetch/$s_!uI6b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uI6b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png" width="1456" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94261743-6233-429c-b585-8c40840a4dea_2410x926.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3280281,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.uncommonapps.nyc/i/206901948?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uI6b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png 424w, https://substackcdn.com/image/fetch/$s_!uI6b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png 848w, https://substackcdn.com/image/fetch/$s_!uI6b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png 1272w, https://substackcdn.com/image/fetch/$s_!uI6b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94261743-6233-429c-b585-8c40840a4dea_2410x926.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ve been listening to podcasts for a long time. Not as long as some I&#8217;m sure, but I discovered them in college and have been consuming them regularly since at least ~2010, starting with The Moth, This American Life, and Podcast Beyond. I suppose the first place I ever listened was iTunes on the Mac, but the first podcast app I actually used and cared about was <a href="https://www.40tech.com/2011/05/10/app-of-the-week-doggcatcher-podcast-player-android/">DoggCatcher</a>. This was years before most podcast apps we use today existed. Eventually, I graduated to <a href="https://pocketcasts.com/">PocketCasts</a> when they were still an indie app. Then I wrote an Android app, <a href="https://aurelian.audio/">Aurelian</a>, and now run <a href="https://castro.fm/">Castro</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RguX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RguX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png 424w, https://substackcdn.com/image/fetch/$s_!RguX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png 848w, https://substackcdn.com/image/fetch/$s_!RguX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png 1272w, https://substackcdn.com/image/fetch/$s_!RguX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RguX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png" width="512" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:512,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37726,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.uncommonapps.nyc/i/206901948?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RguX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png 424w, https://substackcdn.com/image/fetch/$s_!RguX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png 848w, https://substackcdn.com/image/fetch/$s_!RguX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png 1272w, https://substackcdn.com/image/fetch/$s_!RguX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7716fb3-04d5-4e38-a361-0d0f6a98f2f9_512x512.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">What a great icon</figcaption></figure></div><p>So my history was scattered across a bunch of apps. I recently undertook a project to reconstruct as much of that listening history as I could in order to keep that data with me. Since podcasts are built on open frameworks, it just feels appropriate that none of this should be locked behind a proprietary app, even if I own the app.</p><p>Unfortunately, all my DoggCatcher listening is lost to history, like the app itself. For PocketCasts though, I was able to export actual listening history going back to 2018, and played episodes going back to 2015. So while I&#8217;d love to have a few more years, a decade of data feels pretty good. I started using Aurelian around 2022, and the last couple years I&#8217;ve been primarily using Castro. Using the method below, I was able to take the data from all three apps and build out one giant library over the past decade.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.uncommonapps.nyc/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.uncommonapps.nyc/subscribe?"><span>Subscribe now</span></a></p><h2>Doing the extraction</h2><p>So the first thing we&#8217;re going to want to do is extract all our data from all the podcast apps we&#8217;ve ever used. Depending on the app this is either very easy or a little involved. A podcast is really just a URL with a flat XML file. Within that file, for the purposes of this exercise, there are only a few things we care about:</p><ul><li><p>Feed title</p></li><li><p>Feed artwork</p></li><li><p>Items</p><ul><li><p>Item artwork</p></li><li><p>GUID</p></li><li><p>Title</p></li><li><p>Published date</p></li><li><p>Media URL (enclosure)</p></li></ul></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pCG3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pCG3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png 424w, https://substackcdn.com/image/fetch/$s_!pCG3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png 848w, https://substackcdn.com/image/fetch/$s_!pCG3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png 1272w, https://substackcdn.com/image/fetch/$s_!pCG3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pCG3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png" width="1450" height="808" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:808,&quot;width&quot;:1450,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:244160,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.uncommonapps.nyc/i/206901948?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pCG3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png 424w, https://substackcdn.com/image/fetch/$s_!pCG3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png 848w, https://substackcdn.com/image/fetch/$s_!pCG3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png 1272w, https://substackcdn.com/image/fetch/$s_!pCG3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e2cffc-5740-4d94-8e2c-0f9afe385bc2_1450x808.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Because this is literally all a podcast is, any podcast app is going to store this information, either directly or indirectly. GUID is the most important attribute here. It&#8217;s the easiest way to keep track of episodes in the feed. Once I have the podcast URL and GUID from an episode, then it becomes trivial to map it from one app to another, and I know exactly what we&#8217;ve played, queued, etc. The first step is going to be going through all the apps you&#8217;re using and exporting each database:</p><h3>Castro</h3><p>Castro stores a backup file with the extension <code>.castrobackup</code> in your iCloud drive. This file is JSON, and lists only Castro public IDs. These look like the GUID above, but they&#8217;re actually internal UUIDs and don&#8217;t map onto the feed in the way we&#8217;d like. Luckily, Castro does expose this data, either through public REST APIs or <a href="https://castro.fm/blog/castro-mcp">Castro MCP</a>.  So you can access which Castro episode you&#8217;re looking at in either direction. If I have a Castro ID and I want the full episode data:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;8c598e2d-a85a-46b1-9ca2-cbf92ffc739f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">  Input (episode)
  {
    "public_id": "0d6d1c14-23b4-4cbc-96b2-106c06942635"
  }

  Output

  {
    "public_id": "0d6d1c14-23b4-4cbc-96b2-106c06942635",
    "feed_guid": "19263b9a-7ad2-11f1-aaed-3fa07ea54e9e",
    "podcast_public_id": "3878bc03-96bc-4457-b29c-1b1bdbebccf6",
    "short_id": "r7SxXj",
    "title": "The Odyssey: Hero of the Trojan Horse (Part 1)",
    "podcast_title": "The Rest Is History",
    ...
  }</code></pre></div><p>That <code>public_id</code> is what you&#8217;re going to see in the Castro backup, and mapping in the other direction is equally straightforward. This episode is also available <a href="https://castro.fm/episode/r7SxXj">here</a>.</p><h3>Podcast Republic</h3><p>Open the app settings and go to &#8220;Backup &amp; Restore&#8221;. You can export the full SQLite database, which contains feed URLs and GUIDs, giving you everything you need.</p><h3>AntennaPod</h3><p>Likewise, this has a Database export feature under &#8220;Backup &amp; restore&#8221; and contains this information directly.</p><h3>Apple Podcasts</h3><p>If your iPhone and Mac are syncing, you may be able to find the database at <code>$HOME/Library/Group Containers/243LU875E5.groups.com.apple.podcasts/Documents/MTLibrary.sqlite</code>. Then you may be able to use the fact that Apple generates identifiers like <code>md5(feed_url + guid)</code>to get something useful out of this. But if you want a more comprehensive one-time data export, it&#8217;s easier to go to <code>privacy.apple.com</code>, export your data, and ensure you check &#8220;Apple Media Services Information&#8221;. That&#8217;s going to give you at least feed URLs, and it&#8217;ll likely be enough to reverse engineer your playback history.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!p-Oq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p-Oq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png 424w, https://substackcdn.com/image/fetch/$s_!p-Oq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png 848w, https://substackcdn.com/image/fetch/$s_!p-Oq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!p-Oq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p-Oq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png" width="1456" height="860" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:860,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:321886,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.uncommonapps.nyc/i/206901948?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!p-Oq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png 424w, https://substackcdn.com/image/fetch/$s_!p-Oq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png 848w, https://substackcdn.com/image/fetch/$s_!p-Oq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!p-Oq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb190fa8f-1ee7-4e09-83f7-77be6a5cbe13_2424x1432.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>PocketCasts</h3><p>Go to Profile Tab &#8594; Help &amp; Feedback, then in the menu &#8220;Export database&#8221;. Unfortunately, PocketCasts&#8217; database does not list feed URLs or GUIDs, only their own public IDs. Mapping these IDs back to the feed URLs and GUIDs is not too difficult, and PocketCasts is open source so I&#8217;ll leave that bridge as an exercise for the reader. One trick to know: once you have a feed URL and an enclosure, you can simply pull the XML yourself and compare enclosures as a reverse-lookup to find the GUID you are looking for (grepping by title and publish date can also work). </p><h3>Overcast</h3><p>Ensure your account is syncing. Log into Overcast on the web, go to Account, and export the OPML with &#8220;All Data&#8221;. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A1nx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A1nx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png 424w, https://substackcdn.com/image/fetch/$s_!A1nx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png 848w, https://substackcdn.com/image/fetch/$s_!A1nx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png 1272w, https://substackcdn.com/image/fetch/$s_!A1nx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A1nx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png" width="1456" height="299" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f188c788-3793-4444-b063-75b3975efe37_1576x324.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:299,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59970,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.uncommonapps.nyc/i/206901948?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A1nx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png 424w, https://substackcdn.com/image/fetch/$s_!A1nx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png 848w, https://substackcdn.com/image/fetch/$s_!A1nx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png 1272w, https://substackcdn.com/image/fetch/$s_!A1nx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff188c788-3793-4444-b063-75b3975efe37_1576x324.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Overcast uses numeric IDs that are formulaic, and you can derive the share page (e.g. <code>overcast.fm/+BClHgIbP-s)</code> from that ID. You can see the details <a href="https://mastodon.social/@overcastfm/109863328508642286">here</a>. Similar to PocketCasts, once you have the share link, you have an enclosure URL, so you can just do the lookup using the RSS feed to get the GUID.</p><h2>Building the data</h2><p>So we have a set of databases from different apps. We want to define a data model between them, and store it all in one place.  One way to do this is with a local SQLite database. Your tables might look like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z18O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z18O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png 424w, https://substackcdn.com/image/fetch/$s_!Z18O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png 848w, https://substackcdn.com/image/fetch/$s_!Z18O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png 1272w, https://substackcdn.com/image/fetch/$s_!Z18O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z18O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png" width="1456" height="888" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:888,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177863,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.uncommonapps.nyc/i/206901948?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Z18O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png 424w, https://substackcdn.com/image/fetch/$s_!Z18O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png 848w, https://substackcdn.com/image/fetch/$s_!Z18O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png 1272w, https://substackcdn.com/image/fetch/$s_!Z18O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb2e87db-882a-41ae-bda3-867824dd294d_2000x1220.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can think about this data model<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> if you&#8217;re old school, or just tell Claude Code to figure it out. The point is we can have multiple rows for each episode that represent each app, allowing us to merge the different libraries together as needed and also split them apart. </p><p>Once you&#8217;ve set up your database, you want to write a Python script for each app to map it into your new database format, along with any needed business logic to bridge the GUIDs as needed for the relevant apps above. I did something very similar a few years back and it was very painful. I spent hours on tests to ensure the data all translated cleanly, building the business logic to parse and compare the XML, etc. It&#8217;s completely wild that Codex or Claude Code can just knock this stuff out for us in a way that truly makes 2022 feel like the dark ages. <a href="https://github.com/dabluck/agnostic-podcast-app">Here&#8217;s </a>a sample of how these scripts work. The linked code is definitely slop, and it will likely be easier to generate them yourself but feel free to use it as a reference or give it to an LLM to help it understand the concept. </p><h2>Your beautiful library</h2><p>Once you have your databases and run your ingestion, you&#8217;ll have your full podcast listening history all to yourself and free of any app. You can just stare fondly into the eyes of your SQLite tables if you want, but there are probably more interesting things we can do. We can make an HTML viewer like this:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;7ecb462e-b4df-4427-9062-15ce4cedc264&quot;,&quot;duration&quot;:null}"></div><p>We can also graph listening over time, build a cover flow, or create a GitHub-style daily chart. (These are seed with fake data for prettier visuals.)</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ebed9ee-9328-4b28-9298-a997eaa04855_2410x926.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bad5f539-58a4-417a-8483-fecd94fb0b2b_1580x912.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1fb9c653-47d9-45d7-ad32-9340b50e1fb4_2362x704.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99a98ff5-62ac-4afb-be51-e5ffd13a5b4f_2406x802.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9bdfc874-16c2-4b34-8402-c770d284ccb7_1668x1138.png&quot;}],&quot;caption&quot;:&quot;Pulling interesting things out of our podcast data&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69597a84-b919-46dc-8a7f-fed27c364c1e_1456x1210.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>Now when I want to know if I&#8217;ve listened to an episode before, I can search on my desktop instead of going through all the different apps. This is extremely useful for shows like Casefile and Criminal, where I may have dropped off a few years ago but can&#8217;t remember where. I know the <a href="https://castro.fm/episode/iQcxQT">longest episode</a> I&#8217;ve ever listened to (not surprising it&#8217;s Dan Carlin), and that I&#8217;ve completed 9,931 episodes across 886 shows! Stay tuned for number 10,000!</p><h2>What next?</h2><p>One thing you might want to do is update your local library regularly. Castro does a daily backup to your iCloud drive, which makes setting up some kind of script to regularly ingest your listening fairly straightforward. Any podcast app that lets you do regular backups to Google Drive, etc., would allow you to keep your external library updated.</p><p>At some point, you&#8217;ll probably want to pull this library into a podcast app to actually make it useful. If you use Castro, the MCP will help build a backup file that contains all your listening history from forever. I would highly recommend that option. If you want to export your full library into another app, your best bet is going to be AntennaPod or one of the other apps that include RSS feed URLs and GUIDs within the database itself. You can presumably just use the initial database you exported from that app as a guide, and build up your new database using the same schema. Then just import right back into the app. For an app that relies on its own IDs, it&#8217;s going to be a little more involved, but it&#8217;s certainly possible. Whatever you do with it, you&#8217;ll now have a fully external backup, and you&#8217;ll know your data is safe no matter what happens to the app you&#8217;re using.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.uncommonapps.nyc/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Uncommon Apps! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>I did a version of this project a few years ago, but it was very difficult at the time to do all this data wrangling and mappings between IDs. It was very tedious to write scripts that mapped one simple SQLite schema to another. The world has changed quite a bit, and now this stuff is way more fun. Using Claude Code I was able to do the whole project in a couple of hours.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>One note for the careful reader: podcasts often have more than one URL over their lives, so you&#8217;ll likely want another table of feed urls to account for this. Even in the simplest case, one app may have been using <code>http://example.com/feed</code> while another might&#8217;ve been looking at <code>https://example.com/feed</code>, so you'll almost certainly need some business logic around duplicates.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Just Pay the Subscription]]></title><description><![CDATA[Subscription mobile apps are actually good and you should stop complaining]]></description><link>https://www.uncommonapps.nyc/p/just-pay-the-subscription</link><guid isPermaLink="false">https://www.uncommonapps.nyc/p/just-pay-the-subscription</guid><dc:creator><![CDATA[Dustin Bluck]]></dc:creator><pubDate>Thu, 09 Jul 2026 13:01:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qFM1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qFM1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qFM1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qFM1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qFM1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qFM1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qFM1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg" width="1456" height="1001" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1001,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2236733,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.uncommonapps.nyc/i/206226794?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qFM1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qFM1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qFM1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qFM1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790a4590-6f90-4ccc-9249-9d1e5a506416_4080x2805.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">D&#8217;Amico in Carroll Gardens has a large iced coffee for a great price, so you can at least get the best bang for your buck</figcaption></figure></div><p>I would say the least useful comment on the internet is that you hate subscriptions. It&#8217;s like hating rules. It&#8217;s too abstract. Some are good and some are bad. I believe subscriptions for mobile apps are the best thing that has ever happened for both indie developers and iPhone users. If you like an app, you should buy a subscription.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> If you like it but really can&#8217;t pay for it, that&#8217;s okay, you don&#8217;t have to use it. But let&#8217;s be honest, if you&#8217;re reading this you can probably pay for it, and if you&#8217;re bothering to complain about the subscription then you probably want to use it. Before firing off an email or a tweet complaining about subscriptions, you should really, sincerely, consider not complaining and just paying the money instead.</p><p>I like subscriptions because, in the worst kind of corporate management speak, subscriptions align our interests. You pay for the app for the duration that you see fit. You pay for it because it gives you value. I have that money to pay for infrastructure and improving the app. I&#8217;m incentivized to do a good job so you&#8217;ll pay me again next year. If you stop using the app or I stop holding up my end of the bargain, you stop paying. It&#8217;s a fair deal on both sides. I genuinely can&#8217;t understand why this notion is abrasive to so much of the internet. I mean I understand why you might not want to pay for a subscription to your Honda garage door opener, I wouldn&#8217;t want to either. But for software on your phone that is constantly being maintained and updated, with a cloud component, how else do you want things to work exactly?</p><p>Of course, if you like living in a world where Meta, Amazon, Apple, and Google run every single thing on your phone and ultimately your life, that&#8217;s great for you. I hope you enjoy your scrolling and your ads. I don&#8217;t love that world. I like the one where talented individuals work hard on making great software like craftsmen, and they just get paid for it. But how should they be paid? Well, in a way that will allow them to make a living building the thing I like. Something recurring probably. At regular intervals and at amounts large enough to be meaningful if a few thousand people appreciate their work. Don&#8217;t we want nice things to exist?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.uncommonapps.nyc/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.uncommonapps.nyc/subscribe?"><span>Subscribe now</span></a></p><p>I understand some people are against subscriptions because they want to feel a sense of ownership. Wait, no I don&#8217;t. I&#8217;m honestly not sure what that means. You can&#8217;t take <a href="http://Cal.ai">Cal.ai</a> and Flighty out of your phone and put them on your shelf. These things are only going to work as long as they&#8217;re maintained and updated. It&#8217;s not 1995 anymore.</p><p>Okay, maybe ownership isn&#8217;t possible, but I just want a one-time purchase, you might say. Maybe for budgeting purposes you don&#8217;t want to lock in future obligations. And I guess I can understand that, but I can&#8217;t help feeling like you have in mind that this one-time purchase is going to be $5 total. And I&#8217;m here to tell you that&#8217;s not happening. For anything that takes effort it&#8217;s going to be more like $200. And if you&#8217;re throwing a fit over $5/month you&#8217;re probably not going to shell out $200. Even if you&#8217;re willing to pay that, it seems like a bad deal for you. You paid $200 up front and I can disappear next month, with no incentive to keep you happy with the app. Why would you want that? Upgrade pricing also doesn&#8217;t solve this. The App Store doesn&#8217;t support it properly, but even if it did, versioned upgrades incentivize developers to chase shiny features that people might pay for rather than improving their app and building for the long haul. It makes the product worse. If you&#8217;re arguing for upgrade pricing, it&#8217;s likely because you don&#8217;t see yourself buying future versions and just hope you&#8217;ll get the bug fixes for free.</p><p>&#8220;Okay, okay, but this app doesn&#8217;t have a backend, and it&#8217;s actually already perfect and never needs to change at all. So why can&#8217;t I just pay this one time and use it forever?&#8221; Hmm, you really love this iPhone app so much, but you want it to look like iOS 15 forever? You don&#8217;t want it to support Liquid Glass? I think you do, but even if you don&#8217;t, APIs get deprecated. Crashes come up on new OS versions. Anything remotely complex is going to need some maintenance. Sure, you say, but it&#8217;s just a little maintenance. It shouldn&#8217;t take much, and it would only be once a year. So how should we handle that? Maybe paying yearly would make sense? Like a subscription? You can decide what price point is worth it to you, but you&#8217;re not going to convince me subscription is the wrong model even for an offline app.</p><p>Oh I have too many subscriptions, you say, and I get that. But do you really need Hulu, Disney Plus, Netflix, and Spotify? And are they all more important to you than your favorite apps on your phone? If the app is not important to you then by all means don&#8217;t pay for it. This is not about charity. But if you do love an app and are just objecting to the business model, stop doing that. You&#8217;re wrong. The business model is correct.</p><p>I really don&#8217;t know where people got this idea that mobile apps aren&#8217;t serious software and this software shouldn&#8217;t cost money, but it&#8217;s pervasive. Every single day, a surprising number of people sit down and type out a message either to developer support or just on their favorite social media app to remind app developers that charging a subscription is barbaric and we should be ashamed. I truly can&#8217;t believe these people are real, but I&#8217;m not ashamed. If you are someone who does this, I beg you, next time at least say it to their faces instead! Take your favorite indie developer out to coffee, look them in the eye, and tell them the $5.99 you just spent on them should be good to cover their work until they die.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.uncommonapps.nyc/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Uncommon Apps! </p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p><em>Note: In this essay I am concerned with what I work on, which is subscriptions for mobile apps including productivity tools, media, entertainment, etc. These subscriptions are purchased through the App Store or Google Play. I understand there are dark patterns and companies may try to trick you or make it difficult to cancel. Those things are bad and I reject them as vociferously as the rest of the internet. You should know what you are paying for, you should do it intentionally, and yeah you should go ahead and pay it.</em></p></div></div>]]></content:encoded></item><item><title><![CDATA[Castro Podcasts — Things I got wrong: Support]]></title><description><![CDATA[Building meaningful relationships with customers through support didn't turn out as I'd hoped]]></description><link>https://www.uncommonapps.nyc/p/castro-podcasts-things-i-got-wrong-support</link><guid isPermaLink="false">https://www.uncommonapps.nyc/p/castro-podcasts-things-i-got-wrong-support</guid><dc:creator><![CDATA[Dustin Bluck]]></dc:creator><pubDate>Fri, 03 Jul 2026 17:49:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/19d7d3fa-0422-450c-9271-d4949f07692b_1488x352.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I had an idea when I <a href="https://castro.fm/blog/castro-is-back?utm_source=www.uncommonapps.nyc&amp;utm_medium=newsletter&amp;utm_campaign=castro-podcasts-things-i-got-wrong-support&amp;_bhlid=616107fd58d68c381e7d5f5a3d1b040ec9021a75">bought</a>&nbsp;<a href="https://castro.fm/?utm_source=www.uncommonapps.nyc&amp;utm_medium=newsletter&amp;utm_campaign=castro-podcasts-things-i-got-wrong-support&amp;_bhlid=3643853015504bf0b02aedcba989438f3b5ba337">Castro</a> that human support based around actual user experience was an easy differentiator. I&#8217;ve rarely gotten useful answers from support from services I use. I thought if I used my own product every day, read every email and answered it thoughtfully, people would appreciate this, and it would build some degree of loyalty and appreciation. This way, customers would feel their subscription dollars were actually going toward something. When emails overwhelmed me, I asked a thoughtful user who emailed frequently and seemed to know as much about the product as I did if he&#8217;d help answer the emails, so I paid him to do that. And he did a great job, especially in terms of directly solving user problems.</p><p>However, what I found is this whole thing didn&#8217;t work as I thought it would. Sure sometimes we were able to wow customers, particularly when we responded right away with an exact fix for them. But the vast majority of our honest, thoughtful answers were deeply unsatisfactory to users, and it often annoyed them more than anything else.</p><p>Here are my unscientific categories of support requests/emails we get and why the approach is flawed.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.uncommonapps.nyc/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.uncommonapps.nyc/subscribe?"><span>Subscribe</span></a></p><h3><strong>Complaints about subscriptions and pricing</strong></h3><p>I have already thought about this a great deal. I am not changing anything based on your email. I can of course try to justify why we charge what we do, and I&#8217;m happy to explain why an essential app is worth your money, and why software lends itself to subscription so well. But in reality the user is not satisfied with this. I can think of exactly one customer in two years who was surprised that software costs money and we&#8217;re actually doing work every day, thus charging a subscription makes sense. 99% of the time, no matter how carefully or kindly it&#8217;s explained, the reply will be more negative than the initial email. I tried just offering an additional 30-day trial to anyone who asked, but this didn&#8217;t change the sentiment of the emails, and those trials had a substantially lower hit rate than our typical free trials. I could fill several blog posts with thoughts on subscriptions, but suffice it to say, emails about pricing are not helpful in terms of building rapport.</p><h3><strong>Bugs</strong></h3><p>These emails are genuinely useful to me, the receiver. I want to know about the bugs people are experiencing on a daily basis. In the best case, I can say we know about this and are actively working on a fix or have already fixed it. Due to the way shipping works in the App Store, it&#8217;s common for a bug to be fixed but not distributed yet. Those are great emails to answer and we can satisfy the customer.</p><p>But there&#8217;s a long tail of bugs that are not like this:</p><ul><li><p>We have heard this before, but we cannot see it or replicate it. The user gets to do work for us and/or get no resolution. Bad experience for them, bad experience for us, mostly a waste of everyone&#8217;s time. Very, very occasionally a user will send a detailed report with steps to reproduce or a meaningful factor. Still we need to get these emails to know what people are seeing.</p></li><li><p>We have never heard this before. User can provide details for us, but if others aren&#8217;t experiencing it, it&#8217;s unlikely to be prioritized. Still, useful signal for us.</p></li><li><p>We get no information. &#8220;It doesn&#8217;t work&#8221; is the whole email. Not much I can do without the user doing more work, which they understandably aren&#8217;t interested in doing.</p></li><li><p>We know about this, but fixing it is a decent amount of work or low-priority because it&#8217;s not a big deal or few users see it.</p></li></ul><p>None of these categories seem to build any meaningful rapport. Any honest answer I give is deeply unsatisfying to both parties, and we typically have better data from telemetry or crash logs than the emails provide. It&#8217;s certainly useful for us to receive them, but there&#8217;s not a helpful response I can give. In retrospect, this seems obvious, but before owning Castro it was not obvious to me that a human response detailing why I am unable to solve your problem today and am not even going to try is about the worst thing a user can receive!</p><h3><strong>Nuanced questions / human intervention</strong></h3><p>Sometimes we get nuanced questions about App Store processes, store issues, specific locales, hyper-specific podcast questions, etc. A user recently had a Castro subscription on two different accounts at different times and wanted to let one expire while ensuring they got the months they paid for. We were able to resolve it for them quickly. People do genuinely appreciate this kind of responsiveness. So yeah, the idea probably works here. Unfortunately, these are less than 1% of support emails.</p><h3><strong>Customers genuinely confused / something unclear</strong></h3><p>This comes closest to building the customer relationships I was hoping for, with the worst results. Customers email us with confusion about how podcasts work, how the App Store works, how their Mac works, and any number of tangential issues. What tends to happen is the same users do this over and over, and once they find out we answer, the requests get more frequent and more burdensome. I think I heard Patrick McKenzie use the term &#8220;pathological customers&#8221;. While in theory building rapport and loyalty sounds nice, what you actually end up doing is spending a lot of time on the people who ask the most of you, but their subscription dollars aren&#8217;t worth more, and they&#8217;re rarely satisfied. You end up feeling taken advantage of.</p><h3><strong>Feature requests / general thoughts</strong></h3><p>Similar to the last category. Good in theory, sometimes useful, but often the same small, unrepresentative segment with strong thoughts. Woe to the team who implements a suggestion based on an email, you are likely to get a full product roadmap soon!</p><p>Castro is an opinionated app and I&#8217;ve thought a lot about what we&#8217;re building and what we&#8217;re going to work on next. It&#8217;s unlikely I&#8217;m going to implement the request. If I did, by catering more to persnickety power users, we run the risk of alienating newer users who don&#8217;t know how things work. But our power users probably aren&#8217;t going anywhere, at least they&#8217;re a little harder to shake, and alienating new users is the death of the product.</p><p>To the user, any response aside from &#8220;Okay, we&#8217;re going to build that right now&#8221; is meh-to-negative. Various honest responses, such as &#8220;I thought about this or tried it in the past and it unfortunately didn&#8217;t work very well&#8221; are not going to knock their socks off. These just don&#8217;t do much in terms of loyalty and rapport.</p><h2><strong>Conclusion</strong></h2><p>Ultimately, for us, putting too much time into support isn&#8217;t a differentiator, and it&#8217;s often counter-productive. The person who paid our subscription but would never think about emailing us and asking for something for free deserves a great app just as much as the person who emails us every week. If we have a specific resolution or fix for their problem, great. If not, we&#8217;ve had better results by saying we appreciate the email, we read them, and we are actively working on the product to improve the issues. Avoiding explanations and specifics tends to get a neutral response and doesn&#8217;t suck anyone in or waste too much time. In other words, the best approach for us is what most companies do. Because building loyalty or rapport at the moment something isn&#8217;t working and the user is frustrated hasn&#8217;t worked. The real positive experience comes when you actually improve the product, so that&#8217;s where we&#8217;re spending our time.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.uncommonapps.nyc/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.uncommonapps.nyc/subscribe?"><span>Subscribe</span></a></p>]]></content:encoded></item><item><title><![CDATA[Welcome to Uncommon Apps]]></title><description><![CDATA[For those interested in independent software]]></description><link>https://www.uncommonapps.nyc/p/welcome-to-uncommon-apps</link><guid isPermaLink="false">https://www.uncommonapps.nyc/p/welcome-to-uncommon-apps</guid><dc:creator><![CDATA[Dustin Bluck]]></dc:creator><pubDate>Mon, 20 Apr 2026 20:22:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!x7jk!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd54d0b0-1c31-49f9-adcf-1f5a9781acee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Uncommon Apps is a newsletter by yours truly focused on running a mobile app studio and what&#8217;s going on with indie apps.</p><p>Future topics will include:</p><ul><li><p>Lessons learned from buying apps</p></li><li><p>Customer service / help desk</p></li><li><p>Open ecosystem challenges and opportunities</p></li><li><p>Why subscriptions are the right business model for apps (no, really), and how to build subscriptions worth paying for.</p></li><li><p>Future of indie software and why it&#8217;s bright</p></li></ul><p>I promise to talk about AI only when required and write all the words myself. Any resemblance to slop is purely the fault of the human author.</p><p>Thanks and talk to you soon!</p><p>- Dustin</p>]]></content:encoded></item></channel></rss>