Marco.org

I’m : a programmer, writer, podcaster, geek, and coffee enthusiast.

Overcast 2

After a year of work, Overcast 2 is now available as a free update for everyone. It’s mostly a major under-the-hood improvement, with relatively few user-facing changes. But they’re pretty good, I think.

And now, all features are free, and I’m trying a new business model.

Download on the App Store

Streaming ☁️

The headlining feature of Overcast 2 is streaming. You can still download all episodes as you did before — I fixed some bugs there, too — but now, you have two more capabilities:

And with the new storage manager, you can see how much space your downloads are consuming for each show, and optionally delete the downloads and stream the episodes on demand.

Overcast’s streaming engine is completely custom-written and designed for modern devices, the modern mobile internet, and the expectations of today’s customers, tightly integrated with Overcast’s custom audio engine to be as fast and efficient as possible.

And, of course, Smart Speed and Voice Boost are always available, even when streaming. I wouldn’t have it any other way.

Audio improvements

Even if you don’t plan to use streaming, you’ll reap its benefits: converting the audio engine to a streaming architecture has made all playback faster to start, easier on battery life, more compatible, and more reliable. (And everyone wants to play an undownloaded episode right now sometimes.)

Smart Speed and Voice Boost have also been quietly enhanced:

Quite simply, it sounds a bit nicer.

Chapters 🇩🇪

I was wrong. (Not for the first time.) Turns out that chapters are pretty nice. Don’t doubt the Germans.

Social directory

Overcast’s podcast directory has always had a good search if you knew what you were looking for, but browsing was limited to very narrow editorial picks that I edited manually, badly, and infrequently. Since I sucked at that job, I fired myself and replaced me with someone far better: everyone else.

Now, the directory categories are powered by recent recommendations by Overcast users. This is already surfacing far more diverse podcasts, and updating far more frequently, than I could ever offer as one person who mostly listens to tech shows.

Everything else

I’ve made lots of other changes and fixed a lot more bugs. Some of the highlights:

Plus too many smaller improvements to list here.

My crazy new business model

Overcast has always been free up front to bring the best app to the most people. But I’m just one person, running this business the old-fashioned way, so it has to make money somehow.

Overcast 1.0 locked the best features behind an in-app purchase, which about 20% of customers bought. This made enough money, but it had a huge downside:

80% of my customers were using an inferior app. The limited, locked version of Overcast without the purchase sure wasn’t the version I used, it wasn’t a great experience, and it wasn’t my best work.

With Overcast 2.0, I’ve changed that by unlocking everything, for everyone, for free. I’d rather have you using Overcast for free than not using it at all, and I want everyone to be using the good version of Overcast.

If you can pay, I’m trying to make up the revenue difference by offering a simple $1 monthly patronage. It’s completely optional, it doesn’t get you any additional features, and it doesn’t even auto-renew — it’s just a direct way to support Overcast’s ongoing development and hosting without having to make the app terrible for 80% of its users.

If only 5% of customers become monthly patrons, Overcast will match its previous revenue.

Patrons may get special features in the future if I can’t afford to offer something to everyone (due to hosting costs, etc.), but today, patronage is simply that: supporting Overcast directly, because you want to. And if you’d rather not, no hard feelings.

Thanks, and I hope you enjoy Overcast 2.

Pragmatic app pricing

When Overcast 1.0 launched last year, I expected some pushback for its pricing model (free with limits, $5 to unlock everything). I knew there was a chance I’d be perceived by some indie-development commentators as a rich, popular bully aggressively taking the podcast market from other indie developers.

I decided to proceed with that pricing model anyway, because:

It turned out that nobody complained, and everything’s fine.

In fact, based on rankings, there’s a pretty good chance the top paid-up-front podcast apps — Pocket Casts, Downcast, and PodCruncher — made more money than I did. And all three probably have far more users, each, than Overcast.

This year, with 2.0, I decided, for various reasons, to replace the “free with paid unlock” model with an “everything’s free, pay what you want” model.

And I finally got the pushback I expected last year: Michael Anderson says this is “not quite” predatory pricing. Michael’s narrative is dramatic, but untrue. No first-world iOS developer will “starve” if their app doesn’t sell, and I can’t spend years on an app that makes no money.

Similar reasoning as last year guided me on this year’s model:

I wasn’t very competitive against Pocket with Instapaper, and Pocket “won” (at least in the sense of having far more users, although if I had to choose either company to be running today, I’d definitely pick Instapaper).

I’m trying not to repeat my mistakes, and one of the biggest mistakes I made was putting short-term gain from paid-app sales above long-term growth. I watched my biggest competitor clone all of my features, raise VC money, and hire a staff. I knew he’d go completely free months before he did. He wasn’t doing anything I couldn’t do, but I wasn’t doing it. I knew I was vastly outgunned, but I just sat back and let it happen.

This time, I’m not too worried about Pocket Casts and Castro. Well, a little — that instinct never fully leaves a person. But even after Pocket Casts ships their silence skipper and volume booster shortly on iOS and Castro 2 comes out with a far nicer UI than I could ever imagine, they have their users, I have mine, and we’ll all be fine. We have much bigger problems than each other.

Podcasts are hot right now. Big Money is coming.

Big Money isn’t going to sell nicely designed, hand-crafted, RSS-backed podcast players for $2.99 or ask you to pay what you want to support them, because that doesn’t make Big Money.

They’re coming with shitty apps and fantastic business deals to dominate the market, lock down this open medium into proprietary “technology”, and build empires of middlemen to control distribution and take a cut of everyone’s revenue.

That’s how you make Big Money. And it usually works.

With those challenges on the horizon, this is the worst time for the indie-podcast world to put up any unnecessary barriers. I don’t know if Overcast stands a chance of preventing the Facebookization of podcasting, but I know I’m increasing the odds if my app is free without restrictions. As long as I can make money some other way, I’m fine.

Predatory pricing is setting the price so low that competitors can’t match it, by making yourself lose money until they all go out of business. It’s usually not illegal, although most people consider it fairly rude (except when VC-funded companies do it and call it “disruption”).

But I don’t need to do that. Patronage works. I may be taking a pay cut for a while, but it’s still very profitable for an individual. As long as I can keep the lights on and the virtual servers running, I’m making enough, and I’m not doing anything that anyone else can’t do.

And this time, as Big Money comes, I’m ready.

Automatic social discipline

I lack self-control and waste far too much time on social apps on my computer, especially Twitter, and more recently, Slack. Here’s a typical weekly breakdown as reported to me by the very good RescueTime:

I could just uninstall them or block their services at the network level, but I need both of them for parts of my work — I just don’t need to keep switching over to them constantly and wasting so many hours per week. Without any intervention, I’ll just habitually leave these apps open, right next to what I’m working on, resulting in a steady stream of tiny interruptions throughout the day as new messages trickle in.

Tonight, I hacked together yet another crazy idea to try to mitigate these problems: a script that automatically quits social and news apps every 10 minutes unless I’m actively using them, or if I’m podcasting (in which case I want them to stay open even if they’re not in the foreground).

Here’s how to do this, if you’re interested:

Open Script Editor and save this as an AppleScript somewhere (I saved it as ~/antisocial.scpt):

set quitlist to {"Tweetbot"}
set exceptionTriggerList to {"Skype"}

tell application "System Events"
    set activeAppName to name of the first process whose frontmost is true
end tell

set exceptionRunning to false
repeat with exceptionName in exceptionTriggerList
    if exceptionRunning is false and application exceptionName is running then
        set exceptionRunning to true
    end if
end repeat

if exceptionRunning is false then
    repeat with appName in quitlist
        if (activeAppName as string) is not (appName as string) and application appName is running then
            tell application appName to quit
        end if
    end repeat
end if

My lists on top there mean, “Quit Tweetbot, Slack, and ReadKit if they are not the active application, but only if Skype isn’t open.” Adjust as necessary.

Then you’ll need launchd to run it at your desired time interval. Create a com.marcorules.antisocial.plist file in ~/Library/LaunchAgents that points to the AppleScript like this:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>EnableGlobbing</key>
    <false/>
    <key>Label</key>
    <string>com.marcorules.antisocial</string>
    <key>LowPriorityIO</key>
    <false/>
    <key>Nice</key>
    <integer>0</integer>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/osascript</string>
        <string>/Users/YOURUSERNAMEHERE/antisocial.scpt</string>
    </array>
    <key>StartInterval</key>
    <integer>600</integer>
</dict>
</plist>

Change the YOURUSERNAMEHERE bit to point to where you saved that AppleScript, and set the StartInterval integer to your desired time interval in seconds (600 = 10 minutes).

Then run this in Terminal to add this new task to launchd:

launchctl load ~/Library/LaunchAgents/com.marcorules.antisocial.plist

You can test it by opening any of the targeted apps, then running this in Terminal:

launchctl start com.plisterine.antisocial

…or just waiting 10 minutes.

I don’t know if this will stick, or if it’ll meaningfully solve my problem, but it’s worth a try.