Context
#129 lands the in-app Sparkle 2 migration: single feed at https://macdown.app/sparkle/macdown3000/stable/appcast.xml, pre-releases delivered as a beta channel in that one appcast (the old dual stable/testing feed scheme is retired), EdDSA signing with the public key in Info.plist (placeholder until the real key is generated).
The Nov 2025 automation plan on #129 predates the channel decision and assumed separate stable/testing appcast files routed by directory — it needs a redesign around a single channel-aware appcast before implementation.
Scope
Automate appcast generation and publishing in .github/workflows/release.yml:
- Channel-aware generation: run Sparkle's
generate_appcast with --channel beta for pre-release version tags (-beta, -alpha, -rc), no channel for stable tags; one appcast file containing both, with history preserved (download existing appcast before regenerating).
- EdDSA signing via a
SPARKLE_EDDSA_PRIVATE_KEY GitHub secret; validate secrets up front, clean up key material afterward (even on failure).
- Publishing: upload to macdown.app hosting (mechanism TBD — SSH per the original plan, or a simpler alternative if hosting has changed), with retry +
known_hosts pinning if SSH.
- Docs: extend
plans/release-process.md with the automated flow and required secrets.
Prerequisites (manual, before this can be tested)
First real test should be a beta tag so failures don't affect the stable channel.
Related to #129
Context
#129 lands the in-app Sparkle 2 migration: single feed at
https://macdown.app/sparkle/macdown3000/stable/appcast.xml, pre-releases delivered as abetachannel in that one appcast (the old dual stable/testing feed scheme is retired), EdDSA signing with the public key in Info.plist (placeholder until the real key is generated).The Nov 2025 automation plan on #129 predates the channel decision and assumed separate stable/testing appcast files routed by directory — it needs a redesign around a single channel-aware appcast before implementation.
Scope
Automate appcast generation and publishing in
.github/workflows/release.yml:generate_appcastwith--channel betafor pre-release version tags (-beta,-alpha,-rc), no channel for stable tags; one appcast file containing both, with history preserved (download existing appcast before regenerating).SPARKLE_EDDSA_PRIVATE_KEYGitHub secret; validate secrets up front, clean up key material afterward (even on failure).known_hostspinning if SSH.plans/release-process.mdwith the automated flow and required secrets.Prerequisites (manual, before this can be tested)
generate_appcast --generate-keys); public key replaces the placeholderSUPublicEDKeyinMacDown-Info.plist; private key stored as the GitHub secret and never committed.SUFeedURLpath (currently 503).First real test should be a beta tag so failures don't affect the stable channel.
Related to #129