Skip to content

feat(desktop): download and install updates from GitHub Releases - #17

Merged
Aforno merged 3 commits into
mainfrom
t3code/match-t3code-updates-releases
Aug 28, 2026
Merged

feat(desktop): download and install updates from GitHub Releases#17
Aforno merged 3 commits into
mainfrom
t3code/match-t3code-updates-releases

Conversation

@Aforno

@Aforno Aforno commented Aug 28, 2026

Copy link
Copy Markdown
Owner

Summary

Packaged Agent Notch builds could only point people at the GitHub releases page. They could not download or install an update in-app.

This wires Sparkle 2.9.6 to the GitHub Releases appcast and uses the same two-step flow as T3 Code: Check, Download, then Restart to Update. Automatic checks default on, run at launch and at most once a day, and never download or install until the user asks. Settings → General and the app menu expose Check for Updates. Homebrew marks the cask as self-updating (auto_updates true) and livechecks github_latest.

Signed release CI now requires SPARKLE_ED_PRIVATE_KEY, generates dist/appcast.xml, and attaches it to the GitHub release. The EdDSA public key is baked in at Resources/SparklePublicEDKey. Sparkle verifies that signature and the Developer ID signature before replacing the app. System profile data is not sent. Unpackaged/debug hosts stay on the packaged-only message.

Same commit also drops ProjectIdentity (rows and notifications show the working-directory last path component, not the git worktree root) and the 7-day completed-session clamp (SessionHistoryPolicy). Default history retention is 30 days, and 30 / 90 / 365 are valid again.

Verification

  • swift test
  • swift test -c release
  • ./script/package_release.sh --adhoc
  • ./script/check_repository.sh
  • Packaged-app UI/runtime smoke test, when applicable

Smoke the packaged app: Check for Updates from Settings and the app menu, Download, Restart to Update, and confirm an unsigned/ad-hoc build does not pretend Sparkle can install. Confirm Homebrew auto_updates and that a signed release publishes appcast.xml.

Compatibility and risk

  • Signing / release. Signed tags need SPARKLE_ED_PRIVATE_KEY (base64 EdDSA seed matching Resources/SparklePublicEDKey). Missing it fails the release job. Nested Sparkle.framework is signed with the app. Appcast enclosure URL is the GitHub release ZIP. Feed URL is https://github.com/Aforno/AgentNotch/releases/latest/download/appcast.xml.
  • Persistence. New installs default automaticallyCheckForUpdates to true (was false) and historyRetentionDays to 30. Existing preference values are kept. The old 7-day ceiling is gone, so previously stored 30 / 90 / 365 day choices apply again.
  • Protocol / hooks. Hook mapping no longer resolves a git project identity. Display uses workingDirectory's last path component. No hook schema or provider-install change.
  • Network. Update checks fetch only the Sparkle appcast. The ZIP is fetched only after Download. No analytics or system profile.
  • Homebrew. auto_updates true tells brew upgrade --cask the app updates itself. Cask bumps on main still work for people who prefer brew.

Screenshots

Settings → General now has Check for Updates, Download, and Restart to Update instead of a GitHub-releases link. The app menu has Check for Updates… after About. Screenshots not attached.

- Check, Download, then Restart to Update; automatic checks default on and never install until asked
- Signed releases publish a Sparkle appcast; Homebrew marks the cask as self-updating
Copilot AI lite review requested due to automatic review settings August 28, 2026 18:52

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Aforno added 2 commits August 28, 2026 22:10
- Retry after a Sparkle startup failure starts the updater again
- Ineligible updates no longer show as Up to date
- Check for Updates opens Settings → General
Keep Sparkle in-app updates and Check for Updates focusing Settings.
Keep worktree project names and the 3/7-day completed-session cap.
@Aforno
Aforno merged commit c67659c into main Aug 28, 2026
2 checks 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.

2 participants