Loading...
Loading...
Release a native macOS app to GitHub with DMG packaging and Sparkle appcast updates. Use this skill whenever the user wants to publish a new version, create a release, ship an update, push a release to GitHub, or update the appcast. Also trigger when the user mentions DMG creation, Sparkle signing, notarization, archiving, or anything related to distributing a new version of their macOS app. This covers the full release pipeline: archive, notarize, export, create DMG, sign with Sparkle EdDSA, update appcast.xml, git push, and GitHub release creation.
npx skill4agent add fayazara/macos-app-skills macos-releaseBump version → Archive → Notarize → Export → Create DMG → Sign DMG → Update appcast.xml → Git push → GitHub Release| Tool | Install | Purpose |
|---|---|---|
| | Creates the DMG installer |
| | Creates GitHub releases |
| Built-in | Pushes appcast changes |
Sparkle | Built automatically when the project is built with Sparkle | EdDSA-signs the DMG |
sign_updatefind ~/Library/Developer/Xcode/DerivedData -name "sign_update" -type f 2>/dev/null | head -1MARKETING_VERSION1.2CURRENT_PROJECT_VERSION5# Check current values
grep -E "MARKETING_VERSION|CURRENT_PROJECT_VERSION" YourApp.xcodeproj/project.pbxproj | head -4~/Downloads/YourApp.appcreate-dmg \
--volname "YourApp" \
--window-pos 200 120 \
--window-size 660 400 \
--icon-size 160 \
--icon "YourApp.app" 180 170 \
--app-drop-link 480 170 \
--hide-extension "YourApp.app" \
~/Downloads/YourApp.dmg \
~/Downloads/YourApp.app/path/to/sign_update ~/Downloads/YourApp.dmgsparkle:edSignature="BASE64..." length="12345"<item><channel>appcast.xml<item>
<title>Version 1.2 (Build 5)</title>
<pubDate>Mon, 26 May 2026 12:00:00 +0000</pubDate>
<sparkle:version>5</sparkle:version>
<sparkle:shortVersionString>1.2</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
<description><![CDATA[<ul><li>Feature one</li><li>Bug fix two</li></ul>]]></description>
<enclosure url="https://github.com/OWNER/REPO/releases/download/v1.2/YourApp.dmg"
type="application/octet-stream"
sparkle:edSignature="THE_SIGNATURE_FROM_STEP_5"
length="THE_LENGTH_FROM_STEP_5" />
</item>pubDatedate -Rgit add appcast.xml
git commit -m "Release v1.2 appcast"
git push origin maingh release create v1.2 \
~/Downloads/YourApp.dmg \
--title "v1.2" \
--notes "- Feature one
- Bug fix two"references/release-pipeline.mdsign_updateplutilrelease.jsonrelease.jsoncli/release.example.json{
"app_name": "MyApp",
"github_repo": "owner/myapp"
}app_namegithub_repo| Field | Default | Description |
|---|---|---|
| | The .app bundle filename |
| | Output DMG filename |
| | Branch to push appcast to |
| | Sparkle minimum macOS version |
| | Appcast filename in repo root |
| | DerivedData prefixes to search for |
go run github.com/fayazara/macos-app-skills/release/cli@latestgo run ./release/clirelease.jsoncreate-dmgghgitsign_update~/Downloads/create-dmgsign_updateappcast.xml| Problem | Solution |
|---|---|
| Build the project in Xcode first so DerivedData has the Sparkle artifacts |
| Run |
| Duplicate build number in appcast | Bump |
| Notarization fails | Check signing identity, entitlements, and hardened runtime settings |
| DMG is too large | Check for debug symbols or unnecessary frameworks in the export |
| App won't update | Verify |
appcast.xmlhttps://raw.githubusercontent.com/OWNER/REPO/main/appcast.xmlSUFeedURL