Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Emanuele-web04/synara/llms.txt
Use this file to discover all available pages before exploring further.
Synara ships with a built-in set of keyboard shortcuts for every major action — opening the terminal, creating chat threads, focusing the composer, and more. You can override any of them, add new ones, or layer context-sensitive rules using a plain JSON file. No restart is required; Synara watches the file and reloads it automatically whenever it changes.
File Location
~/.synara/userdata/keybindings.json
If you override the home directory with --home-dir or SYNARA_HOME, the path becomes:
$SYNARA_HOME/userdata/keybindings.json
On first launch Synara writes all default bindings to this file so you have a complete, editable starting point. New defaults introduced in future releases are backfilled automatically on startup unless the shortcut context is already taken by a custom rule.
Rule Shape
The file must be a JSON array of rule objects. Each rule supports three fields:
The keyboard shortcut string. Modifier names are joined to the base key with +. See Key Syntax for the full list of accepted modifiers.
The action to fire. Must be one of the Available Commands. Dynamic script commands follow the pattern script.<id>.run.
An optional boolean expression that gates when the shortcut is active. When omitted the rule fires regardless of focus state. See When Conditions.
Minimal example
[
{ "key": "mod+g", "command": "terminal.toggle" },
{ "key": "mod+shift+g", "command": "terminal.new", "when": "terminalFocus" }
]
Default Keybindings
The table below lists every default shortcut shipped with Synara. These are the exact values written to keybindings.json on first launch.
| Key | Command | When |
|---|
mod+b | sidebar.toggle | !terminalFocus |
mod+k | sidebar.search | — |
mod+shift+o | sidebar.addProject | !terminalFocus |
mod+i | sidebar.importThread | !terminalFocus |
mod+j | terminal.toggle | — |
mod+d | terminal.split | terminalFocus |
mod+shift+arrowright | terminal.splitRight | terminalFocus |
mod+shift+arrowleft | terminal.splitLeft | terminalFocus |
mod+shift+arrowdown | terminal.splitDown | terminalFocus |
mod+shift+arrowup | terminal.splitUp | terminalFocus |
mod+t | terminal.new | terminalFocus |
mod+w | terminal.close | terminalFocus |
mod+shift+j | terminal.workspace.newFullWidth | — |
mod+w | terminal.workspace.closeActive | terminalWorkspaceOpen |
mod+1 | terminal.workspace.terminal | terminalWorkspaceOpen |
mod+2 | terminal.workspace.chat | terminalWorkspaceOpen |
mod+shift+b | browser.toggle | !terminalFocus |
mod+d | diff.toggle | !terminalFocus |
cmd+l | composer.focus.toggle | !terminalFocus |
mod+shift+m | modelPicker.toggle | !terminalFocus |
mod+shift+e | traitsPicker.toggle | !terminalFocus |
mod+shift+u | settings.usage | !terminalFocus |
mod+n | chat.new | !terminalFocus |
mod+shift+n | chat.newLatestProject | !terminalFocus |
mod+alt+n | chat.newChat | !terminalFocus |
mod+shift+t | chat.newTerminal | !terminalFocus |
mod+alt+c | chat.newClaude | !terminalFocus |
mod+alt+x | chat.newCodex | !terminalFocus |
mod+alt+r | chat.newCursor | !terminalFocus |
mod+alt+g | chat.newGemini | !terminalFocus |
mod+\ | chat.split | !terminalFocus |
ctrl+tab | view.recent.next | — |
ctrl+shift+tab | view.recent.previous | — |
mod+1 | thread.jump.1 | !terminalFocus && !terminalWorkspaceOpen |
mod+2 | thread.jump.2 | !terminalFocus && !terminalWorkspaceOpen |
mod+3 | thread.jump.3 | !terminalFocus && !terminalWorkspaceOpen |
mod+4 | thread.jump.4 | !terminalFocus && !terminalWorkspaceOpen |
mod+5 | thread.jump.5 | !terminalFocus && !terminalWorkspaceOpen |
mod+6 | thread.jump.6 | !terminalFocus && !terminalWorkspaceOpen |
mod+7 | thread.jump.7 | !terminalFocus && !terminalWorkspaceOpen |
mod+8 | thread.jump.8 | !terminalFocus && !terminalWorkspaceOpen |
mod+9 | thread.jump.9 | !terminalFocus && !terminalWorkspaceOpen |
mod+shift+] | chat.visible.next | !terminalFocus |
mod+shift+[ | chat.visible.previous | !terminalFocus |
mod+o | editor.openFavorite | — |
mod maps to Cmd on macOS and Ctrl on Windows/Linux. cmd+l uses Cmd specifically so that Ctrl+L remains available to shells on non-macOS platforms.
Available Commands
| Command | Description |
|---|
sidebar.toggle | Show or hide the sidebar |
sidebar.search | Focus the sidebar search / command palette |
sidebar.addProject | Open the add-project dialog |
sidebar.importThread | Import a thread from a file |
Terminal
| Command | Description |
|---|
terminal.toggle | Open or close the terminal drawer |
terminal.split | Split the active terminal pane |
terminal.splitRight | Split right |
terminal.splitLeft | Split left |
terminal.splitDown | Split down |
terminal.splitUp | Split up |
terminal.new | Open a new terminal tab |
terminal.close | Close/kill the focused terminal |
terminal.workspace.newFullWidth | Open a new full-width terminal workspace tab |
terminal.workspace.closeActive | Close the active terminal workspace tab |
terminal.workspace.terminal | Switch to the Terminal view inside the workspace |
terminal.workspace.chat | Switch to the Chat view inside the workspace |
Chat & Threads
| Command | Description |
|---|
chat.new | New thread, preserving the active branch/worktree state |
chat.newLatestProject | New thread for the active project in a fresh environment |
chat.newChat | New chat-only thread |
chat.newLocal | New thread in a local environment |
chat.newTerminal | New terminal-first thread |
chat.newClaude | New thread using the Claude provider |
chat.newCodex | New thread using the Codex provider |
chat.newCursor | New thread using the Cursor provider |
chat.newGemini | New thread using the Gemini provider |
chat.split | Split the current chat view |
chat.visible.next | Switch to the next visible thread |
chat.visible.previous | Switch to the previous visible thread |
thread.jump.1 … thread.jump.9 | Jump directly to thread slot 1–9 |
view.recent.next | Cycle forward through recently visited views |
view.recent.previous | Cycle backward through recently visited views |
Composer & Pickers
| Command | Description |
|---|
composer.focus.toggle | Focus or blur the chat prompt composer |
modelPicker.toggle | Open or close the model picker |
traitsPicker.toggle | Open or close the traits/effort picker |
settings.usage | Open the usage settings panel |
Editor & Browser
| Command | Description |
|---|
editor.openFavorite | Open the current project or worktree in the last-used editor |
browser.toggle | Show or hide the in-app browser panel |
diff.toggle | Show or hide the diff view |
Scripts
| Command pattern | Description |
|---|
script.<id>.run | Run a project script by its ID. The <id> must be 1–24 characters, lowercase alphanumeric with hyphens (a-z0-9 and -), and must not start with a hyphen. Example: script.test.run, script.build-watch.run. |
Key Syntax
A key string is one or more modifier names followed by a base key, all separated by +.
Modifiers
| Token | Meaning |
|---|
mod | Cmd on macOS, Ctrl on all other platforms |
cmd / meta | The Meta / Command key |
ctrl / control | The Control key |
shift | The Shift key |
alt / option | The Alt / Option key |
Base keys
Any single character, named key (arrowup, arrowdown, arrowleft, arrowright, escape, space, tab, enter, backspace, …), or the literal + character (written as a trailing + in the string, e.g. mod++).
Examples
mod+j
mod+shift+arrowright
ctrl+tab
cmd+l
mod+alt+g
When Conditions
The when field accepts a boolean expression evaluated against the current UI context. It is optional — omit it to make a shortcut always active.
Context keys
| Key | True when… |
|---|
terminalFocus | The keyboard focus is inside a terminal pane |
terminalOpen | The terminal drawer is open (even if not focused) |
terminalWorkspaceOpen | A terminal workspace tab is the active view |
Unknown context keys evaluate to false.
Operators
| Operator | Syntax |
|---|
| Not | !condition |
| And | conditionA && conditionB |
| Or | conditionA || conditionB |
| Grouping | (conditionA && conditionB) || conditionC |
Examples
{ "key": "mod+d", "command": "terminal.split", "when": "terminalFocus" }
{ "key": "mod+d", "command": "diff.toggle", "when": "!terminalFocus" }
{ "key": "mod+w", "command": "terminal.close", "when": "terminalFocus" }
{ "key": "mod+1", "command": "terminal.workspace.terminal", "when": "terminalWorkspaceOpen" }
{ "key": "mod+1", "command": "thread.jump.1", "when": "!terminalFocus && !terminalWorkspaceOpen" }
Precedence
Synara evaluates the full keybindings array in order for every key event. The last matching rule — where both key matches the pressed chord and when evaluates to true — wins. This means later entries in the array take priority over earlier ones.
When you add entries to keybindings.json, your custom rules are appended after the defaults, so they naturally override any conflicting default with the same shortcut context.
Invalid rules (unparseable key strings or unrecognized commands) are silently ignored at runtime. A warning is written to the server log, but the UI will not show an error. Double-check the server log if a shortcut does not seem to work.
Putting It All Together
The example below overrides the terminal toggle key, adds a script shortcut, and maps a provider-specific new-thread shortcut only outside the terminal:
[
{ "key": "mod+j", "command": "terminal.toggle" },
{ "key": "mod+d", "command": "terminal.split", "when": "terminalFocus" },
{ "key": "mod+shift+arrowright", "command": "terminal.splitRight", "when": "terminalFocus" },
{ "key": "mod+shift+arrowleft", "command": "terminal.splitLeft", "when": "terminalFocus" },
{ "key": "mod+shift+arrowdown", "command": "terminal.splitDown", "when": "terminalFocus" },
{ "key": "mod+shift+arrowup", "command": "terminal.splitUp", "when": "terminalFocus" },
{ "key": "mod+t", "command": "terminal.new", "when": "terminalFocus" },
{ "key": "mod+w", "command": "terminal.close", "when": "terminalFocus" },
{ "key": "cmd+l", "command": "composer.focus.toggle", "when": "!terminalFocus" },
{ "key": "mod+o", "command": "editor.openFavorite" },
{ "key": "mod+shift+r", "command": "script.test.run" },
{ "key": "mod+alt+c", "command": "chat.newClaude", "when": "!terminalFocus" }
]