Release APP_DISPLAY
One command does the whole pipeline: macos release __SLUG__. This skill is the checklist around it.
Before releasing
- Finalize the changelog. Move work from
## Unreleasedinto a dated## X.Y.Z - YYYY-MM-DDsection. Entries are user-facing prose — what someone notices, not internal churn. This text becomes the GitHub release notes and the Sparkle appcast description verbatim. - Set the version.
macos bump __SLUG__ --version X.Y.Z(ormacos bump __SLUG__to bump just the build number). The build number must strictly increase — Sparkle compares on it. - Clean tree. Commit everything; the release refuses to run on a dirty working tree.
- Preview.
macos release __SLUG__ --dry-run— it lists every step and flags anything missing.
Release
macos release __SLUG__
It runs: preflight → swift test → build+sign+notarize+staple → GitHub release (zip + dSYM) →
EdDSA-signed appcast (committed + pushed) → Homebrew cask → bump build number. It's idempotent and
fail-fast; re-running after a fix is safe.
After releasing — verify the chain
- The GitHub release exists with the zip asset.
appcast.xmlhas the new<item>with ansparkle:edSignature.- The enclosure URL returns 200 (
curl -I <url>). brew install --cask __SLUG__(if a tap is configured) installs the new version.- Install the previous build and confirm Sparkle offers + applies the update.
A release isn't done until that chain checks out.
Rules
- Signing/notary creds come from
~/.config/macos— never hardcode or commit them. - If notarization fails, fix and re-run; don't ship an un-notarized build (Gatekeeper will block it).