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.
windows-text-renderingenumnaturalWindows only. DirectWrite rasterization. natural (default) is grayscale AA with grid-fitting; natural-symmetric is slightly softer; gdi is GDI-style hinting; cleartype is subpixel ClearType; aliased has no antialiasing. Ignored on other platforms.
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. See Box Drawing.
strip-cjk-wrap-padboolfalseHide the stray reverse-video cell some line editors (zsh) leave when a wide CJK character wraps. Off renders it verbatim, same as tmux / Ghostty / Terminal.app. See Wrapped CJK lines.
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.
bidibooltrueReorder each line for Hebrew, Arabic, and mixed RTL text with the Unicode bidirectional algorithm. The grid stays in logical order so copy, paste, and search are unaffected. Turn off if a TUI lays out RTL itself. See BiDi / RTL Text.
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.
dedup-repaint-scrollbackbooltrueDrop stale copies that some full-screen TUIs (e.g. Claude Code's classic renderer) leave in scrollback when they repaint a region taller than the window. Legitimate repeats (a status line after every command) are never removed. See Duplicate scrollback lines.
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).
max-fpsinteger0Cap on the terminal's redraw rate. 0 follows the display (120 on ProMotion); 60 halves the CPU a stream of output costs there. macOS.

Transparency ​

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

KeyTypeDefaultDescription
background-opacityfloat1.0Terminal background opacity (0.5 – 1.0). Values below 0.5 are rejected for readability.
window-opacityfloat1.0Window-level opacity (0.5 – 1.0).
unfocused-split-opacityfloat0.6Opacity of split panes that don't have focus (0.0 – 1.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.
ctrl-shortcutsenumshellWindows / Linux. How a bare Ctrl chord is split between a shortcut and the control byte the shell reads. shell always sends to the shell. hold runs the shortcut on tap and sends the control byte after the hold threshold. left / right bind that Ctrl to shortcuts and the other one to the shell. Unbound chords (Ctrl+A, Ctrl+R, …) always reach the shell.
ctrl-c-actionenumcopy-selectionWindows / Linux. copy-selection copies when there is a selection (Windows Terminal / VS Code) and sends ^C otherwise. shell always sends ^C. Ctrl+C is never put behind a hold — it has to interrupt a runaway process.
ctrl-hold-threshold-msinteger1500Windows / Linux. Hold duration (120–5000 ms) before a Ctrl chord goes to the shell when ctrl-shortcuts = hold. The byte is sent as soon as the threshold elapses, not on release.
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-accesslist—Pinned 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, right-arrow (only → accepts; Tab always goes to your shell's own completion), 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 (run most and run last), or an argument you clearly use most — never merely the first of several.
autocomplete-inline-providerenumottyWindows, PowerShell only: who draws that preview. Values: otty (PSReadLine's own inline prediction is switched off), psreadline (PSReadLine's prediction when it has one, Otty's otherwise). Tab and Esc behave the same over either.
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.

IPC Security ​

KeyTypeDefaultDescription
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.
output-scroll-animationenumautoHow the view follows the scroll the terminal does to itself. Values: auto (follow terminal-scroll-smooth), off, smooth.
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