Loading page...Загружаем страницу...正在加载页面...
AtlasRepo

Shipping a Mac app without a $99 Apple Developer account

Description and use

Kopi uses a self‑signed certificate to avoid the $99 Apple Developer Program fee, keeping permissions across updates while accepting a single Gatekeeper warning on first launch.

Problem

How to ship a macOS app without paying the $99 annual Apple Developer Program fee while maintaining a good user experience.

Outcome

Kopi can be distributed to macOS users without paying Apple’s $99 fee, preserving permission continuity across updates while accepting a single Gatekeeper warning on first launch.

Workflow

  • Create a self‑signed code‑signing certificate and store its private key in the repo’s secrets.
  • Sign every release with that certificate, producing a stable designated requirement based on bundle identifier and certificate leaf.
  • Import the certificate into the keychain during the release workflow so Tauri can sign the app.
  • Provide users with an install guide, a .dmg background, and a one‑line terminal script to bypass quarantine.
  • After the first launch, users grant permissions once; subsequent updates are signed with the same certificate and install without quarantine, so Gatekeeper does not block them.
  • Users can disable automatic updates in the app settings if desired.

Evidence

On macOS, an app downloaded from the internet opens without a Gatekeeper warning only if it is signed with an Apple Developer ID certificate and notarized by Apple.

Source

For an ad‑hoc signature, that requirement includes the build's own hash. Every new build has a new hash, so every new build looks like a different app to macOS.

Source

I created a self‑signed code‑signing certificate and stored it in the repository's secrets. Every release is signed with it.

Source

The workaround is to have the release workflow import the certificate into the keychain itself, then let the build sign with that identity.

Source

The script doesn't quarantine the app, so Gatekeeper doesn't block the first launch.

Source

  • Record date: 2026-10-21T20:11:18.315Z