Sparkle 2: the macOS update framework that keeps your app's own UI
A software update framework for macOS
At a glance
- What is it?
- Sparkle is a software update framework for macOS that verifies EdDSA-signed appcasts and installs updates without any code in the host app. It suits Mac developers who ship outside the Mac App Store and can host static files over HTTPS.
- Who is it for?
- Adopt Sparkle if you ship a macOS app outside the Mac App Store, can serve static files over HTTPS, and want updates that keep your own icon and window. Do not adopt it for iOS, for Windows or Linux targets, or if you cannot run generate_appcast and keep the signing keys safe.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 2 days ago.
- What is it written in?
- Mainly Objective-C, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The problem Sparkle solves for apps sold outside the Mac App Store
If you distribute a Mac app yourself, you own the update path. Apple's built-in mechanism only serves apps that go through the store. Everyone else has to build a feed, sign the payload, download it, verify it, and replace a running bundle without corrupting it. Sparkle is that whole path as a framework. The README describes it as a "secure and reliable software update framework for macOS" and lists the pieces it handles: EdDSA signatures, Apple Code Signing, delta updates that patch only changed files, atomic-safe installs, quarantine, permissions, and authentication prompts when the installer needs them.
The intended user is a Mac developer with a web server, not an end user. Sparkle requires no code in the host app according to the README; what you supply is configuration and static files. That constraint shapes everything else. If you are shipping through the Mac App Store, or if your product is a command line tool with no bundle, the framework's model does not map onto your problem.
How an appcast, a signature and a delta patch fit together
The release information lives in an RSS-based appcast. The README calls appcasts a de-facto standard that third party update-tracking programs and websites also read, which is why the format matters beyond Sparkle itself. The host app points at that feed through the SUFeedURL key. The README's troubleshooting section names a bad SUFeedURL as a common error, alongside feeds served without modern TLS.
On the publishing side, generate_appcast produces the appcast files, the correct signatures, and the delta updates. On the client side, Sparkle verifies updates using EdDSA signatures and Apple Code Signing before installing. Delta updates are the reason a point release does not force every user to pull a full bundle: only changed files are patched. Installs are described as atomic-safe, which is the property that matters when a process is replacing the bundle it was launched from.
Sparkle 2 adds channels for beta updates, phased rollouts, and flags for critical or major updates, plus progress and status notifications for the host app. It also stays hidden until the second launch, a deliberate choice about first impressions rather than a technical limit. The architecture is split across the repository's top-level directories: Downloader, InstallerLauncher, InstallerConnection, InstallerStatus, BinaryDelta, and Autoupdate, with the command line tools in generate_appcast, generate_keys, sign_update, and sparkle-cli.
Installing Sparkle and running a first update check
The README points at the getting started guide on sparkle-project.org for installation and says no code is necessary, only a bit of configuration. Package manager integration is advertised in the badges at the top: SwiftPM and Carthage. The repository also ships the command line tools you need to generate keys, sign a build, and write the feed.
Start by generating a signing key pair with the bundled tool. The README lists generate_keys among the tools and says generate_appcast creates correct signatures, so the key material is what the appcast references. The repository's bin directory is where the built tools are collected, and the Makefile's release rule builds the Distribution scheme with xcodebuild:
xcodebuild -scheme Distribution -configuration Release -derivedDataPath "$(BUILDDIR)" buildThat command comes from the Makefile's release target, which then calls ./Configurations/release-move-tag.sh and opens the release products folder. If you only want a working build of the framework itself, the Makefile's build rule is:
xcodebuild clean buildThe README's own instruction for generating the feed is to use the generate_appcast tool, which the repository ships as a top-level directory and which creates appcast files, correct signatures, and delta updates automatically. Point the app at the resulting feed through the SUFeedURL key; the README names that key and warns that typos and 404s are a common error. When the app runs, Sparkle reads the feed, verifies the signature, and shows its update window with the release notes. If nothing appears, the README's first instruction is to open Console.app and read the logs under your application; it says Sparkle prints detailed information about every problem and often suggests a fix in the log message.
Where Sparkle is the wrong tool, and what it does not hide
Sparkle is macOS only. An app that also ships on Windows or Linux needs a second update mechanism, and the two will not share a feed format. Sandboxed apps are supported in Sparkle 2, but the README does not describe what changes for them beyond that statement, so a sandboxed host should expect to work through the installer and permission paths rather than assume they behave like an unsandboxed one.
The HTTPS requirement is not optional. The README lists an HTTPS server for serving updates as a requirement and links to a page on App Transport Security. That means a certificate problem takes down your update channel, not just your website.
Two more constraints are easy to miss. The runtime floor differs by branch: macOS 12.0 or later on 2.x, macOS 10.13 or later on 2.9.6, so moving to 2.x drops older systems. And the build requirement is the latest major Xcode, stable or beta, plus one major version less, which ties your CI image to Apple's release cadence whether or not you want it there. The README also notes that Sparkle is built with hidden visibility, so no symbols are exported by default and any new public API symbol must be decorated with the SU_EXPORT macro. That is a note for people modifying Sparkle, but it also explains why the framework's surface is narrow.
Sparkle versus the update mechanism Apple ships
The obvious alternative for a Mac developer is the update path that comes with distribution through the Mac App Store. The difference is not quality, it is control. The store handles delivery and signing for you, and in exchange you accept its review process and its rules about what the app may do. Sparkle assumes the opposite arrangement: you run the server, you hold the signing keys, and the feed is a file you publish.
That trade shows up in operation. With Sparkle, a bad appcast is your outage and the README's troubleshooting list is your runbook: check Console.app, check SUFeedURL, test the TLS. The release history shows the project itself using its own vocabulary, with 2.9.6 titled Appcast Improvements and 2.10.0 titled Golden Gate Bump. The repository also carries a Documentation directory for internal design documents and a CHANGELOG, which is where the detail lives that the README does not repeat.
Maintenance cost, licensing and what to check before you commit
The repository is not archived and the last push was on 2026-09-21, so the project is being worked on. Releases are frequent: 2.10.0 on 2026-09-13, a beta on 2026-09-07, and 2.9.6 on 2026-08-17. That pace is good for fixes and awkward for anyone who pins a version and stops watching. The README points at a roadmap in the project's milestones for future versions, and pre-releases appear on the Releases page or through package managers.
Your upgrade cost is mostly the Xcode requirement and the runtime floor. Each major Sparkle line can raise the minimum macOS version, as 2.x did relative to 2.9.6, so the framework's support matrix and your app's support matrix have to move together.
The licence field in the repository metadata is NOASSERTION, which means the machine-readable identifier was not resolved. A LICENSE file exists at the top level, and that file, not the metadata, is what you read. Two practical points follow: shipping Sparkle means shipping third party code inside your app, which is worth a look at your own attribution practice, and the signing keys you generate are yours to protect. Nothing here is legal advice; read the LICENSE file and your own distribution terms.
Editorial conclusion
Adopt Sparkle if you ship a macOS app outside the Mac App Store, can serve static files over HTTPS, and want updates that keep your own icon and window. Do not adopt it for iOS, for Windows or Linux targets, or if you cannot run generate_appcast and keep the signing keys safe. Before wiring it in, check three things: your deployment target (macOS 12.0 or later on 2.x, macOS 10.13 or later on 2.9.6), that the URL in SUFeedURL resolves over modern TLS, and that your build toolchain matches the Xcode requirement in the README. Then read the Console.app logs from your app the first time an update is offered.
Frequently asked questions
Does Sparkle require code changes in my app?
The README states that Sparkle requires no code in your app and only needs static files on a web server, but a bit of configuration is required. The configuration includes setting the SUFeedURL key so the app knows where its appcast lives.
What macOS versions does Sparkle 2 support?
The README lists macOS 12.0 or later on the 2.x branch, while 2.9.6 supports macOS 10.13 or later. Moving to 2.x therefore raises the runtime floor for your users.
Why is my Sparkle update not appearing?
The README's troubleshooting section says to check Console.app for logs under your application, since Sparkle prints detailed information about problems and often suggests solutions there. It also names an invalid or 404 SUFeedURL and a feed without modern TLS as common causes.
How are Sparkle updates verified before installation?
The README says updates are verified using EdDSA signatures and Apple Code Signing, and that the generate_appcast tool creates appcast files with the correct signatures. Sparkle 2 also supports sandboxed applications.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/sparkle-project-sparkle)