• About ▾

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

Under the Radar

Introducing Under the Radar, a new podcast for independent app developers, with “Underscore” David Smith and me on Relay FM.

Subscribe links:

I’ve been wanting to do another development-focused podcast for a while, but kept talking myself out of it. I didn’t think I could afford the time commitment of another full-blown tech podcast, I didn’t want to take away from the one I’m already on, and I wasn’t sure what form it could take and who I’d want to do it with. So I knocked those out, one by one.

The co-host was the easy part: David and I talked about potentially doing this at WWDC this year, and we very quickly agreed that it could work well.

The distinction from ATP is straightforward: ATP occasionally has developer topics, but it is not a developer show. It covers such broad topics within technology that there usually isn’t time to delve too far into programming or software-business topics, and many people in ATP’s audience aren’t software developers. The new show would be, completely and unambiguously, a show for developers about development.

Time and format concerns were solved together. I always enjoyed David’s Developing Perspective podcast, mostly because it’s great, but partly because it was always explicitly “never longer than 15 minutes”. I’d have my Overcast playlist sort it as the top-most priority so its episodes always showed up first, because I knew I could get through the entire short show while running almost any errand.

Short episodes with an explicit time limit help focus a show, keep it moving, and make it more accessible to new listeners. And, importantly for us, a short show is easier to schedule and takes far less time to record and edit. I don’t have time in my life right now to do another 2-hour show every week, but I can do a short one. We both felt that 15 minutes would be too tight for a two-person discussion, so we’re going with a 30-minute limit.

Let’s get started.

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" "">
<plist version="1.0">

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.

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.

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.

Apple refunding all purchases of Peace

Apple notified me this afternoon that they’ll be proactively refunding all purchases of Peace. It will probably take a few days to process.

As far as I know, this effectively never happens. When I decided to pull the app, I asked some Apple friends if this was even possible, and we all thought the same thing: iTunes billing works the way it works, period, and no special cases can be made.

One of the ways it works, which most customers don’t know, is that developers have no ability to issue refunds. I had to tell people to individually request refunds from Apple, which is not only a clunky process but also left me with the question of whether it was right to keep the remaining money from it, or what to do with it if not — a question that I don’t think has a widely agreeable “right” answer.1 (Like ad-blocking.)

Over 13,000 people were granted refunds through the regular system over the last few days, leading to some interesting AppFigures reports. But that could never cover all buyers of the app.

Today, Apple made the decision for me, in a way that I didn’t even think was possible, and I’m actually happy — or at least, as happy as someone can be who just made a lot of money on a roller coaster of surprise, guilt, and stress, then lost it all suddenly in a giant, unexpected reset that actually resolves things pretty well.

  1. Even the simple answer of “Give it to charity!”, which a few hundred people told me to do on Twitter (between the couple thousand calling me an asshole), poses an infinitely arguable problem: which charity? 

Just doesn’t feel good

I’ve pulled Peace from the App Store. I’m sorry to all of my fans and customers who bought this on my name, expecting it to be supported for longer than two days. It’ll keep working for a long time if you already have it, but with no updates.

If you want a refund, here’s how you do that.

Update: Apple is refunding all purchases automatically.

As I write this, Peace has been the number one paid app in the U.S. App Store for about 36 hours. It’s a massive achievement that should be the highlight of my professional career. If Overcast even broke the top 100, I’d be over the moon.

Achieving this much success with Peace just doesn’t feel good, which I didn’t anticipate, but probably should have. Ad blockers come with an important asterisk: while they do benefit a ton of people in major ways, they also hurt some, including many who don’t deserve the hit.

Peace required that all ads be treated the same — all-or-nothing enforcement for decisions that aren’t black and white. This approach is too blunt, and Ghostery and I have both decided that it doesn’t serve our goals or beliefs well enough. If we’re going to effect positive change overall, a more nuanced, complex approach is required than what I can bring in a simple iOS app.

I still believe that ad blockers are necessary today, and I still think Ghostery is the best one, but I’ve learned over the last few crazy days that I don’t feel good making one and being the arbiter of what’s blocked.

Ad-blocking is a kind of war — a first-world, low-stakes, both-sides-are-fortunate-to-have-this-kind-of-problem war, but a war nonetheless, with damage hitting both sides. I see war in the Tao Te Ching sense: it should be avoided when possible; when that isn’t possible, war should be entered solemnly, not celebrated.

Even though I’m “winning”, I’ve enjoyed none of it. That’s why I’m withdrawing from the market.

It’s simply not worth it. I’m incredibly fortunate to be able to turn away an opportunity like this, and I don’t begrudge anyone else who wants to try it. I’m just not built for this business.

I suggest you use Ghostery on the desktop and one of these competitors on iOS instead, both of which are good apps that were probably about to surpass Peace anyway:

And again, if you want a refund on Peace, here’s how to get it.

I know pulling Peace from the store after just two days is going to be an immensely unpopular move, and subject me to a torrent of unpleasantness. But that’ll end soon enough, and that’s better than how I’d feel if I kept going.

Last night, in an effort to improve my morale, I did some low-level technical work on Overcast, which I greatly enjoy. It was a breath of fresh air: rather than a tricky business of messy distinctions and low technical challenge, I got to engage the technical part of my brain and make something great that doesn’t hurt anyone, with no asterisks or qualifications.

That’s my peace.

Why Peace 1.0 blocks The Deck ads

One of the most common questions I’m getting about Peace is whether and why it blocks ads from The Deck, my own site’s ad publisher. Most notably, my friend and colleague John Gruber tweeted:

I think if your Safari Content Blocker blocks The Deck by default, it’s wrong. I dare you to defend it.

The Deck is unusually well-behaved for an ad provider: its ads are small, unintrusive, non-animated, and classy, and while it’s loaded by a third-party JavaScript include, it doesn’t set cookies or perform any tracking. That’s why I publish Deck ads on this site, and why many of my friends and colleagues do as well.

But Peace uses the Ghostery database, and Ghostery includes The Deck. It’s classified as “Advertising”, and even though it’s far nicer than most other entries in the category, it’s fair to call it advertising.1

I was therefore faced with a decision about The Deck. I had to either:

And once I looked at it like that, it wasn’t a difficult decision. It’s uncomfortable, but I’d rather be consistent and fair.

In Ghostery’s desktop-browser plugins, users can selectively disable individual rules, so you could, for example, whitelist The Deck if you find their ads acceptable. Peace 1.0 doesn’t offer this level of granularity — you can whitelist individual publisher sites, like, but not ad rules across all sites. That wasn’t an opinionated decision — it was simply cut for 1.0 to ship in time, and I’ll likely add it in the first update.

Whether such “good” ads should be unblocked by default is worth considering. In the past, ad-blockers’ attempts to classify “acceptable” ads have been problematic, to say the least. I don’t know if that can be done well, but I’d consider it if it could.

  1. Some people have requested that I distinguish between “ads” and “trackers” in the options. But this distinction isn’t very useful: most ads are also cross-site trackers, so if you want to block most tracking, you’ll need to block most ads.

    Simply blocking third-party cookies isn’t enough to prevent tracking, either: there are many ways to uniquely identify you without using cookies. 

Ads via The Deck