Why Ghostty
I've used iTerm2 for years. It was fine. Then I tried Alacritty — blazing fast, but stripped down to the point where you need tmux for basic split panes. WezTerm was powerful but felt like configuring a Lua application rather than a terminal. Kitty was close, but the UI never felt native on macOS.
Then Ghostty came along. Built by Mitchell Hashimoto (the HashiCorp founder) in Zig, it hits a sweet spot I didn't think was possible: GPU-accelerated rendering on par with Alacritty, a rich feature set rivaling iTerm2, and a genuinely native UI on both macOS (Swift/AppKit) and Linux (GTK4). No Electron. No compromises.
The killer combination:
- Metal/OpenGL GPU rendering — roughly 100x faster than Terminal.app
- Native UI — proper macOS and Linux integration, not a web wrapper
- Built-in splits and tabs — no tmux dependency for basic workflows
- Zero-config defaults — works beautifully out of the box, customizable when you need it
- Quake-style dropdown terminal — a global hotkey that summons a terminal from the top of your screen
Currently supports macOS and Linux. Windows is on the roadmap. The core library libghostty already compiles for macOS, Linux, Windows, and WebAssembly.
Installation
macOS
# Homebrew (recommended)
brew install --cask ghostty
# Or download the DMG directly from ghostty.org/download
Linux
# Arch Linux (official repos)
sudo pacman -S ghostty
# NixOS
nix-env -iA nixpkgs.ghostty
# Ubuntu/Debian
sudo add-apt-repository ppa:ghostty/ppa
sudo apt update && sudo apt install ghostty
# Fedora/RHEL
sudo dnf install ghostty
# From source (requires Zig 0.13+)
git clone https://github.com/ghostty-org/ghostty
cd ghostty
zig build -p ~/.local -Doptimize=ReleaseFast
Verify It Works
ghostty --version
ghostty +list-themes # see all built-in themes
ghostty +list-keybinds # see all default keybindings
Configuration
Ghostty uses a plain-text key = value config file at ~/.config/ghostty/config. No JSON, no YAML, no Lua — just simple key-value pairs. Many options support hot-reload, so you don't even need to restart.
Open it with Cmd+, on macOS, or Ctrl+Shift+, on Linux.
Here's the config I actually use:
############################
# Font
############################
font-family = JetBrains Mono
font-size = 14
font-thicken = true # bolder glyphs on Retina displays
############################
# Appearance
############################
theme = catppuccin-mocha
background-opacity = 0.92
background-blur-radius = 20 # frosted glass effect (macOS)
window-padding-x = 12
window-padding-y = 10
cursor-style = block
cursor-style-blink = false
############################
# Behavior
############################
shell-integration = zsh
mouse-hide-while-typing = true
copy-on-select = clipboard # select text = copy to clipboard
confirm-close-surface = false # no confirmation dialog on close
scrollback-limit = 10000
############################
# Window
############################
window-decoration = false
macos-titlebar-style = hidden
resize-overlay = never
############################
# SSH compatibility
############################
term = xterm-256color # prevents terminfo errors on remote
############################
# Custom keybindings
############################
keybind = global:cmd+grave_accent=toggle_quick_terminal
keybind = opt+h=goto_split:left
keybind = opt+j=goto_split:bottom
keybind = opt+k=goto_split:top
keybind = opt+l=goto_split:right
Quick Reference
| Key | What it does |
|---|---|
font-family | Any installed font name |
font-size | Font size in pt (default: 12) |
theme | Theme name — run ghostty +list-themes to browse |
background-opacity | 0.0 to 1.0 transparency |
background-blur-radius | Blur intensity (macOS only) |
cursor-style | block, underline, or bar |
shell-integration | bash, fish, zsh, or none |
scrollback-limit | Lines of scrollback (0 = unlimited) |
copy-on-select | true, clipboard, or false |
term | TERM env var — default xterm-ghostty |
macos-titlebar-style | native, transparent, hidden, tabs |
Appearance Customization
Themes
Ghostty ships with hundreds of built-in themes:
ghostty +list-themes
# Popular ones worth trying:
# catppuccin-mocha / catppuccin-latte
# tokyo-night / tokyonight-storm
# gruvbox-dark / gruvbox-light
# dracula / nord / one-dark
# rose-pine / kanagawa
You can even auto-switch between light and dark themes based on your system appearance:
theme = dark:catppuccin-mocha,light:catppuccin-latte
Custom Colors
If you want full control over your palette:
background = #1e1e2e
foreground = #cdd6f4
selection-background = #585b70
cursor-color = #f5e0dc
# ANSI colors
palette = 0=#45475a
palette = 1=#f38ba8
palette = 2=#a6e3a1
palette = 3=#f9e2af
Font Setup with Nerd Fonts
For icon support in tools like Starship, Neovim, and lsd:
brew install --cask font-jetbrains-mono-nerd-font
brew install --cask font-meslo-lg-nerd-font
brew install --cask font-fira-code-nerd-font
font-family = JetBrainsMono Nerd Font
font-size = 13
font-thicken = true
# Enable ligatures
font-feature = calt
font-feature = liga
Custom Shaders
Ghostty supports GLSL shaders for visual effects like CRT scanlines or glow:
custom-shader = ~/.config/ghostty/shaders/crt.glsl
custom-shader-animation = true
Keybindings Cheat Sheet
Window & Tabs (macOS)
| Shortcut | Action |
|---|---|
Cmd+N | New window |
Cmd+T | New tab |
Cmd+W | Close current tab |
Cmd+1-9 | Switch to tab N |
Cmd+Shift+{ / } | Previous / next tab |
Cmd+Return | Toggle fullscreen |
Cmd+Shift+P | Command palette |
Split Panes (macOS)
| Shortcut | Action |
|---|---|
Cmd+D | Split right (horizontal) |
Cmd+Shift+D | Split down (vertical) |
Cmd+Shift+Return | Toggle split zoom |
Cmd+Option+Arrow | Navigate to split in direction |
Cmd+Shift+[ / ] | Cycle through splits |
Edit & Copy
| Shortcut | Action |
|---|---|
Cmd+C / Cmd+V | Copy / paste (macOS) |
Ctrl+Shift+C / V | Copy / paste (Linux) |
Cmd+F | Search (v1.3.0+) |
Cmd++ / Cmd+- | Zoom in / out |
Cmd+0 | Reset font size |
Cmd+, | Open config file |
Ctrl+Shift+, | Reload config |
Cmd+Shift+I | Terminal inspector |
Splits & Tabs — Replacing tmux
This is where Ghostty shines. Built-in splits mean you can skip tmux entirely for local work.
Vim-Style Navigation (My Recommended Config)
# Navigate splits with Opt+hjkl
keybind = opt+h=goto_split:left
keybind = opt+j=goto_split:bottom
keybind = opt+k=goto_split:top
keybind = opt+l=goto_split:right
# Create splits with Opt+Shift+hjkl
keybind = opt+shift+h=new_split:left
keybind = opt+shift+j=new_split:down
keybind = opt+shift+k=new_split:up
keybind = opt+shift+l=new_split:right
# Resize splits (10px increments)
keybind = ctrl+shift+h=resize_split:left,10
keybind = ctrl+shift+j=resize_split:down,10
keybind = ctrl+shift+k=resize_split:up,10
keybind = ctrl+shift+l=resize_split:right,10
# Equalize all splits
keybind = opt+shift+equal=equalize_splits
tmux-Style Prefix Keys
If you're coming from tmux and want similar ergonomics:
keybind = ctrl+a>o=toggle_tab_overview
keybind = ctrl+a>n=new_window
keybind = ctrl+a>t=new_tab
The > syntax creates sequence bindings — press Ctrl+A, release, then press the next key. Feels identical to tmux prefix mode.
Undo Closed Splits
Accidentally closed a split? Ghostty has undo:
keybind = cmd+z=undo
keybind = cmd+shift+z=redo
undo-timeout = 10s
The Tab Overview supports search and shows the last command each tab ran — very useful for finding the right tab in a busy session.
Quick Terminal (Quake Mode)
This is my favorite Ghostty feature. A single global hotkey summons a terminal that slides in from the top of your screen — like the console in Quake. It persists in the background, keeping your session alive.
# Global hotkey — works even when Ghostty is in the background
keybind = global:cmd+grave_accent=toggle_quick_terminal
# Configure position and size
quick-terminal-position = top # top | bottom | left | right | center
quick-terminal-screen = main # main | mouse | screen number
quick-terminal-size-height = 0.4 # 40% of screen height
quick-terminal-animation-duration = 0.2
The global: prefix means this keybinding works system-wide — even when another app is in focus. I use Cmd+` to toggle it, and it's become muscle memory for quick commands.
Advanced Features
Shell Integration
With shell integration enabled, Ghostty becomes context-aware:
shell-integration = zsh
shell-integration-features = cursor,sudo,title
What you get:
- Cursor shape changes automatically in vi mode
- Title bar shows the currently running command
- sudo temporarily disables password echo protection
- Command-block navigation — jump between command outputs
Image Display
Ghostty supports the Kitty graphics protocol, so you can display images directly in the terminal:
pip install timg
timg image.png
# Or use viu (Rust-based)
cargo install viu
viu image.png
Performable Keybindings (v1.2.0+)
Smart keybindings that only fire when the action makes sense:
# Ctrl+C copies when text is selected, sends interrupt otherwise
keybind = performable:ctrl+c=copy_to_clipboard
This eliminates the classic terminal conflict between "copy" and "interrupt signal."
Key Tables (Modal Keybindings)
Create Vim-style modal keybinding layers:
# Enter "copy mode" with Ctrl+Shift+Space
keybind = ctrl+shift+space=push_key_table:copy-mode
keybind = copy-mode/escape=pop_key_table
keybind = copy-mode/y=copy_to_clipboard
Clickable Links
link-url = true
URLs in terminal output become clickable. Combined with shell integration, file paths from ls, grep, and compiler errors are all navigable.
macOS-Specific Features
- Quick Look — preview files directly in the terminal
- Force Touch — force-press the trackpad to look up words
- Secure Input — password fields are protected from keyloggers
- Window restoration — all tabs and splits are restored after a restart
- Non-native fullscreen —
macos-non-native-fullscreen = trueavoids the Space-switching animation
Practical Tips
Working with tmux
If you still want tmux for remote sessions, you can forward Ghostty keybindings to tmux:
# Cmd+S sends tmux save-buffer
keybind = cmd+s=text:\x01\x73
# Cmd+B sends tmux prefix + zoom
keybind = cmd+b=text:\x01\x7a
# Disable Ghostty splits to avoid conflicts
keybind = cmd+d=unbind
SSH Without terminfo Errors
The most common Ghostty gotcha — remote servers don't know xterm-ghostty:
term = xterm-256color
Or per-connection: TERM=xterm-256color ssh user@server
Launch a Specific Shell
# All new windows start fish
command = /opt/homebrew/bin/fish
# Or auto-attach to a tmux session
initial-command = tmux new-session -A -s main
Multi-Config Files
Split your config into modules:
config-file = ~/.config/ghostty/work.conf
config-file = ~/.config/ghostty/keybinds.conf
Discovery Commands
ghostty +list-keybinds # all active keybindings
ghostty +list-actions # all available actions
ghostty +list-themes # all built-in themes
How Does Ghostty Compare?
| Terminal | Speed | Features | Native Feel | Config Complexity |
|---|---|---|---|---|
| Ghostty | Excellent | Excellent | Excellent | Very Low |
| Alacritty | Excellent | Minimal | Low | Low |
| WezTerm | Good | Excellent | Low | High |
| iTerm2 | Fair | Excellent | Good | Medium |
| Kitty | Excellent | Good | Low | Medium |
Ghostty is the first terminal that doesn't ask you to choose between speed and features. If you're on macOS or Linux and haven't tried it yet, brew install --cask ghostty and give it 30 minutes. You probably won't go back.
FAQ
Q: Config changes aren't taking effect? Not all options support hot-reload. Font, renderer, and other low-level settings require a full restart. Themes, opacity, and keybindings usually hot-reload fine.
Q: Neovim colors look wrong?
Make sure term = xterm-ghostty (the default) and add vim.opt.termguicolors = true to your Neovim config.
Q: How do I reset everything?
rm ~/.config/ghostty/config
# Restart Ghostty — you're back to defaults
Q: Windows support? On the roadmap. The core rendering library already supports Windows, but the native UI layer isn't built yet.
