Skip to content

Updates through Sparkle 2: progress window, reliable relaunch - #54

Merged
broisnischal merged 1 commit into
mainfrom
feat/sparkle-updates
Oct 7, 2026
Merged

broisnischal merged 1 commit into
mainfrom
feat/sparkle-updates

Conversation

@broisnischal

Copy link
Copy Markdown
Collaborator

Replaces the hand-rolled updater with Sparkle 2 (SPUStandardUpdaterController), like Mac Mouse Fix. Same Ed25519 release key (SUPublicEDKey), update verified before the image is mounted; ad-hoc host accepted because Sparkle takes EdDSA or a code-signing match. Framework + XPC services embedded and re-signed in package-app.sh; CFBundleVersion becomes a monotonic build number. CI publishes both appcast.xml (Sparkle) and appcast.json (legacy, so 0.18.3–0.18.5 still update to this one).

Verified end to end on a real Mac over local HTTP: 99.0.0 → 99.0.1 showed Software Update, swapped the bundle, relaunched (new pid), settings intact. 257 tests pass. Ships as 0.18.6.

Updates now run through Sparkle's standard UI (checking, release notes,
download progress, installing) and the app relaunches as the new version,
which the old swap-script path did silently and sometimes not at all.

Trust stays on our existing Ed25519 release key: SUPublicEDKey is the same
public key, the release job adds a Sparkle-format signature over the DMG
(sign-update now emits both), and SUVerifyUpdateBeforeExtraction checks it
before the image is mounted. With the app ad-hoc signed, Sparkle accepts
EdDSA alone ("Either DSA must be valid, or Apple Code Signing must be
valid", SUUpdateValidator.m); the framework and its XPC services are
re-signed innermost-first in package-app.sh and the executable gets an
@executable_path/../Frameworks rpath.

Both feeds are published: appcast.xml for Sparkle and the legacy
appcast.json, so 0.18.3–0.18.5 copies still receive this release through
their old updater. CFBundleVersion becomes a monotonic build number
(major*10000+minor*100+patch) for Sparkle's comparison.

Verified end to end on this Mac over local HTTP: 99.0.0 → 99.0.1 showed the
Software Update window, swapped the bundle and relaunched (new pid),
settings intact. 257 tests pass.
@broisnischal
broisnischal merged commit a386443 into main Oct 7, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant