
Ghostty Config
- 172 installs
- 154 repo stars
- Updated July 30, 2026
- sammcj/agentic-coding
Configure Ghostty terminal themes, fonts, keybindings, splits, and performance options for a fast daily driver aligned with agentic coding sessions.
About
ghostty-config from sammcj/agentic-coding focuses on tailoring the Ghostty terminal for high-throughput coding: sensible defaults, readable typography, efficient panes, and settings that pair well with long agent sessions and local CLI tooling.
- Ghostty config file structure
- Theme and font tuning
- Keybinding and split layouts
- GPU/perf sensible defaults
- DX alignment for agentic workflows
Ghostty Config by the numbers
- 172 all-time installs (skills.sh)
- +5 installs in the week ending Jul 26, 2026 (Skillselion tracking)
- Ranked #213 of 550 CLI & Terminal skills by installs in the Skillselion catalog
- Data as of Aug 1, 2026 (Skillselion catalog sync)
npx skills add https://github.com/sammcj/agentic-coding --skill ghostty-configAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 172 |
|---|---|
| repo stars | ★ 154 |
| Last updated | July 30, 2026 |
| Repository | sammcj/agentic-coding ↗ |
What it does
Configure Ghostty terminal themes, fonts, keybindings, splits, and performance options for a fast daily driver aligned with agentic coding sessions.
Files
Ghostty Configuration
Guidance for configuring the Ghostty terminal emulator. Ghostty uses text-based config files with sensible defaults and zero required configuration.
Config File Locations
Since Ghostty 1.2.3 the config file is named config.ghostty (the .ghostty extension lets editors apply syntax highlighting). The extensionless config name is still loaded for backwards compatibility.
XDG Path (All Platforms):
$XDG_CONFIG_HOME/ghostty/config.ghostty$XDG_CONFIG_HOME/ghostty/configXDG_CONFIG_HOMEdefaults to~/.configif undefined
macOS Additional Path:
~/Library/Application Support/com.mitchellh.ghostty/config.ghostty~/Library/Application Support/com.mitchellh.ghostty/config
Loading order: all matching files are loaded, later files overriding earlier ones. Within a location config.ghostty loads before config. On macOS all macOS-path files load after all XDG-path files, so the macOS path wins on conflicts. Config is optional; with no file Ghostty uses its defaults.
Config Syntax
# Comments start with #
background = 282c34
foreground = ffffff
font-family = "JetBrains Mono"
keybind = ctrl+z=close_surface
font-family = # Empty value resets to defaultRules:
- Keys are case-sensitive (use lowercase)
- Whitespace around
=is flexible - Values can be quoted or unquoted
- Empty values reset to defaults
- Every config key works as CLI flag:
ghostty --background=282c34
Config Loading & Includes
Files processed sequentially - later entries override earlier ones.
# Include additional configs
config-file = themes/dark.conf
config-file = ?local.conf # ? prefix = optional (no error if missing)Critical: config-file directives are processed at the file's end. Keys appearing after config-file won't override the included file's values.
Runtime Reloading
- Linux:
ctrl+shift+, - macOS:
cmd+shift+,
Some options cannot be reloaded at runtime. Some apply only to newly created terminals.
CLI Commands
Ghostty provides CLI actions via ghostty +<action>. Use ghostty +<action> --help for action-specific help.
Configuration Commands
| Command | Description |
|---|---|
ghostty +show-config | Show current effective configuration |
ghostty +show-config --default | Show default configuration |
ghostty +show-config --default --docs | Show defaults with documentation |
ghostty +validate-config | Validate configuration file for errors |
ghostty +edit-config | Open config file in default editor |
Listing Commands
| Command | Description |
|---|---|
ghostty +list-fonts | List available fonts (fixed-width) |
ghostty +list-themes | List available colour themes |
ghostty +list-keybinds | Show current keybindings |
ghostty +list-keybinds --default | Show default keybindings |
ghostty +list-colors | List available colour names |
ghostty +list-actions | List all available keybinding actions |
Other Commands
| Command | Description |
|---|---|
ghostty +version | Show version information |
ghostty +help | Show help |
ghostty +show-face | Show font face information |
ghostty +ssh-cache | Manage SSH terminfo cache |
ghostty +crash-report | Generate crash report |
ghostty +new-window | Open new window (Linux only) |
ghostty +boo | Easter egg |
Launching with Options
Every config key works as a CLI flag:
ghostty --background=282c34 --font-size=14
ghostty -e top # Run command in terminalmacOS Note: The ghostty CLI is a helper tool. To launch the terminal use open -na Ghostty.app or open -na Ghostty.app --args --font-size=14.
Keybinding Syntax
Format: keybind = trigger=action
Triggers
Modifiers: shift, ctrl/control, alt/opt/option, super/cmd/command
keybind = ctrl+a=select_all
keybind = ctrl+shift+t=new_tab
keybind = super+backquote=toggle_quick_terminalPhysical keys (W3C codes): KeyA, key_a, Digit1, BracketLeft
- Physical keys have higher priority than unicode codepoints
- Use for non-US keyboard layouts
Key sequences (leader keys):
keybind = ctrl+a>n=new_window # Press ctrl+a, release, press n
keybind = ctrl+a>ctrl+n=new_window # Both with ctrlSequences wait indefinitely for next key.
Named key tables (Ghostty 1.3+): Switch into a modal set of bindings with activate_key_table:name / activate_key_table_once:name, leave with deactivate_key_table. Use end_key_sequence to flush a partial sequence to the terminal. In-terminal search (search, start_search, navigate_search, end_search) is also available. See references/keybindings.md.
Prefixes
| Prefix | Effect |
|---|---|
global: | System-wide (macOS: needs Accessibility permissions; Linux: needs XDG Desktop Portal) |
all: | Apply to all terminal surfaces |
unconsumed: | Don't consume input (passes through) |
performable: | Only consume if action succeeds |
Combine prefixes: global:unconsumed:ctrl+a=reload_config
Note: Sequences cannot be used with global: or all: prefixes.
Special Values
keybind = clear- Remove ALL keybindingskeybind = ctrl+a=unbind- Remove specific bindingkeybind = ctrl+a=ignore- Prevent processing by Ghostty and terminal
Shell Integration
Auto-injection for: bash, zsh, fish, elvish
shell-integration = detect # Default - auto-detect shell
shell-integration = none # Disable auto-injection
shell-integration = fish # Force specific shellShell Integration Features
shell-integration-features = cursor,sudo,title
shell-integration-features = no-cursor # Disable specific feature| Feature | Description |
|---|---|
cursor | Blinking bar at prompt |
sudo | Preserve terminfo with sudo |
title | Set window title from shell |
ssh-env | SSH environment compatibility |
ssh-terminfo | Auto terminfo on remote hosts |
What Shell Integration Enables
1. Smart close (no confirm when at prompt) 2. New terminals start in previous terminal's directory 3. Prompt resizing via redraw 4. Ctrl/Cmd+triple-click selects command output 5. jump_to_prompt keybinding works 6. Alt/Option+click repositions cursor at prompt
Manual Setup (if auto-injection fails)
Bash (add to ~/.bashrc at top):
if [ -n "${GHOSTTY_RESOURCES_DIR}" ]; then
builtin source "${GHOSTTY_RESOURCES_DIR}/shell-integration/bash/ghostty.bash"
fiZsh:
source ${GHOSTTY_RESOURCES_DIR}/shell-integration/zsh/ghostty-integrationFish:
source "$GHOSTTY_RESOURCES_DIR"/shell-integration/fish/vendor_conf.d/ghostty-shell-integration.fishmacOS Note: /bin/bash does NOT support automatic shell integration. Install Bash via Homebrew or manually source the script.
Common Configuration Patterns
Theme with Light/Dark Mode
theme = light:catppuccin-latte,dark:catppuccin-mochaQuick Terminal (Drop-down)
quick-terminal-position = top
quick-terminal-size = 50%
quick-terminal-autohide = true
keybind = global:super+backquote=toggle_quick_terminalCustom Colour Palette
palette = 0=#1d2021
palette = 1=#cc241d
# ... (0-255 supported)Font Configuration
font-family = "JetBrains Mono"
font-family-bold = "JetBrains Mono Bold"
font-size = 14
font-feature = -calt # Disable ligatures
font-feature = -ligaBackground Transparency
background-opacity = 0.9
background-blur = true # macOS, KDE Plasma onlyPlatform-Specific Notes
macOS Only:
window-position-x/y,window-save-state,window-step-resizewindow-vsync,window-colorspacemacos-titlebar-style,toggle_window_float_on_topfont-thicken,font-thicken-strengthtoggle_visibility,undo,redo,check_for_updatestoggle_secure_input,toggle_background_opacity,reset_window_size- Global keybindings require Accessibility permissions
Linux/GTK Only:
window-title-font-family,window-subtitlewindow-titlebar-background/foreground(requireswindow-theme = ghostty)window-show-tab-bar,gtk-single-instancetoggle_maximize,toggle_window_decorationstoggle_tab_overview,show_gtk_inspector,show_on_screen_keyboard
Linux Wayland Only:
quick-terminal-keyboard-interactivitygtk-quick-terminal-layer,gtk-quick-terminal-namespace
FreeType (Linux) Only:
freetype-load-flags
Reference Files
For complete option and keybinding references, load:
- `references/options.md` - All config options by category (font, colour, window, etc.)
- `references/keybindings.md` - All keybinding actions with parameters
Load these when you need specific option details, valid values, or keybinding action syntax.
Ghostty configuration schema reference
You can find the latest Ghostty configuration schema (including those supported by the tip releases) at: https://raw.githubusercontent.com/sammcj/vscode-ghostty-config-syntax/refs/heads/main/schema/ghostty-config-syntax.schema.json - this can be quite large, so it's best to pass it programmatically to avoid having to read it in full.
When updating it, update the SKILL.md file to update the date the skill was updated to the latest config schema.
Ghostty Keybinding Actions Reference
Complete reference of keybinding actions available in Ghostty.
Format: keybind = trigger=action or keybind = trigger=action:parameter
---
Meta Actions
| Action | Description |
|---|---|
ignore | Prevents key processing by Ghostty and terminal (OS may still handle it) |
unbind | Removes previously defined keybinding |
keybind = ctrl+c=ignore # Disable ctrl+c in Ghostty
keybind = ctrl+shift+c=unbind # Remove default copy binding---
Terminal Output Actions
| Action | Format | Description |
|---|---|---|
csi | csi:text | Send CSI sequence without header |
esc | esc:text | Send escape sequence |
text | text:text | Send string (Zig string literal syntax) |
cursor_key | cursor_key:app_text,normal_text | Send data based on cursor key mode |
keybind = ctrl+r=csi:0m # Reset text styling
keybind = ctrl+l=esc:c # Send ESC c (reset)
keybind = ctrl+shift+enter=text:\x1b[13;2u # Send modified enter---
Terminal Control Actions
| Action | Description |
|---|---|
reset | Restore terminal to initial state (like reset command) |
clear_screen | Erase display and all scrollback history |
---
Clipboard Actions
| Action | Description |
|---|---|
copy_to_clipboard | Copy selected text to system clipboard |
paste_from_clipboard | Insert system clipboard contents |
paste_from_selection | Insert selection clipboard contents |
copy_url_to_clipboard | Copy URL under cursor to clipboard |
copy_title_to_clipboard | Copy window title to clipboard |
---
Font Actions
| Action | Format | Description |
|---|---|---|
increase_font_size | increase_font_size:points | Enlarge font (default: 1 point) |
decrease_font_size | decrease_font_size:points | Reduce font (default: 1 point) |
reset_font_size | - | Restore configured default |
set_font_size | set_font_size:points | Set exact font size |
keybind = ctrl+plus=increase_font_size:2
keybind = ctrl+minus=decrease_font_size:2
keybind = ctrl+0=reset_font_size
keybind = ctrl+1=set_font_size:14---
Selection Actions
| Action | Format | Description |
|---|---|---|
select_all | - | Highlight all visible text |
adjust_selection | adjust_selection:direction | Modify existing selection |
Directions for `adjust_selection`:
left,right,up,downpage_up,page_downhome,endbeginning_of_line,end_of_line
keybind = shift+left=adjust_selection:left
keybind = shift+end=adjust_selection:end---
Scrolling Actions
| Action | Format | Description |
|---|---|---|
scroll_to_top | - | Move to scrollback beginning |
scroll_to_bottom | - | Move to scrollback end |
scroll_to_selection | - | Position viewport to show selection |
scroll_to_row | scroll_to_row:row | Scroll to absolute row (0 = first) |
scroll_page_up | - | Move up one page |
scroll_page_down | - | Move down one page |
scroll_page_fractional | scroll_page_fractional:fraction | Scroll by fraction (positive=down) |
scroll_page_lines | scroll_page_lines:count | Scroll by lines (positive=down) |
keybind = shift+page_up=scroll_page_up
keybind = ctrl+up=scroll_page_lines:-3
keybind = ctrl+down=scroll_page_lines:3
keybind = ctrl+shift+up=scroll_page_fractional:-0.5---
Navigation Actions
| Action | Format | Description |
|---|---|---|
jump_to_prompt | jump_to_prompt:offset | Navigate by shell prompts (requires shell integration) |
Offset: positive=forward, negative=backward
keybind = ctrl+shift+up=jump_to_prompt:-1 # Previous prompt
keybind = ctrl+shift+down=jump_to_prompt:1 # Next prompt---
Search Actions
Available since Ghostty 1.3. Search has its own GUI in the terminal surface.
| Action | Format | Description |
|---|---|---|
start_search | - | Open the search UI without setting a query |
search | search:text | Search for the given text (empty cancels) |
search_selection | - | Search for the current selection |
navigate_search | navigate_search:direction | Move between results: previous or next |
end_search | - | End the current search and hide the search GUI |
keybind = ctrl+shift+f=start_search
keybind = ctrl+f=search_selection
keybind = ctrl+g=navigate_search:next
keybind = ctrl+shift+g=navigate_search:previous
keybind = escape=end_search---
File Export Actions
| Action | Format | Description |
|---|---|---|
write_scrollback_file | write_scrollback_file:action | Export scrollback to temp file |
write_screen_file | write_screen_file:action | Export visible screen to temp file |
write_selection_file | write_selection_file:action | Export selection to temp file |
Actions: copy (path to clipboard), paste (path as terminal input), open (open in default app)
keybind = ctrl+shift+s=write_scrollback_file:open
keybind = ctrl+shift+e=write_selection_file:copy---
Window Actions
| Action | Format | Description |
|---|---|---|
new_window | - | Open new terminal window |
goto_window | goto_window:target | Focus the previous or next window |
keybind = super+shift+bracket_left=goto_window:previous
keybind = super+shift+bracket_right=goto_window:next---
Tab Actions
| Action | Format | Description |
|---|---|---|
new_tab | - | Create new tab |
previous_tab | - | Switch to preceding tab |
next_tab | - | Switch to following tab |
last_tab | - | Jump to final tab |
goto_tab | goto_tab:index | Navigate to tab by 1-based index |
move_tab | move_tab:offset | Reposition tab (wraps cyclically) |
toggle_tab_overview | - | Show/hide tab selector. Linux only |
keybind = ctrl+1=goto_tab:1
keybind = ctrl+9=last_tab
keybind = ctrl+shift+left=move_tab:-1
keybind = ctrl+shift+right=move_tab:1---
Title Actions
| Action | Format | Description |
|---|---|---|
set_surface_title | set_surface_title:title | Set the focused surface's title (empty resets it) |
set_tab_title | set_tab_title:title | Set the current tab's title (empty clears it) |
prompt_surface_title | - | Open a dialog to rename the focused surface |
prompt_tab_title | - | Open a dialog to rename the current tab |
A tab title set via set_tab_title or prompt_tab_title overrides any title the terminal application sets, and persists across focus changes.
---
Split Actions
| Action | Format | Description |
|---|---|---|
new_split | new_split:direction | Create terminal division |
goto_split | goto_split:target | Focus adjacent split |
toggle_split_zoom | - | Expand/contract split to fill tab |
resize_split | resize_split:direction,pixels | Adjust split dimensions |
equalize_splits | - | Distribute space equally |
Directions for `new_split`: right, down, left, up, auto (larger axis)
Targets for `goto_split`: right, down, left, up, previous, next
keybind = ctrl+d=new_split:right
keybind = ctrl+shift+d=new_split:down
keybind = alt+left=goto_split:left
keybind = alt+right=goto_split:right
keybind = ctrl+alt+right=resize_split:right,50
keybind = ctrl+alt+left=resize_split:left,50
keybind = ctrl+shift+z=toggle_split_zoom
keybind = ctrl+shift+e=equalize_splits---
Window Management Actions
| Action | Description | Platform |
|---|---|---|
reset_window_size | Restore default dimensions | macOS only |
toggle_maximize | Maximize/restore window | Linux only |
toggle_fullscreen | Enter/exit fullscreen | All |
toggle_window_decorations | Show/hide titlebar | Linux only |
toggle_window_float_on_top | Keep window above others | macOS only |
---
Inspector & Development Actions
| Action | Format | Description | Platform |
|---|---|---|---|
inspector | inspector:mode | Control inspector visibility | All |
show_gtk_inspector | - | Activate GTK dev tools | Linux only |
show_on_screen_keyboard | - | Display virtual keyboard | Linux/GTK only |
Modes for `inspector`: toggle, show, hide
keybind = ctrl+shift+i=inspector:toggle---
Configuration Actions
| Action | Description |
|---|---|
open_config | Launch config file in default editor |
reload_config | Reread and apply configuration changes |
keybind = ctrl+comma=open_config
keybind = ctrl+shift+comma=reload_config---
Closing Actions
| Action | Description |
|---|---|
close_surface | Close current window, tab, or split |
close_tab | Close current tab and all its splits |
close_window | Close active window and all contents |
close_all_windows | Deprecated - Use all:close_window instead |
keybind = ctrl+w=close_surface
keybind = ctrl+shift+w=close_tab---
Application Actions
| Action | Description | Platform |
|---|---|---|
toggle_secure_input | Prevent keyboard monitoring | macOS only |
toggle_command_palette | Display action browser | All |
toggle_quick_terminal | Show/hide drop-down terminal | All |
toggle_mouse_reporting | Toggle mouse reporting (see mouse-reporting) | All |
toggle_readonly | Toggle read-only mode (no input sent to the PTY) | All |
toggle_background_opacity | Toggle transparent/opaque (no-op if opacity >=1) | macOS only |
toggle_visibility | Show/hide all windows | macOS only |
check_for_updates | Initiate update verification | macOS only |
undo | Revert last reversible action | macOS only |
redo | Reapply last undone action | macOS only |
quit | Terminate Ghostty application | All |
Reversible actions for undo/redo: new/close window, tab, split
keybind = global:super+backquote=toggle_quick_terminal
keybind = super+h=toggle_visibility
keybind = super+q=quit---
Testing Actions
| Action | Format | Description |
|---|---|---|
crash | crash:thread | Intentionally crash for testing. DATA LOSS WARNING |
Threads: main, io, render
---
Key Table & Sequence Actions
Available since Ghostty 1.3. Named key tables let a trigger switch into a different set of bindings (a modal layer), similar to Vim modes or tmux prefix tables. The named tables themselves are defined in the keybind configuration; these actions activate and deactivate them.
| Action | Format | Description |
|---|---|---|
activate_key_table | activate_key_table:name | Activate a named table; stays active until deactivated |
activate_key_table_once | activate_key_table_once:name | Activate a named table until its first valid binding runs |
deactivate_key_table | - | Deactivate the current table; the previous one returns |
deactivate_all_key_tables | - | Deactivate every active table |
end_key_sequence | - | End the active key sequence, flushing prior keys to the terminal |
# Enter a modal "resize" table, then deactivate it with escape
keybind = ctrl+a>r=activate_key_table:resize
# Flush ctrl+w to the program instead of waiting for the next key in a sequence
keybind = ctrl+w>escape=end_key_sequenceIf a named table does not exist, the activate actions have no effect and report performable as false.
---
Default Keybindings
View all default keybindings:
ghostty +list-keybinds --defaultCommon Defaults (Platform Dependent)
| macOS | Linux | Action |
|---|---|---|
cmd+c | ctrl+shift+c | copy_to_clipboard |
cmd+v | ctrl+shift+v | paste_from_clipboard |
cmd+t | ctrl+shift+t | new_tab |
cmd+w | ctrl+shift+w | close_surface |
cmd+n | ctrl+shift+n | new_window |
cmd+d | ctrl+shift+d | new_split:right |
cmd+plus | ctrl+plus | increase_font_size |
cmd+minus | ctrl+minus | decrease_font_size |
cmd+0 | ctrl+0 | reset_font_size |
cmd+, | - | open_config |
cmd+shift+, | ctrl+shift+, | reload_config |
---
Keybinding Tips
Remove All Default Bindings
keybind = clearVim-style Navigation
keybind = ctrl+h=goto_split:left
keybind = ctrl+j=goto_split:down
keybind = ctrl+k=goto_split:up
keybind = ctrl+l=goto_split:righttmux-style Leader Key
keybind = ctrl+a>c=new_tab
keybind = ctrl+a>n=next_tab
keybind = ctrl+a>p=previous_tab
keybind = ctrl+a>|=new_split:right
keybind = ctrl+a>-=new_split:down
keybind = ctrl+a>z=toggle_split_zoom
keybind = ctrl+a>x=close_surfaceGlobal Quick Terminal
keybind = global:super+backquote=toggle_quick_terminalmacOS: Requires Accessibility permissions Linux: Requires XDG Desktop Portal (KDE 5.27+, GNOME 48+)
Ghostty Configuration Options Reference
Complete reference of Ghostty configuration options organised by category.
Format: option-name - Type - Default - Description. Valid values and platform notes where applicable.
---
Font Options
Font Family
| Option | Type | Default | Description |
|---|---|---|---|
font-family | String (repeatable) | System dependent | Primary font with fallback support |
font-family-bold | String (repeatable) | Derived | Bold variant |
font-family-italic | String (repeatable) | Derived | Italic variant |
font-family-bold-italic | String (repeatable) | Derived | Bold-italic variant |
Use ghostty +list-fonts to see available fonts.
Font Style
| Option | Type | Default | Description |
|---|---|---|---|
font-style | String/Boolean | null | Named style (e.g., "Heavy") or false to disable |
font-style-bold | String/Boolean | null | Bold style override |
font-style-italic | String/Boolean | null | Italic style override |
font-style-bold-italic | String/Boolean | null | Bold-italic style override |
font-synthetic-style | String | true | Values: true, false, no-bold, no-italic, no-bold-italic |
Font Size & Features
| Option | Type | Default | Description |
|---|---|---|---|
font-size | Number | System dependent | Font size in points (non-integer allowed, e.g., 13.5) |
font-feature | String (repeatable) | null | OpenType features: feat, +feat, -feat, feat=value |
font-thicken | Boolean | false | Draw thicker strokes. macOS only |
font-thicken-strength | Integer (0-255) | null | Thickening intensity. macOS only |
font-shaping-break | String | cursor | Where to break font shaping |
Variable Fonts
| Option | Type | Default | Description |
|---|---|---|---|
font-variation | String (repeatable) | null | Format: axis=value (e.g., wght=600) |
font-variation-bold | String (repeatable) | null | Bold variant axes |
font-variation-italic | String (repeatable) | null | Italic variant axes |
font-variation-bold-italic | String (repeatable) | null | Bold-italic variant axes |
Common axes: wght (weight), slnt (slant), ital, opsz, wdth, GRAD
Font Mapping
| Option | Type | Default | Description |
|---|---|---|---|
font-codepoint-map | String (repeatable) | null | Format: U+ABCD=fontname or U+ABCD-U+DEFG=fontname |
FreeType (Linux Only)
| Option | Type | Default | Description |
|---|---|---|---|
freetype-load-flags | String | Per-flag defaults | Values: hinting, force-autohint, monochrome, autohint, prefix with no- |
---
Colour & Display
Basic Colours
| Option | Type | Default | Description |
|---|---|---|---|
background | Colour | Theme dependent | Format: #RRGGBB, RRGGBB, or X11 colour name |
foreground | Colour | Theme dependent | Format: #RRGGBB, RRGGBB, or X11 colour name |
theme | String | null | Theme name or light:theme1,dark:theme2 for mode switching |
palette | String (repeatable) | null | Format: N=COLOR (N: 0-255) |
palette-generate | Boolean | null | Auto-generate 256-colour palette (indices 16-255) from base 16 ANSI colours |
palette-harmonious | Boolean | null | Invert generated palette colour order for light/dark mode. Requires palette-generate |
bold-color | String | null | Colour for bold text. Value: colour (e.g., #RRGGBB) or bright for bright palette |
bold-is-bright | Boolean | null | Whether bold text uses bright colours |
faint-opacity | Number (0.0-1.0) | null | Opacity of faint (dim) text |
Transparency & Images
| Option | Type | Default | Description |
|---|---|---|---|
background-opacity | Number (0.0-1.0) | 1.0 | Background transparency. macOS requires restart |
background-opacity-cells | Boolean | false | Apply opacity to cells with explicit backgrounds |
background-blur | Integer/Boolean | false | Blur intensity. true=20. macOS, KDE Plasma only |
background-image | Path | null | PNG or JPEG |
background-image-opacity | Number | 1.0 | Image opacity |
background-image-position | String | center | Values: top-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center, bottom-right |
background-image-fit | String | contain | Values: contain, cover, stretch, none |
background-image-repeat | Boolean | false | Tile background image |
alpha-blending | String | Platform dependent | Values: native, linear, linear-corrected |
Custom Shaders
| Option | Type | Default | Description |
|---|---|---|---|
custom-shader | Path | null | Path to custom GLSL shader |
custom-shader-animation | Boolean | null | Whether to enable shader animation |
Cursor
| Option | Type | Default | Description |
|---|---|---|---|
cursor-color | Colour | null | Cursor colour. Special: cell-foreground, cell-background |
cursor-text | Colour | null | Text under cursor colour |
cursor-opacity | Number (0.0-1.0) | 1.0 | Cursor transparency |
cursor-style | String | null | Values: block, bar, underline, block_hollow |
cursor-style-blink | Boolean/null | null | Whether cursor blinks (null respects DEC Mode 12) |
cursor-invert-fg-bg | Boolean | null | Whether to invert foreground and background colours for cursor |
Selection
| Option | Type | Default | Description |
|---|---|---|---|
selection-foreground | Colour | null | Selected text foreground |
selection-background | Colour | null | Selected text background |
selection-invert-fg-bg | Boolean | null | Whether to invert foreground and background for selection |
selection-clear-on-typing | Boolean | true | Clear selection when typing |
selection-clear-on-copy | Boolean | false | Clear selection after copy |
selection-word-chars | String | null | Characters that mark word boundaries for double-click selection |
Search Colours
| Option | Type | Default | Description |
|---|---|---|---|
search-foreground | Colour | null | Foreground for search matches. Special: cell-foreground, cell-background |
search-background | Colour | null | Background for search matches. Special: cell-foreground, cell-background |
search-selected-foreground | Colour | null | Foreground for the focused search match. Special: cell-foreground, cell-background |
search-selected-background | Colour | null | Background for the focused search match. Special: cell-foreground, cell-background |
Contrast & Splits
| Option | Type | Default | Description |
|---|---|---|---|
minimum-contrast | Number (1-21) | null | WCAG contrast ratio |
split-divider-color | Colour | null | Split pane divider colour |
unfocused-split-opacity | Number (0.15-1.0) | System dependent | Unfocused split opacity |
unfocused-split-fill | Colour | Background | Unfocused split overlay colour |
Scrollbar
| Option | Type | Default | Description |
|---|---|---|---|
scrollbar | String | null | Values: system, never |
---
Cell Adjustments
All accept Integer or Percentage (e.g., 20%, -15%).
| Option | Default | Description |
|---|---|---|
adjust-cell-width | 0 | Cell width adjustment |
adjust-cell-height | 0 | Cell height (font centred vertically) |
adjust-font-baseline | 0 | Baseline position (positive=UP) |
adjust-underline-position | 0 | Underline position (positive=DOWN) |
adjust-underline-thickness | 0 | Underline thickness |
adjust-strikethrough-position | 0 | Strikethrough position |
adjust-strikethrough-thickness | 0 | Strikethrough thickness |
adjust-overline-position | 0 | Overline position |
adjust-overline-thickness | 0 | Overline thickness |
adjust-cursor-thickness | 0 | Bar/hollow cursor thickness |
adjust-cursor-height | 0 | Cursor height |
adjust-box-thickness | 0 | Box drawing character thickness |
adjust-icon-height | 1.2x capital height | Nerd font icon height |
| Option | Type | Default | Description |
|---|---|---|---|
grapheme-width-method | String | unicode | Values: legacy, unicode |
---
Command & Shell
| Option | Type | Default | Description |
|---|---|---|---|
command | String | SHELL env or passwd | Command to run. Prefixes: direct: (skip shell), shell: (force shell) |
initial-command | String | null | Command for first terminal only. CLI: -e flag |
env | String (repeatable) | null | Format: KEY=VALUE. Reset: env =. Remove: env = key= |
input | String (repeatable) | null | Startup input. Format: raw:string or path:filepath |
wait-after-command | Boolean | false | Keep terminal open after command exits |
abnormal-command-exit-runtime | Duration | null | Threshold for "abnormal" exit detection (e.g., 2s, 5000ms) |
shell-integration | String | detect | Values: none, detect, bash, fish, zsh, elvish |
shell-integration-features | String | null | Features: cursor, sudo, title, ssh-env, ssh-terminfo. Prefix no- to disable |
term | String | null | TERM environment variable value (e.g., xterm-256color, xterm-ghostty) |
---
Scrollback & Clipboard
| Option | Type | Default | Description |
|---|---|---|---|
scrollback-limit | Integer (bytes) | System dependent | Scrollback buffer size |
clipboard-read | String | ask | Values: ask, allow, deny |
clipboard-write | String | allow | Values: ask, allow, deny |
clipboard-trim-trailing-spaces | Boolean | false | Trim whitespace from copied text |
clipboard-paste-protection | Boolean | true | Confirm before pasting text with newlines |
clipboard-paste-bracketed-safe | Boolean | true | Consider bracketed pastes safe |
copy-on-select | Boolean/String | true | Values: true (selection clipboard), false, clipboard (both) |
clipboard-codepoint-map | String (repeatable) | null | Map codepoints on copy. Format: U+XXXX=U+YYYY or U+XXXX=text |
---
Links & Images
| Option | Type | Default | Description |
|---|---|---|---|
link-url | Boolean | true | Enable URL matching on hover |
link-previews | String/Boolean | true | Values: true, false, osc8 |
link | String (repeatable) | null | Custom regex link pattern. Format: regex:PATTERN action:ACTION |
image-storage-limit | Integer (bytes) | 320MB | Kitty image protocol storage per screen |
---
Keybindings & Input Remapping
| Option | Type | Default | Description |
|---|---|---|---|
keybind | String (repeatable) | null | Key binding. Format: [prefix:]trigger=action[:param]. Use keybind=clear to remove all defaults |
key-remap | String (repeatable) | null | Remap modifier keys. Format: source=target (e.g., left_ctrl=left_alt, caps_lock=left_ctrl) |
---
Mouse & Input
| Option | Type | Default | Description |
|---|---|---|---|
cursor-click-to-move | Boolean | false | Alt/Option+click repositions cursor at prompt |
mouse-hide-while-typing | Boolean | false | Hide mouse when typing |
mouse-shift-capture | String/Boolean | false | Values: true, false, always, never |
mouse-scroll-multiplier | Number (0.01-10000) | 3 | Mouse wheel scroll distance |
mouse-reporting | Boolean | null | Report mouse events to terminal apps. Toggle with toggle_mouse_reporting keybind |
scroll-to-bottom | String | keystroke, no-output | Values: keystroke, output. Prefix no- to disable |
right-click-action | String | context-menu | Values: context-menu, paste, copy, copy-or-paste, ignore |
click-repeat-interval | Integer (ms) | Platform specific | Multi-click detection interval |
---
Bell
| Option | Type | Default | Description |
|---|---|---|---|
bell-features | String (repeatable) | null | Bell features. Values: audio, system, attention, title, border. Prefix no- to disable |
bell-audio-path | Path | null | Path to audio file for bell sound |
bell-audio-volume | Number (0.0-1.0) | null | Bell audio volume relative to system volume |
---
Notifications
| Option | Type | Default | Description |
|---|---|---|---|
desktop-notifications | Boolean | null | Whether to enable desktop notifications |
app-notifications | String | null | App notifications to enable (e.g., clipboard-copy, no-clipboard-copy) |
notify-on-command-finish | String | null | Values: never, unfocused, always. Requires shell integration or OSC 133 |
notify-on-command-finish-action | String | null | How to notify. Comma-separated. Values: bell, notify. Prefix no- to disable |
notify-on-command-finish-after | Duration | null | Minimum command runtime before notification (e.g., 5s, 30s) |
---
Window
Size & Position
| Option | Type | Default | Description |
|---|---|---|---|
window-width | Integer (cells) | null | Initial width (min 10). Both width/height required |
window-height | Integer (cells) | null | Initial height (min 4). Both width/height required |
window-position-x | Integer (pixels) | null | Initial X position. macOS only |
window-position-y | Integer (pixels) | null | Initial Y position. macOS only |
Padding
| Option | Type | Default | Description |
|---|---|---|---|
window-padding-x | Integer | 0 | Horizontal padding. Format: single value or left,right |
window-padding-y | Integer | 0 | Vertical padding. Format: single value or top,bottom |
window-padding-balance | Boolean | false | Balance extra padding from cell alignment |
window-padding-color | String | background | Values: background, extend, extend-always |
Appearance
| Option | Type | Default | Description |
|---|---|---|---|
window-decoration | String/Boolean | auto | Values: none, auto, client (1.1.0+), server (1.1.0+) |
window-theme | String | auto | Values: auto, system, light, dark, ghostty |
window-colorspace | String | srgb | Values: srgb, display-p3. macOS only |
window-vsync | Boolean | true | Sync with screen refresh. macOS only |
window-title-font-family | String | System default | Title font. GTK only. (1.1.0+) |
window-subtitle | String/Boolean | null | Values: false, working-directory. GTK only. (1.1.0+) |
window-titlebar-background | Colour | null | Titlebar background. GTK only, requires window-theme = ghostty |
window-titlebar-foreground | Colour | null | Titlebar foreground. GTK only, requires window-theme = ghostty |
Behaviour
| Option | Type | Default | Description |
|---|---|---|---|
window-inherit-working-directory | Boolean | true | New windows inherit working directory |
window-inherit-font-size | Boolean | false | New windows inherit font size |
window-save-state | String | default | Values: default, never, always. macOS only |
window-step-resize | Boolean | false | Resize in cell increments. macOS only |
maximize | Boolean | false | Start maximised. (1.1.0+) |
fullscreen | Boolean | false | Start fullscreen |
title | String | null | Force window title |
class | String | com.mitchellh.ghostty | Application class (WM_CLASS). GTK only |
x11-instance-name | String | ghostty | WM_CLASS instance. X11 only |
working-directory | String | inherit | Values: absolute path, home, inherit |
focus-follows-mouse | Boolean | false | Mouse movement selects splits |
Tabs & Splits
| Option | Type | Default | Description |
|---|---|---|---|
window-new-tab-position | String | current | Values: current, end |
window-show-tab-bar | String | auto | Values: always, auto, never. GTK only |
split-inherit-working-directory | Boolean | null | Whether new splits inherit the working directory |
split-preserve-zoom | String | null | Preserve zoomed split state. Values: navigation, no-navigation |
tab-inherit-working-directory | Boolean | null | Whether new tabs inherit the working directory |
---
Resize Overlay
| Option | Type | Default | Description |
|---|---|---|---|
resize-overlay | String | after-first | Values: always, never, after-first |
resize-overlay-position | String | center | Values: center, top-left, top-center, top-right, bottom-left, bottom-center, bottom-right |
resize-overlay-duration | Duration | 750ms | Format: 1h30m, 45s, 100ms |
---
Quick Terminal
| Option | Type | Default | Description |
|---|---|---|---|
quick-terminal-position | String | null | Values: top, bottom, left, right, center |
quick-terminal-size | String | null | Format: 50% or 500px, or size1,size2 |
quick-terminal-screen | String | main | Values: main, mouse, macos-menu-bar. macOS only |
quick-terminal-animation-duration | Number (seconds) | System dependent | Animation duration. macOS only |
quick-terminal-autohide | Boolean | Platform dependent | Auto-hide on focus loss |
quick-terminal-space-behavior | String | move | Values: move, remain. macOS only |
quick-terminal-keyboard-interactivity | String | on-demand | Values: none, on-demand, exclusive. Linux Wayland only |
gtk-quick-terminal-layer | String | top | Values: overlay, top, bottom, background. GTK Wayland only |
gtk-quick-terminal-namespace | String | null | Window namespace. GTK Wayland only |
---
Application
| Option | Type | Default | Description |
|---|---|---|---|
confirm-close-surface | String/Boolean | true | Values: true, false, always |
quit-after-last-window-closed | Boolean | Platform dependent | Exit when last window closes |
quit-after-last-window-closed-delay | Duration | unset | Delay before quitting. Min: 1s. Linux only |
initial-window | Boolean | true | Create window on launch |
undo-timeout | Duration | 5s | Undo availability duration. 0 disables. macOS only |
auto-update | String | null | Values: off, check, download |
auto-update-channel | String | null | Values: stable, tip |
---
macOS Platform
Window & Titlebar
| Option | Type | Default | Description |
|---|---|---|---|
macos-titlebar-style | String | auto | Values: auto, hidden, tabs |
macos-titlebar-proxy-icon | String | null | Values: visible, hidden |
macos-window-buttons | String | null | Traffic light buttons visibility. Values: visible, hidden |
macos-window-shadow | Boolean | null | Whether to show window shadow |
macos-non-native-fullscreen | String | null | Values: true, false, visible-menu, padded-notch |
macos-hidden | String | null | Hide app from dock and app switcher. Values: never, always |
Input
| Option | Type | Default | Description |
|---|---|---|---|
macos-option-as-alt | String | null | Treat option key as alt. Values: true, false, left, right |
macos-shortcuts | String | null | Allow macOS Shortcuts to control Ghostty. Values: ask, allow, deny |
Security
| Option | Type | Default | Description |
|---|---|---|---|
macos-auto-secure-input | Boolean | null | Auto-enable secure input |
macos-secure-input-indication | Boolean | null | Show secure input indication |
Icon
| Option | Type | Default | Description |
|---|---|---|---|
macos-icon | String | null | Values: official, blueprint, chalkboard, microchip, glass, holographic, paper, retro, xray, custom, custom-style |
macos-icon-frame | String | null | Frame material. Values: aluminum, beige, plastic, chrome |
macos-icon-ghost-color | Colour | null | Ghost colour for custom icon |
macos-icon-screen-color | Colour | null | Screen colour for custom icon |
macos-custom-icon | Path | null | Path to custom app icon (PNG, JPEG, or ICNS) |
Behaviour
| Option | Type | Default | Description |
|---|---|---|---|
macos-dock-drop-behavior | String | null | Dock file/folder drop action. Values: new-tab, new-window |
---
GTK/Linux Platform
GTK Appearance
| Option | Type | Default | Description |
|---|---|---|---|
gtk-adwaita | Boolean | null | Whether to use Adwaita theme |
gtk-titlebar | Boolean | null | Whether to show titlebar |
gtk-titlebar-style | String | null | Values: native, tabs (merges tab bar into titlebar) |
gtk-titlebar-hide-when-maximized | Boolean | null | Hide titlebar when maximised |
gtk-toolbar-style | String | null | Toolbar bar appearance. Values: flat, raised, raised-border |
gtk-tabs-location | String | null | Tab bar location. Values: top, bottom |
gtk-wide-tabs | Boolean | null | Whether to use wide tabs |
gtk-single-instance | Boolean | true | Single application instance |
adw-toolbar-style | String | null | Adwaita toolbar style. Values: flat, raised, raised-border |
language | String | null | Override GUI language (e.g., de_DE.UTF-8). Cannot be reloaded at runtime |
GTK Custom Styling
| Option | Type | Default | Description |
|---|---|---|---|
gtk-custom-css | Path | null | Path to custom CSS file |
GTK Rendering
| Option | Type | Default | Description |
|---|---|---|---|
gtk-gsk-renderer | String | null | GSK renderer (e.g., gl, cairo) |
gtk-opengl-debug | Boolean | null | Enable OpenGL debugging |
Linux System
| Option | Type | Default | Description |
|---|---|---|---|
linux-cgroup | String | null | Linux cgroup configuration (e.g., v2, v1) |
linux-cgroup-hard-fail | Boolean | null | Hard fail on cgroup errors |
linux-cgroup-memory-limit | Number | null | Cgroup memory limit in bytes |
linux-cgroup-processes-limit | Number | null | Cgroup process limit |
async-backend | String | null | Low-level async IO backend. Values: auto, epoll, io_uring |
---
Terminal Behaviour
| Option | Type | Default | Description |
|---|---|---|---|
enquiry-response | String | null | Response to ENQ character |
osc-color-report-format | String | null | OSC colour report format. Values: 8-bit, 16-bit |
vt-kam-allowed | Boolean | null | Whether VT KAM (keyboard action mode) sequence is allowed |
---
Miscellaneous
| Option | Type | Default | Description |
|---|---|---|---|
config-file | String (repeatable) | null | Additional config files. Prefix ? for optional |
config-default-files | Boolean | true | Load default config paths. CLI only |
title-report | Boolean | false | Enable title reporting (CSI 21 t). Security risk |
command-palette-entry | String (repeatable) | null | Format: title:text,action:action[,description:text] |
---
Colour Format Reference
All colour options accept:
#RRGGBB- Hex with hashRRGGBB- Hex without hash- X11 colour names (e.g.,
red,steelblue,coral) - Special values for cursor/selection:
cell-foreground,cell-background
Duration Format Reference
Duration options accept combinations of:
y(years),d(days),h(hours),m(minutes)s(seconds),ms(milliseconds),us/µs(microseconds),ns(nanoseconds)
Examples: 1h30m, 45s, 100ms, 750ms
Full Ghostty configuration schema reference
You can find the latest Ghostty configuration schema (including those supported by the tip releases) at: https://raw.githubusercontent.com/sammcj/vscode-ghostty-config-syntax/refs/heads/main/schema/ghostty-config-syntax.schema.json - this can be quite large, so it's best to pass it programmatically to avoid having to read it in full.