You install Claude Code. You run it from your default terminal. The font is small, the background is flat black with no depth, there are no shortcuts to split the screen into panels. You try to have Claude Code on one side and a regular shell on the other, but your emulator does not support splits. You open another window, alternate with Alt+Tab, lose context every time you switch. Claude Code generates a long output, you scroll up and the buffer has already discarded the first lines. You copy a command from Claude’s response, paste it, and it runs before you have time to review it.
The default terminal is not designed for this. It is designed to run ls, read a log, launch a short script. It is not designed to maintain hours-long sessions with an AI agent that continuously reads, writes and executes code. You need something better.
Dani Avila published a Ghostty configuration for macOS with a keybinding system he called SAND (Split, Across, Navigate, Destroy) that I found elegant. His repository was my starting point. But I use Linux, not macOS, and my Claude Code workflow has different needs. This is my version, explained option by option.
Why Ghostty and not another emulator
On Linux there are four serious terminal emulators for development. Before explaining why I chose Ghostty, here is a quick comparison:
| Alacritty | Kitty | WezTerm | Ghostty | |
|---|---|---|---|---|
| Native splits | No | Yes | Yes | Yes |
| Tabs | No | Yes | Yes | Yes |
| GPU-accelerated | Yes | Yes | Yes | Yes |
| Config format | TOML | kitty.conf | Lua | Plain text |
| Quick terminal (Quake) | No | No | No | Yes |
| Config complexity | Low | High | Medium-high | Low |
Alacritty is fast and minimal. Too minimal. It has no native tabs or splits. If you want to split the terminal you need tmux or an external multiplexer. It works, but adding a software layer between your emulator and your panels is unnecessary complexity when other emulators include it out of the box.
Kitty is powerful. It has splits, tabs, its own image protocol, and an extension system with kittens. The problem is configuration. The kitty.conf file has hundreds of options with default values you need to know to avoid stepping on. It is not hard, but it is tedious to get started.
WezTerm is configured in Lua. If you need conditional logic in your configuration (change font based on hostname, enable options based on the OS), Lua is an advantage. If you do not need any of that, learning a programming language to configure a terminal is disproportionate.
Ghostty is configured with a plain text file. One option per line, no nesting, no braces, no mandatory quotes. It is written by Mitchell Hashimoto, co-founder of HashiCorp (Vagrant, Terraform, Vault). It is written in Zig, uses GPU rendering, has native splits and tabs, Quake-style quick terminal, and the entire configuration file fits on one screen. Simplicity as a competitive advantage.
Typography: JetBrains Mono with Nerd Fonts
font-family = JetBrainsMonoNerdFont
font-size = 14
font-thicken = true
adjust-cell-height = 2
JetBrains Mono is a monospaced font designed specifically for programming. It has ligatures that turn != into an inequality symbol, => into an arrow, <= into less-than-or-equal. They do not change the code, they just improve readability. The Nerd Font version adds hundreds of icons that tools like eza (modern ls replacement), Starship (prompt) and other terminal programs use to display visual information.
Size 14 is a balance between readability and information density. On a 1080p monitor at normal desk distance, 14 points is readable without wasting space.
font-thicken = true slightly thickens the font strokes. On low pixel density monitors, which on Linux with 1080p screens are the norm, thin fonts can look blurry. This setting compensates without looking bold.
adjust-cell-height = 2 adds 2 pixels of vertical space between lines. When working with Claude Code you read a lot of text at once: explanations, code blocks, diffs. That extra space reduces eye fatigue during long sessions without breaking the terminal grid alignment.
Dual theme: Catppuccin that follows the system
theme = light:Catppuccin Latte,dark:Catppuccin Mocha
background-opacity = 0.9
background-blur-radius = 20
window-padding-x = 10
window-padding-y = 8
window-save-state = always
window-theme = auto
Catppuccin is not just another theme. It is a color palette with four variants (Latte, Frappe, Macchiato, Mocha) designed to maintain readable contrast in both modes. It has ports for practically everything: terminals, editors, browsers, GTK themes, VS Code extensions. If you use Catppuccin in Ghostty, you can use Catppuccin across your entire environment and everything looks visually coherent.
The light:Catppuccin Latte,dark:Catppuccin Mocha syntax tells Ghostty to detect the operating system theme. In GNOME or KDE, when you switch to dark mode, Ghostty automatically changes to Mocha. When you switch back to light mode, it changes to Latte. Without touching the config file, without restarting. window-theme = auto applies the same behavior to the window decoration (title bar).
The translucent background with background-opacity = 0.9 lets you see 10% of what is behind the terminal. This is not decoration. With Claude Code running operations that take several seconds, sometimes you need to check something in the window underneath (a browser with documentation, an editor with the file open) without Alt+Tabbing. The 20-pixel blur (background-blur-radius = 20) blurs what is behind enough to not distract but enough to distinguish shapes and colors.
The 10-pixel horizontal and 8-pixel vertical padding prevents text from touching the window edges. It seems like a minor detail, but after hours staring at the terminal you notice the difference.
window-save-state = always is critical. When you close Ghostty and reopen it, it restores all tabs, all splits and their positions. If you have a layout with Claude Code on the left and a shell on the right, the next day you open Ghostty and it is exactly as you left it. No rebuilding the layout every morning.
Cursor and mouse: details that matter
cursor-style = bar
cursor-style-blink = true
cursor-opacity = 0.8
mouse-hide-while-typing = true
copy-on-select = clipboard
The bar cursor is thinner than the classic block. In a terminal where you read more than you write, a large block covering the current character is an unnecessary distraction. The bar indicates position without hiding text.
cursor-opacity = 0.8 makes it slightly translucent. It is not invisible, but it is not a solid block blinking at 100% opacity competing for your attention with the code you are trying to read.
mouse-hide-while-typing hides the mouse cursor as soon as you press a key. When you are in the middle of a conversation with Claude Code, the mouse pointer sitting still in the middle of the screen is visual noise. It reactivates as soon as you move the mouse.
copy-on-select = clipboard is the most productive change on this list. You select text with the mouse and it is already copied to the clipboard. No Ctrl+Shift+C in between. Claude Code shows file paths, function names, suggested commands. You select, switch to the other panel, paste. Two actions instead of three, multiplied by dozens of times per day.
Quick terminal: Quake mode for Claude Code
quick-terminal-position = top
quick-terminal-screen = mouse
quick-terminal-autohide = true
quick-terminal-animation-duration = 0.15
The name comes from the game Quake (1996), where the game console would slide down from the top of the screen when you pressed the tilde key. The idea is the same: a terminal that appears and disappears with a global shortcut without permanently occupying space on your desktop.
quick-terminal-position = top deploys it from the top edge. Ghostty supports bottom, left, right and center, but the top position is the classic one and the one that least interferes with screen content.
quick-terminal-screen = mouse positions it on the monitor where the mouse is. Important if you work with two screens: the quick terminal appears where you are looking, not on a fixed monitor.
quick-terminal-autohide = true hides it automatically when you click outside of it. You do not have to close it manually or press the shortcut again.
quick-terminal-animation-duration = 0.15 is 150 milliseconds of animation. Enough for the movement to feel smooth, not so slow that you feel lag.
The global shortcut is configured separately:
keybind = global:ctrl+grave_accent=toggle_quick_terminal
ctrl+grave_accent is Ctrl plus the key to the left of 1 (the grave accent, `). The global: prefix means it works from any application, not just when Ghostty has focus.
The use case with Claude Code is straightforward. You are in VS Code reviewing a file Claude has modified. You need to ask it something without losing sight of the code. Ctrl+`, the terminal drops from above, you type the question, Claude responds, you click on VS Code and the terminal disappears. No Alt+Tab, no switching virtual desktops, no losing visual context.
On Linux, before Ghostty, the only way to get this was with specialized terminals like Guake or Yakuake. Ghostty integrates it as just another emulator feature, without installing anything extra.
Keyboard shortcuts: ctrl+shift to avoid fighting GNOME
On macOS, application shortcuts use the Cmd key. Dani Avila’s original configuration maps everything to Cmd because on macOS that key does not collide with the desktop. On Linux the equivalent would be Super (the Windows key), but GNOME captures Super combinations at the compositor level: super+d shows the desktop, super+shift+arrows moves windows between monitors, super+alt+arrows switches workspaces. Ghostty never receives those shortcuts.
The solution is to use ctrl+shift as the base modifier. It does not collide with GNOME or with shell shortcuts (Ctrl+C, Ctrl+D, Ctrl+Z), and it is the pattern most Linux terminal emulators use.
Tabs:
keybind = ctrl+shift+t=new_tab
keybind = ctrl+shift+left=previous_tab
keybind = ctrl+shift+right=next_tab
keybind = ctrl+shift+w=close_surface
ctrl+shift+t opens a new tab. ctrl+shift+w closes the active tab or panel. ctrl+shift+left/right navigates between tabs.
Panels (splits):
keybind = ctrl+shift+d=new_split:right
keybind = ctrl+shift+enter=new_split:down
keybind = ctrl+shift+h=goto_split:left
keybind = ctrl+shift+l=goto_split:right
keybind = ctrl+shift+k=goto_split:top
keybind = ctrl+shift+j=goto_split:bottom
ctrl+shift+d splits the current panel to the right. ctrl+shift+enter splits it downward. To move between panels, h/j/k/l with ctrl+shift: the same logic as Vim. h left, l right, k up, j down. If you use Vim or Neovim, you already have them memorized.
Panel management:
keybind = ctrl+shift+e=equalize_splits
keybind = ctrl+shift+f=toggle_split_zoom
ctrl+shift+e equalizes the size of all panels. Useful when one panel has grown too large because you needed temporary extra space. ctrl+shift+f zooms into the active panel: expands it to full screen. Press again and it returns to its original size.
Font size:
keybind = ctrl+plus=increase_font_size:1
keybind = ctrl+minus=decrease_font_size:1
keybind = ctrl+zero=reset_font_size
Same shortcuts as in a browser. ctrl+0 restores the default size.
Utilities:
keybind = ctrl+shift+comma=reload_config
Reload the configuration without restarting Ghostty. You change something in the file, press ctrl+shift+, and the change applies immediately. Useful when you are adjusting colors, sizes or shortcuts.
Dani Avila used the SAND system where each letter represents an action: S for Split, A for Across (tabs), N for Navigate (panels), D for Destroy (close). It is an elegant mnemonic designed for macOS with Cmd. My approach uses ctrl+shift as the base and h/j/k/l Vim-style for panel navigation, because on Linux with GNOME it is the combination that works without conflicts. They are different philosophies, neither is better than the other.
Security and performance
clipboard-paste-protection = true
clipboard-paste-bracketed-safe = true
shell-integration = detect
scrollback-limit = 25000000
clipboard-paste-protection is the option you appreciate most the day it saves you. When you paste text that contains line breaks, pipes, sudo or anything potentially dangerous, Ghostty shows a warning before sending it to the terminal. With Claude Code you copy and paste constantly: suggested commands, paths, code fragments. If by mistake you have something dangerous in the clipboard and paste without looking, this protection stops you.
clipboard-paste-bracketed-safe adds a second layer. It uses “bracketed paste mode” to send markers to the shell indicating that the text was pasted, not typed. Shells like bash and zsh recognize these markers and do not automatically execute the pasted text. You have to press Enter explicitly.
shell-integration = detect allows Ghostty to detect your shell (bash, zsh, fish) and activate specific integrations: command markers, current directory tracking, and completion notifications.
scrollback-limit = 25000000 sets 25 million lines of history. Claude Code generates extensive output: complete diffs, codebase search results, build logs. With a scrollback limited to a few thousand lines, as most terminals default to, you lose context you will need later. 25 million lines in memory is negligible on a modern system. Better to have too much than to fall short.
The full flow: Ghostty + Claude Code in action
You open Ghostty. Thanks to window-save-state = always, the layout you left yesterday is restored: Claude Code on the left, shell on the right. You rebuild nothing.
You ask Claude Code to review a file. The output spans several screens, but with 25 million lines of scrollback you can scroll through it entirely without losing anything. Claude suggests a change and shows the file path. You select the path with the mouse and, thanks to copy-on-select, it is already in the clipboard. You paste it in the right panel to open the file.
You need to check a function’s documentation without breaking the layout. Ctrl+` and the quick terminal drops from above. You make the query, get the answer, click outside and it disappears. Your two-panel layout remains intact.
Claude Code suggests running a command with rm to clean temporary files. You copy the command from its response. When you paste it, the clipboard protection shows you the content before sending it to the terminal. You verify it is what you expect and confirm. No surprises.
Night falls. You switch the system theme to dark mode from GNOME settings. Ghostty automatically changes from Catppuccin Latte to Catppuccin Mocha. Colors adapt, background opacity stays the same, blur keeps working. Without touching the configuration file.
Every option in this configuration file exists for a concrete reason in this workflow. It is not decoration. It is infrastructure.