home / skills / sammcj / agentic-coding / ghostty-config

ghostty-config skill

/Skills/ghostty-config

This skill guides editing Ghostty terminal configuration files, applying sensible defaults and validating syntax to ensure reliable setups.

npx playbooks add skill sammcj/agentic-coding --skill ghostty-config

Review the files below or copy the command above to add this skill to your agents.

Files (3)
SKILL.md
9.0 KB
---
name: ghostty-config
description: Guidance for editing Ghostty terminal configuration files. You must use this skill when creating or modifying Ghostty config files.
# allowed-tools: "Read,Edit,Write,Grep,Glob"
model: "inherit"
---

# 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

**XDG Path (All Platforms):**
- `$XDG_CONFIG_HOME/ghostty/config`
- Defaults to `~/.config/ghostty/config` if XDG_CONFIG_HOME undefined

**macOS Additional Path:**
- `~/Library/Application Support/com.mitchellh.ghostty/config`
- If both XDG and macOS paths exist, both are loaded with macOS path taking precedence

## Config Syntax

```
# Comments start with #
background = 282c34
foreground = ffffff
font-family = "JetBrains Mono"
keybind = ctrl+z=close_surface
font-family =                     # Empty value resets to default
```

**Rules:**
- 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:
```bash
ghostty --background=282c34 --font-size=14
ghostty -e top                              # Run command in terminal
```

**macOS 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_terminal
```

**Physical 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 ctrl
```
Sequences wait indefinitely for next key.

### 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 keybindings
- `keybind = ctrl+a=unbind` - Remove specific binding
- `keybind = 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 shell
```

### Shell 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):
```bash
if [ -n "${GHOSTTY_RESOURCES_DIR}" ]; then
    builtin source "${GHOSTTY_RESOURCES_DIR}/shell-integration/bash/ghostty.bash"
fi
```

**Zsh:**
```zsh
source ${GHOSTTY_RESOURCES_DIR}/shell-integration/zsh/ghostty-integration
```

**Fish:**
```fish
source "$GHOSTTY_RESOURCES_DIR"/shell-integration/fish/vendor_conf.d/ghostty-shell-integration.fish
```

**macOS 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-mocha
```

### Quick Terminal (Drop-down)

```
quick-terminal-position = top
quick-terminal-size = 50%
quick-terminal-autohide = true
keybind = global:super+backquote=toggle_quick_terminal
```

### Custom 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 = -liga
```

### Background Transparency

```
background-opacity = 0.9
background-blur = true      # macOS, KDE Plasma only
```

## Platform-Specific Notes

**macOS Only:**
- `window-position-x/y`, `window-save-state`, `window-step-resize`
- `window-vsync`, `window-colorspace`
- `macos-titlebar-style`, `toggle_window_float_on_top`
- `font-thicken`, `font-thicken-strength`
- `toggle_visibility`, `undo`, `redo`, `check_for_updates`
- Global keybindings require Accessibility permissions

**Linux/GTK Only:**
- `window-title-font-family`, `window-subtitle`
- `window-titlebar-background/foreground` (requires `window-theme = ghostty`)
- `window-show-tab-bar`, `gtk-single-instance`
- `toggle_maximize`, `toggle_window_decorations`
- `toggle_tab_overview`, `toggle_command_palette`
- `prompt_surface_title`

**Linux Wayland Only:**
- `quick-terminal-keyboard-interactivity`
- `gtk-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.

Overview

This skill provides practical guidance for creating and editing Ghostty terminal configuration files. It explains file locations, syntax rules, includes, runtime reloading, keybinding patterns, shell integration, and platform-specific options to help you author correct, maintainable configs. Use this when you need to create, modify, or validate Ghostty config files.

How this skill works

It inspects and explains the Ghostty text-based config format: key=value lines, case-sensitive keys, quoted or unquoted values, and empty values that reset defaults. It covers where Ghostty loads configs (XDG and macOS paths), how include directives are processed, and which options can be reloaded at runtime. It also describes CLI commands to show, validate, and edit effective configuration.

When to use it

  • Creating a new Ghostty config from defaults
  • Merging theme or environment-specific configs with include files
  • Adding or modifying keybindings and leader sequences
  • Configuring shell integration for bash, zsh, fish, or elvish
  • Tuning platform-specific features on macOS, Linux, or Wayland
  • Validating or debugging config behaviour with the CLI

Best practices

  • Keep keys lowercase and use consistent quoting for readability
  • Place config-file includes where intended: includes are processed at file end, so order matters
  • Use optional include prefix (?) for local overrides that may be absent
  • Use CLI flags for testing values before committing to files (ghostty --key=value)
  • Prefer physical key codes for non-US layouts and use prefixes (global:, all:) carefully
  • Version-control small fragments (themes, local overrides) and avoid committing sensitive or machine-specific files

Example use cases

  • Define a light/dark theme mapping: theme = light:catppuccin-latte,dark:catppuccin-mocha
  • Create a drop-down quick terminal with keybind = global:super+backquote=toggle_quick_terminal and quick-terminal-size = 50%
  • Assemble a palette file and include it: config-file = themes/palette.conf plus palette = entries
  • Enable shell integration selectively: shell-integration = detect and shell-integration-features = cursor,sudo,title
  • Test runtime reloads after tweaking colors, using ctrl+shift+, (Linux) or cmd+shift+, (macOS)

FAQ

Where should I put my main config file?

Use $XDG_CONFIG_HOME/ghostty/config (defaults to ~/.config/ghostty/config). On macOS you can also use ~/Library/Application Support/com.mitchellh.ghostty/config; macOS entries take precedence when both exist.

How do I safely include optional files?

Use config-file = ?local.conf. The ? prefix makes the include optional and avoids errors if the file is missing.