FrogSwitch now ships with Sparkle-based auto-updates. This document captures the commands that keep the feed and bundle in sync.
- Install the Python dependencies used by the helper scripts:
python3 -m pip install cryptography
- Keep a generated Ed25519 key pair in
keys/. The private key is excluded via.gitignore, whilekeys/README.mdexplains how to generate it withscripts/generate_sparkle_key.py.
- Bump the version in
Info.plist(CFBundleShortVersionString/CFBundleVersion), tag it (e.g.v1.2.0), and update any other copy of the version string if needed. - Run the Swift release build and package it:
./scripts/package_app.sh release cd build rm -f FrogSwitchNative.zip zip -r FrogSwitchNative.zip FrogSwitchNative.app cd -
- Sign the zip with the private key:
python3 scripts/sign_release.py build/FrogSwitchNative.zip > release.signature - Regenerate the appcast that Sparkle reads:
python3 scripts/generate_appcast.py \ build/FrogSwitchNative.zip \ --version 1.2.0 \ --short-version 1.2.0 \ --download-url https://github.com/fagionpw/AutoSwitcher/releases/download/v1.2.0/FrogSwitchNative.zip \ --release-notes https://github.com/fagionpw/AutoSwitcher/releases/tag/v1.2.0 \ --pub-date 2026-01-28T15:30:00+00:00 \ --title "FrogSwitch 1.2.0" \ --feed-link https://github.com/fagionpw/AutoSwitcher \ --output appcast.xml - Inspect
appcast.xmland make sure the<enclosure>attributes match the release asset. - Tag the release (e.g.
git tag v1.2.0) and push the tag plus the updatedappcast.xml. - Upload the signed zip and the
appcast.xmlas GitHub release assets. Sparkle expects the feed to be downloaded via theSUFeedURLthat is already hardcoded inInfo.plist.
Repeat steps 2–7 for every subsequent release. Keep the private key secret; if it rotates,
regenerate a new key pair and update both Info.plist and the feed.