From 9641a9dc1cf330bb91a6ef04627aa71da057482b Mon Sep 17 00:00:00 2001 From: Jiang Bohan Date: Wed, 22 Apr 2026 15:11:36 +0800 Subject: [PATCH] feat(changelog): surface release notes from sidebar menu + update prompt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two entry points to multica.ai/changelog so users actually find out what shipped: - Sidebar user menu (both expanded popover + collapsed dropdown variants) gains a "What's new" item with a Sparkles icon, sitting above Log out. Plain `` works on both surfaces: web opens a new tab, desktop's main-process setWindowOpenHandler intercepts and routes through openExternalSafely. The shared view doesn't need to branch. - Desktop's UpdateNotification "ready to restart" card grows a secondary "See changes" button next to "Restart now", giving the user a reason to actually restart instead of dismissing. Mirrors Conductor's update prompt pattern. The "available" / "downloading" states stay action-only — the changelog isn't useful before the download finishes. No version-detection / unread-tracking yet. Web users still need to click into the menu to see the changelog; that's a follow-up if the team wants Linear-style "new" dot. --- .../src/components/update-notification.tsx | 25 +++++++++++++----- packages/views/layout/app-sidebar.tsx | 26 +++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/apps/desktop/src/renderer/src/components/update-notification.tsx b/apps/desktop/src/renderer/src/components/update-notification.tsx index 4ef34c6d5..5b4fe0075 100644 --- a/apps/desktop/src/renderer/src/components/update-notification.tsx +++ b/apps/desktop/src/renderer/src/components/update-notification.tsx @@ -110,12 +110,25 @@ export function UpdateNotification() {

Restart to apply the update

- +
+ {/* Secondary "See changes" — gives the user a reason to + restart by surfacing what they're about to get. Opens + in the default browser via the shared openExternal + bridge so the URL hits the same allow-list as every + other outbound link. */} + + +
)} diff --git a/packages/views/layout/app-sidebar.tsx b/packages/views/layout/app-sidebar.tsx index 16fc90b04..308814241 100644 --- a/packages/views/layout/app-sidebar.tsx +++ b/packages/views/layout/app-sidebar.tsx @@ -28,6 +28,7 @@ import { SquarePen, CircleUser, FolderKanban, + Sparkles, X, Zap, } from "lucide-react"; @@ -415,6 +416,22 @@ export function AppSidebar({ topSlot, searchSlot, headerClassName, headerStyle } )} + {/* Plain anchor with target=_blank works on both web + (new tab) and desktop (intercepted by the main + process's setWindowOpenHandler → openExternalSafely), + so the shared component doesn't need to branch. */} + + } + > + + What's new + Log out @@ -599,6 +616,15 @@ export function AppSidebar({ topSlot, searchSlot, headerClassName, headerStyle }
+ + + What's new +