March 2026 · 8 min read

Building PrivacyStage in public, mostly

Why I started a small studio, what the first year of shipping a native Mac app looked like, and the things I'd genuinely do differently.

PrivacyStage started, like most of my better ideas, as a bad afternoon. I was about to share my screen on a sales call, panicked, and spent ten minutes closing apps, muting notifications, and mentally rehearsing what was on each desktop. I shared anyway. A Slack DM popped up almost immediately. It wasn't catastrophic — it never is — but the failure mode was so obvious it felt embarrassing that no-one had built the thing.

So I went looking. The available options on the Mac were either ten-tab Electron monsters that wanted to manage my calendar, or one-trick demos that hadn't shipped an update since Catalina. I wanted something quiet that lived in the menu bar and did exactly one thing well. So I built it.

What I expected versus what happened

I expected the hard part to be the OCR — it's the bit that demos well, and it sounds vaguely scary. In practice, the Vision framework does most of the work for you, and the interesting question is what to mask, not how to mask it.

The actually-hard part was the virtual camera. macOS lets third-party apps publish a video device via a CoreMediaIO extension, which is great. The problem is that some clients — most notably the WebRTC stack used by Google Meet and Safari — quietly reject any frame whose format descriptor isn't exactly what they expect. Get one extension attachment wrong and your perfect 1080p feed shows up as a black square with no error. I lost an embarrassing number of nights to this before I figured out the rule:

Use a plain CMVideoFormatDescriptionCreate with no extensions. Anything else risks silent rejection. Save your fancy attachments for somewhere they're actually wanted.

Things I did right

  • Shipped a TestFlight build in week three. Real feedback from real users beats any plan.
  • Wrote the marketing copy before the feature was finished. If I couldn't explain it in one sentence, the feature wasn't ready.
  • Kept the free tier genuinely useful. The Pro upgrade isn't a wall, it's a reward.
  • Said no to a "team plan" three separate times in the first six months. There is no team plan yet.

Things I'd do differently

  • Build the menu bar UI second, not first. The settings window is the spine of the app — the menu bar is the front porch.
  • Start the App Store review process two weeks earlier than I think I need to. Always.
  • Take screenshots as I go. By launch day my Photos library was 90% half-finished mockups and 10% the cat.
  • Email more. Every cold email I sent to a beta tester produced more signal than a week of analytics ever would.

What's next

PrivacyStage isn't done — it's barely begun. The next year is about depth: more masking patterns, smarter detection of "presentation moments," and a small but genuinely useful integration with screen-recording tools. A second app is also lurking in the notebook. More on that when there's more to say.

If you've used PrivacyStage and have thoughts — kind or otherwise — write to me at [email protected]. I read everything.


Want to follow along? There is no newsletter, by design. Check back when you remember. Or just send a suggestion — that puts you on the very short list of people I owe a reply to.

Read more

A trickle of essays on independent development, Apple platforms, and the quiet craft of shipping small.