Skip to content

Signed, notarizable .dmg release tooling - #12

Open
okaris wants to merge 3 commits into
digimata:masterfrom
okaris:signed-release-dmg
Open

Signed, notarizable .dmg release tooling#12
okaris wants to merge 3 commits into
digimata:masterfrom
okaris:signed-release-dmg

Conversation

@okaris

@okaris okaris commented Jul 29, 2026

Copy link
Copy Markdown

What

Adds tooling to ship quill as a downloadable, Developer ID-signed and Apple-notarized macOS release — a menu-bar quill.app inside a .dmg.

Everything signs with a single Developer ID Application certificate — no Developer ID Installer cert required (that's why this uses an .app/.dmg rather than a .pkg).

Changes

  • scripts/build-release.sh — one command: build → wrap in quill.app → codesign (hardened runtime + entitlements) → notarize + staple → package .dmg → sign → notarize + staple. Config via env vars; SKIP_NOTARIZE=1 for signed-only local builds.
  • packaging/Info.plist — app bundle plist, LSUIElement (menu-bar agent, no dock icon), version templated via @VERSION@.
  • packaging/quill.entitlementscom.apple.security.device.audio-input.
  • .github/workflows/release.yml — on a v* tag, builds/signs/notarizes and attaches the .dmg to the GitHub release. Secrets documented at the top of the file.
  • README — Download (drag quill.app to Applications) and Releasing sections.

Design note

The README describes quill as "a single Swift binary, no app bundle." This PR keeps that intact — the .app is a thin distribution wrapper around the same executable; the CLI subcommands (quill doctor, quill run, quill install) still work via the bundled binary, and source builds are unchanged. The .app exists purely so distribution can be signed + notarized + stapled with the Developer ID Application cert (a bare binary can't be stapled).

Notarization

Fully wired up. A signed and notarized v0.1.0 .dmg built with this tooling is available for reference: https://github.com/okaris/quill/releases/tag/v0.1.0 (spctl reports source=Notarized Developer ID).

For CI, add the certificate + App Store Connect notary secrets (documented atop release.yml) and push a v* tag.

okaris added 3 commits July 29, 2026 12:37
Package quill as a menu-bar quill.app shipped inside a .dmg, signed with a
Developer ID Application certificate. Everything signs with a single cert —
no Developer ID Installer cert required.

- scripts/build-release.sh: build → wrap in quill.app (LSUIElement) →
  codesign (hardened runtime + entitlements) → notarize + staple app →
  package .dmg → sign → notarize + staple. Config via env; SKIP_NOTARIZE=1
  for signed-only local/test builds.
- packaging/Info.plist: app bundle plist (@Version@ templated).
- packaging/quill.entitlements: audio-input entitlement.
- .github/workflows/release.yml: on v* tag, build/sign/notarize and attach
  the .dmg to the GitHub release.
- README: Download (.dmg, drag to Applications, first-launch note) and
  Releasing sections.

The .app is a thin distribution wrapper; the core stays a single binary and
the CLI subcommands work via the bundled executable.

Claude-Session: https://claude.ai/code/session_01Mq7wGXgaovgYzcYe5snUUJ
Reuse the exact feather from MenuBarController.featherSVG as the app/Finder
icon so the bundle and the menu bar match. packaging/icon.svg renders to
packaging/quill.icns; build-release.sh installs it into Contents/Resources
and Info.plist points CFBundleIconFile at it.

Claude-Session: https://claude.ai/code/session_01Mq7wGXgaovgYzcYe5snUUJ
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