How to Distribute a macOS App Outside the App Store

If you're building a Mac app, distributing through the App Store isn't your only option. Many of the most popular Mac apps like ChatGPT, Firefox, Sketch, Sublime Text ship directly to users without ever going through App Review.

Here's why you might want to do the same, and exactly how to do it.

Why distribute outside the App Store?

The Mac App Store takes a 30% cut of every sale. That's significant, but it's not the only reason developers choose to self-publish:

  • No App Review delays. Ship on your own schedule, not Apple's.
  • Direct customer relationship. You own the relationship and the payment flow.
  • Full control. Use private APIs, kernel extensions, or system-level features that the App Store doesn't allow.
  • No sandboxing requirement. The App Store requires App Sandbox. Outside it, you choose the security model that fits your app.

The trade-off is that you need to handle a few things yourself: code signing, notarization, updates, and packaging. Let's walk through each.

What you need

Before distributing outside the App Store, you'll need:

  1. An Apple Developer account ($99/year) — required for code signing certificates and notarization.
  2. A Developer ID certificate — this is different from the App Store distribution certificate.
  3. A way to notarize your app — Apple requires this so macOS doesn't show scary warnings to your users.
  4. An update mechanism — your users need a way to get new versions.
  5. A distribution format — typically a DMG installer.

Code signing and notarization

Every Mac app distributed outside the App Store must be signed with a Developer ID certificate and notarized by Apple. Without this, macOS Gatekeeper will block your app or show a warning dialog that scares users away.

Notarization is Apple's automated check that your app is free of malware and has been properly signed. The process involves uploading your app to Apple's servers, waiting for approval (usually a few minutes), and then stapling the notarization ticket to your app.

You can do this manually with xcrun notarytool, or let Amore handle it automatically.

Over-the-air updates with Sparkle

Without the App Store, you need your own update mechanism so your users don’t have to download your app from your website again once you released a new version. Sparkle is the de facto standard for macOS app updates. It's been around for over a decade, is used by thousands of apps, and provides a familiar update experience for Mac users.

Sparkle works by checking an RSS-like feed (called an appcast.xml) for new versions. When an update is available, it downloads it, verifies the cryptographic signature, and installs it, all with a native macOS UI your users already recognize.

Setting up Sparkle involves adding the framework to your project, configuring your Info.plist with a feed URL and public key, and hosting the appcast somewhere. You can follow our step-by-step Sparkle setup guide.

Creating a DMG installer

A DMG (disk image) is the standard way to distribute Mac apps outside the App Store. Users download the DMG, open it, and drag your app to the Applications folder. It's simple and familiar.

A good DMG includes a custom background with a visual arrow pointing from your app icon to the Applications folder. The DMG itself should be code-signed and notarized so users don't see any warnings.

Creating DMGs manually with hdiutil and setting up the background and layout is tedious. Amore creates DMG installers automatically as part of the release process.

Putting it all together

Each piece — code signing, notarization, Sparkle updates, DMG creation — is well-documented individually. The challenge is wiring them all together into a reliable release workflow.

That's exactly what Amore does. It's a Mac app and CLI that handles the entire release pipeline:

  1. Code-sign your app with your Developer ID
  2. Notarize with Apple
  3. Create a DMG installer
  4. Sign the update for Sparkle
  5. Generate the appcast.xml
  6. Upload everything for distribution

You can do this through the GUI by dragging your app in, or with a single CLI command:

amore release --scheme Acme

Get started with Amore in under 5 minutes. It's free for open-source projects and has a free tier for everyone else.