Skip to content

Add Developer ID signing + notarized DMG release pipeline - #3

Merged
modfox merged 1 commit into
mainfrom
signing-release-setup
Jul 13, 2026
Merged

Add Developer ID signing + notarized DMG release pipeline#3
modfox merged 1 commit into
mainfrom
signing-release-setup

Conversation

@modfox

@modfox modfox commented Jul 13, 2026

Copy link
Copy Markdown
Owner

Sets up a signed + notarized distribution path so Nib.app can be handed to other people via GitHub Releases — no Gatekeeper warnings, and a stable cdhash that keeps the Accessibility / Input Monitoring (TCC) grants from resetting across updates (the problem flagged in INSTALL.md).

What's here

  • driver/scripts/build-app.sh — builds a universal (arm64 + x86_64) release binary and assembles an unsigned Nib.app, stamping version/build from git.
  • driver/scripts/release.sh — Developer ID sign (Hardened Runtime) → notarize → staple → package Nib-<version>.dmg. Works locally (notarytool keychain profile) or in CI (App Store Connect API key).
  • driver/packaging/entitlements.plist — empty Hardened Runtime entitlements. Nib needs none (HID + CGEvent are TCC-gated, not entitlement-gated) and must not be sandboxed, which would block raw HID access.
  • .github/workflows/release.yml — on a v* tag: import cert → build → sign → notarize → publish DMG to a Release.
  • driver/RELEASING.md — full walkthrough (cert, API key, repo secrets, tagging).
  • INSTALL.md / .gitignore — point at RELEASING.md; ignore driver/build/.

Safe to merge as-is — nothing runs yet

The release workflow is dormant by default: the job is gated on if: vars.RELEASE_ENABLED == 'true', so a v* tag push is a no-op until that repo variable is set. No credentials or personal identity are in any committed file — the Developer ID cert and secrets are added later, only when you actually opt in.

To go live (later)

  1. Get a Developer ID Application cert + an App Store Connect API key.
  2. Add the repo secrets listed in RELEASING.md.
  3. Set repo variable RELEASE_ENABLED=true.
  4. git tag v0.2.0 && git push origin v0.2.0.

🤖 Generated with Claude Code

Adds a signed/notarized distribution path so builds can be handed to other
people via GitHub Releases without Gatekeeper warnings, and with a stable
cdhash that keeps TCC (Accessibility/Input Monitoring) grants across updates.

- scripts/build-app.sh: build a universal (arm64+x86_64) release binary and
  assemble an unsigned Nib.app, stamping version/build from git.
- scripts/release.sh: Developer ID sign (Hardened Runtime), notarize, staple,
  and package Nib-<version>.dmg. Works locally (notarytool profile) or in CI
  (App Store Connect API key).
- packaging/entitlements.plist: empty Hardened Runtime entitlements — HID +
  CGEvent access is TCC-gated, and the app must not be sandboxed.
- .github/workflows/release.yml: on a v* tag, sign/notarize/publish the DMG.
  Dormant by default (if: vars.RELEASE_ENABLED == 'true') so it never runs
  until explicitly opted in.
- RELEASING.md: full walkthrough (cert, API key, secrets, tagging).
- INSTALL.md/.gitignore: point at RELEASING.md; ignore driver/build/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@modfox
modfox merged commit 7075c4f into main Jul 13, 2026
1 check passed
@modfox
modfox deleted the signing-release-setup branch July 13, 2026 16:24
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