diff --git a/packages/app/src/components/windows-app-menu.tsx b/packages/app/src/components/windows-app-menu.tsx
index e12387c38dd..e823e9fdb0c 100644
--- a/packages/app/src/components/windows-app-menu.tsx
+++ b/packages/app/src/components/windows-app-menu.tsx
@@ -102,32 +102,42 @@ export function WindowsAppMenu(props: {
if (entry.type === "separator") return
if (entry.dynamic === "recentProjects") {
const servers = global.servers.list()
- const projects = servers.flatMap((server) =>
- global
- .ensureServerCtx(server)
- .projects.recent()
- .map((project) => ({ server, project })),
- )
+ const groups = servers
+ .map((server) => ({
+ server,
+ projects: global.ensureServerCtx(server).projects.recent().slice(0, 5),
+ }))
+ .filter((group) => group.projects.length > 0)
return (
-
- {(item) => (
- 1
- ? `${displayName(item.project)} — ${serverName(item.server)}`
- : displayName(item.project)
- }
- disabled={false}
- onSelect={() =>
- runCommand(
- desktopRecentProjectCommand(
- ServerConnection.key(item.server),
- item.project.worktree,
- ),
- )
- }
- />
+
+ {(group, index) => (
+ <>
+ 0}>
+
+
+ 1}>
+
+
+
+ {(project) => (
+
+ runCommand(
+ desktopRecentProjectCommand(
+ ServerConnection.key(group.server),
+ project.worktree,
+ ),
+ )
+ }
+ />
+ )}
+
+ >
)}
diff --git a/packages/desktop/src/main/menu.ts b/packages/desktop/src/main/menu.ts
index 1b68f4ef9b1..40630b0efa6 100644
--- a/packages/desktop/src/main/menu.ts
+++ b/packages/desktop/src/main/menu.ts
@@ -47,10 +47,25 @@ function nativeItem(entry: DesktopMenuEntry, deps: Deps): MenuItemConstructorOpt
}
if (entry.dynamic === "recentProjects") {
- item.submenu = deps.recentProjects().map((project) => ({
- label: project.server ? `${project.label} — ${project.server}` : project.label,
- click: () => deps.trigger(project.command),
- }))
+ const projects = deps.recentProjects()
+ const servers = new Map()
+ projects.forEach((project) => {
+ if (!project.server) return
+ servers.set(project.server, [...(servers.get(project.server) ?? []), project])
+ })
+ item.submenu = servers.size
+ ? [...servers.entries()].flatMap(([server, entries], index) => [
+ ...(index > 0 ? ([{ type: "separator" as const }] satisfies MenuItemConstructorOptions[]) : []),
+ { label: server, enabled: false },
+ ...entries.slice(0, 5).map((project) => ({
+ label: project.label,
+ click: () => deps.trigger(project.command),
+ })),
+ ])
+ : projects.slice(0, 5).map((project) => ({
+ label: project.label,
+ click: () => deps.trigger(project.command),
+ }))
item.enabled = item.submenu.length > 0
return item
}