Skip to content

fix(updater): name macOS updater archives per-arch so the manifest can serve them#119

Merged
eliotlim merged 1 commit into
mainfrom
fix/macos-updater-arch-suffix
Jul 11, 2026
Merged

fix(updater): name macOS updater archives per-arch so the manifest can serve them#119
eliotlim merged 1 commit into
mainfrom
fix/macos-updater-arch-suffix

Conversation

@eliotlim

Copy link
Copy Markdown
Owner

The bug

The macOS auto-updater silently no-op'd on every machine: click Update → "downloads" → app restarts → same version, still pending.

Root cause

Tauri bundles the macOS updater archive as an arch-less OpenBook.app.tar.gz, but the account-server manifest (open.book.pub lib/updates.ts) selects the macOS asset only by an arch-suffixed name — OpenBook_<ver>_{aarch64,x64}.app.tar.gz. The arch-less name matched nothing, so the manifest returned 204 "up to date" to every macOS caller even with a newer release out. Verified live against account.book.pub: the manifest 204s for every current_version despite v1.76.0 being latest.

Secondary: both macOS matrix legs uploaded the same OpenBook.app.tar.gz with gh release upload --clobber, so only one arch's archive ever survived on a release.

Symptom chain: manifest 204 → Tauri check() returns null → downloadAndInstall() no-ops → but the Settings action / background scheduler relaunched (or toasted "ready to restart") anyway → app restarts unchanged, while the separate informational /check endpoint still shows "update pending".

Fixes

  • .github/workflows/release.yml — rename the macOS updater archive (and its detached .sig) per-arch before upload, matching the name the manifest expects and stopping the two legs from clobbering each other. Signature-safe: the .sig signs the archive bytes, not the filename.
  • downloadAndInstall() now returns whether an update was actually staged (false on the 204 no-op). The Settings action (UpdatesSection) and the background scheduler (UpdateScheduler) gate the relaunch / "ready to restart" toast on that, so a no-op never triggers a pointless restart onto the same version — Settings shows a clear inline note instead.

Why cutting this release fixes live users

The manifest endpoint is dynamic and reads the latest release's assets. Once v1.76.1 ships with correctly-named OpenBook_1.76.1_{aarch64,x64}.app.tar.gz + .sig, an existing 1.76.0 machine hitting the manifest gets a valid 200 and can finally update (its compiled-in pubkey still matches — same signing key). So this repairs current macOS installs, not just future ones.

Note: the aarch64 archive on the existing v1.76.0 release was clobbered and can't be backfilled without a rebuild — that release stays broken; v1.76.1 is the fix.

Verification

  • nx release --dry-run → derives a patch bump to v1.76.1 from this commit.
  • ui unit suite: 950 passed (incl. new no-op coverage in updateRunner + UpdateScheduler tests).
  • typecheck + lint green across ui, app, web.
  • Existing scheduler e2e stays green (the web preview stub reports a staged update).

🤖 Generated with Claude Code

…n serve them

The macOS auto-updater silently no-op'd on every machine: click Update →
"downloads" → restarts → same version, still pending.

Root cause: Tauri bundles the macOS updater archive as an arch-less
`OpenBook.app.tar.gz`, but the account server's manifest selects the macOS
asset only by an arch-suffixed name (`OpenBook_<ver>_{aarch64,x64}.app.tar.gz`).
The arch-less name matched nothing, so the manifest returned 204 ("up to date")
to every macOS caller — even with a newer release out. Worse, both macOS matrix
legs uploaded the same `OpenBook.app.tar.gz` with `--clobber`, so only one arch
ever survived.

Fixes:
- release.yml renames the macOS updater archive (and its detached `.sig`)
  per-arch before upload, matching the name the manifest expects and stopping
  the two legs from clobbering each other. Signature-safe: the `.sig` signs the
  archive bytes, not the filename.
- `downloadAndInstall()` now returns whether an update was actually staged
  (false on the 204 no-op). The Settings action and background scheduler gate
  the relaunch / "ready to restart" toast on that, so a no-op never triggers a
  pointless restart onto the same version — Settings shows a clear note instead.

Cutting this release republishes the macOS updater assets under the correct
names, which also unbreaks existing 1.76.0 users (the manifest is dynamic and
reads the latest release's assets).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KFk2T9k3p7ghCjdzMfkA5w
@vercel

vercel Bot commented Jul 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
app.book.pub Ready Ready Preview, Comment Jul 11, 2026 7:24am

Request Review

@eliotlim eliotlim merged commit cebe6f5 into main Jul 11, 2026
10 checks passed
@eliotlim eliotlim deleted the fix/macos-updater-arch-suffix branch July 11, 2026 07:35
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