Skip to content

build(macos): sign + notarize builds (local opt-in and in CI)#54

Merged
TCVinNYC merged 1 commit into
mainfrom
feat/macos-signing
Jun 22, 2026
Merged

build(macos): sign + notarize builds (local opt-in and in CI)#54
TCVinNYC merged 1 commit into
mainfrom
feat/macos-signing

Conversation

@TCVinNYC

Copy link
Copy Markdown
Member

Makes signed, notarized macOS builds first-class (previously the script only printed manual steps).

What

  • build_macos.sh: opt-in signing via MACOS_SIGN_IDENTITY — deep-signs the .app (hardened runtime + entitlements.plist), signs the .dmg, and notarizes + staples when notary creds are present. Unset → unsigned build, manual steps printed as before.
  • release.yml (macOS job): imports a Developer ID cert from secrets into a temp keychain and passes signing/notary env through. No secrets → unsigned .dmg (forks still build).
  • docs/building.md / installation.md: documents the local env vars + the CI secrets.

Action needed: add these repo secrets (Settings → Secrets and variables → Actions)

Secret Value
MACOS_CERTIFICATE_P12_BASE64 Developer ID Application cert exported as .p12, base64'd
MACOS_CERTIFICATE_PASSWORD the .p12 export password
MACOS_SIGN_IDENTITY Developer ID Application: Your Name (TEAMID)
MACOS_NOTARY_APPLE_ID Apple ID email
MACOS_NOTARY_TEAM_ID 10-char Team ID
MACOS_NOTARY_PASSWORD app-specific password

I can't test real signing without the cert; the script's unsigned path and the YAML are validated.

🤖 Generated with Claude Code

Make signed, notarized macOS builds first-class instead of a printed TODO:

- build_macos.sh: when MACOS_SIGN_IDENTITY is set, deep-sign the .app (hardened
  runtime + entitlements) before building the .dmg, then sign the .dmg and, when
  notary credentials are present (keychain profile or Apple-ID), notarize +
  staple it. Unset → unsigned build with the manual steps printed as before.
- release.yml: the macOS job imports a Developer ID cert from repo secrets into a
  temporary keychain and passes the signing/notary env through; absent secrets
  fall back to an unsigned .dmg so forks still build.
- docs/building.md: document the opt-in local env vars and the required CI
  secrets (MACOS_CERTIFICATE_P12_BASE64/PASSWORD, MACOS_SIGN_IDENTITY,
  MACOS_NOTARY_APPLE_ID/TEAM_ID/PASSWORD). installation.md: signed releases open
  normally.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@TCVinNYC TCVinNYC merged commit 7317837 into main Jun 22, 2026
@TCVinNYC TCVinNYC deleted the feat/macos-signing branch June 22, 2026 04:54
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