Skip to content

feat(x): native application menu bar - #876

Open
hrsvrn wants to merge 1 commit into
mainfrom
app-menu-bar
Open

feat(x): native application menu bar#876
hrsvrn wants to merge 1 commit into
mainfrom
app-menu-bar

Conversation

@hrsvrn

@hrsvrn hrsvrn commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

What

Replaces Electron's factory-default menu (electronjs.org Help links, DevTools and Reload enabled in production) with a full native application menu for the desktop app.

  • File — New Chat (⌘N), New Note (⇧⌘N), Export Note (md / pdf / docx)
  • Edit — undo/redo + clipboard. On Windows/Linux undo/redo route through the renderer so the markdown editor's history routing keeps working; macOS keeps the standard roles, identical to the old default menu
  • View — Search (⌘K), Toggle Sidebar (⌘), Full-Screen Chat (⌘L), zoom controls, full screen; Reload / Force Reload / DevTools are now dev-only
  • Go — Back/Forward plus all ten sections (Home, Email, Meetings, Brain, Apps, Code, Live Notes, Chat History, Background Tasks, Graph) with ⌘1–9
  • Tools — Quick Ask (shows the live global chord, hidden when unregistered), Start/Stop Meeting Notes with dynamic relabel (same hook as the tray)
  • Help — GitHub / Report an Issue / Release Notes, Keyboard Shortcuts (deep-links the settings tab), Open Data Folder (~/.rowboat), About, and a state-aware "Check for Updates…" that becomes "Restart to Update" when an update is staged, and links to GitHub releases on Linux where autoUpdater is unsupported

How

  • New apps/main/src/menu.ts, installed before the window is created so Linux/Windows never paint the default menu. Rebuilt on recording-state changes, quick-ask rebinds, and updater transitions — mirrors tray.ts.
  • Two new typed IPC channels: menu:command (one discriminated payload; each command reuses the exact code path of the in-app control it mirrors) and menu:toggleSidebar (its own channel because the handler must live under the SidebarProvider). Go-menu navigation needs no channel — it rides the existing deep-link pipeline (dispatchDeepLinkapp:openUrl), which already parks URLs while the renderer loads.
  • Zoom logic extracted from main.ts into zoom.ts so menu clicks and the before-input-event keystroke handler share one implementation; the stale "Linux suppresses the menu bar" comment is corrected in the move.
  • Chords the renderer already handles (⌘K/⌘N/⌘L/⌘Z) are display-only in the menu on Windows/Linux (registerAccelerator: false), so existing keyboard behavior is untouched.
  • updater.ts gains onUpdaterStatusChanged; menu-opened Settings gets its own dialog instance that can deep-link any tab (ConfigTab is now exported).

Testing

  • npm run deps, npm run lint, npm run typecheck all pass; apps/main additionally typechecked directly with tsc --noEmit (it is not covered by the workspace typecheck script).
  • 75-second dev-app boot on Linux: no main-process errors, menu renders with all sections.
  • Linux menu bar stays always-visible; flipping to Alt-to-reveal is a one-line autoHideMenuBar change if preferred.

…gated devtools, update-aware Help

Replaces Electron's factory-default menu (electronjs.org Help links,
DevTools enabled in production) with a real application menu:

- File: New Chat (Cmd+N), New Note (Cmd+Shift+N), Export Note (md/pdf/docx)
- Edit: undo/redo route through the renderer on Windows/Linux so the
  markdown editor's history routing keeps working; macOS keeps roles
- View: Search (Cmd+K), Toggle Sidebar (Cmd+\), Full-Screen Chat (Cmd+L),
  zoom, full screen; Reload/DevTools now dev-only
- Go: Back/Forward + all ten sections with Cmd+1-9, riding the existing
  deep-link pipeline (dispatchDeepLink -> app:openUrl)
- Tools: Quick Ask (live chord display), Start/Stop Meeting Notes with
  dynamic relabel (same hook as the tray)
- Help: GitHub/issues/releases, Keyboard Shortcuts (deep-links the
  settings tab), Open Data Folder, About, and a state-aware
  "Check for Updates…" ("Restart to Update" when staged; GitHub releases
  link on Linux where autoUpdater is unsupported)

Wiring: new menu:command + menu:toggleSidebar typed IPC channels; each
command reuses the exact code path of the in-app control it mirrors.
Chords the renderer already handles (Cmd+K/N/L/Z) stay display-only on
Windows/Linux. Zoom logic moves from main.ts into zoom.ts so menu clicks
and the before-input-event handler share one implementation; its stale
"Linux suppresses the menu bar" comment is gone. Menu rebuilds on
recording-state changes, quick-ask rebinds, and updater transitions.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant