Agent skill

Keyboard Shortcuts

by marcus in marcus/sidecar

Reference for keyboard shortcut implementation, keybinding registration, shortcut parity with vim and other TUI tools, and the complete shortcut assignment table across all sidecar plugins.

MITAuto-check passed

Install Keyboard Shortcuts

skills CLI
$ npx skills add marcus/sidecar --skill keyboard-shortcuts -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install marcus/sidecar keyboard-shortcuts --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/marcus/sidecar.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/keyboard-shortcuts .claude/skills/keyboard-shortcuts && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
keyboard-shortcuts
GitHub stars
1.1k
Token cost
~11k tokens
SKILL.md length
5,864 words
Files
2 (incl. references)
Skills in repo
19
Repo updated
First seen
Licence
MIT

At a glance

Reference for keyboard shortcut implementation, keybinding registration, shortcut parity with vim and other TUI tools, and the complete shortcut assignment table across all sidecar plugins.

  • Works in 4 steps: Add the binding in… → Add command handling in the plugin's… → Add the command to the plugin's… → …
  • Modifying keyboard shortcuts
  • SKILL.md covers Architecture, Global Shortcuts, Configuration (config /… and Agent Overview (overview…, plus 6 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Keyboard Shortcuts is an agent skill from marcus/sidecar. Reference for keyboard shortcut implementation, keybinding registration, shortcut parity with vim and other TUI tools, and the complete shortcut assignment table across all sidecar plugins. Use when adding or modifying keyboard shortcuts, checking shortcut assignments, resolving key conflicts, or assessing alignment with vim conventions.

Its SKILL.md is about 11k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/assessment.md`).

The repository describes itself as: Use sidecar next to CLI agents for diffs, file trees, conversation history, and task management with td. The licence is MIT.

When your agent uses it

  • Modifying keyboard shortcuts
  • Checking shortcut assignments
  • Resolving key conflicts
  • Assessing alignment with vim conventions

Example prompts

  • “/keyboard-shortcuts”

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Add the binding in internal/keymap/bindings.go under the appropriate context.
  2. Add command handling in the plugin's Update() method (usually in a handlers.go file).
  3. Add the command to the plugin's Commands() method for footer hint and command palette.
  4. Keep command names short (1 word preferred) to prevent footer wrapping.

What it can do on your machine

Read from SKILL.md and the folder at commit 2a2978a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Keyboard Shortcuts loads about 11k tokens when it runs, and up to ~18k if it reads all its reference files. Until then it costs about 90 tokens; SKILL.md has 5,864 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~90
When it runs · the whole SKILL.md, loaded when a task matches
~11k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~18k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from marcus/sidecar at commit 2a2978a, republished under its MIT licence (© marcus). 5,864 words, ~11,305 tokens.

Download SKILL.mdSave it as .claude/skills/keyboard-shortcuts/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
keyboard-shortcuts
description
Reference for keyboard shortcut implementation, keybinding registration, shortcut parity with vim and other TUI tools, and the complete shortcut assignment table across all sidecar plugins. Use when adding or modifying keyboard shortcuts, checking shortcut assignments, resolving key conflicts, or assessing alignment with vim conventions.

Keyboard Shortcuts

Complete shortcut listings and context reference for all sidecar plugins. For implementation patterns, see docs/guides/deprecated/ui-feature-guide.md. For a detailed assessment of inconsistencies, vim alignment, mnemonic quality, and improvement proposals, see references/assessment.md in this skill directory.

Architecture

  • Centralized binding registry: internal/keymap/bindings.go is the single source of truth for key bindings.
  • Context-based dispatch: Each plugin defines contexts; bindings are scoped to contexts.
  • Command palette (?): Auto-discovers bindings for discoverability.
  • User overrides: Supported via ~/.config/sidecar/config.json.
  • Key sequences: Compound commands like g g are supported with 500ms timeout.
Adding a New Shortcut
  1. Add the binding in internal/keymap/bindings.go under the appropriate context.
  2. Add command handling in the plugin's Update() method (usually in a handlers.go file).
  3. Add the command to the plugin's Commands() method for footer hint and command palette.
  4. Keep command names short (1 word preferred) to prevent footer wrapping.
TD Monitor Shortcuts

TD shortcuts are dynamically exported from TD itself via ExportBindings() and ExportCommands() in pkg/monitor/keymap/. TD is the single source of truth. To add TD shortcuts:

  1. Add binding to TD's pkg/monitor/keymap/bindings.go
  2. Add command constant to TD's pkg/monitor/keymap/registry.go
  3. Add metadata to TD's pkg/monitor/keymap/export.go
  4. Handle in TD's pkg/monitor/model.go

Global Shortcuts

KeyCommandDescription
j / downcursor-downMove cursor down
k / upcursor-upMove cursor up
Gcursor-bottomJump to bottom
g gcursor-topJump to top
ctrl+dpage-downPage down
ctrl+upage-upPage up
enterselectSelect item
escbackGo back / close
`next-pluginNext header entry
~prev-pluginPrevious header entry
]next-pluginNext header entry
[prev-pluginPrevious header entry
1-7focus-plugin-NFocus the Nth project tab (positional; stops at 7)
8focus-sessionsSessions (global)
9focus-activityActivity (global)
0focus-tasksTasks (global; no-op when the Tasks host is disabled)
?toggle-paletteCommand palette
!toggle-diagnosticsDiagnostics overlay
@switch-projectProject switcher
Wswitch-worktreeWorktree switcher
#switch-themeTheme switcher
,open-configurationOpen Configuration (contexts that bind , win)
iopen-issueOpen issue
rrefreshRefresh
qquitQuit (root contexts only)
ctrl+cquitForce quit
The header row is one ring

Sidecar's header is a single row of entries: the global ones in the left cluster (Sessions, Activity, and Tasks when its feature is on) followed by the project's plugin tabs on the right.

[ / ] (and their ~ / ` aliases) wrap through all of it, in that order, and the ring is identical from either scope — the project tabs are painted only in project scope, but they stay in the ring from the global space so the cycle is never a trap and ] then [ is always the identity. Tasks is absent from the ring whenever its feature is off.

The number row addresses the same row, but by two different rules:

  • 1-7 are positional project tabs. They stop at 7. An eighth plugin tab is reached with [ / ] or from the command palette.
  • 8 / 9 / 0 are named global entries — Sessions, Activity, Tasks — and mean the same thing in every scope. A key whose entry is disabled (0 with the Tasks host off) does nothing at all, silently; it never falls through to a plugin tab.

All ten digits and the four cycling keys are in keymap.GlobalKeys, so no plugin may claim them, and all of them yield to a focused text input.

Configuration (config / config-edit / config-confirm contexts)

Opened with , or by clicking the header gear, always on Sidecar Setup. Like the Overview, Configuration covers the plugin pane and owns keyboard focus: unhandled keys are swallowed rather than leaking to the hidden plugin. ? still opens the command palette.

KeyCommandContextAction
j / k / up / downcursor-down / cursor-upconfigMove through sidebar destinations
enterselectconfigOpen the selected destination
/searchconfigFocus Search (enters config-edit)
tabfocus-searchconfigMove focus between sidebar and Search
escclose-configurationconfigReturn from a child route, else close and restore the prior surface
downfirst-resultconfig-editMove from Search to the first visible result
upfocus-searchconfig-editReturn to Search from the first result
escclear-searchconfig-editClear the query and restore the full sidebar
enter / yconfirmconfig-confirmConfirm a consequential change
esc / ncancelconfig-confirmCancel it

Agent Overview (overview context)

Opened with K or by clicking the Sidecar logo. The Overview covers the plugin pane and owns keyboard focus: a plugin left in interactive/text-input mode underneath it (embedded shell, inline editor) does not receive keys while it is open, and unhandled keys are swallowed rather than leaking to the hidden plugin.

KeyAction
h / l / left / rightMove between lanes
j / k / up / downMove within a lane
enterOpen the selected workspace (switches project)
rRefresh the board
esc / KClose the Overview
qQuit Sidecar (confirmation modal)

Global shortcuts stay live while it is open: `/~, [/], 1-9, @, #, W, ?, !, ^, i, ctrl+c, q. Plugin-switching keys (`, ~, 1-9) close the Overview first. esc on the Agents board or Workspaces list leaves the global space. q opens Sidecar's quit modal.

Global Workspaces

Contexts: global-workspaces (list, root), global-workspaces-filter, global-workspaces-rename, global-workspaces-create, global-workspaces-delete, global-workspaces-terminal (typing), global-workspaces-doc, global-workspaces-doc-search, global-workspaces-doc-find, global-workspaces-issue, global-workspaces-diff.

There is no watched-preview focus: hiding the sidebar is layout only. l / → do not move focus to the preview. Clicking a file or td id focuses a content leaf with its own context; footer, help, and the palette follow WorkspaceFocusContext().

KeyAction
j / k / arrows / g / GMove selection; preview follows; not typing
enter / EStart typing in the selected live pane. A dead row stays put
click in paneStart typing. Clicking Diff/Task action chips opens a leaf and does not type
click a file tabSelect that file in the document preview. { / } also cycle when the document is focused
click an issue tabSelect that issue in the issue preview. { / } also cycle when the issue is focused
click a list rowSelect it; preview follows; not typing
click another row while typingSwitch session and stay typing
double-click a rowOpen that identity in its owning project
wheel on terminalScroll only; do not activate
ctrl+\ / esc escStop typing and land on the list
ctrl+shift+f while typingSearch the complete terminal history
iFind TD task (open-issue). Not interactive
nOpen Create Workspace (Worktree)
ctrl+nOpen Create Workspace with Shell selected (modal)
DDelete the selected shell (shown only for shell rows)
mOpen the owning project's established merge strategy workflow for a safe worktree
/Filter
v / sOpen View: sort the list. v matches the project sidebar; s is the original alias
\Toggle sidebar
escLeave the global space (or clear the filter first)
qQuit Sidecar (confirmation modal)
KToggle the global space
MOpen the reposition modal on the focused pane, or on the selected row's Primary terminal from the list (pane_move)
BOpen Broadcast to agents (broadcast-agents, agent_control)

ctrl+] attach stays project-only and is off unless tmux_full_attach is enabled. While typing, i and q go to the pane.

Focused document (global-workspaces-doc)

Same keys as the project document pane: q/esc close, x close tab, {/} cycle tabs, m toggle render, Y yank path — and the same three searches, all rooted at the pane's own directory: / in-file search, ctrl+p file finder, f project search. The finder and project search are internal/panesearch; the in-file bar is internal/docview. Contexts while one is up: global-workspaces-doc-search and global-workspaces-doc-find.

Focused issue (global-workspaces-issue)

An unmodified click on a td-… link opens it beside the terminal. A second click appends a tab; an already-open ID is focused. Click a drawn tab to select it. The header is only the tab strip: ID plus headline, truncated at the end so the ID stays visible. Footer hints are Tab× Tab← Tab→. There is no close chip.

enter on a parent or subtask uses the same open-or-focus path (no duplicate, no silent replace). Tabs stay in memory for the selected row and are not written to disk.

KeyCommandDescription
enteropen-itemOpen or focus the selected parent or subtask as a tab
Oopen-in-tdOpen the selected issue in td (same jump as the preview modal's o)
xclose-tabClose the active tab. Last tab closes the pane and forgets the set
{ / }prev-tab / next-tabPrevious / next issue tab
yyank-issueCopy issue as markdown
Yyank-issue-keyCopy issue ID
q / esccloseClose the pane and forget this row's in-memory tabs
Project issue pane (workspace-issue)

Same open/append/click/cycle/close journey and the same { / } / x / yank / enter keys. tab / shift+tab cycle panes; \ toggles the sidebar. q / esc hide the pane and retain tabs for that surface; last x forgets. Switching shells or relaunching restores tabs, the active tab, and each tab's scroll.

KeyCommandDescription
enteropen-itemOpen or focus the selected parent or subtask as a tab
Oopen-in-tdOpen the selected issue in td (same jump as the preview modal's o)
xclose-tabClose the active tab. Last tab forgets the pane
{ / }prev-tab / next-tabPrevious / next issue tab
yyank-issueCopy issue as markdown
Yyank-issue-keyCopy issue ID
tab / shift+tabnext-pane / prev-paneMove focus between sidebar, terminal, document, and issue
\toggle-sidebarToggle sidebar visibility
q / esccloseHide the pane. Tabs stay remembered for this surface

Sidebar Controls (All Two-Pane Plugins)

KeyAction
Tab / Shift+TabSwitch focus between panes
\Toggle sidebar visibility
h / leftFocus left pane
l / rightFocus right pane
+Grow sidebar width
-Shrink sidebar width

Git Status Plugin

Contexts
ContextView
git-statusFile list (root)
git-status-commitsRecent commits sidebar (root)
git-status-diffInline diff pane (root)
git-commit-previewCommit detail in right pane
git-diffFull-screen diff
git-commitCommit editor
git-push-menuPush strategy selection
git-pull-menuPull strategy selection
git-pull-conflictConflict resolution
git-historyCommit history
git-commit-detailSingle commit view
File List Shortcuts
KeyCommandDescription
sstage-fileStage selected file
uunstage-fileUnstage selected file
Sstage-allStage all modified
Uunstage-allUnstage all
ccommitOpen commit editor
AamendAmend last commit
d / entershow-diffView file changes
Ddiscard-changesDiscard unstaged changes
hshow-historyOpen commit history
PpushOpen push menu
LpullOpen pull menu
ffetchFetch from remote
bbranchBranch operations
zstashStash changes
Zstash-popPop stash
ctrl+zstash-applyStash apply
oopen-in-githubOpen in GitHub
Oopen-in-file-browserOpen in file browser
yyank-fileCopy file info
Yyank-pathCopy file path
Inline Diff Pane (git-status-diff)

The right-hand pane of the Git tab, focused with enter / l from the file list.

KeyCommandDescription
j / kscroll-down / scroll-upScroll the diff
ctrl+d / ctrl+upage-down / page-upScroll half a page
g / G—Jump to start (also resets the horizontal axis) / end
h / l—Scroll horizontally; h at column 0 returns to the sidebar
|reset-hscrollSnap the horizontal scroll back to column 0
enterfull-diffOpen the full-screen diff
s / ustage-file / unstage-fileStage / unstage the file
vtoggle-diff-viewCycle unified → split → full-file
wtoggle-wrapToggle line wrap
\toggle-sidebarToggle the sidebar
+ / -resize-pane-grow / resize-pane-shrinkResize the split

| is vim's goto-column key. It reads as the odd choice next to vim's 0, and 0 is what this pane used to bind — but the whole number row belongs to the header (see "The header row is one ring"), so 0 never reaches the plugin. It was a live handler that had quietly stopped being reachable; | is the replacement, and unlike 0 it is registered, so it appears in the footer and in ?.

Full-Screen Diff (git-diff)
KeyCommandDescription
, / .prev-file / next-filePrevious / next changed file
s / ustage-file / unstage-fileStage / unstage the file on screen
vtoggle-diff-viewCycle the diff view mode
wtoggle-wrapToggle line wrap
yyank-diffCopy the diff
ccommitOpen the commit editor
q / escclose-diffLeave the diff

This view has no tabs, so { / } are deliberately unbound here rather than made to mean "next file" — that would be the one place in Sidecar where a brace did something other than cycle tabs, and a silent wrong action is worse than a no-op. File stepping is , / ., the same as in the Workspaces Diff pane.

Commit List Shortcuts
KeyCommandDescription
enter / dview-commitOpen commit details
hshow-historyOpen history view
yyank-commitCopy commit as markdown
Yyank-idCopy commit hash
/search-historySearch commit messages
ffilter-authorFilter by author
pfilter-pathFilter by path
Fclear-filterClear filters
nnext-matchNext search match
Nprev-matchPrevious match
oopen-in-githubOpen commit in GitHub
vtoggle-graphToggle commit graph
Pull Menu
KeyCommand
ppull-merge
rpull-rebase
fpull-ff-only
apull-autostash

File Browser Plugin

Contexts
ContextView
file-browser-treeTree view (root)
file-browser-previewPreview pane
file-browser-searchFilename search
file-browser-content-searchContent search
file-browser-quick-openFuzzy file finder
file-browser-project-searchRipgrep search modal
file-browser-file-opFile operation input
file-browser-inline-editInline vim editor (all keys forwarded, global shortcuts bypassed)
Tree Shortcuts
KeyCommandDescription
/searchFilter files by name
ctrl+pquick-openFind — a file by name (same key, same name as a workspace file pane)
fproject-searchSearch — the project's contents (ripgrep)
/ (preview)search-contentInFile — this file's contents
acreate-fileCreate new file
Acreate-dirCreate new directory
ddeleteDelete (with confirmation)
tnew-tabOpen in new tab
{prev-tabPrevious tab
}next-tabNext tab
xclose-tabClose active tab
yyankCopy to clipboard
ppastePaste from clipboard
ssortCycle sort mode
mmoveMove file/directory
RrenameRename
ctrl+rrevealReveal in file manager

A file opened in an app content pane beside Files uses the shared workspace-doc document context. It keeps the same file-facing shortcuts as the primary Files preview wherever the shared viewer owns the capability: / InFile, ctrl+p Find, f Search, e inline Edit, E external Editor, r Reload, m Render, w Wrap, I Info, ctrl+r Reveal, y Contents, Y Path, configured selection copy/select-all, { / } tabs, and + / - resize. Its finder and project search are the same internal/panesearch surfaces used by project and global Workspace document panes, rooted at that content deck's project and loading results back into the focused pane. Files-only tree operations such as rename and its full-screen blame mode remain owned by the primary Files surface; they are not document-viewer shortcuts and are not forwarded to a potentially different file behind the focused pane.

Conversations Plugin

Contexts
ContextView
conversationsSession list single-pane (root)
conversations-sidebarSession list two-pane (root)
conversations-mainMessages pane
conversations-searchSearch mode
conversations-filterAdapter filter
conversation-detailTurn list
message-detailSingle turn content
analyticsUsage stats

Workspaces Plugin

Contexts
ContextView
workspace-listWorkspace list (root)
workspace-previewPreview pane
workspace-docFile tabs beside the terminal (hide with q)
workspace-doc-searchA pane's file finder / project search (owns the keyboard)
workspace-doc-findA pane's in-file search bar (owns the keyboard)
workspace-doc-editA pane's inline editor (owns every key, ctrl+c included)
workspace-issueIssue tabs beside the terminal (hide with q; last x forgets)
workspace-diffDiff tabs beside the terminal (hide with q; last x forgets)
workspace-createCreate Workspace form
workspace-task-linkTask selection modal
workspace-mergeMerge workflow modal
workspace-interactiveEmbedded terminal
List Shortcuts
KeyCommandDescription
nnew-workspaceOpen Create Workspace (Worktree)
ctrl+nnew-shellCreate a new shell immediately (shadows the global ctrl+n cursor-down in this context)
vopen-viewOpen View: sort the list (Manual, Activity, Recent, Name)
Vtoggle-viewToggle list/kanban
Ddelete-workspaceDelete workspace / delete shell (confirm)
dshow-diffOpen working-tree Diff leaf
ppushPush branch
mmerge-workflowStart merge workflow
Tlink-taskLink/unlink task
sstart-agentStart agent
enter / EinteractiveEnter interactive mode
iopen-issueFind TD task (global; not interactive)
tattachFull tmux attach (tmux_full_attach, default off)
Sstop-agentStop agent
Ffind-fileOpen a file pane on the fuzzy file finder
Pfetch-prFetch a remote PR as a workspace
Mmove-paneOpen the reposition modal on the selected row's Primary terminal (pane_move)
Bbroadcast-agentsOpen Broadcast to agents (agent_control)
Preview Shortcuts
KeyCommandAction
oopen-paneOpen the pane switcher (kind list focused) without leaving the preview
dshow-diffOpen working-tree Diff leaf
ctrl+ttoggle-terminalToggle a terminal split beside the preview
Mmove-paneOpen the reposition modal on the focused pane (pane_move)
The Pane Switcher Is Reachable From Every Pane

n opens the pane switcher whenever a content pane has focus — Document, Issue, Note, Diff or Resource — on both the project workspace (workspace-doc|issue|note|diff|resource) and the global Workspaces browser (global-workspaces-doc|issue|note|diff|resource). Every content pane absorbs the keys it does not own, so without this the switcher was reachable only from the sidebar or the terminal: putting a second pane beside the one you were reading meant leaving it first.

n is the same key the sidebar and the terminal preview already answer with "make me a new thing", so the answer does not change with focus. Two consequences follow, and both are deliberate:

  • The Diff pane's n / N next-change pair moved to > / < — the shifted forms of its , / . file steps, so the pair reads as one hierarchy: step a file, shift to step a change inside it. One key means one thing in every pane; a key that meant next-change here and "new pane" everywhere else is exactly the drift this codebase refuses.
  • A live input surface inside a pane still wins. A committed in-file search owns n for its next-match while it is up, as does the doc editor and the finder overlay; the switcher is asked only after they decline.

The terminal preview keeps o rather than n, because n there belongs to the list's create. internal/keymap's parity tests hold both surfaces to the same key in the same contexts.

The plugin half: ctrl+n

The same entry exists in the ordinary plugins, under ctrl+n rather than n. Every plugin that has a create already spends n on it — new-note, next-match — so displacing those would be the drift the Workspaces half deliberately avoided.

It is bound in one place for all five plugins: internal/app/pane_switcher.go, not once per plugin. The deck the switcher opens into is the app's (internal/app/content_deck.go) and so is the key routing, so a plugin opts in simply by being deck-eligible — implementing plugin.ContentLinkProvider and plugin.PaneFocusProvider, with features.PluginContentPanes on. Today that is file-browser, git-status, notes, tasks and td-monitor; workspace is excluded because it owns its own pane tree.

Three rules decide where the key appears, and none of them is a per-plugin list:

  • The keymap is the whole opt-in. The host reads the entry key out of the keymap for whatever context is active (paneSwitcherKeyFor) rather than comparing against a constant. A context that never names open-pane never reaches the switcher, and a user who rebinds open-pane moves the key and its footer hint together.
  • Browse and preview contexts only. ctrl+n is cursor-down in the global context and in every filter, finder, search and editor context. Claiming it where it already walks a list would take the cursor out from under someone who is typing, so those contexts keep it. See the assignment table below.
  • A focused passive leaf answers n, not ctrl+n. A leaf inside a plugin's deck reports the same workspace-doc|issue|note|diff|resource context the two Workspaces surfaces report for the same pane, so it answers the same key there. One model, three projections, one key each.

The switcher offers pane kinds only outside Workspaces — File, Git diff, td issue, Note, one row per configured resource provider — and is titled "Open Pane" rather than "Create Workspace". Shell and Worktree create workspace rows, which a Notes plugin has nowhere to put; Terminal split is absent because a plugin deck is a passive contentpanes deck with no live-leaf host. That is workspacecreate.OpenOpts.PaneKindsOnly plus AllowTerminalSplit: false — the same data-driven catalog, one more flag, no second modal.

See docs/plans/active/pane-switcher-everywhere.md.

Where ctrl+n goes, in full

Every context that binds ctrl+n in keymap.DefaultBindings(), and to what. internal/keymap/pane_switcher_parity_test.go holds this table to the tree.

ContextCommandWhy
globalcursor-downThe emacs/readline default. Everything below either shadows it or inherits it.
notes-listopen-paneNotes' browse context.
file-browser-tree, file-browser-previewopen-paneThe File Browser's two browse contexts.
git-status, git-status-commits, git-status-diff, git-diff, git-commit-previewopen-paneGit names both the focused pane and the cursor's row in its context, so reading a file row, reading a commit and reading a diff are three contexts.
tasks-list, tasks-detail, tasks-response, tasks-response-detailopen-paneExactly Tasks' four root contexts; everything else Tasks reports is an overlay it owns the keyboard in.
td-monitor, td-board, td-kanbanopen-panetd's three browse views: the main list, board mode, the kanban view.
global-workspaces, workspace-listnew-shellThe Workspaces lists' second create. This is the precedent ctrl+n follows here — one modifier out from n, same intent.
global-workspaces-filter, project-switchercursor-downFilters. The key walks the list while you type.
file-browser-quick-open, file-browser-project-searchcursor-downFinders.
notes-search, notes-editorcursor-downSearch and the built-in editor.

Contexts deliberately without a row, and the reason each is different:

  • notes-preview — the note preview answers ctrl+n/ctrl+p as its own cursor motion in plugin code (notes.handleEditorPreviewKey), with nothing in bindings.go to show for it. The rule stands aside; Notes stays reachable from notes-list.
  • td-modal and its sub-focus states (td-epic-tasks, td-parent-epic, td-blocked-by-focused, td-blocks-focused) — tdmonitor.BlocksGlobalKeys hands every key in that context to the embedded td model at precedence level 2, two rungs above the switcher's, so a binding there would never fire. This is the one genuinely wanted pane the entry does not reach.
  • td-search, td-form, td-board-editor, td-confirm, td-close-confirm, and every non-root tasks-* context — text input or an overlay the plugin forwards wholesale.
  • git-history — has bindings in bindings.go but gitstatus.FocusContext() never reports it. A binding on a context nobody stands in is a key that does nothing.
  • Anything reaching a live PTY. ctrl+n is a real control character: tty.MapKeyToTmux encodes it as C-n and sends it to the pane. The tty layer's own chords are ctrl+\ (exit), ctrl+] (attach), alt+c (copy), alt+v (paste), ctrl+a (select all) and the platform copy chord; its scrollback set is the arrows plus the j/k/g/G/ctrl+d/ctrl+u pager aliases. The two host OnKey hooks claim only terminal search and ctrl+t. Above all of that, workspace-interactive, file-browser-inline-edit, notes-inline-edit and workspace-doc-edit forward every key two rungs before the switcher's is reached.

g / G jump to the top / bottom of the preview's scrollback. 0 is deliberately not bound here: it is the header's global Tasks shortcut, and a context-local binding would make the same key mean two different things one tab apart. (It previously carried a reset-scroll command that had no handler anywhere in the tree.)

Show full SKILL.md (2,229 more words)Show less
M Opens the Reposition Modal From Every Pane

M (move-pane, feature pane_move, default on) opens the shared pane reposition modal — the same modal the pane header's ⊞ button opens, and the same one for all three pane hosts. It is an entry point, not a second interaction: M never mutates the live tree by itself. Inside the modal, h/j/k/l and the arrows edit a draft, z toggles zoom, enter commits the whole sequence atomically, and esc discards it.

Which pane it targets depends on which window owns the keyboard:

  • From a focused pane — a preview, a document, an issue, a note, a diff, a resource — M targets that leaf.
  • From either Workspaces list (workspace-list, and global-workspaces, which the Sessions surface also reports for a focused Primary terminal) M targets the selected row's Primary terminal. Host focus decides which of the two the shared global-workspaces context means.
  • From a plugin content deck the key is answered on the app's own structural rung, so it targets the focused passive leaf and never the primary plugin leaf underneath.

Bound contexts (all feature-gated on pane_move): workspace-list, workspace-preview, workspace-doc, workspace-issue, workspace-note, workspace-diff, workspace-resource, global-workspaces, global-workspaces-doc, global-workspaces-issue, global-workspaces-note, global-workspaces-diff, global-workspaces-resource. The app content decks report the same workspace-* context names for their own leaves and inherit these bindings.

Not bound in text-input, interactive-terminal, modal, or unrelated plugin browse contexts — workspace-filter, workspace-interactive, workspace-doc-edit|search|find, global-workspaces-filter, global-workspaces-terminal, file-browser-tree, git-status, notes-list, and the rest. Those contexts keep every printable key for themselves, and internal/keymap/pane_move_parity_test.go holds them to it.

Why M and not m. m is free in ten of the twelve pane contexts, and taken in exactly the two that would break parity: global-workspaces-doc spends it on render, and global-workspaces (what a focused Primary terminal reports on the Sessions surface) spends it on merge-workflow. One key must mean one thing in every pane, so a key that works in ten and not the other two is not a candidate. M is bound nowhere else except git-status (stash-pop), a plugin browse context that is never a pane leaf.

A pane with nowhere to go has no entry. A tree with a single leaf offers neither the key's modal nor the header's ⊞: PlanMove refuses every destination on it, so both would open onto a layout that cannot change. The button appears when a second pane does.

The agent's half of the same capability is sidecar layout move over the same planner, with --to left|right|up|down compiling through the identical direction rule. See .claude/skills/ui-features/SKILL.md and docs/reference/cli.md.

Interactive Mode
KeyCommand
ctrl+\exit
ctrl+]attach (tmux_full_attach, default off)
ctrl+ttoggle a terminal split beside the preview (workspace_terminal_panel, default on)
ctrl+shift+fsearch complete terminal history
alt+ccopy
super+ccopy (Cmd+C, when the emulator passes it through)
alt+vpaste
Document Pane

An unmodified click on a resolvable file path in workspace or shell terminal output opens it beside that terminal. A second click appends a tab; a path that is already open is focused (and path:line jumps). Click a drawn tab to select it. The header is only the tab strip: each label is the relative path, left-truncated so the filename end always wins. Document panes are enabled by default; --disable-feature=workspace_doc_panes opts out for a launch and also disables Diff (no pane tree). shift-drag and alt-drag remain terminal selection gestures.

The global Workspaces view uses the same tab strip and the same click / { / } / x keys. Those tabs stay in memory for the selected row.

q / esc hide the pane and remember the tab set for this shell or workspace. x on the last tab forgets the set. Switching surfaces or relaunching onto the same surface restores open files, the active tab, render mode, wrap, scroll, and split ratio. , / . cycle Diff target tabs only while a Diff leaf is focused; they do not cycle document tabs.

KeyCommandDescription
j / downscroll-downScroll down
k / upscroll-upScroll up
ctrl+d / ctrl+upage-down / page-upScroll half a page
g / Gcursor-top / cursor-bottomJump to start / end
/search-contentSearch within this file (in-pane bar; same feature as the Files plugin's /)
eeditEdit this file inline (tmux PTY editor in the pane body; features.tmux_inline_edit)
ctrl+pfind-fileFind a file by name in this pane (modal scoped to the pane)
fsearch-projectSearch the project in this pane (modal scoped to the pane)
xclose-tabClose the active tab. Last tab closes the pane and forgets the set
{ / }prev-tab / next-tabPrevious / next file tab
mrenderToggle rendered/raw markdown (markdown only; no-op otherwise)
wtoggle-wrapToggle line wrap
IinfoFile info modal
ctrl+rrevealReveal in the OS file manager
Yyank-pathCopy the relative path
+ / -resize-pane-grow / resize-pane-shrinkResize the workspace split
tab / shift+tabnext-pane / prev-paneMove focus between sidebar, terminal, and document
q / esccloseHide the pane. Tabs stay remembered for this surface

While a pane search is open (workspace-doc-search) it owns every key in the pane: esc closes it, enter loads the hit in the active tab, and shift+enter opens it in a new tab.

Inline edit (e) opens the same tmux-PTY editor the Files plugin uses, sized to the pane body, on both pane surfaces (workspace-doc-edit and the global browser's document pane). While a session is live every key is the editor's — ctrl+\ or esc esc exit it — and clicking outside the pane raises the save / discard / cancel confirmation instead of leaving the buffer behind.

In-file search (/) is a third surface, drawn by internal/docview as one row inside the pane, and it owns every key while it is up (workspace-doc-find, global-workspaces-doc-find): enter commits, n / N step matches, esc closes. It dismisses when the pane loses focus. While it is up it also keeps n away from the pane switcher, which is asked only after the pane's own input surfaces decline.

Diff Pane

d / show-diff on the Workspaces list or preview opens a working-tree Diff leaf beside the terminal. The leaf is not a root context: q / esc hide it. { / } cycle Diff target tabs while the leaf is focused; , / . step next/prev file inside the view, and > / < step next/prev change inside a file (this pair was n / N until the pane switcher took n in every content pane).

One rule everywhere: { / } is always "cycle the tabs of the thing I am looking at." Document, issue, File Browser and Diff leaves all obey it. The Diff pane is the only surface with a second navigation axis — the files inside the active target — and that axis gets its own pair, , / ..

The earlier arrangement was the reverse ({ / } = file, , / . = tab), on the reasoning that in-view file jumping is the more frequent act in a diff and so deserved the better-known keys. That reasoning was sound in isolation and wrong in aggregate: it made the diff the one place in Sidecar where } did not mean "next tab", so the cost was paid on every context switch into and out of the diff, by everyone, forever — while the benefit accrued only inside the diff. Consistency of a key's meaning across surfaces beats optimality of its assignment on one surface. If you are tempted to re-optimise a key for a single pane again, that is the trade to weigh.

KeyCommandDescription
dshow-diffOpen working-tree Diff leaf (list and preview)
q / esccloseHide the pane. Tabs stay remembered for this surface
xclose-tabClose the active tab. Last tab forgets the pane
{ / }prev-tab / next-tabPrevious / next Diff target tab
, / .prev-file / next-filePrevious / next file in this target
Yyank-idCopy the target identity (wt / c:… / r:…)
tab / shift+tabnext-pane / prev-paneMove focus between sidebar, terminal, and content
\toggle-sidebarToggle sidebar visibility

Moving around inside the viewer. These are the shared viewer's own keys (internal/workspacediff/keys.go); they are registered in bindings.go for both workspace-diff and global-workspaces-diff so the footer, help and palette show them, and the viewer answers them before keymap dispatch.

KeyCommandDescription
l / right / enterdiff-openOpen the selected file's diff, or a commit's file list
j / downdiff-down / diff-scroll-downNext item in the list; scroll the diff body
k / updiff-up / diff-scroll-upPrevious item; scroll the diff body up
h / leftdiff-backBack to the file list (scrolls sideways first when panned)
g / Gdiff-top / diff-bottomJump to the top / bottom
ctrl+d / pgdowndiff-page-downPage down
ctrl+u / pgupdiff-page-upPage up
vtoggle-diff-viewCycle unified → side-by-side → full-file
ztoggle-diff-scopeCycle working tree → commits → aggregate
> / <diff-next-changeNext / previous change (full-file mode)
ffile-pickerOpen the file picker (project pane only)
Issue Pane

An unmodified click on a td-… link in workspace or shell terminal output opens it beside that terminal. A second click appends a tab; an ID that is already open is focused. Click a drawn tab to select it. The header is only the tab strip: each label is the issue ID plus headline, truncated at the end so the ID stays visible. There is no close chip. Footer hints are Tab× Tab← Tab→.

The global Workspaces view uses the same tab strip and the same click / { / } / x keys. Those tabs stay in memory for the selected row and are not written to disk. q / esc and last-x forget that row's set.

In project Workspaces, q / esc hide the pane and remember the tab set for this shell or workspace. x on the last tab forgets the set. Switching surfaces or relaunching onto the same surface restores open issues, the active tab, and each tab's scroll. Parent and subtask enter uses the same open-or-focus path.

File tabs keep left-truncated paths so the filename survives. Issue tabs keep the ID visible and truncate the headline.

KeyCommandDescription
j / kscroll-down / scroll-upScroll down / up
down / upWalk parent, siblings, and subtasks
ctrl+d / ctrl+upage-down / page-upScroll half a page
g / Gcursor-top / cursor-bottomJump to start / end
xclose-tabClose the active tab. Last tab closes the pane and forgets the set
{ / }prev-tab / next-tabPrevious / next issue tab
enteropen-itemOpen or focus the selected parent or subtask as a tab
yyank-issueCopy the issue as markdown
Yyank-issue-keyCopy the issue ID
tab / shift+tabnext-pane / prev-paneMove focus between sidebar, terminal, document, and issue
q / esccloseHide the pane. Tabs stay remembered for this surface

Notes Plugin

Contexts: notes-list (root), notes-preview, notes-editor, notes-search, notes-info, notes-task-modal, notes-delete-modal, notes-inline-edit.

The built-in editor is modeless: printable keys type. Selection and undo use modifier chords so v, u, y, d, x, and p stay letters.

Built-in editor (notes-editor)
KeyCommandDescription
shift+arrows / shift+home / shift+endselect-*Extend a source-coordinate selection
alt+sselect-toggleSet or clear the selection anchor; ordinary movement then extends
alt+aselect-allSelect the whole note
super+aselect-allSelect the whole note when the terminal delivers Cmd; alt+a is the portable advertised fallback
super+up / super+downnote-start / note-endMove to the start / end of the note when delivered
shift+super+up / shift+super+downselect-note-start / select-note-endExtend selection to the start / end of the note when delivered
alt+ccopy-noteCopy the selection, or the whole note if none
alt+xcutCut the selection
backspace / delete / type / paste—Replace the selection (one undo unit)
ctrl+zundo-editUndo the last edit unit
ctrl+y / ctrl+shift+zredo-editRedo
ctrl+ssaveSave now; after leaving edit, retry a failed save from list, preview, or search
esc / tabback / switch-paneLeave edit and persist

The tmux/$EDITOR pane (e) keeps vim's own undo and selection.

In the list and read-only preview, ctrl+y copies the selected note ID. In the built-in editor it remains redo, and in the tmux/$EDITOR pane it is forwarded unchanged. Enter and note-body clicks follow plugins.notes.defaultEditor; i, e, and E remain explicit built-in, in-pane, and external editor paths.

TD Monitor Plugin

Contexts: td-monitor (root), td-board, td-kanban, td-modal, td-stats, td-search, td-confirm, td-epic-tasks, td-parent-epic, td-handoffs.

Shortcuts are defined in TD's pkg/monitor/keymap/ and auto-exported. The context names come from there too — td names its own context and monitor/keymap.ContextToSidecar spells it for sidecar — so any sidecar-side binding on a td-* context is a copy of someone else's constant. tdmonitor.TestBrowseContextsCarryThePaneSwitcherEntry derives them from the upstream constants so a rename in td fails a test here rather than silently unbinding a key.

ctrl+n opens the pane switcher in td-monitor, td-board and td-kanban. See "The Pane Switcher Is Reachable From Every Pane" for why td-modal is not among them.

Tasks Plugin

Contexts: tasks-list, tasks-detail, tasks-response, tasks-response-detail (the four root contexts), plus every overlay Tasks reports — tasks-filter, tasks-form, tasks-modal, tasks-picker, tasks-prompt, tasks-task-edit, tasks-agent-activity and the rest.

Shortcuts are defined in Tasks' pkg/tui and auto-exported, and the context names come from there verbatim (tasksui.FocusContext). Root-ness is sidecar's own judgement (internal/plugins/tasks/routing.go) and it fails conservative: anything unknown is treated as an overlay, so sidecar's global keys do not fire underneath one.

ctrl+n opens the pane switcher in the four root contexts and nowhere else — in an overlay, BlocksGlobalKeys has already handed the key to the tab.

Project Switcher

KeyCommand
@toggle
down / ctrl+ncursor-down
up / ctrl+pcursor-up
Enterselect
Escclose

Command Palette

Press ? to open. Press tab to toggle between current-context and all-contexts view.

KeyAction
j / k / up / downNavigate
ctrl+d / ctrl+uPage down/up
enterExecute
escClose
tabToggle context filter

Known Conflicts and Design Decisions

Key conflicts exist across plugins (e.g., d = delete in file-browser, diff in git, delete-session in conversations). See references/assessment.md for the full inconsistency analysis, vim alignment audit, mnemonic analysis, and proposed improvement plan.

Shift Modifier Convention (Current)
  • s/S: stage / stage-all (git)
  • u/U: unstage / unstage-all (git)
  • d/D: diff / discard (git), delete/- (file-browser)
  • y/Y: yank item / yank path
  • n/N: next-match / prev-match (search contexts)

© marcus, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (references) in .claude/skills/keyboard-shortcuts of marcus/sidecar.

  • SKILL.md
  • references/assessment.md

Open the folder on GitHubat commit 2a2978a

Compare with similar skills

Keyboard Shortcuts next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Keyboard Shortcuts compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Keyboard Shortcuts this skillmarcus/sidecar1.1k—~11kAutomated safety check: PassMIT
cmux Keyboard Shortcut Customizermanaflow-ai/cmux28k1 repos~3.1kAutomated safety check: PassCustom licence
Windsurf Keyboard Shortcutsjeremylongshore/tons-of-skills-marketplace2.8k—~484Automated safety check: PassMIT
Adding Keyboard Shortcutslobehub/lobehub83k—~647Automated safety check: PassCustom licence
Keybindings Helpasgeirtj/system_prompts_leaks69k—~3.6kAutomated safety check: PassCC0-1.0
Warp Keybinding Editorwarpdotdev/warp65k1 repos~1.1kAutomated safety check: PassAGPL-3.0

Similar skills

  • Turns a described workflow preference into cmux keyboard shortcut bindings, proposing templates such as tmux-style or Vim-style and applying only what the user picks.

    28k GitHub starsUsed in 1 repo~3.1k tokens
    Productivity & AutomationAuto-check passed
  • Windsurf Keyboard Shortcuts

    jeremylongshore/tons-of-skills-marketplace

    Configure custom keyboard shortcuts for Cascade and AI features.

    2.8k GitHub stars~484 tokensUpdated today
    Auto-check passed
  • Walks through adding a keyboard shortcut to LobeHub: the id type, default registration, translation text, the hook and an optional tooltip, plus scope and conflict advice.

    83k GitHub stars~647 tokensUpdated today
    Frontend & DesignAuto-check passed
  • Keybindings Help

    asgeirtj/system_prompts_leaks

    A skill your agent uses when the user wants to customize keyboard shortcuts, rebind keys, add chord bindings, or modify ~/.claude/keybindings.json.

    69k GitHub stars~3.6k tokensUpdated today
    Auto-check passed
  • Warp Keybinding Editor

    warpdotdev/warp

    Remaps, rebinds, or removes a Warp terminal keyboard shortcut by editing the user's keybindings.yaml file in Warp's own normalized key syntax.

    65k GitHub starsUsed in 1 repo~1.1k tokens
    DevelopmentAuto-check passed
  • Studio Shortcuts

    supabase/supabase

    Official

    Keyboard shortcut conventions for Supabase Studio. An agent skill from supabase/supabase.

    111k GitHub stars~919 tokensUpdated today
    Backend & APIsAuto-check passed

More from marcus/sidecar

All 19 skills in this repo
  • Create Adapter

    marcus/sidecar

    Create conversation adapters for importing AI chat history from different tools (Claude Code, Cursor, Warp, Codex, etc.).

    1.1k GitHub stars~4.8k tokensUpdated 2 days ago
    Auto-check passed
  • Create Modal

    marcus/sidecar

    Create declarative modals using the modal library API. An agent skill from marcus/sidecar.

    1.1k GitHub stars~2.6k tokensUpdated 2 days ago
    Auto-check passed
  • Create Plugin

    marcus/sidecar

    Create new sidecar plugins implementing the plugin.Plugin interface, rendering views with Bubble Tea, handling keyboard input via keymap contexts, and integrating with the app shell (footer hints…

    1.1k GitHub stars~2.3k tokensUpdated 2 days ago
    Auto-check passed
  • Project Switching

    marcus/sidecar

    Project switching implementation in sidecar: project discovery, state management, UI flow, modal rendering, filtering, theme preview, and plugin reinitialization.

    1.1k GitHub stars~1.8k tokensUpdated 2 days ago
    Auto-check passed
  • Shell Integration

    marcus/sidecar

    Interactive shell/TTY integration with tmux session management, shell command execution, control-mode output capture with polling fallback, native cursor rendering, lazy scrollback, selection, paste…

    1.1k GitHub stars~3.6k tokensUpdated 2 days ago
    Auto-check passed
  • Sidecar Website

    marcus/sidecar

    Writing and maintaining the Sidecar Docusaurus documentation site, including page structure, doc authoring, blog posts, styling, images, and deployment workflow.

    1.1k GitHub stars~1.7k tokensUpdated 2 days ago
    Auto-check passed

Questions about Keyboard Shortcuts

What does Keyboard Shortcuts do?

Reference for keyboard shortcut implementation, keybinding registration, shortcut parity with vim and other TUI tools, and the complete shortcut assignment table across all sidecar plugins. Keyboard Shortcuts is an agent skill from marcus/sidecar. Reference for keyboard shortcut implementation, keybinding registration, shortcut parity with vim and other TUI tools, and the complete shortcut assignment table across all sidecar plugins.

When should I use Keyboard Shortcuts?

Keyboard Shortcuts fits situations like: modifying keyboard shortcuts; checking shortcut assignments; resolving key conflicts; assessing alignment with vim conventions.

How do I install Keyboard Shortcuts in Claude Code?

Run `npx skills add marcus/sidecar --skill keyboard-shortcuts -a claude-code`. Or copy the skill folder (.claude/skills/keyboard-shortcuts in marcus/sidecar) into .claude/skills/keyboard-shortcuts in your project. Claude Code loads it when a task matches its description.

How do I install Keyboard Shortcuts in Codex?

Run `npx skills add marcus/sidecar --skill keyboard-shortcuts -a codex`. Or copy the skill folder (.claude/skills/keyboard-shortcuts in marcus/sidecar) into .agents/skills/keyboard-shortcuts in your project. Codex loads it when a task matches its description.

Can I use Keyboard Shortcuts in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add marcus/sidecar --skill keyboard-shortcuts -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/keyboard-shortcuts, .gemini/skills/keyboard-shortcuts, .github/skills/keyboard-shortcuts and .opencode/skills/keyboard-shortcuts in your project.

What does Keyboard Shortcuts need to run?

SKILL.md names no scripts, command-line tools or credentials: Keyboard Shortcuts is instructions for the agent only.

Does Keyboard Shortcuts access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Keyboard Shortcuts safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Keyboard Shortcuts use?

Keyboard Shortcuts is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Keyboard Shortcuts use?

About 11k tokens (SKILL.md is roughly 45k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6.5k tokens, read only when the agent opens those files.

What are the alternatives to Keyboard Shortcuts?

Skills that share tags, products or a category with Keyboard Shortcuts: cmux Keyboard Shortcut Customizer (manaflow-ai/cmux, 28k stars), Windsurf Keyboard Shortcuts (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), Adding Keyboard Shortcuts (lobehub/lobehub, 83k stars) and Keybindings Help (asgeirtj/system_prompts_leaks, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Keyboard Shortcuts?

marcus (a GitHub user) maintains it in marcus/sidecar, which has 1,086 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 8, 2026.

Source: marcus/sidecar on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.