Skip to content

Notarize releases so a download opens without a warning - #20

Merged
progremir merged 4 commits into
mainfrom
claude/unsigned-dmg
Oct 25, 2026
Merged

progremir merged 4 commits into
mainfrom
claude/unsigned-dmg

Conversation

@progremir

@progremir progremir commented Oct 25, 2026 •

Copy link
Copy Markdown
Owner

The v0.1.0 DMG would not open after download. Gatekeeper said it could not verify the image was free of malware, because the DMG was signed with an Apple Development certificate.

What changed

  • release.sh signs the app and the DMG with Developer ID by default (Developer ID Application: Emir Amanbekov (ZZ2G9658MN)). It then notarizes the DMG with the hyperpoint notarytool keychain profile, staples it and checks it with spctl.
  • --publish refuses anything but a Developer ID build, so an un-notarized DMG cannot reach a release again.
  • With any other identity (an Apple Development check build, or CI's ad-hoc build) the DMG is left unsigned. Gatekeeper refuses a downloaded DMG signed with Apple Development but mounts an unsigned one.
  • build-app.sh signs with the hardened runtime, which notarization requires. SIGN_TIMESTAMP=1 adds the secure timestamp. Hyperpoint needs no entitlements under it: it only spawns /usr/bin/hidutil and uses SMAppService.
  • The installer window's Open Anyway hint becomes "Hyperpoint lives in the menu bar, next to the clock."
  • The v0.1.0 release assets were replaced with an unsigned DMG, which now mounts after download.

Before the next release

  1. Create a Developer ID Application certificate in Xcode › Settings › Accounts › Manage Certificates.
  2. Run xcrun notarytool store-credentials hyperpoint --apple-id <apple-id> --team-id ZZ2G9658MN with an app-specific password.

Verification

  • With the browser's quarantine flag, open refused the Apple Development-signed DMG (-128). The unsigned one mounted and showed the installer window.
  • Without the profile, release.sh stops before building. --publish with an Apple Development identity is refused.
  • An Apple Development check build has flags=0x10000(runtime) on the app and an unsigned DMG. The CI ad-hoc path still builds.
  • Not yet run: the notarytool submission, and the hardened-runtime app on the real devices. Both need the Developer ID certificate.

🤖 Generated with Claude Code

Emir Amanbekov and others added 2 commits October 26, 2026 01:49
Gatekeeper refused to open the v0.1.0 DMG after download because it was signed with an Apple Development
certificate. An unsigned image mounts and shows the installer window; the app inside keeps its signature.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A notarized, stapled DMG opens after download without a Gatekeeper warning, so the installer drops the Open Anyway
hint. The app is signed with the hardened runtime notarization needs. Publishing refuses anything but Developer ID.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@progremir progremir changed the title Leave the release DMG unsigned so a download opens Notarize releases so a download opens without a warning Oct 25, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@progremir
progremir force-pushed the claude/unsigned-dmg branch from 8b1e19c to b71e4c0 Compare October 25, 2026 20:56
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@progremir
progremir merged commit 35dda7c into main Oct 25, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant