Configuration

Configuration

Sinclair reads a single settings.json — JSON with // comments. Appearance and keybindings reload the instant you save it — no restart required.

Where the config lives

Sinclair loads its settings from $XDG_CONFIG_HOME/sinclair/settings.json, falling back to ~/.config/sinclair/settings.json when XDG_CONFIG_HOME is unset (Windows: %APPDATA%\sinclair\settings.json). The file is created on demand, so you can start from an empty {} (or no file at all) and add only the keys you care about. A legacy key = value config file from older versions is migrated into settings.json once on launch and no longer read.

If you would rather not edit text by hand, open the built-in GUI settings with ⌘, and the same options are exposed there.

Format

The file is JSON with comments: one object, one member per setting. // comment lines are allowed and ignored.

Most keys take a single scalar value. A handful of keys are lists and take a JSON array, one entry per value. The list keys are font-family, font-feature, keybind, palette, plugin, container, sandbox-mount, sandbox-env, sandbox-packages, sandbox-setup, sandbox-agents, redact, trigger, snippet, and profile.

Bad lines never abort the load. An unknown key, a malformed value, or a typo becomes a friendly diagnostic surfaced on startup, and the rest of the file is applied normally.

// ~/.config/sinclair/settings.json
{
  "font-family": ["JetBrains Mono", "Menlo"],   // fallback chain, in order
  "font-size": 14,
  "font-feature": ["+liga", "ss01"],

  "theme": "Catppuccin Mocha",
  "cursor-style": "bar",
  "copy-on-select": true,
  "scrollback-limit": 50000
}

Live reload

Sinclair watches the config file. Appearance settings (fonts, theme, colors, padding, cursor) and keybindings take effect the moment you save — there is no need to quit and relaunch.

Tip

Keep the config open in a split next to a live terminal and tweak fonts or themes interactively — each save redraws immediately.

Options

Every supported key is listed below, grouped by area. Keybindings have their own syntax and reference; see the Keybindings page for the keybind option.

Fonts & text

KeyTypeDefaultDescription
font-familystring (repeatable)MenloPrimary font; repeat to build a fallback chain in order of preference.
font-sizefloat13.0Font size in points.
font-styleenum normal|bold|italic|bold-italicnormalBase style applied to the default text.
font-featurestring (repeatable)noneOpenType feature codes, e.g. +liga, -calt, ss01, cv01=2.
adjust-cell-widthint0Pixels added to (or removed from) each cell's width.
adjust-cell-heightint0Pixels added to (or removed from) each cell's height.

Theme & colors

KeyTypeDefaultDescription
themestringDarkBuilt-in or custom theme name. Matching is case-, space-, dash-, and underscore-insensitive.
theme-lightstringnoneTheme used when the OS is in light mode. Set with theme-dark to follow the system appearance automatically (live).
theme-darkstringnoneTheme used when the OS is in dark mode.
background-opacityfloat1.0Window background alpha; the terminal goes translucent. Clamped to 0.2..=1.0.
terminal-background-opacityfloat1.0Per-terminal theme background alpha. Text and colored cell backgrounds stay opaque. Clamped to 0.2..=1.0.
background-imagepathnoneImage drawn behind the terminal (best with background-opacity < 1 so it shows through).
badgestringnoneFaint watermark drawn in each pane's corner; {cwd} and {host} are substituted per pane.
backgroundhexnoneOverride the theme background color.
foregroundhexnoneOverride the theme foreground color.
bold-is-brightboolfalseRender bold text using the bright ANSI palette variant.
minimum-contrastfloat1.0Minimum foreground/background contrast ratio. Clamped to 1..=21.
split-divider-colorhexnoneColor of the divider between splits.
unfocused-split-opacityfloat0.7Opacity of splits that are not focused. Clamped to 0.15..=1.0.
palettestring (repeatable)noneOverride a single ANSI color as N=#rrggbb, where N is index 0–255.

Cursor

KeyTypeDefaultDescription
cursor-styleenum block|bar|underlineblockShape of the text cursor.
cursor-style-blinkbooltrueWhether the cursor blinks.
cursor-colorhexnoneOverride the cursor color.
cursor-texthexnoneColor of the glyph under the cursor.
selection-foregroundhexnoneText color within a selection.
selection-backgroundhexnoneBackground color of a selection.

Window & padding

KeyTypeDefaultDescription
window-padding-xint2Horizontal padding (pixels) between the grid and the window edge.
window-padding-yint2Vertical padding (pixels) between the grid and the window edge.
window-widthint (cells)0 (80)Initial window width in cells; 0 means 80.
window-heightint (cells)0 (24)Initial window height in cells; 0 means 24.
titlestringnoneFixed window title; overrides the title set by the running program.
quit-after-last-window-closedboolfalseQuit the app once the last window closes.
window-inherit-working-directorybooltrueNew windows inherit the working directory of the focused surface.
mouse-scroll-multiplierfloat1.0Scroll speed multiplier. Clamped to 0.01..=10000.
mouse-hide-while-typingboolfalseHide the mouse cursor while you type.
smart-selectbooltrueDouble-click selects the whole URL / email / path / git hash under the pointer, falling back to a word.
middle-click-pasteboolfalsePaste the current selection with a middle click (X-style).
focus-follows-mouseboolfalseFocus the split the pointer moves over, without a click.
macos-option-as-altenum auto|left|right|true|falseautoTreat the macOS Option key as Alt for key encoding.

Shell & behavior

KeyTypeDefaultDescription
commandstring (shell path)none (login shell)Program to run instead of the default login shell.
working-directorystringnone ($HOME)Initial working directory for new surfaces.
copy-on-selectboolfalseCopy selected text to the clipboard automatically.
timestampsboolfalseShow a faint relative time (5s/2m/1h/3d) beside each scrollback row.
confirm-close-surfacebooltrueSinclair before closing a surface that has a running process.
confirm-quitbooltrueSinclair before quitting the application.

Clipboard & scrollback

KeyTypeDefaultDescription
clipboard-readenum allow|ask|denyaskPolicy for programs reading the clipboard.
clipboard-writeenum allow|ask|denyallowPolicy for programs writing the clipboard.
clipboard-paste-protectionboolfalseWarn before pasting potentially unsafe content.
scrollback-limitint (lines)100000Maximum number of scrollback lines retained.

Shell integration & sessions

KeyTypeDefaultDescription
shell-integrationbooltrueInject OSC 133 prompt marks and OSC 7 cwd reporting into zsh/bash/fish via environment — no rc-file edits.
auto-updatebooltrueCheck GitHub for a newer release on launch and hourly, and offer to update (Homebrew/apt installs defer to the package manager; manual .dmg/AppImage swap in place).
autosuggest-ghostbooltrueFish-style inline ghost text completing the current command; accept with → or End. Needs shell integration.
autosuggest-popupboolfalseShow a completion dropdown under the cursor; ↑/↓ to move, Enter to accept.
autosuggest-tabboolfalseTab cycles inline completions instead of forwarding Tab to the shell.
autosuggest-historybooltrueUse captured command history as a suggestion source.
autosuggest-commandsbooltrueUse the built-in common-command list as a suggestion source.
autosuggest-pathsbooltrueComplete filesystem paths from the working directory.
autosuggest-assistbooltrueRank suggestions with the local assist model rather than plain recency.
session-restoreboolfalseRestore windows and splits from the previous run.
session-restore-linesint1000Lines of each pane's scrollback saved with the session and replayed into the pane on restore, so a restored window opens on the history it had. Colors and attributes come back with the text; images and live hyperlink targets do not. 0 restores the layout only.
unified-tab-barbooltrueFold the tabs into the window titlebar, so the top row of tabs is the titlebar. Off gives an ordinary titlebar — window controls, the active tab's title, and the split buttons — with the tab bars beneath it. The split controls sit at the titlebar's right edge either way.
tab-title-show-hostboolfalseKeep the user@host: prefix shells write into their title. Off by default, so tabs show just the path. A label you set by hand is never rewritten.
tab-peekbooltrueAllow the tab peek: a strip of live miniatures of every tab, dropped under the tab bar by tab_peek (⌘E) or the View menu. It covers the top of the terminal rather than resizing it, so nothing reflows.
tab-peek-hoverint0Milliseconds the pointer must rest on the tab bar before the peek drops on its own; it closes again when the pointer leaves. 0 means only the keybinding and the menu open it.
tab-peek-heightint120Height of a peek card in px (60–400). Card width follows each tab's own grid, so a card keeps the shape of the screen it shows.

Automation & privacy

KeyTypeDefaultDescription
triggerstring (repeatable)noneRegex, optionally regex | Title. When new output matches, a desktop notification fires with the matched line.
redactstring (repeatable)noneRegex whose matches are masked with bullets on every copy path, keeping secrets off the clipboard.
snippetstring (repeatable)nonelabel | command; recalled from the snippet picker (snippets action), inserted into the focused pane.
profilestring (repeatable)nonelabel | command; opens a new tab running the command from the profile picker (profiles action).

Plugins

KeyTypeDefaultDescription
pluginstring (repeatable)nonePath to a plugin directory or a plugin.toml file. ~ expands to the home directory.

Agents

KeyTypeDefaultDescription
mcp-server-enabledboolfalseExpose Sinclair's MCP server for tool calls.

Shared sandbox

One container per project, shared by your panes and every agent you run in them. Needs Docker or Podman and nothing else. See Share one container with your agents and Work in your project's dev container.

KeyTypeDefaultDescription
sandbox-enabledboolfalseRun this project's panes and agents inside one shared container.
sandbox-imagestringnoneReady-made image, used as-is. Nothing is built; the image must carry the agent CLI.
sandbox-basestringdebian:bookworm-slimBase image the generated sandbox image layers on. The generated layer uses apt-get.
sandbox-packagesstring (repeatable)noneExtra apt packages baked into the generated image.
sandbox-setupstring (repeatable)noneExtra commands baked into the generated image, one layer each.
sandbox-agentsstring (repeatable)claudeAgent CLIs to install into the image: claude, codex, gemini.
sandbox-mountstring (repeatable)noneExtra mounts, source:target[:ro]. A bare path mounts at itself.
sandbox-envstring (repeatable)noneExtra environment inside the sandbox, KEY=VALUE.
sandbox-userstringhost uid on LinuxUser the container runs as. host is your own uid:gid, which keeps a Linux bind mount from filling with root-owned files.
sandbox-networkstringbridgebridge, host, or none. none cuts agents off from their model APIs.
sandbox-memorystringunlimited--memory ceiling for the whole sandbox, e.g. 8g.
sandbox-cpusstringunlimited--cpus ceiling for the whole sandbox, e.g. 4.
sandbox-persistbooltrueKeep the container running when the last pane using it closes.
sandbox-devcontainerbooltrueRead a project's devcontainer.json, and enter a container an editor already started for it.

Agents note

Note

The MCP server and the sandbox default to off. Turn them on only when you intend to use them — see the Agents and MCP pages for setup and details.