--- summary: "Sparkle integration details for CodexBar: updater config, keys, and release flow." read_when: - Touching Sparkle settings, feed URL, or keys - Generating or troubleshooting the Sparkle appcast - Validating update toggles or updater UI --- # Sparkle integration - Framework: Sparkle 2.8.1 via SwiftPM. - Updater: `SPUStandardUpdaterController` owned by `AppDelegate` (see `Sources/CodexBar/CodexbarApp.swift:1`). - Feed: `SUFeedURL` in Info.plist points to GitHub Releases appcast (`appcast.xml`). - Key: `SUPublicEDKey` set to `AGCY8w5vHirVfGGDGc8Szc5iuOqupZSh9pMj/Qs67XI=`. Keep the Ed25519 private key safe; use it when generating the appcast. - UI: auto-check toggle (About) enables auto-downloads; menu only shows “Update ready, restart now?” once an update is downloaded. - LSUIElement: works; updater window will show when checking. App is non-sandboxed. - Channels: stable vs beta are served from the same appcast. Beta items are tagged with `sparkle:channel="beta"`; About → Update Channel controls `allowedChannels`. ## Release flow 1) Build & notarize as usual (`./Scripts/sign-and-notarize.sh`), producing notarized `CodexBar-macos-universal-.zip`. 2) Generate appcast entry with Sparkle `generate_appcast` using the Ed25519 private key; HTML release notes come from `CHANGELOG.md` via `Scripts/changelog-to-html.sh`. For beta releases: set `SPARKLE_CHANNEL=beta` to tag the entry. 3) Upload `appcast.xml` + zip to GitHub Releases (feed URL stays stable). 4) Tag/release. ## Notes - HTML release notes are embedded in the appcast entry; the Sparkle update dialog should show formatted bullets (not raw tags). - If you change the feed host or key, update Info.plist (`SUFeedURL`, `SUPublicEDKey`) and bump the app. - Auto-check toggle is persisted via Sparkle; manual “Check for Updates…” remains in About. - CodexBar disables Sparkle in Homebrew and unsigned builds; those installs should be updated via `brew` or reinstalling from Releases.