Goal
Enable silent background downloads with an in-app notification badge across all platforms. Replace native OS dialogs with a subtle UI indicator. Enable Linux auto-update (currently disabled).
Design doc: in-app-updates-design.md
What Changes
| Area |
Before |
After |
| Download trigger |
User clicks "Download" in native dialog |
Silent, automatic |
| Download progress |
Console only |
IPC → renderer badge shows % |
| Update ready |
Native dialog |
In-app badge with dropdown |
| Linux (AppImage) |
Skipped |
Works via electron-updater |
| Linux (deb/snap) |
Skipped |
Package manager (unchanged) |
| Store builds (MAS, MSIX) |
Skipped |
Still skipped |
| Dev mode |
Skipped |
Still skipped |
Tasks
Task 1: Main process — silent download + Linux
File:
Task 2: Preload — expose new IPC channels
File: main/preload.ts
Task 3: Frontend — notification badge component
File: frontend/
Task 4: Cross-platform testing
Must verify ALL applicable platforms:
| Platform |
Format |
Test |
| macOS |
DMG (x64) |
Silent download → badge → restart installs |
| macOS |
DMG (arm64) |
Same on Apple Silicon |
| macOS |
MAS |
Auto-update skipped (store status) |
| Windows |
NSIS (x64) |
Silent download → badge → restart installs |
| Windows |
MSIX |
Auto-update skipped (store status) |
| Linux |
AppImage |
Download → badge → restart |
| Linux |
deb |
"linux-managed" status, no errors |
| Linux |
snap |
Snap own update handles it |
| All |
Dev mode |
"dev-mode" status, no check |
| All |
No internet |
Check fails silently, no error UI |
Edge cases:
Acceptance Criteria
Out of Scope (future)
- Deferral ("remind me later", skip version)
- Restart safety check (no active orders)
- Changelog panel / "what's new" modal
- Delta updates, staged rollouts
Goal
Enable silent background downloads with an in-app notification badge across all platforms. Replace native OS dialogs with a subtle UI indicator. Enable Linux auto-update (currently disabled).
Design doc: in-app-updates-design.md
What Changes
Tasks
Task 1: Main process — silent download + Linux
File:
autoUpdater.autoDownload = trueupdate-download-progress)if (process.platform === 'linux') return;linux-managedstatus, skip self-update!isStoreBuildonly)restart-and-installIPC handlerTask 2: Preload — expose new IPC channels
File:
main/preload.tsrestartAndInstallinvoke handleronUpdateProgresslisteneronUpdateReadylistenerTask 3: Frontend — notification badge component
File:
frontend/useUpdateStatus()hook — manages state from IPC events<UpdateBadge />component — shows in app headerTask 4: Cross-platform testing
Must verify ALL applicable platforms:
Edge cases:
Acceptance Criteria
Out of Scope (future)