feat(desktop): self-update from GitHub Releases (signed + notarized) - #407
Merged
Conversation
hay-kot
force-pushed
the
feat/desktop-auto-update
branch
from
July 21, 2026 22:16
d4f0ed4 to
3651092
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Purpose
Let the installed Hive desktop app update itself from GitHub Releases: an auto-update toggle in System settings, a title-bar "update available" chip that downloads + relaunches into the new version, and a hardened macOS release pipeline (Developer ID signing + notarization) so the swapped
.apppasses Gatekeeper.Implements epic
hc-hs74vlj4.Proposed Changes
desktop/updater_provider.go) scoped to thedesktop-v*tag namespace — the stock GitHub provider can't see desktop releases as newer because they share the repo with CLIv*tags. Lists releases, filters by prefix, compares semver, picks the single.zip, and attaches the SHA256 digest fromSHA256SUMS; delegatesDownloadto the stock provider.UpdaterService(desktop/updaterservice.go) with a self-managed poll ticker (the framework'sCheckIntervalhas no runtime setter),Status/SetEnabled/CheckNow/InstallUpdate, and a release-build gate (dev builds skipInit).internal/desktop/settings.go):AutoUpdate *bool(unset ⇒ default on) + load-modify-save fix so fields no longer clobber each other.InstallUpdate; regenerated Wails bindings.SHA256SUMSsidecar.Digest-only verification for now; Ed25519 signature verification is a follow-up. Windows/Linux are out of scope (macOS-only workflow today) but the provider/service are OS-agnostic.
Required repository secrets (one-time setup)
The release workflow needs six secrets from your Apple Developer account. Add each under Settings → Secrets and variables → Actions → New repository secret.
Signing certificate →
MACOS_CERTIFICATE,MACOS_CERTIFICATE_PWD,MACOS_SIGN_IDENTITYYou need a Developer ID Application certificate (the cert type for distribution outside the Mac App Store).
Developer ID Application: <Name> (TEAMID), expand it so the private key is included, right-click → Export →.p12, and set a password.MACOS_CERTIFICATE_PWDbase64 -i Certificates.p12 | pbcopyMACOS_CERTIFICATEDeveloper ID Application: Jane Doe (AB12CD34EF)→MACOS_SIGN_IDENTITYNotarization API key →
AC_API_KEY_ID,AC_API_ISSUER_ID,AC_API_KEYApp Store Connect → Users and Access → Integrations tab → App Store Connect API → Team Keys → +. Give it the Developer access role.
AC_API_KEY_IDAC_API_ISSUER_ID.p8key (base64 -i AuthKey_XXXXXXXX.p8 | pbcopyAC_API_KEYGotchas
TEAMIDis your 10-char Apple Team ID (App Store Connect → Membership)..p8API key is used (instead of Apple-ID + app-specific password) to avoid 2FA prompts in CI.Checklist