Downloads/updates:
- config: DOWNLOADS_DIR (override to a mounted volume in prod).
- static.js: serves /downloads/* (installer, latest.yml, .blockmap) with range support for
resumable + differential auto-updates; /download/windows redirects to the current .exe
(stable link). Landing page gets a "Download the Windows desktop app" button (hidden in-app).
Install tracking (who installed the app):
- db app_installs + repos.appInstalls (upsert by install_id, fills in the user on sign-in).
- POST /api/v1/telemetry/install (records install + user once authenticated);
GET /api/v1/admin/installs (admin: list installs with user/version/os/last-seen).
- desktop main.js: stable per-install id in userData, exposed via preload
(bizConnectNative.installId/version/os); home.html reportInstall() posts it after login.
- e2e: +2 checks (telemetry recorded, admin sees it). 119/119. build batch20.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Mirrors the rail's unread-chat count onto the Windows taskbar icon (overlay) and the
macOS/Linux dock badge. updateRailUnread() draws a small red count badge on a canvas
and hands it to the shell via bizConnectNative.setUnread(count, dataUrl); main sets it
with win.setOverlayIcon + app.setBadgeCount. Clears at 0, shows 99+ past 99. No-op in a
browser/mobile. (home.html build batch17)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- desktop/main.js: grant media (camera/mic), display-capture, notifications, clipboard,
fullscreen, pointerLock for the app origin (Electron denies these by default, which
silently broke meetings' camera/mic). Adds setPermissionRequestHandler +
setPermissionCheckHandler on the app session.
- Clicking a notification now raises + focuses the window: preload exposes
bizConnectNative.focusApp(), main handles 'focus-window' IPC, and the web notify()
onclick calls it when running in the desktop shell. (home.html build batch16)
- CLIENTS.md: Phase D — inline-reply notifications (Windows Toast RemoteInput /
Android RemoteInput / iOS UNTextInputNotificationAction) queued right after packaging.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>