Skip to content

Otty Configuration Reference

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

Format: Ghostty-style key = value (one per line, # for comments). Despite the .toml extension the file is line-based, not real TOML — values are bare (quotes are optional and stripped). 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.
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-blinkbool(app default)Whether the cursor blinks. Unset follows the application's request.
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 | pathhomeDirectory for a brand-new window's first pane.
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-ambiguouslistenclosed-alphanumericsUnicode blocks whose East-Asian-Ambiguous codepoints render width-2. 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.

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).

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. A single number sets both; compound form discrete:3.0,precision:1.0.
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.
open-with-appName|bundle(none)Add an external app to "Open in" submenus. 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-copyboolfalseClear 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-widthinteger220Sidebar width in pixels.
details-panel-widthinteger220Details panel width in pixels.

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.
confirm-close-tabenumprocessConfirm closing a tab. Values: always, process (only with a running process).
confirm-close-windowenumprocessConfirm closing a window. Values: always, process, multiple_tabs.
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 there's a single suggestion.
autocomplete-on-device-learningbooltrueAllow on-device learning (history, --help probes, README extraction). Privacy gate; everything stays local.
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.

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.

AprilGlass DarkOne Light
April DarkGlass LightOwl
Ayu DarkGruvbox DarkPaper
Ayu LightMonokai ClassicPink
Catppuccin MochaNewsprintRosé Pine
DraculaNightSeafoam Pastel
Floating CardNordSolarized Dark
One DarkSolarized Light
Tokyo Night

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 = true

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

# Environment
env = EDITOR=nvim

# Scrollback
scrollback-lines = 50000

See also

Otty