Cover photo

Switching from iTerm2 to Ghostty

I've been using iTerm2 for years, but recently switched to Ghostty — and I'm not going back.

The nudge came from zhangchitc, who shared a polished Ghostty config along with a relevant data point: Boris, the lead on Claude Code, has said his team's go-to terminal is Ghostty — running five instances in parallel. If the people building Claude Code are running it in Ghostty, that's a reasonable signal worth paying attention to.

zhangchitc open-sourced his config, I ran it for a few days, adjusted it to fit my workflow, and here's where I landed.

What I Changed

zhangchitc's config is already well thought-out — the changes I made are purely personal preference:

  • Font: Maple Mono NF CNMonaco Nerd Font Mono — just find Monaco easier on the eyes for code

  • Theme: Catppuccin MochaSelenized Black — pure black background, high contrast, easier to read logs for long stretches

  • No background transparency: zhangchitc uses background-opacity = 0.85 for a frosted-glass look, which is nice, but I prefer a solid background for reading focus

  • Cursor: non-blinking block cursor (block + blink = false), with shell-integration-features = no-cursor to prevent shell integration from overriding it

  • Removed Ghostty's native splits: my workflow puts different SSH connections in separate Ghostty tabs, with tmux handling splits on the remote side — so the cmd+d split keybinds are gone

  • No window state persistence: dropped window-save-state = always, so each launch starts clean

Net result: pure black background, solid block cursor, no transparency, no native splits — as minimal as a terminal gets.

Why Your Terminal Actually Matters

The terminal is one of those tools you use every day but rarely optimize. A few areas where Ghostty genuinely helps:

  • GPU rendering: when backtests are dumping large volumes of log output, iTerm2 can stutter. Ghostty renders on the GPU — scrolling through dense output stays smooth

  • Quick Terminal: global hotkey Ctrl+` drops a terminal down from the top of the screen from any app. Great for a quick script or a fast git push without switching context

  • Claude Code workflow: one tab running Claude Code, another SSH'd into a server tailing live logs, Quick Terminal for one-off commands — tab switching is fast and all tabs share a consistent color scheme

  • tmux on the remote: remote servers use tmux for multi-pane process management (data feeds, strategy processes, monitoring). Ghostty handles local tabs and connections; tmux handles remote layout. They don't step on each other.

Installation

On macOS: brew install --cask ghostty. Config goes in ~/.config/ghostty/config.

One macOS gotcha (possibly a bug): the system config at ~/Library/Application Support/com.mitchellh.ghostty/config may contain a line like theme = TokyoNight Night. If it does, comment it out — otherwise it overrides your theme setting in ~/.config/ghostty/config, locking you into TokyoNight Night regardless of what you set.

Config

My config:

# ============================================
# Ghostty Terminal - My Config
# ============================================
# Location: ~/.config/ghostty/config
# Hot reload: Cmd+Shift+,
#
# Reference: config shared by zhangchitc
# https://gist.github.com/zhangchitc/7dead7c1b517390e061e07759ed80277
#
# Based on the reference config, adjusted to personal preferences:
# - Font: switched to Monaco Nerd Font Mono
# - Theme: switched to Selenized Black
# - Transparency: no background transparency, solid color for focused reading
# - Split keybinds: removed Ghostty native splits
#                   different SSH connections separated by Ghostty tabs, remote splits handled by tmux
# - Quick Terminal: enabled, globally summon with Ctrl+` anytime, supplements regular terminal windows
# - Window state: not saved

# --- Font & Typography ---
font-family = "Monaco Nerd Font Mono"
font-size = 14

# --- Theme ---
theme = "Selenized Black"
# Increase ANSI faint/dim text opacity to prevent it from being too light on the Selenized Black theme
faint-opacity = 0.8

# --- Window Appearance ---
# No transparency, solid background
window-padding-x = 10
window-padding-y = 8

# --- Cursor ---
# Non-blinking block cursor
cursor-style = block
cursor-style-blink = false
shell-integration-features = no-cursor

# --- Mouse ---
# Hide mouse pointer while typing
mouse-hide-while-typing = true
# Selection is copied directly to system clipboard
copy-on-select = clipboard

# --- Quick Terminal (global dropdown terminal) ---
# Global hotkey Ctrl+` to summon/dismiss from the top of the screen
# Can be triggered from any app, useful for quick commands and git operations
quick-terminal-position = top
# Appears on the screen where the mouse is (multi-monitor friendly)
quick-terminal-screen = mouse
# Auto-hide when clicking another window
quick-terminal-autohide = true
quick-terminal-animation-duration = 0.15

# --- Security ---
# Prevent malicious content from injecting commands via clipboard
clipboard-paste-protection = true
clipboard-paste-bracketed-safe = true

# --- Shell Integration ---
# Auto-detect zsh/bash/fish and inject integration scripts
shell-integration = detect

# --- Performance ---
# ~25MB scrollback buffer
scrollback-limit = 25000000

# --- Keybinds ---
# Tabs (use case: different SSH connections in separate tabs)
keybind = cmd+t=new_tab
keybind = cmd+shift+left=previous_tab
keybind = cmd+shift+right=next_tab
keybind = cmd+w=close_surface

# Quick Terminal global hotkey
keybind = global:ctrl+grave_accent=toggle_quick_terminal

# Font size
keybind = cmd+plus=increase_font_size:1
keybind = cmd+minus=decrease_font_size:1
keybind = cmd+zero=reset_font_size

# Hot reload config file (no restart needed after config changes)
keybind = cmd+shift+comma=reload_config

zhangchitc's original config:

See zhangchitc's GitHub Gist.