Skip to content

Otty Configuration Reference

Configuration file: ~/.config/otty/config.toml

Format: TOML — a flat list of key = value pairs (one per line, # for comments). Otty's reader is lenient, so quotes around simple string values are optional. Unknown keys are silently ignored, so a config written for a newer Otty stays loadable on an older build.

Most keys are also editable from Settings (the in-app UI writes the same file). A handful are Settings-only or theme-only and are noted as such.


Font

KeyTypeDefaultDescription
font-familystring | listJetBrains MonoPrimary terminal font. Also accepts an inline array — font-family = ["A", "B"] — where the rest are fallbacks tried in order.
font-family-fallbacklist(none)Extra fallback families tried, in order, before the OS system cascade. Comma-separated.
font-family-boldstring(none)Override family for bold cells. Empty = reuse font-family and synthesize.
font-family-italicstring(none)Override family for italic cells.
font-family-bold-italicstring(none)Override family for bold+italic cells.
font-family-fallback-boldlist(none)Per-style fallback chain for bold cells.
font-family-fallback-italiclist(none)Per-style fallback chain for italic cells.
font-family-fallback-bold-italiclist(none)Per-style fallback chain for bold+italic cells.
font-sizefloat13.0Font size in points.
font-blendingenumsrgb-overGlyph alpha compositing. srgb-over blends in the gamma-encoded framebuffer (classic terminal look). macos-like keeps non-linear blending in the OS-native color space (Ghostty's native). linear blends in linear-light space (physically correct, can thin strokes). perceptual boosts alpha for thin strokes so dark text keeps its stem weight. Aliases: font-smooth, font-antialiased.
text-boldenumautoHow bold cells resolve when no bold face exists. Values: off, auto, primary-only, synthetic. Alias: font-bold.
text-italicenumautoHow italic cells resolve when no italic face exists. Values: off, auto, primary-only, synthetic. Alias: font-italic.
text-underlinebooltrueRender SGR-underline cells' underline decoration. Alias: font-underline.
text-blinkboolfalseAnimate SGR-blink (SGR 5/6) cells. Off renders them steady (accessibility). Alias: font-blink.
font-ligaturesenumdligOpenType ligature level. off disables programming ligatures, calt enables the standard/contextual set, dlig also enables discretionary ligatures. Alias: ligatures.
font-ligatures-alphabetboolfalseAlso form ligatures inside runs of letters/digits/CJK. Off keeps fi/fl-style letter ligatures from collapsing cells.
font-thickenboolfalsemacOS only. Force GUI-style stem darkening regardless of font-blending. Auto-enabled when background-opacity < 1.0. Mirrors Ghostty's font-thicken.
arrow-box-drawing-joinbooltrueRender arrows ← → ↑ ↓ and solid triangles ◀ ▶ ▲ ▼ aligned to the cell centerline when adjacent to a connecting rule (, , , , , …) — arrows get a box-aligned stem + chevron, triangles a flat back flush on the rule's edge — so they butt against it instead of leaving a gap. Standalone glyphs in prose / TUIs are unaffected.
adjust-cell-heightstring(none)Ghostty-compatible cell-height delta. Npx / bare N add logical points; N% scales by 1 + N/100. Negative compacts; glyphs stay vertically centered. Unset here, the active theme's [token].adjust-cell-height applies; unset in both, macOS/Linux use the font's natural line height and Windows defaults to line height 1.2 (20%), whose tight DWrite metrics otherwise render cramped rows. Set 0 to force the natural height anywhere.
live-resize-sigwinch-delay-msinteger50Milliseconds the grid must stay stable during a live drag before a single mid-drag SIGWINCH fires. 0 disables the mid-drag signal (drag-end still fires one).

Cursor

KeyTypeDefaultDescription
cursor-styleenumblockCursor shape. Values: block, bar, underline, block_hollow (also block-hollow).
cursor-style-blinkenumdefault_offCursor blink policy. Values: default_off, default_on, always_off, always_on. default_* set the initial blink but let a program override it (DECSCUSR blink bit / DEC mode 12); always_* pin it and ignore programs. Legacy true/false still parse as always_on/always_off.
cursor-colorcolor(theme)Cursor fill color.
cursor-textcolor(theme)Text color under the cursor.
cursor-opacityfloat1.0Cursor opacity (0.0 – 1.0).
cursor-animationenumoffCursor motion animation. Values: off, smooth.

Shell & Environment

KeyTypeDefaultDescription
commandstring$SHELL (else /bin/zsh)Shell/command to run. Alias: shell.
envKEY=VALUE(none)Set an environment variable. Repeatable (one env line each).
termstringautoValue of $TERM. auto picks the best-supported value for Otty.
working-directoryenum | pathinheritInitial directory. inherit, home, or an absolute path (~/ allowed).
window-working-directoryenum | pathprofileDirectory for a brand-new window's first pane. profile (Windows only; elsewhere same as home) uses the launch profile's cwd (empty → home).
tab-working-directoryenum | pathinheritDirectory for a new tab (inherits the active pane's CWD).
split-working-directoryenum | pathinheritDirectory for a new split.

Terminal Identity & VT

KeyTypeDefaultDescription
enquiry-responsestring(empty)Reply string for the ENQ (0x05) control character.
osc-color-report-formatenum16-bitOSC 4/10/11 color-query response format. Values: none, 8-bit, 16-bit.
title-reportboolfalseAllow apps to query the window title (XTWINOPS). Off by default (security).
vt-kam-allowedbooltrueAllow the KAM (keyboard action mode) escape sequence.
vt-keypad-app-allowedbooltrueAllow application keypad mode (DECKPAM, ESC =). When off, the keypad always sends literal digits.
kitty-keyboardbooltrueSupport the Kitty keyboard protocol (disambiguated/extended key reporting).
widen-ambiguouslist(empty)Unicode blocks whose East-Asian-Ambiguous codepoints render width-2. Empty by default so widths match your shell's wcwidth (ambiguous = 1 cell on macOS/Linux in every locale); only opt in if you run a CJK font whose programs also treat the range as wide, otherwise the cursor desyncs. Values: enclosed-alphanumerics, number-forms, math-operators, misc-technical, misc-symbols, dingbats, arrows, geometric-shapes.
login-greetingboolfalseRun the login shell as a login shell so the system greeting/MOTD prints.

Scrollback & Session Log

KeyTypeDefaultDescription
scrollback-linesinteger10000Maximum scrollback lines retained per pane.
scrollback-limitinteger(none)Alternative byte-budget form (divided by 80 to derive lines). Mirrors Ghostty.
session-log-size-mbinteger5Max per-session log size (MB) used for recover & the scrollback pager.
session-log-modeenumredactedSession log capture. plain stores raw output; redacted masks detected secrets with equal-width asterisks.
freeze-inactive-tabboolfalseRelease inactive tabs' GPU surfaces to save memory; recreate on switch. Off keeps tab switches smooth.

Session Restore

KeyTypeDefaultDescription
session-restore-bannerbooltrueShow "Closed at" / "Restored at" banners on restore.
session-restore-multiplayerbooltrueReattach multiplexer sessions (currently tmux) on restore.
session-restore-processesenumnoneWhich still-running pane commands to relaunch. Values: none, whitelist, all.
session-restore-process-allowlistlist(none)Command prefixes eligible for relaunch when session-restore-processes = whitelist. Matched as whitespace-delimited prefixes.
agent-commandAGENT=COMMAND(built-in command)Override the executable/wrapper and global arguments Otty uses to launch an agent. Repeat once per agent; Otty appends native resume/fork arguments.

For example, keep Claude Code's permission mode when Otty resumes or forks a session:

ini
agent-command = claude=claude --dangerously-skip-permissions

The value before the second = is the agent id (claude, codex, opencode, cursor, kimi, pi, or omp). The command after it may include a wrapper, an absolute executable path, and global flags. Do not include --resume, the session id, or fork arguments—Otty adds those for the selected action. The same setting is available under Settings → Integrations → Coding Agents.

Window

KeyTypeDefaultDescription
window-sizeenumrememberHow initial window size is decided. remember restores the last size, frame uses pixel dimensions, grid uses cell counts.
window-width-pxinteger1000Initial window width in pixels (frame mode).
window-height-pxinteger600Initial window height in pixels (frame mode).
window-colsinteger80Initial columns (grid mode).
window-rowsinteger24Initial rows (grid mode).

Transparency

Applied at window creation; editing the value requires reopening the window.

KeyTypeDefaultDescription
background-opacityfloat1.0Terminal background opacity (0.51.0). Values below 0.5 are rejected for readability.
window-opacityfloat1.0Window-level opacity (0.51.0).
unfocused-split-opacityfloat0.6Opacity of split panes that don't have focus (0.01.0). 1.0 keeps every pane fully visible — no dimming. Applies live; no window reopen needed.

Terminal Colors

KeyTypeDefaultDescription
foregroundcolor#d4d4d4Default text color (when no theme is set).
backgroundcolor#1e1e1eTerminal background color (when no theme is set).
palette-0 .. palette-15color(Dracula-based)ANSI palette. 0–7 normal, 8–15 bright.
paletteN=COLOR(none)Alternative per-index syntax: palette = 1=#ff5555.
bold-colorenum | colornoneBold text color. none, bright (use the bright palette variant), or a #rrggbb hex.
faint-opacityfloat0.5Opacity multiplier for faint/dim text (0.0 – 1.0).
selection-foregroundcolor | auto(none)Text color in selections. Unset keeps the fg↔bg swap default; auto keeps each cell's original foreground.
selection-backgroundcolor(none)Selection background. Accepts 8-digit #rrggbbaa for a translucent selection. Unset uses the default foreground.
minimum-contrastfloat1.0Minimum fg/bg contrast ratio (1.0 – 21.0). 1.0 disables adjustment.

Color values use hex format: #rrggbb (or #rrggbbaa where alpha is supported).

Default terminal colors only show when no theme is set. Out of the box Otty ships with theme = Paper, so the active colors come from that theme.

Fallback Palette

The 16-color palette used when no theme is active (Dracula-based):

IndexColorNameIndexColorName
0#282a36Black8#6272a4Bright Black
1#ff5555Red9#ff6e6eBright Red
2#50fa7bGreen10#69ff94Bright Green
3#f1fa8cYellow11#ffffa5Bright Yellow
4#bd93f9Blue12#d6acffBright Blue
5#ff79c6Magenta13#ff92dfBright Magenta
6#8be9fdCyan14#a4ffffBright Cyan
7#f8f8f2White15#ffffffBright White

Theme

KeyTypeDefaultDescription
themestringPaperActive theme (light slot). Overrides foreground, background, and palette. See Built-in Themes.
theme-darkstringNordTheme used when the OS is in dark mode and auto-theme-dark-mode is on.
auto-theme-dark-modebooltrueFollow the OS appearance: theme for light, theme-dark for dark.

UI Chrome Colors

Control the application UI (sidebar, panels, borders). All optional; auto-derived from the terminal foreground/background when unset. Override the active theme's [panel].*.

KeyTypeDefaultDescription
ui-panel-backgroundcolor(auto)Chrome frame behind the terminal grid. (Not the app's main background — that's background.)
ui-panel-surfacecolor(auto)Surface/card background.
ui-panel-bordercolor(auto)Panel border. Accepts 8-digit #rrggbbaa for a translucent border.
ui-border-subtlecolor(auto)Subtle/secondary border.
ui-text-primarycolor(auto)Primary UI text.
ui-text-secondarycolor(auto)Secondary UI text.
ui-text-tertiarycolor(auto)Tertiary/muted UI text.
ui-hovercolor(auto)Hover highlight.
ui-activecolor(auto)Active/pressed highlight.
ui-accentcolor(auto)Accent color (defaults to blue).

UI Font

KeyTypeDefaultDescription
ui-font-familystring(system)Font family for UI chrome text.
ui-font-sizefloat13.0Font size for UI chrome text in points.

Mouse & Input

KeyTypeDefaultDescription
mouse-reportingbooltrueForward mouse events to the terminal application.
mouse-hide-while-typingboolfalseHide the mouse cursor while typing.
mouse-scroll-multiplierfloat | compound3.0Scroll speed for Otty's own scrollback. A single number sets both; compound form discrete:3.0,precision:1.0. Does not scale the wheel events sent to a program that reads the mouse itself (tmux, vim with mouse=a) — those apps apply their own step per event.
focus-follows-mouseboolfalseFocus the pane under the mouse without clicking.
macos-option-as-altenumfalseTreat Option as Alt. Values: true, false, left, right.
shift-arrow-selectbooltrueEnable Shift+Arrow text selection.
mouse-shift-to-selectbooltrueHolding Shift always does local selection even when the app has mouse reporting on.
cursor-click-to-movebooltrueClick on the active prompt line emits arrow keys to move the shell cursor to the click target.
right-click-actionenumcontext-menuWhat right-click does. Values: context-menu, copy, paste, copy-or-paste, ignore.
scroll-to-bottomflagskeystroke,no-outputWhen to auto-scroll to bottom. Comma-separated: keystroke/no-keystroke, output/no-output.
KeyTypeDefaultDescription
link-open-withenumbrowserWhere to open a clicked URL. Values: browser, otty.
file-open-withenumdefault-appWhere to open a clicked file path. Values: default-app, otty.
folder-open-withenumdefault-appWhere to open a clicked folder path. Values: default-app, otty.
link-schemesenumallWhich extra URL schemes are auto-detected. all (any scheme://) or custom (only the allowlist). http(s)/file/mailto are always detected.
link-scheme-allowlistlist(none)Extra schemes to detect when link-schemes = custom (bare names, no ://).
link-previewsbooltrueShow the corner pill with the hovered link's full URL — on Cmd-hover (macOS), on bare hover plus a Ctrl+Click to open hint (Windows). Off hides the pill only; links stay clickable.
open-with-appName|bundle(none)Add an external app to "Open in" submenus. Repeatable. Settings-managed.
open-with-commandName|command(none)Add a TUI command (e.g. yazi, lazygit) to "Open in" submenus; it runs in a new tab rooted at the target. {} in the command is replaced by the target path. Repeatable. Settings-managed.
default-git-clientstring(auto)Bundle ID of the preferred git GUI client for "Open in <App>". Empty = first installed.

Clipboard & Selection

KeyTypeDefaultDescription
clipboard-readenumaskOSC 52 clipboard read access. Values: ask, allow, deny.
clipboard-writeenumallowOSC 52 clipboard write access. Values: ask, allow, deny.
clipboard-trim-trailing-spacesboolfalseTrim trailing whitespace when copying.
copy-on-selectboolfalseAutomatically copy on selection.
clipboard-paste-protectionbooltrueWarn before pasting potentially dangerous content.
clipboard-paste-bracketed-safebooltrueSanitize bracketed-paste sequences inside pasted content.
selection-clear-on-typingbooltrueClear the active selection when typing.
selection-clear-on-copybooltrueClear the selection after an explicit copy (does not apply to copy-on-select).
selection-backspace-deletesbooltrueBackspace deletes a selection on the prompt line instead of one character at the cursor.
KeyTypeDefaultDescription
window-layoutenumsidebar-leftTab placement. Values: sidebar-left, tabs-top, tabs-bottom.
auto-hide-tab-barenumdefaultAuto-hide policy for the inline tab bar (tabs-top/tabs-bottom). Values: always, default, auto. Alias: window-show-tab-bar.
auto-hide-tabs-panelenumdefaultAuto-hide policy for the sidebar tabs panel (sidebar-left). Same values.
sidebar-visiblebooltrueShow the sidebar on startup.
sidebar-widthinteger240 (220 on macOS)Sidebar width in pixels. Also written back when you drag the sidebar's right edge.
details-panel-widthinteger220 (300 on Windows)Details panel width in pixels. Also written back when you drag the details panel's left edge.

Tab Appearance

Edited in Settings → View; hand-editing is supported but the panel is easier.

KeyTypeDefaultDescription
title-from-oscbooltrueLet programs rename the tab and window with OSC 0/1/2. Turn off to pin every tab to what the rules below resolve.
tab-rulerule(none)One ordered rule per line, highest priority first. See below.
tab-icon-placementenumcombinedWhere a tab's icon sits. combined: it shares the badge slot, and a status badge takes over while one is active. separate: icon on the left, badges on the right, shell name hidden, and the window title carries the icon too.

A rule is a set of field="value" pairs on one line. The first four are match conditions — the Settings UI offers one per rule, but the file format accepts several and ANDs them; an omitted one means "don't care". The rest are what the rule contributes:

FieldMeaning
pathGlob against the pane's working directory. A pattern with no * also matches everything below it, so ~/Work/otty covers the whole project.
commandGlob against the foreground command line, e.g. ssh *.
agentCoding agent bound to the pane: claude, codex, opencode, …
hostGlob against the SSH host of a remote session.
fileGlob against a file / folder / URL pane's name, e.g. *.md. Never matches a terminal pane, which has no file.
aliasShort project name, also available as ${alias} in titles.
iconAn icon name from the built-in set, or any emoji.
icon-colorTint for the icon: an ANSI colour name (red, bright-blue, …) resolved against the active palette, or a literal #rrggbb. Empty = the tab's own text colour.
titleTitle template — see the variables below.

Each of alias / icon / title is resolved independently: for each one, the first rule that matches and fills that field wins. A broad rule can supply the icon while a narrower rule above it overrides only the title.

Title templates interpolate ${alias}, ${cwd}, ${folder}, ${user}, ${host}, ${agent}, ${branch}, ${command}, ${title} (whatever the program set), ${shell}, ${file} and ${index}. A variable with no value expands to nothing, and a separator left stranded by it is dropped — ${folder} · ${branch} reads otty outside a repository, not otty ·.

Chain names with | for a fallback, first non-empty wins: ${title|folder} names the tab after its directory until a program sets a title. Any length works, and a quoted last link ends the chain in text rather than in a variable — ${title|file|folder|'Shell'}. Single quotes are the ones to reach for here: the template already lives inside a title="…" field, so double quotes would need escaping.

toml
tab-rule = 'path="~/Work/otty" alias="Otty" icon="terminal" title="${alias} · ${branch}"'
tab-rule = 'path="~/Work/typora" alias="Typora" title="${alias}: ${title|folder}"'
tab-rule = 'agent="claude" icon="claude" icon-color="magenta"'
tab-rule = 'command="ssh *" icon="server" icon-color="cyan" title="${user}@${host}"'
tab-rule = 'file="*.md" icon="markdown" icon-color="blue"'

Matching is case-insensitive, ~ expands to your home directory, and * spans / so one wildcard can cover a whole tree.

Details Panel Views

Edited in Settings → View → Details Panel; see Details Panel.

KeyTypeDefaultDescription
details-viewview(the four built-ins)One view per line, in tab order. See below.
details-panel-widthint220Panel width in points.

Like tab-rule, a view is field="value" pairs on one line. Omit details-view entirely and you get Info, Outline, Git and Files in that order, all switched on; list any of them and the rest are appended after your entries, so a built-in added in a later release still shows up.

FieldMeaning
idRequired. A built-in (info, outline, git, files) or a name of your own, which also names the view's folder under ~/.config/otty/views/.
kindbuiltin, tui (a program in an embedded terminal) or web (a URL). Inferred from url / command when omitted.
titleTab label. Empty on a built-in keeps Otty's own translated name.
iconAn icon name from the built-in set, or any emoji. Empty uses the default glyph.
commandkind = tui: the whole command line, run the way a prompt would run it — pipes, && and ; included. ${…} variables resolve against the focused pane first: cwd, folder, file, pid, command, branch, host, user, agent, shell. Substitution is textual, so quote a value that may contain spaces.
urlkind = web: the page to load.
mobilekind = web: false asks the site for its desktop page. On by default — the panel is a narrow column, and a mobile layout is what fits it. The page is laid out at the panel's width either way.
cwdkind = tui: where to run it. Empty = ~/.config/otty/views/<id>, created on first launch.
enabledfalse hides the tab without forgetting how it was set up.
toml
details-view = 'id="info"'
details-view = 'id="docker" kind="tui" title="Docker" command="lazydocker" icon="docker"'
details-view = 'id="lazygit" kind="tui" title="Git" command="lazygit -p \"${cwd}\""'
details-view = 'id="grafana" kind="web" title="Grafana" url="http://localhost:3000"'
details-view = 'id="admin" kind="web" url="http://localhost:8080" mobile="false"'
details-view = 'id="outline"'
details-view = 'id="git" enabled="false"'

Two tui views that resolve to the same command and folder share one running program across every window — so a ${cwd} view gets one program per directory. At most six are kept alive; the least recently used is retired.

A tui view runs with OTTY_NO_NEW_PANE=1 and a shimmed PATH: it may not open Otty windows, tabs or panes, and open / xdg-open are refused. otty view / otty edit still work — inside a view they load into that view. See Details Panel.

Shell Integration & CLI

KeyTypeDefaultDescription
shell-integrationbooltrueInstall the managed shell-rc block (OSC 133 marks, CWD reporting, edit/view/jump wrappers, custom aliases).
ssh-integrationbooltrueForward Otty's shell integration over SSH to remote hosts.
omit-otty-prefixboolfalseInstall edit/view/watch shell functions so the otty prefix can be dropped. Live-toggleable.
cli-allow-overwriteboolfalseLet omit-prefix / custom-alias wrappers replace names the user already defined.
cli-aliasname=cmd(none)User CLI alias: installs a shell function <name> running otty <command>. Repeatable. Settings-managed.
progress-bar-commandslist(built-in set)Command prefixes the shell integration auto-emits OSC 9;4 progress for (curl, git push, npm install, …). Matched as whitespace-delimited prefixes.

App Behavior

KeyTypeDefaultDescription
languageenumsystemUI language. Values: system, english, chinese.
on-launchenumrestore_sessionWhat happens at launch. Values: new_window, restore_session.
quit-after-last-window-closedboolfalseQuit Otty when the last window closes.
stay-in-trayboolfalseWindows only. Keep Otty running after the last window closes, reachable from the tray icon.
show-tray-iconbooltrueWindows only. Show the notification-area (tray) icon. Forced on while stay-in-tray is set.
quick-accesslistPinned entries for the + menu, the tray menu and the Jump List, one per line: quick-access = 'kind="folder" value="C:\dev\otty" label="otty"'. kind is folder, recipe, ssh or profile; value is the path, recipe id, ssh host or profile id.
confirm-close-tabenumprocessConfirm closing a tab. Values: always, process (only with a running process), never.
confirm-close-windowenumprocessConfirm closing a window. Values: always, process, multiple_tabs, never.
confirm-close-paneenumprocessConfirm closing a split pane. Values: always, process, never.
window-hide-dirty-indicatorboolfalsemacOS only. Never show the unsaved/running dot on the window close button (traffic light).
new-tab-positionenumautoWhere a new tab opens. Values: end, auto, after-current.

Autocomplete

KeyTypeDefaultDescription
autocomplete-shortcutenumtabKey that accepts a suggestion. Values: tab, tab+right-arrow, ctrl+space, disable.
autocomplete-show-candidatesenumescapeKey that reveals the candidate panel. Values: disable, auto, escape, option-escape.
autocomplete-inline-suggestionbooltrueShow a faded inline preview when one suggestion clearly leads: the only match, a whole command line that leads this folder, or — in tab+right-arrow — the top of several.
autocomplete-on-device-learningbooltrueAllow on-device learning (history, --help probes, README extraction). Privacy gate; everything stays local.
autocomplete-skip-secretsboolfalseNever record a command that looks like it carries a password, token or API key. New commands only — already-stored ones are untouched, and otty learn still keeps one deliberately.
autocomplete-history-ignorelist(none)Glob patterns for commands never recorded (e.g. ssh *, export *TOKEN*).
autocomplete-description-languageenumsystemLanguage for spec descriptions. Values: system, english, chinese.

Notifications, Sounds & Badges

Defaults for new panes. Most are per-pane overridable at runtime.

KeyTypeDefaultDescription
notification-foregroundenumoffBanner behavior while Otty is foreground. Values: off, always, tab-unfocused.
privilege-sound-on-errorboolfalsePlay a sound on a non-zero command exit.
privilege-sound-shellbooltrueLet shell-integration commands trigger sounds.
privilege-notification-on-finishboolfalseNotify when a long command finishes.
privilege-notification-on-errorbooltrueNotify when a command errors.
privilege-notification-on-watch-finishbooltrueNotify when a watched command finishes.
privilege-notification-shellbooltrueLet shell-integration commands post notifications.
privilege-badge-exit-statusbooltrueShow an exit-status badge on the tab.
privilege-badge-activitybooltrueShow an activity badge for background output.
privilege-badge-agent-processingbooltrueBadge while an agent is processing.
privilege-badge-agent-task-completebooltrueBadge when an agent finishes a task.
privilege-badge-agent-awaiting-inputbooltrueBadge when an agent awaits input.
privilege-notify-agent-task-completebooltrueSystem notification when an agent finishes a task.
privilege-notify-agent-awaiting-inputbooltrueSystem notification when an agent awaits approval/input.
privilege-caffeinate-agent-processingboolfalseKeep the Mac awake while an agent is processing.
privilege-resume-agent-sessionbooltrueOffer to resume agent sessions on restore.
privilege-mouse-shellbooltrueLet the shell control mouse reporting.
privilege-title-shellbooltrueLet the shell set the window/tab title.
privilege-clipboard-shellbooltrueLet the shell drive clipboard (OSC 52) operations.

Auto Approve & IPC Security

KeyTypeDefaultDescription
show-auto-approveboolfalseSurface the (deprecated) Auto Approve feature in the UI.
auto-approve-enabledboolfalseEnable Auto Approve.
hide-auto-approve-pillboolfalseHide the Auto Approve toolbar pill.
ipc-allow-send-keysboolfalseAllow the send-keys IPC command.
ipc-allow-sensitive-sessionsboolfalseAllow send-keys/capture on SSH/sudo sessions.

Secure Input (macOS)

KeyTypeDefaultDescription
auto-secure-inputbooltrueAuto-enable macOS Secure Keyboard Entry at password-style prompts.
secure-input-indicationbooltrueShow the title-bar pill while Secure Keyboard Entry is active.

Quick Terminal

KeyTypeDefaultDescription
quick-terminal-persist-sessionboolfalseKeep the quick-terminal session alive between toggles.
quick-terminal-cwdenumcurrent-paneWorking directory for the quick terminal. Values: last-used, current-pane.

Recipes

KeyTypeDefaultDescription
recipe-replay-savedenumask_onceCommand replay for internally-saved recipes. Values: auto, ask_once, manually.
recipe-replay-fileenummanuallyCommand replay for external .ottyrecipe files. Same values.

See Custom Commands / Layouts / Snippets and Recipes.

Open Quickly, Frecency & Jump

KeyTypeDefaultDescription
open-quickly-folders-limitinteger12Max frecency-ranked folders surfaced in Open Quickly. Alias: open-quickly-zoxide-limit.
frecency-auto-recordbooltrueRecord every CWD change into the frecency table (powers the Folders tab and otty jump).
zoxide-enabledbooltrueSync removals to the external zoxide binary when present.
zoxide-local-pathstring(auto)Explicit path to the zoxide binary. Empty = auto-detect. Settings-hidden.

Editor (File Pane)

Apply to Otty's non-terminal text surfaces (file panes, previews).

KeyTypeDefaultDescription
editor-line-wrapbooltrueSoft-wrap long lines instead of horizontal scrolling.
editor-tab-sizeinteger4Visual width of a tab character, in columns.
editor-visible-whitespaceboolfalseRender whitespace as glyphs.
editor-show-line-numbersbooltrueShow the line-number gutter.
editor-default-to-preview-readonlybooltrueOpen preview-capable formats (.md, .svg, .html…) in read-only preview mode.
editor-scroll-past-endbooltrueAllow scrolling past the last line (VS Code's scrollBeyondLastLine).

Terminal Scrolling

KeyTypeDefaultDescription
terminal-scroll-past-endenumdisabledScroll past the last line in the terminal. Values: disabled, last-line-with-content, last-line-in-middle, cursor-line. Always off on the alternate screen.
terminal-scroll-past-first-lineenumdisabledScroll past the first scrollback line. Values: disabled, same-as-last-line, first-line-with-content, first-line-in-middle.
terminal-scroll-past-end-stickyboolfalseKeep the past-end offset sticky instead of draining it as new output arrives.
terminal-scroll-smoothbooltruePixel-granular scrollback navigation; snaps to the nearest row on idle.
terminal-scrollbar-hide-on-auto-scrollboolfalseShow the scrollbar only while the viewport is parked away from the live output; keep it hidden while the view just follows program output.

Dock Icon (macOS)

KeyTypeDefaultDescription
dock-icon-animate-progressboolfalseAnimate the Dock icon while any session emits OSC 9;4 progress.
dock-icon-error-badgebooltrueTint the Dock icon red on a non-zero exit / OSC 9;4;2 error; clicking focuses the next error tab.

Keybindings

KeyTypeDefaultDescription
keybindtrigger=action(built-in)Bind a key chord to an action. Repeatable. See the Keybindings Reference for triggers and action names.

Built-in Themes

Set a theme with theme = <name> (case-insensitive). The theme overrides foreground, background, and the 16-color palette. theme-dark selects a separate dark-mode theme when auto-theme-dark-mode is on.

Acrylic DarkGlass LightOwl
AprilGruvbox DarkPaper
April DarkMonokai ClassicPink
Ayu DarkNewsprintRosé Pine
Ayu LightNightSeafoam Pastel
Catppuccin MochaNordSolarized Dark
DraculaOne DarkSolarized Light
Floating CardOne LightTokyo Night
Glass Dark

The defaults differ per platform: macOS and Linux open on Paper / Nord (light / dark), Windows on One Light / Acrylic Dark — the two themes carrying the Windows chrome treatment.

You can also drop custom .toml themes into ~/.config/otty/themes/ or import them from other terminals — see Themes and Import / Export Settings.


Example Configuration

# Otty config example
theme = Dracula
font-family = JetBrains Mono
font-size = 14

# Semi-transparent background (minimum 0.5)
background-opacity = 0.9

# Cursor
cursor-style = bar
cursor-style-blink = default_on

# Use Option as Alt for both keys
macos-option-as-alt = true

# Environment
env = EDITOR=nvim

# Scrollback
scrollback-lines = 50000

See also

Otty