You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Accessibility / Screen Recording: these grants are tied to the code signature. Keep the signature stable across updates.
Before installing, tear down the Dock hover observer and the switcher window.
Reference implementation
This is the same setup as OpenLens, OpenDefendrWatchr, OpenZombr and OpenConnct, all released on 2026-09-16:
The app:
An UpdateManager wraps mxcl/AppUpdater 4.1.2, pinned with exact: and with Package.resolved committed. See trsdn/OpenLens Sources/OpenLens/Update/UpdateManager.swift or trsdn/OpenDefendrWatchr Sources/OpenDefendrWatchr/Update/UpdateManager.swift.
It checks once a day (waking hourly), downloads and validates the update in the background, and offers Install and Restart.
The menu has Check for Updates… and a Check for Updates Automatically toggle, which is on by default.
The app stops its own work cleanly before the bundle is swapped.
Goal
OpenSwitchr should update itself from GitHub Releases.
Specific to this repository
openswitchr(SwiftPM) already exists with ZIP and DMG artifacts, but there is no GitHub release yet.OpenSwitchr-{version}.dmgas acopy_ofthe DMG.dependency_lock, and copy and declareAppUpdater_AppUpdater.bundle, likeassemble_menu_bar_swiftpmin feat: AppUpdater releases for opendefendrwatchr, onboard openzombr macos-notarization-broker#46.Reference implementation
This is the same setup as OpenLens, OpenDefendrWatchr, OpenZombr and OpenConnct, all released on 2026-09-16:
UpdateManagerwraps mxcl/AppUpdater 4.1.2, pinned withexact:and withPackage.resolvedcommitted. See trsdn/OpenLensSources/OpenLens/Update/UpdateManager.swiftor trsdn/OpenDefendrWatchrSources/OpenDefendrWatchr/Update/UpdateManager.swift.GitHubAttestationPolicy:swift buildproducts, AppUpdater'sBundle.modulelookup never looks inContents/Resources, so verifying an attestation ends infatalError(In-app update verification will reject tag-triggered releases (attested ref is refs/tags/…, policy expects refs/heads/main) OpenWritr#31).<repository>-<semver>.dmg, containing one app with the installed app's file name. On the broker, add it as acopy_ofthe notarized DMG (feat: AppUpdater support for openlens, with release publishing macos-notarization-broker#43).scripts/request.sh <profile> vX.Y.Z --publishthen uploads it.dependency_lockequal to the app'sPackage.resolved.AppUpdater_AppUpdater.bundle, list it undernested_resource_bundles(examples: feat: AppUpdater releases for opendefendrwatchr, onboard openzombr macos-notarization-broker#46 for SwiftPM apps, feat(openconnct): pin AppUpdater and publish the updater DMG macos-notarization-broker#48 for a Makefile build).To do
Package.resolved.UpdateManagerand menu items, and stop the app's work before installing.OpenSwitchr-{version}.dmgcopy_ofartifact.scripts/request.sh openswitchr vX.Y.Z --publish.🤖 Generated with Claude Code