#18502 · @Brendonovich · opened Mar 21, 2026 at 8:49 AM UTC · last updated Mar 21, 2026 at 8:49 AM UTC

app: allow navigating projects with keybinds

appfeat
57
+3602 files

Score breakdown

Impact

6.0

Clarity

8.0

Urgency

4.0

Ease Of Review

4.0

Guidelines

6.0

Readiness

7.0

Size

9.0

Trust

10.0

Traction

0.0

Summary

This PR introduces new keyboard shortcuts for navigating between projects, specifically using cmd+option+arrow keybinds. It adds a quality-of-life feature for keyboard-centric users. The changes involve modifying i18n files and the main layout component.

Open in GitHub

Description

Adds discord-style cmd+option+array keybinds for navigating between projects

Linked Issues

None.

Comments

No comments.

Changed Files

packages/app/src/i18n/en.ts

+20
@@ -23,6 +23,8 @@ export const dict = {
"command.sidebar.toggle": "Toggle sidebar",
"command.project.open": "Open project",
"command.project.previous": "Previous project",
"command.project.next": "Next project",
"command.provider.connect": "Connect provider",
"command.server.switch": "Switch server",
"command.settings.open": "Open settings",

packages/app/src/pages/layout.tsx

+340
@@ -936,6 +936,26 @@ export default function Layout(props: ParentProps) {
navigateToSession(session)
}
function navigateProjectByOffset(offset: number) {
const projects = layout.projects.list()
if (projects.length === 0) return
const current = currentProject()?.worktree
const fallback = currentDir() ? projectRoot(currentDir()) : undefined
const active = current ?? fallback
const index = active ? projects.findIndex((project) => project.worktree === active) : -1
const target =
index === -1
? offset > 0
? projects[0]
: projects[projects.length - 1]
: projects[(index + offset + projects.length) % projects.length]
if (!target) return
openProject(target.worktree)
}
function navigateSessionByUnseen(offset: number) {
const sessions = currentSessions()
if (sessions.length === 0) return
@@ -1002,6 +1022,20 @@ export default function Layout(props: ParentProps) {
keybind: "mod+o",
onSelect: () => chooseProject(),
},
{
id: "project.previous",
title: language.t("command.project.previous"),
category: language.t(