Skip to content

Replace Sparkle standard driver with custom inline update UI - #35

Merged
andyhtran merged 1 commit into
mainfrom
ft-sparkle2
Jul 4, 2026
Merged

Replace Sparkle standard driver with custom inline update UI#35
andyhtran merged 1 commit into
mainfrom
ft-sparkle2

Conversation

@andyhtran

Copy link
Copy Markdown
Owner

Summary

  • Replace Sparkle's SPUStandardUpdaterController with a custom SPUUserDriver (UpdateDriver) that maps every Sparkle callback into an observable UpdateState enum, eliminating the focus/activation bugs inherent to alert windows in an LSUIElement app
  • Add a full-pipeline UpdateBanner rendered inline in the menu popover (checking → available → downloading → preparing → installing → error/not-found), replacing the old two-state banner
  • Mirror live update state in the Settings window and popover "Check for Updates" row
  • Add UpdateSimulator (debug-only) for exercising all banner states without signing or an appcast, and just test-update for local E2E testing with the real Sparkle updater against a localhost appcast
  • Extract code signing into Scripts/sign-dev-app.sh with auto-detection of Developer ID identity

Test plan

  • just dev — app launches, popover renders normally, no update banner when idle
  • just test-update — walk through the full update flow: Check Now → available → Install → download → prepare → install → relaunch as bumped version
  • defaults write com.miniwhisper.dev UpdateSimulatorScenario happy + just dev — simulator banner walks through all states
  • Test all simulator scenarios: happy, background, notfound, error
  • Settings window "Check Now" mirrors state correctly
  • Settings popover row label updates dynamically with state
  • Notification tap opens popover with update banner (background scenario)
  • just test — unit tests pass

🤖 Generated with Claude Code

…date UI

Sparkle's built-in alert windows don't work well for this LSUIElement app —
they appear unfocused, behind other windows, or on the wrong Space. This
replaces the standard driver with a custom SPUUserDriver (UpdateDriver) that
folds every Sparkle callback into an observable UpdateState enum, rendered
inline as a menu-bar banner with full pipeline visibility (checking →
available → downloading → preparing → installing). Adds a debug-only
UpdateSimulator for exercising the UI without signing/appcast, and a local
E2E test script (just test-update) for the real Sparkle flow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@andyhtran
andyhtran merged commit 09ee1d8 into main Jul 4, 2026
1 check passed
@andyhtran
andyhtran deleted the ft-sparkle2 branch July 4, 2026 18:07
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.

1 participant