DEV Community

Apoorv Darshan
Apoorv Darshan

Posted on

Shipping a native Swift Mac app via npm to skip Gatekeeper

Distributing a Mac app as a solo dev has an annoying tollbooth: Gatekeeper. Hand someone a prebuilt .app and macOS slaps it with the com.apple.quarantine attribute, then refuses to open it unless you've paid for Apple notarization.

For TetherShot, I sidestepped the whole thing.

The trick: don't ship a binary at all. Ship the source, and build it on the user's machine.

npm install -g tethershot
Enter fullscreen mode Exit fullscreen mode

That postinstall doesn't download a .app. It compiles one from source using the Xcode Command Line Tools (swift build), then drops the result into ~/Applications.

Why it works:

  • A bundle built locally never receives the quarantine attribute.
  • No quarantine flag means Gatekeeper doesn't block it.
  • No Gatekeeper block means no notarization needed — zero Apple Developer Program cost.

The user gets a native app that just opens. No "unidentified developer." No right-click-open dance.

The only requirement is the Xcode CLT, which most Mac devs already have (xcode-select --install).

TetherShot itself is a menu-bar app for pixel-perfect iPhone screenshots over USB or Wi-Fi — local-first, MIT, no telemetry. But the distribution model is the part I'd reuse for any Swift side project.

Source: https://github.com/apoorvdarshan/TetherShot

Top comments (0)