My Ghostty config is twelve lines. Most of what makes the terminal feel right, I let the OS handle.
A config is a list of disagreements with the defaults. Ghostty’s are good, so mine is short. Every line below is one I kept, and why.
Show the full config
theme = dark:Apple System Colors, light:Apple System Colors Light
title = " "
macos-titlebar-proxy-icon = hidden
font-size = 16
font-thicken = true
window-padding-x = 8
window-padding-y = 8
window-padding-balance = true
bell-features = no-title
shell-integration-features = no-cursor
mouse-hide-while-typing = true
term = xterm-256colorLetting the OS pick the colors
theme = dark:Apple System Colors, light:Apple System Colors LightNo Catppuccin, no Tokyo Night. The terminal borrows the OS palette and follows the system appearance: dark when macOS is dark, light when it’s light. Not a theme so much as the absence of one. It stops being decorated and goes back to being a window.
The titlebar, emptied out
title = " "
macos-titlebar-proxy-icon = hiddenThe title is a single space, so Ghostty can’t fill it with the shell or the working directory. The proxy icon is gone too. Two lines, one job: no chrome above the content.
Font, thickened
font-size = 16
font-thicken = trueNo font-family. Ghostty bundles JetBrains Mono, already the family I use in the editor, so the default is right. font-thicken pushes the glyphs a touch heavier, the way macOS smoothing used to. The one cosmetic line, and I’m keeping it.
Padding, even on all sides
window-padding-x = 8
window-padding-y = 8
window-padding-balance = trueEight pixels on every edge. balance is the part that matters: without it the bottom and right run tight against the window, because the grid doesn’t divide evenly. Balancing evens all four sides.
Turning off the nudges
bell-features = no-title
shell-integration-features = no-cursor
mouse-hide-while-typing = trueThree refusals. no-title stops the bell from rewriting the title I just cleared. no-cursor keeps the shell’s hands off the cursor shape. mouse-hide-while-typing drops the pointer until I reach for it again.
One line for compatibility
term = xterm-256colorGhostty’s own terminfo is better, but not every box I SSH into has heard of it. xterm-256color never starts an argument over a remote connection.
Why so little
Keybindings, splits, shaders: untouched, because the defaults haven’t gotten in my way. A line I add today is one I have to remember in a year. The config that ages best disagrees with the defaults as little as it can. When Ghostty ships a better one, I delete a line. That’s the best a config does.