✨ Improvements
- Updates now surface as a titlebar pill instead of a modal (#3427) — when an update is available, a blue "Update" pill appears in the window chrome. Clicking it opens a compact panel with the version change and install/skip actions; during download the pill shows live progress, and once complete it becomes the restart button. The About dialog's manual check hands over to the same panel, and the update channel selector remains in the About dialog.
🐛 Fixes
- Workspace tab unread badges render one indicator at a time, by priority (#3434) — logged-out warning first, then mention count, then the unread dot; badge colors now follow the design system tokens in both themes, and all badge variants anchor to the same point on vertical tabs.
- Eliminated a render-loop error storm during startup (#3435, #3437) — hardened the workspace tab strip against "Maximum update depth exceeded" errors: stabilized re-render triggers across tab components (#3435) and coalesced the per-room unread events that servers emit at boot, which could flood the window with state updates when unread rooms were present (#3437).
- Workspaces stuck on the loading screen now recover automatically (#3436) — when a workspace's boot wedges (a state that previously required restarting the app), the desktop app now forces a reload with service worker and cache clearing, capped at two attempts per session.
🔧 Internal
- Dev-only boot watchdog that captures forensic reports (event timeline, console buffer, in-page probe, service worker state) whenever a workspace boot hangs — enabled in development, opt-in via
ROCKETCHAT_BOOT_WATCHDOG=true(#3436) - Update flow simulation entry in the Help menu (developer mode only) for exercising the new update pill without a real update (#3427)