fayazara/macos-app-skills

macos-release

Release a native macOS app to GitHub with DMG packaging and Sparkle appcast updates.

Ver código-fonte

Como usar

  1. Copie o comando e verifique o pacote antes de instalar no seu ambiente de agente.
  2. Consulte no original as ferramentas, credenciais e ambientes necessários.
  3. Descreva os dados de entrada e a entrega esperada; confira a saída com as fontes.
npx skills add https://github.com/fayazara/macos-app-skills --skill macos-release

Antes de começar

  • A instalação não inclui assinatura de modelo, franquia API ou acesso aos seus arquivos.
  • Estrelas e instalações indicam atividade, não um teste independente de qualidade ou segurança.
Documento original do Skill

Renderizado do repositório de origem, preservando títulos, exemplos, código, tabelas, links e imagens.

Release macOS App

This skill covers the full release pipeline for distributing a native macOS app outside the Mac App Store via GitHub Releases with Sparkle auto-update support.

Release Pipeline Overview

Bump version → Archive → Notarize → Export → Create DMG → Sign DMG → Update appcast.xml → Git push → GitHub Release

Prerequisites

The user needs these tools installed:

ToolInstallPurpose
create-dmgbrew install create-dmgCreates the DMG installer
ghbrew install ghCreates GitHub releases
gitBuilt-inPushes appcast changes
Sparkle sign_updateBuilt automatically when the project is built with SparkleEdDSA-signs the DMG

The sign_update binary lives in DerivedData after building the project in Xcode:

bash
find ~/Library/Developer/Xcode/DerivedData -name "sign_update" -type f 2>/dev/null | head -1

Step-by-Step Release Guide

1. Bump Version Numbers

In Xcode, update:

  • MARKETING_VERSION (e.g., 1.2) -- the user-facing version
  • CURRENT_PROJECT_VERSION (e.g., 5) -- the build number (must be unique per release)

Or via command line:

bash
# Check current values
grep -E "MARKETING_VERSION|CURRENT_PROJECT_VERSION" YourApp.xcodeproj/project.pbxproj | head -4

2. Archive in Xcode

Product > Archive. This creates a release build with the proper signing identity.

3. Notarize and Export

In the Archives organizer:

  1. Select the archive > Distribute App
  2. Choose "Direct Distribution" (or "Developer ID" for notarization)
  3. Wait for notarization to complete
  4. Export to ~/Downloads/YourApp.app

4. Create DMG

bash
create-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

5. Sign DMG with Sparkle

bash
/path/to/sign_update ~/Downloads/YourApp.dmg

This outputs the EdDSA signature and file length:

sparkle:edSignature="BASE64..." length="12345"

Save both values for the appcast.

6. Update appcast.xml

Add a new <item> at the top of the <channel> in your appcast.xml:

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>

The pubDate should be RFC 2822 format. Generate it:

bash
date -R

7. Commit and Push Appcast

bash
git add appcast.xml
git commit -m "Release v1.2 appcast"
git push origin main

8. Create GitHub Release

bash
gh release create v1.2 \
  ~/Downloads/YourApp.dmg \
  --title "v1.2" \
  --notes "- Feature one
- Bug fix two"

Automating the Pipeline

For frequent releases, build a CLI tool that automates steps 4-8. See references/release-pipeline.md for a template Go CLI that handles DMG creation, signing, appcast updates, and GitHub release creation in one command.

The CLI should:

  • Find sign_update in DerivedData automatically
  • Read version/build from the exported app's Info.plist via plutil
  • Parse and update appcast.xml (preserving existing entries)
  • Interactively collect release notes
  • Show a summary and ask for confirmation before proceeding
  • Create the GitHub release with the DMG attached

Release CLI Tool

This repo includes a Go CLI that automates steps 4-8 (DMG creation through GitHub release) in a single command. It reads configuration from a release.json file in your project root.

Setup

  1. Create a release.json in your project root (see cli/release.example.json):
json
{
  "app_name": "MyApp",
  "github_repo": "owner/myapp"
}

Only app_name and github_repo are required. Everything else has sensible defaults:

FieldDefaultDescription
bundle_name{app_name}.appThe .app bundle filename
dmg_name{app_name}.dmgOutput DMG filename
git_branchmainBranch to push appcast to
min_system_version14.0Sparkle minimum macOS version
appcast_fileappcast.xmlAppcast filename in repo root
derived_data_prefixes["{app_name}-"]DerivedData prefixes to search for sign_update
  1. Run the CLI from your project directory:
bash
go run github.com/fayazara/macos-app-skills/release/cli@latest

Or clone this repo and run locally:

bash
go run ./release/cli

The CLI is interactive -- it prompts for release notes and asks for confirmation before proceeding. It must be run in a terminal the user can interact with.

What the CLI Does

  1. Finds release.json by walking up from the current directory
  2. Checks that create-dmg, gh, git, and Sparkle's sign_update are available
  3. Validates the exported app in ~/Downloads/ (reads version, build, Sparkle keys from Info.plist)
  4. Warns if the build number already exists in the appcast
  5. Collects release notes interactively (one bullet per line, empty line to finish)
  6. Shows a release summary and asks for confirmation
  7. Creates the DMG via create-dmg
  8. Signs the DMG with Sparkle's sign_update (EdDSA)
  9. Updates appcast.xml with the new release entry
  10. Commits and pushes the appcast
  11. Creates a GitHub release with the DMG attached

Common Issues

ProblemSolution
sign_update not foundBuild the project in Xcode first so DerivedData has the Sparkle artifacts
gh auth failureRun gh auth login
Duplicate build number in appcastBump CURRENT_PROJECT_VERSION before archiving
Notarization failsCheck signing identity, entitlements, and hardened runtime settings
DMG is too largeCheck for debug symbols or unnecessary frameworks in the export
App won't updateVerify SUFeedURL points to the raw appcast URL, not the GitHub page URL

Appcast Hosting

The simplest hosting: commit appcast.xml to your GitHub repo and use the raw URL:

https://raw.githubusercontent.com/OWNER/REPO/main/appcast.xml

This must match SUFeedURL in your app's Info.plist.

Relacionados por tarefa

do mesmo repositório

Mais Skills

Todos os Skills
fayazara
Comunidade

macos-auto-update

Add Sparkle auto-update support to a native macOS app. Use this skill whenever the user wants to add auto-updates, implement Sparkle, set up an appcast feed, add "Check for Updates" to their app, or integrate automatic update checking. Also trigger when the user mentions Sparkle, appcast, SUFeedURL, EdDSA signing, or update notifications. This covers the full setup: adding the Sparkle SPM dependency, creating the UpdaterManager singleton, wiring it into the app delegate and UI, configuring Info.

instalações
2
GitHub Stars
681
Atualizado
27 de mai.
fayazara
Comunidade

macos-build

Build a native macOS app using xcodebuild from the command line. Use this skill whenever the user asks to build, compile, or check if their macOS project compiles successfully. Also use it when the user asks to fix build errors, verify changes compile, or run a debug build. Trigger on phrases like "build the app", "does it compile", "run xcodebuild", "fix build errors", or even just "build".

instalações
2
GitHub Stars
681
Atualizado
27 de mai.
fayazara
Comunidade

macos-notch-ui

Add a Dynamic Island-style notch UI to a macOS app. Use this skill whenever the user wants to create a notch overlay, notch extender, Dynamic Island for Mac, notch indicator, or any UI that extends from the MacBook notch area. Also trigger when the user mentions "notch shape", "notch window", "notch cutout", "notch panel", "recording indicator near the notch", "Dynamic Island style", or wants to show status/content that appears to emerge from the hardware notch. This covers the NSPanel setup, th

instalações
2
GitHub Stars
681
Atualizado
27 de mai.
fayazara
Comunidade

macos-patterns

Essential native macOS development patterns that web developers don't know about. Use this skill whenever the user is building a macOS app and needs guidance on native patterns, or when they ask about menu bar apps, floating panels, window levels, keyboard shortcuts, file pickers, clipboard, drag and drop, screen capture, activation policy, Quick Look, launch at login, or any macOS-specific API. Also trigger when the user seems to be applying web development patterns to macOS (e.g., using z-inde

instalações
2
GitHub Stars
681
Atualizado
27 de mai.