visualdynamics.gui.updater¶
updater
¶
The packaged macOS app updates itself, through Sparkle (2026-09-28).
Brandon: is there a way to make the app update itself instead of making
me re-download the whole dmg every time? Sparkle is the updater most
Mac applications outside the App Store use (MIT). It reads the feed
named in the bundle's Info.plist (update.SPARKLE_FEED), shows what is
new, downloads the smallest thing that gets there — a binary delta from
the installed version when the release carries one, the whole archive
otherwise — checks its EdDSA signature against the key in the
Info.plist and the new app's Developer ID against this one's, then
replaces the app and relaunches it.
Only when asked. The Info.plist sets SUEnableAutomaticChecks off,
so Sparkle never checks on its own and never asks to; Check for
Updates is still the one network request the program makes, as the
privacy policy says (Brandon, 2026-09-28: keep checks manual).
The framework is reached through pyobjc's runtime alone — no Cocoa
wrapper package — and only in the frozen macOS app, the one place
Sparkle.framework exists (packaging/build_macos.sh puts it in
Contents/Frameworks). Everywhere else controller() is None and the
window keeps the manifest check (update.py).
Functions:
| Name | Description |
|---|---|
framework_path |
Sparkle.framework inside this app bundle, or None where there is |
controller |
Sparkle's standard updater controller, started once, or None. |
check |
Ask Sparkle to check now, with its own window; False when there |
Functions:¶
framework_path
¶
Sparkle.framework inside this app bundle, or None where there is none (not frozen, not macOS, or a build made without it).
Source code in src/visualdynamics/gui/updater.py
controller
¶
Sparkle's standard updater controller, started once, or None.
Started, because a controller that is not started refuses every check; with automatic checks off in the Info.plist, starting it schedules nothing. A framework that will not load answers None rather than raising: the menu item then falls back to the manifest check, which is worse than an update but better than an error.
Source code in src/visualdynamics/gui/updater.py
check
¶
Ask Sparkle to check now, with its own window; False when there is no Sparkle to ask.