docs/sparkle.md
SPUStandardUpdaterController owned by AppDelegate (see Sources/CodexBar/CodexbarApp.swift:1).SUFeedURL in Info.plist points to GitHub Releases appcast (appcast.xml).SUPublicEDKey set to AGCY8w5vHirVfGGDGc8Szc5iuOqupZSh9pMj/Qs67XI=. Keep the Ed25519 private key safe; use it when generating the appcast.sparkle:channel="beta"; About → Update Channel controls allowedChannels../Scripts/sign-and-notarize.sh), producing notarized CodexBar-<ver>.zip.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.appcast.xml + zip to GitHub Releases (feed URL stays stable).SUFeedURL, SUPublicEDKey) and bump the app.brew or reinstalling from Releases.