fayazara/macos-app-skills/auto-update
Claude Code and agent skill by fayazara/macos-app-skills
- community
Checking that the SKILL.md file is still in the repository.
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…
Install
npx vskill@latest install fayazara/macos-app-skills/auto-updateSKILL.md
Sparkle Auto-Update for macOS Apps
This skill adds Sparkle auto-update support to a native macOS app. Sparkle is the standard open-source framework for macOS app updates outside the Mac App Store.
Overview
The implementation has 4 parts:
- SPM dependency -- add the Sparkle package to the Xcode project
- UpdaterManager.swift -- a singleton that wraps
SPUStandardUpdaterController - Info.plist keys --
SUFeedURLandSUPublicEDKey - UI integration -- "Check for Updates" button in settings/menu bar
Step 1: Add Sparkle via SPM
In Xcode: File > Add Package Dependencies > enter:
Use the "Up to Next Major Version" rule with 2.0.0. Add the Sparkle framework to your app target.
Or add it to Package.swift if your project uses one:
Step 2: Create UpdaterManager.swift
Copy references/UpdaterManager.swift into your project. This is a singleton that:
- Creates
SPUStandardUpdaterControllerearly (beforeapplicationDidFinishLaunchingreturns) - Publishes
canCheckForUpdatesfor UI binding - Exposes
automaticallyChecksForUpdatestoggle - Skips all update logic in DEBUG builds (so you don't get update prompts during development)
- For menu-bar-only apps: temporarily switches to
.regularactivation policy before showing the update window
The key design decisions in this file:
- `startingUpdater: false` in the initializer, then calling
start()explicitly inapplicationDidFinishLaunching. This gives you control over timing. - DEBUG guards on
start()andcheckForUpdates(). Sparkle should never run in debug builds -- it would try to update your debug app with a release build. - `ObservableObject` with `@Published` (not
@Observable) because we need the Combinepublisher(for:)bridge from Sparkle's KVO.
Step 3: Configure Info.plist
Add these keys to your app's Info.plist:
Generating EdDSA Keys
Sparkle uses EdDSA (Ed25519) signing. Generate a keypair:
Run it:
This prints the public key and stores the private key in your Keychain. Put the public key in SUPublicEDKey in Info.plist. The private key stays in Keychain and is used by sign_update during release.
Step 4: Wire Into App
App Delegate
The UpdaterManager.shared property must be accessed early so the SPUStandardUpdaterController is created before the app finishes launching. Referencing it in the AppDelegate property ensures this.
Settings UI (About Pane)
Menu Bar (optional)
Step 5: Create Initial Appcast
Create an appcast.xml at the root of your repo. It starts empty and gets populated by your release process:
Host this file on GitHub (raw URL) or any static file host. The URL must match SUFeedURL in Info.plist.
Menu-Bar-Only Apps
If your app runs as .accessory (no Dock icon), Sparkle's update window won't appear unless you temporarily switch to .regular. The reference UpdaterManager handles this in checkForUpdates():
The app reverts to .accessory when the update window closes (handled by your existing activation policy manager).
Hardened Runtime Entitlements
If your app uses Hardened Runtime (required for notarization), no special Sparkle entitlements are needed. Sparkle 2.x works with the standard hardened runtime configuration.
Appcast Item Format
Each release in the appcast looks like this (for reference when building release tooling):
sparkle:version=CFBundleVersion(build number)sparkle:shortVersionString=CFBundleShortVersionString(marketing version)sparkle:edSignature= output ofsign_update YourApp.dmglength= file size in bytes
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingauto-update/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/fayazara/macos-app-skills/auto-update)