#13610 · @dl-alexandre · opened Feb 14, 2026 at 3:00 PM UTC · last updated Mar 21, 2026 at 1:53 PM UTC
feat(desktop): add keyboard shortcuts to switch projects (Cmd+1-9)
Score breakdown
Impact
Clarity
Urgency
Ease Of Review
Guidelines
Readiness
Size
Trust
Traction
Summary
This PR introduces keyboard shortcuts (Mod+1-9) for switching between projects in the desktop application. It's a rework of a previous attempt, focusing on a cross-platform approach and integrating with existing command and settings systems.
Description
What does this PR do?
Adds Mod+1 through Mod+9 keyboard shortcuts to switch between sidebar projects, similar to browser tab
switching (Chrome, VS Code).
This is a rework of #11847 based on review feedback from @alexyaroshuk. The original approach used a macOS-only Window menu with CustomEvent — this version instead:
- Registers 9 commands (project.switch.0–project.switch.8) via the existing command.register() system in layout.tsx
- Uses mod+1–mod+9 keybinds which are cross-platform (Cmd on macOS, Ctrl on Windows/Linux)
- Integrates with Settings > Shortcuts for user customization
- Adds TooltipKeybind on each sidebar project tile showing the project name and keybind
- Adds command.project.switch i18n string across all 15 supported languages
Closes #11837 Supersedes #11847
How did you verify your code works?
- Typecheck passes (12/12 packages)
- Tested switching between projects using Mod+1-9 in the desktop app
- Verified tooltips appear on hover with correct keybind displayed
Linked Issues
#11837 feat(desktop): Add keyboard shortcuts to switch projects (Cmd+1, Cmd+2, etc.)
View issueComments
PR comments
ndaemy
Nice work on this! One concern about the keybind scope:
The implementation lives in packages/app, which is shared across desktop (Tauri/Electron) and the web version (opencode web / app.opencode.ai proxy). mod+1–9 conflicts with browser tab switching on all platforms.
Would it make sense to gate these keybinds behind a platform check so they only register on desktop?
Changed Files
packages/app/src/i18n/ar.ts
+1−0packages/app/src/i18n/br.ts
+1−0packages/app/src/i18n/da.ts
+1−0packages/app/src/i18n/de.ts
+1−0packages/app/src/i18n/en.ts
+1−0packages/app/src/i18n/es.ts
+1−0packages/app/src/i18n/fr.ts
+1−0packages/app/src/i18n/ja.ts
+1−0packages/app/src/i18n/ko.ts
+1−0packages/app/src/i18n/no.ts
+1−0packages/app/src/i18n/pl.ts
+1−0packages/app/src/i18n/ru.ts
+1−0packages/app/src/i18n/th.ts
+1−0packages/app/src/i18n/zh.ts
+1−0packages/app/src/i18n/zht.ts
+1−0packages/app/src/pages/layout.tsx
+19−4packages/app/src/pages/layout/sidebar-project.tsx
+16−2packages/app/src/pages/layout/sidebar-shell.tsx
+2−2