I spent money on a domain so I might as well use it.

Pocket Casts, You Altered The Deal, So I Will Alter Your App

After all you made your apps open source, so I can remove your ads.
Pocket Casts, You Altered The Deal, So I Will Alter Your App
Ads in the now playing section of Pocket Casts

History so far

Pocket Casts, people are not upset you are trying to find revenue sources. People are upset you are reneging on your promise.

You were a pay-once app. Released in 2011, pay once each for Android, iOS, and Web and keep for life.

In 2018 NPR acquired you. Then in 2019 you moved to a subscription for all users, including the paid ones. People were upset so you backtracked and grandfathered them into a lifetime plus membership. Sadly, in 2020 NPR lost $800k from running you so you were sold to Automattic.

In 2024 you renamed all "Pocket Casts Lifetime Members" to "Pocket Casts Champions" and we knew shenanigans were afoot.

This week you flipped the switch to turn on ads in the app:
1000002462.png

However, in 2022 you made your mobile apps open source, so there is something that can be done: I forked the repo.


Exorcising the ads

In the app you may be able to see the new nag that says: "Unlock folders, bookmarks, transcripts and more with Pocket Casts Plus" just above the artwork in the player screen. I don't see that exact string in the GitHub repo, I think that's because of internationalization.

However, I found where the artwork view fragment is and that it contains AdAndArtworkHorizontal. Looking at the changelog I can see that this was added in Display ads in the player #4086 which created the flag Feature.BANNER_ADS. The PR shows lots of example ads. That PR also shows demos of all sorts of ad types.

In the project a feature flag has the following details:

enum class Feature(  
    val key: String,  
    val title: String,  
    val defaultValue: Boolean,  
    val tier: FeatureTier,  
    val hasFirebaseRemoteFlag: Boolean,  
    val hasDevToggle: Boolean,  
)

With some further updates to the project, the flag is now broken in two:

BANNER_ADS_PLAYER(  
    key = "banner_ad_player",  
    title = "Banner Ads Player",  
    defaultValue = true,  
    tier = FeatureTier.Free,  
    hasFirebaseRemoteFlag = true,  
    hasDevToggle = true,  
),  
BANNER_ADS_PODCASTS(  
    key = "banner_ad_podcasts",  
    title = "Banner Ads Podcasts",  
    defaultValue = true,  
    tier = FeatureTier.Free,  
    hasFirebaseRemoteFlag = true,  
    hasDevToggle = true,  
),

The flags are ultimately used by BlazeAdLocation.

There are a couple of different ways we could slice out the ads. For testing, I went with the simplest approach to start:

  • flip defaultValue to false.
  • flip hasFirebaseRemoteFlag to false so the flag will not be remotely overridden.

Anyway, based on the readme I just needed to./gradlew :app:assembleDebugProd and ./gradlew :app:installDebugProd. This will install a different debug version of the app:
1000002460.png

Voila, ads gone. Though in the future this process may be tougher because of Google's impending crackdown on loading APKs.

Now, after doing all that work, guess what I realized? hasDevToggle field in the Features class? Well the debug build has a feature toggles section:
1000002458.png

So for now you do not need to modify the project's code. You can get by with just using the debug build and toggling the feature off. Feature flags only exist for testing features though. Eventually the flag will go away and I'll have to disable the ads more directly.


Why did we end up here?

Pocket Casts, your current approach to monetization seems extreme. Are you in a similar situation to 2020? Back then the NPR financial report only had a single line item of $812,129 for "Minus: Share of Podcast Media’s net loss". Why does a podcast service cost so much to run? If you give us more transparency, maybe we will better understand why you need to make changes.

Maybe there is a possibility more of the work can be moved on-device. You open-sourced your app, maybe the community can help you out and contribute those changes? We're not too scary. You extended an olive branch by open-sourcing the project, so let's work together. Hopefully Automattic doesn't pull back on contributions like they did with WordPress this year.


An entirely different option

As I mentioned in my post about the apps I kept when switching to GrapheneOS, self-hosting PinePods and using AntennaPod on your phone is a great option! That way you can still have web and desktop sync. I also said in that post:

If I wasn't grandfathered into free premium tier I would be more tempted to jump ship.

The time to jump ship seems to be getting closer. I think Pocket Casts will join a future version of my apps that I got rid of when switching to GrapheneOS post.

Oh and if anyone is looking for new podcasts to listen to, I have recommendations.

Member discussion