I regularly write about my favorite terminal on this blog. Today it's Ghostty's turn to get its own spot: I'll explain why it became my default terminal, and how to configure it to get the most out of it.

What convinced me first was simplicity: right out of the box, without picking a single theme, Ghostty already shows a perfectly native window and crisp text rendering. No need to touch the configuration to get a terminal that looks good. Speed comes next. A terminal that lags displaying a cat on a large file, or chokes on git log output, breaks your focus with every command; Ghostty fixes this at the root, it's a native macOS terminal emulator that offloads text rendering to the GPU (graphics processing unit) rather than the CPU, unlike most legacy terminals.
The difference feels like the gap between a car assembled from spare parts and one designed as a single block for the track. iTerm2 or Terminal.app stack decades of compatibility and plugins on top of an aging base; Ghostty, written from scratch by Mitchell Hashimoto (the creator of Vagrant and Terraform at HashiCorp), starts from a blank slate and keeps only the essentials: speed, themes, native shell integration. Ghostty is now in public stable release, distributed as binaries signed and notarized by the project, so there's no shaky beta to install with caution.
Ghostty installs with a single command via Homebrew (the reference package manager on macOS):
brew install --cask ghosttyOpen the app from Spotlight or Launchpad. Ghostty starts with a minimal configuration: system font, no theme applied, no hidden settings. Everything lives in a single text file, looked up in several locations, loaded in this order:
~/.config/ghostty/config (renamed config.ghostty since version 1.2.3, the old name still works) - the cross-platform location, based on the XDG convention~/Library/Application Support/com.mitchellh.ghostty/config - the macOS-specific location💡 A file name that changed. If a tutorial mentions
configwithout an extension, that's the old name (pre-1.2.3): both still work, no conversion needed.
To keep things simple and portable, use the cross-platform path:
mkdir -p ~/.config/ghostty
touch ~/.config/ghostty/config
code ~/.config/ghostty/config(Replace code with nvim or your editor of choice.)
Before writing anything, explore the full list of available options, documented directly from the command line:
ghostty +show-config --default --docs | lessThis command prints every option, its default value, and an explanation - it's the best reference, always in sync with the installed version. Prefer browsing in a web browser? The full configuration reference lists the same options online. Now add your first settings:
font-family = "JetBrains Mono"
font-size = 14
window-padding-x = 10
window-padding-y = 10
cursor-style = bar
macos-titlebar-style = tabsThe last line merges tabs directly into the title bar, instead of a separate row eating up vertical space. Save, then reload the configuration without restarting the app with cmd+shift+,. Ghostty applies the change immediately: that's the habit to build after every edit.
💡 Key takeaway. One text file, one shortcut to reload (
cmd+shift+,), and+show-configas built-in documentation that's always up to date.
Ghostty ships with several hundred ready-to-use themes, imported from the community iterm2-color-schemes repository and updated weekly. List them directly from the terminal:
ghostty +list-themesPick one and add it to your configuration:
theme = Catppuccin FrappeOn a Mac, it's better to set a theme per display mode rather than a fixed one. Ghostty switches automatically based on the system's light/dark setting:
theme = dark:Catppuccin Frappe,light:Catppuccin LatteNext comes shell integration: a set of features Ghostty automatically injects into your shell at startup, with no configuration needed. Concretely:
cmd selects only a command's output.bash, elvish, fish, nushell, and zsh.⚠️ Common pitfall. The
/bin/bashshipped with macOS is too old to support automatic injection. If it's your default shell, nothing activates, with no visible error message. Install a recent version withbrew install bashand switch shells, or move tozsh(macOS's default shell since Catalina).
To check that integration works without digging through logs, open a new tab from a different folder: if it starts in that folder rather than your $HOME, it's active.
Three families of terminals compete for the same audience:
| Terminal | Interface | Rendering | Session management |
|---|---|---|---|
| iTerm2 | Native (Cocoa), the richest in features (triggers, badges, arrangements) | Optional GPU (Metal), toggled in preferences | Window arrangements |
| Kitty | Custom, doesn't always follow macOS conventions | Native GPU | Session kittens, not persistent |
| WezTerm | Custom, doesn't always follow macOS conventions | Native GPU | Built-in multiplexer, restorable sessions |
| Ghostty | Native (Swift, AppKit, SwiftUI) | Native GPU | None, tmux recommended |
Ghostty stands out on one specific point: its macOS interface is built with the exact same building blocks as any native Apple app, wired to a shared core written in Zig. The concrete result: tabs, split panes, and Quick Look work exactly like in every other app on the system, no reinvented widgets.
On raw speed, let's stay honest: Mitchell Hashimoto puts it this way in the official documentation - Ghostty aims to stay "in the same class as the fastest terminals," sometimes ahead of Kitty or WezTerm on a given benchmark, sometimes behind. The real difference isn't measured in milliseconds, it's in system integration.
Where Ghostty still falls short of WezTerm: the lack of a built-in session manager. Close the window, and open tabs vanish - WezTerm, on the other hand, can multiplex and restore sessions natively. Most Ghostty users fill that gap with tmux (the terminal multiplexer), which keeps sessions alive independently of the graphical window. If you want to go that far, the logical next step is Master tmux: sessions, panes, and sharing, which covers the exact Ghostty configuration to keep true color inside a tmux session.
Splitting the screen into panes. Ghostty natively splits a window into panes, with no need for tmux for simple screen sharing. First, list the keybinds already active by default:
ghostty +list-keybinds --default | grep -i splitIf the default layout doesn't suit you, customize it with the new_split action (which takes a direction: right, down, left, up, or auto to pick automatically based on the window's shape) and goto_split to navigate between panes:
keybind = cmd+d=new_split:right
keybind = cmd+shift+d=new_split:down
keybind = cmd+alt+right=goto_split:right
keybind = cmd+alt+left=goto_split:left
keybind = cmd+alt+up=goto_split:up
keybind = cmd+alt+down=goto_split:down
keybind = cmd+shift+enter=toggle_split_zoom💡 A nod to iTerm2 users. The first two lines deliberately mirror its default shortcuts (
cmd+dfor a vertical split,cmd+shift+dfor a horizontal split), so you don't lose your muscle memory.
The last line (toggle_split_zoom) temporarily expands the active pane to full screen, handy for reading a long log without resizing with the mouse. To adjust a size from the keyboard rather than the mouse, resize_split takes a direction and a pixel amount (resize_split:right,50), and equalize_splits resets every pane to equal size with a single shortcut.

Two settings also showcase Ghostty's native macOS integration: window restoration and automatic secure input.
By default, macOS only restores an app if it was force-closed (crash, restart) or if the system option "Reopen windows when logging back in" is enabled. To force Ghostty to always recover its tabs and panes after a voluntary quit:
window-save-state = alwaysWindow position and size come back either way; each tab's working directory, however, only comes back if the shell integration covered above is active.
Since version 1.2.0, Ghostty can detect that a password prompt is showing (for example with sudo) and automatically enable macOS's "Secure Input" feature, which stops any other app from reading keyboard events while you type:
macos-auto-secure-input = true
macos-secure-input-indication = trueThe second line shows a visual indicator when the protection is active, useful for knowing whether it's actually running.
⚠️ A limitation to know about. Detection relies on heuristics: it doesn't work in an SSH session, and can occasionally trigger (or not) where you wouldn't expect it.
Ghostty is installed, configured with your font and a theme that follows the system appearance, and its shell integration is verified - enough to replace your current terminal today. The file ~/.config/ghostty/config remains the only place you need to know for any new setting.
As a next step, here's a concrete idea: browse the catalog with ghostty +list-themes until you find a theme that's still readable after several hours straight. And if you juggle multiple projects, layer tmux on top to keep persistent sessions, as covered above.
Thanks for following along on this journey! 🍺