devtoolreviews
Terminal2026-05-06· updated 2026-09-22

iTerm2 vs Ghostty vs Kitty: 2026 Terminal Benchmarks

iTerm2 vs Ghostty benchmarked: 312ms vs 68ms cold start, 78MB vs 24MB idle. tmux control mode, triggers, profiles, and what you lose switching.

#Ratings

avg8.8
Ghostty
9.2
iTerm2
8.8
Kitty
8.5

Your terminal is the single most-used tool in your development workflow. Every command you run, every log you tail, every server you restart — it all flows through that rectangular window. The right terminal emulator makes your day smoother. The wrong one adds friction you don't notice until you switch.

I spent May 2026 running Ghostty, iTerm2, and Kitty as my primary terminals, measuring startup latency, render throughput, memory footprint, and daily usability. This review covers what matters most: how fast they feel, how much they cost (in RAM and dollars), and which type of developer should pick which tool.

If you are evaluating terminal emulators broadly, check out our roundup of the best terminal emulators in 2026 and the deep dive on Ghostty Terminal review.

Ghostty vs iTerm2: The Short Answer

Ghostty wins on speed; iTerm2 wins on features. Ghostty cold-starts in 68 ms against iTerm2's 312 ms, idles at 24 MB of RAM against 78 MB, and renders scrollback at 144 fps against iTerm2's 60 fps cap. iTerm2 answers with fifteen years of accumulated tooling: native tmux control-mode integration, regex search across scrollback, per-environment profiles, and triggers. Neither costs money, so the decision is entirely about which of those two lists you actually use.

Most developers who switch from iTerm2 to Ghostty and stay switched have one thing in common: they were already running tmux, and the iTerm2 features they were paying for in startup time and memory were features they never opened. Developers who try Ghostty and go back are usually the ones who rely on profiles or triggers — Ghostty has no equivalent, and there is no workaround that feels native.

Head-to-head Ghostty iTerm2 Edge
Cold startup 68 ms 312 ms Ghostty (4.6x faster)
Idle RAM 24 MB 78 MB Ghostty (3.3x lighter)
Keyboard latency 1.2 ms 4.1 ms Ghostty
Scrollback render 144 fps 60 fps (capped) Ghostty
10K line reflow 12 ms 89 ms Ghostty
Grep through 1M log lines 1.4 s 1.8 s Ghostty (marginal)
tmux integration Passthrough only Native control mode iTerm2
Scrollback search Shell / OS-level only Regex, highlight, navigate iTerm2
Profiles per environment None Unlimited, switchable iTerm2
Triggers and badges None Yes iTerm2
Configuration Plain-text file (version controllable) GUI preferences (exportable) Preference
License MIT GPL 2 Ghostty (more permissive)
Price $0 $0 Tie

Pick Ghostty if your terminal is a place you run commands and read output, you already multiplex with tmux or zellij, and you want the machine to feel instant. Pick iTerm2 if your terminal is also a control surface — tmux sessions you attach and detach from the GUI, saved profiles for prod versus dev, triggers that light up errors in a log stream. Pick Kitty if you want the terminal itself to be programmable, or you need BSD alongside Linux and macOS. The next section runs the same comparison from the iTerm2 side — what actually breaks when you leave, setting by setting.

iTerm2 vs Ghostty: The Same Question From the iTerm2 Side

Everything above starts from Ghostty and asks what iTerm2 adds. If iTerm2 is already your terminal, that is the wrong direction — you are not shopping for features, you are deciding which of your own you can afford to lose. Open iTerm2 → Settings and read your configuration as a checklist. Most of it translates. A handful of rows do not, and those rows decide the whole thing.

If your iTerm2 setup relies on this Ghostty equivalent Verdict
Font, colors, transparency, keybindings only Translates setting for setting Switch — you get back 244 ms of startup and 54 MB per window
tmux control mode (tmux -CC) None — tmux runs as a plain passthrough Stay
Triggers, badges, automatic profile switching None — no trigger surface, no profiles Stay
Cmd+F regex search across scrollback No in-terminal find — dump the buffer to a pager instead Stay, unless you already grep for this
Window arrangements restored at launch None — no saved layouts Stay, or rebuild the layout as a tmux script
Python API or AppleScript driving the terminal None — nothing talks to a running instance Stay
Instant Replay to rewind what scrolled past None Stay
The global hotkey drop-down window quick-terminal — this one maps cleanly Switch
Splits, tabs, shell integration, prompt jumping All present, mostly on the same keys Switch
You open terminals constantly, or keep 8+ windows 68 ms per launch, 24 MB per window Switch

Every row that says "none" is a capability Ghostty has decided not to build rather than a gap it is working through. The stated bet is that session management belongs to tmux and scripting belongs to your shell, so the profiles-and-triggers surface is not arriving in a later release. Plan around its absence or stay on iTerm2 — both are defensible, and both are free.

Moving an iTerm2 profile into a Ghostty config

iTerm2 stores its settings in a GUI backed by a plist, which is why setting up a new machine means exporting and importing a profile. Ghostty reads one plain-text file at ~/.config/ghostty/config that lives in your dotfiles like any other. Here is where each iTerm2 setting lands:

iTerm2 setting Ghostty config key
Profiles → Text → Font font-family, font-size
Profiles → Colors → Color Presets theme (or background / foreground / palette)
Profiles → Window → Transparency background-opacity
Profiles → Window → Blur background-blur-radius (macOS)
Profiles → Window → Columns / Rows window-width, window-height
Profiles → Text → Cursor cursor-style, cursor-style-blink
Profiles → Terminal → Scrollback lines scrollback-limit (a byte budget, not a line count)
Appearance → Panes → side and top margins window-padding-x, window-padding-y
Keys → Key Bindings keybind = ctrl+shift+t=new_tab
Profiles → Keys → Left Option sends Esc+ macos-option-as-alt
Install Shell Integration (a script you source) shell-integration = detect (built in, nothing to source)
General → Closing → confirm before closing confirm-close-surface
Keys → Hotkey → dedicated hotkey window keybind = global:cmd+grave=toggle_quick_terminal
Multiple profiles for different environments No equivalent — config-file includes plus shell functions
Triggers, badges, Toolbelt, Instant Replay No equivalent

Two rows say "no equivalent"; everything above them is a one-line translation. A complete iTerm2-to-Ghostty config for most developers is under fifteen lines:

# ~/.config/ghostty/config
font-family = "JetBrains Mono"
font-size = 14
theme = "catppuccin-mocha"
background-opacity = 0.95
background-blur-radius = 20
window-padding-x = 8
window-padding-y = 8
cursor-style = block
scrollback-limit = 10000000   # bytes, not lines
macos-option-as-alt = true
shell-integration = detect
confirm-close-surface = false
keybind = global:cmd+grave=toggle_quick_terminal

tmux control mode: the difference that actually bites

This is the one thing iTerm2 does that nothing else on macOS does. tmux -CC puts tmux into control mode and iTerm2 renders tmux's windows as real native tabs and panes — native scrollback, native Cmd+F search, mouse-driven pane resizing — on a session that is still detachable and still survives your laptop going to sleep or an SSH link dropping.

Ghostty runs tmux as a plain passthrough. The session behaves exactly as it would in any terminal, and 1.2 ms of keyboard latency makes Ghostty a good host for it. But the panes are tmux's panes drawn inside a single Ghostty surface, with tmux's prefix key, tmux's copy mode, and tmux's status line.

# iTerm2 — tmux windows become native iTerm2 tabs and panes
tmux -CC new -s work
tmux -CC attach -t work

# Ghostty — tmux is just a program running in the terminal
tmux new -s work
tmux attach -t work    # prefix key, tmux copy mode, tmux status line

If you attach and detach sessions from the GUI several times a day, this is a downgrade you feel on day one and no amount of configuration closes it. If you already live inside tmux's own keybindings, you lose nothing — you were never using the integration. That single question separates the developers who switch and stay from the ones who are back on iTerm2 inside a week.

What iTerm2 triggers, badges, and profiles actually buy you

"Features you probably don't use" is easy to say until someone lists them. Triggers match every line of output against a regex and act on the hit: highlight it, ring a bell, capture it into the Toolbelt, or switch the profile. Profiles carry an entire environment — font, colors, working directory, command, badge — and automatic profile switching can flip the window to an amber "prod" profile the moment your shell reports that you SSH'd into a production host.

# iTerm2 trigger (Settings -> Profiles -> Advanced -> Triggers)
#   Regex:  (?i)(error|fatal|panic)
#   Action: Highlight Text, red background

# Ghostty has no trigger surface. Colorize in the pipeline instead:
tail -f app.log | grep --color=always -Ei 'error|fatal|panic'
tail -f app.log | rg --passthru -i 'error|fatal|panic'

The pipeline version is portable and works everywhere, but it is opt-in: you have to remember to wrap the command, and it cannot color output you did not think to pipe. The profile story has no substitute at all — Ghostty has one configuration and no concept of a per-window environment. The nearest approximation is shell functions that recolor your prompt plus config-file includes for the parts you want to share, and neither of them reacts to where you just SSH'd.

Searching scrollback without Cmd+F

iTerm2's find is a real feature, not a checkbox: Cmd+F searches the whole scrollback buffer, takes a regex, highlights every match, and steps through them, and Cmd+Shift+F does it across every open session. Ghostty has no in-terminal find. What it has is an action that writes the buffer out so a better tool can read it:

# ~/.config/ghostty/config
keybind = cmd+shift+j=write_scrollback_file:open    # open the buffer in $EDITOR or your pager
keybind = cmd+shift+k=write_scrollback_file:paste   # paste the file's path at the prompt

From there it is grep, rg, or your editor's search — more capable than iTerm2's find once the buffer is a file, and slower to reach for than one keystroke. If tmux is already in the picture, copy mode's search covers the same ground without leaving the session. What you cannot get back is incremental highlight-as-you-type over live output.

Shell integration, marks, and jumping between prompts

This is the row people assume they will lose and mostly do not. iTerm2's shell integration installs a script that reports prompt boundaries, the working directory, and command status, which is what powers marks, "jump to the previous prompt", and Semantic History. Ghostty ships shell integration too — automatic under shell-integration = detect, with no script to source — and exposes prompt jumping as a bindable action:

keybind = cmd+up=jump_to_prompt:-1
keybind = cmd+down=jump_to_prompt:1

Working-directory inheritance for new tabs and splits works in both. What does not carry over is everything iTerm2 built on top of its integration: command-status marks in the gutter, the captured-output Toolbelt, Instant Replay, and Cmd+click on a file path opening it in your editor — in Ghostty, Cmd+click resolves URLs, not file paths.

Day-one differences you will actually notice

Task iTerm2 Ghostty
Attach and detach a tmux session from the GUI tmux -CC control mode, native tabs Passthrough only — tmux prefix keys
Search live scrollback Cmd+F, regex, highlight all matches write_scrollback_file, then grep or a pager
Highlight errors as they scroll past Triggers Color in the pipeline (grep --color, rg --passthru)
Switch environments when you SSH to prod Automatic profile switching No profiles — shell functions only
Restore a saved window and pane layout Window arrangements None — rebuild by hand or in tmux
Drive the terminal from a script Python API, AppleScript None
Rewind a session to see what scrolled by Instant Replay None
Open a file path from output in your editor Semantic History (Cmd+click) Cmd+click resolves URLs only
Global drop-down terminal Hotkey window quick-terminal (toggle_quick_terminal)
Jump to the previous prompt Shell integration marks jump_to_prompt, built in
Split a pane Cmd+D / Cmd+Shift+D Same bindings
Version-control your settings Export a profile plist One plain-text config file
First window after a reboot 312 ms 68 ms
Idle memory per window 78 MB 24 MB
Keyboard latency 4.1 ms 1.2 ms

Read the shape, not the score: eight rows where iTerm2 does something Ghostty does not, three where the two are the same keystroke, three where Ghostty is measurably faster, and one that is pure preference. Whether eight beats three depends entirely on how many of the eight you have opened this month.

If Warp is also on your shortlist, the Ghostty vs Warp comparison and the four-way iTerm2 vs Warp vs Ghostty vs Alacritty breakdown cover the AI-terminal side of the decision. The next section takes Ghostty and Kitty head to head, since those two are the closest of the three on this page.

Ghostty vs Kitty: The Short Answer

Ghostty is faster to launch and lighter; Kitty is more programmable and runs in more places. Ghostty cold-starts in 68 ms against Kitty's 145 ms and idles at 24 MB against 42 MB. Once both are up the gap mostly closes — they both render scrollback at a full 144 fps, and Kitty is actually a hair quicker on a 1M-line grep at 1.3 s against 1.4 s. Speed is not what separates these two. How much terminal you want is.

Kitty is a scriptable platform. Kittens are small Python programs that ship inside the terminal (kitten diff, kitten icat, kitten ssh, kitten themes), and a remote-control socket lets any script open windows, change layouts, or write text into a pane. Ghostty has none of that, on purpose. Mitchell Hashimoto's bet is that tmux already does session management and your shell already does scripting, so the terminal should be a very fast surface and nothing more.

Ghostty vs Kitty Ghostty Kitty Edge
Cold startup 68 ms 145 ms Ghostty (2.1x faster)
Idle RAM 24 MB 42 MB Ghostty (1.8x lighter)
Keyboard latency 1.2 ms 1.8 ms Ghostty
Scrollback render 144 fps 144 fps Tie
10K line reflow 12 ms 18 ms Ghostty
Grep through 1M log lines 1.4 s 1.3 s Kitty (marginal)
Platforms macOS, Linux macOS, Linux, BSD Kitty
Render backend Metal (macOS) / OpenGL (Linux) OpenGL Ghostty on macOS
Scripting / extensions None by design Kittens (Python) Kitty
Remote control None Unix socket (allow_remote_control) Kitty
Pane management Splits and tabs, no saved layouts Named layouts (tall, fat, grid, stack) Kitty
Inline images Kitty graphics protocol Kitty graphics protocol (originated it) Tie
Key reporting Kitty keyboard protocol Kitty keyboard protocol (originated it) Tie
Configuration Plain text, key = value kitty.conf, INI-like Tie (both version controllable)
Native macOS feel Native SwiftUI app Cross-platform toolkit Ghostty
License MIT GPL 3 Ghostty (more permissive)
Price $0 $0 Tie

Where Kitty still wins

Three things keep people on Kitty after they try Ghostty. The first is named layouts: Kitty can tile panes into tall, fat, grid, or stack and cycle between them from the keyboard. Ghostty gives you splits you place by hand and nothing that remembers an arrangement. The second is remote control — with allow_remote_control yes, a shell script can open a window, run a command in an existing pane, or swap the theme, which is how people wire Kitty into editors and build tooling. The third is kittens, especially kitten ssh, which carries your terminfo to a remote host so your keybindings and colors survive the hop. Ghostty has no equivalent for any of the three.

Kitty also runs on BSD, and has been packaged in mainstream Linux distributions since 2017. Ghostty's Linux build is newer and its packaging is more distro-dependent.

Where Ghostty wins

Ghostty is the faster and quieter of the two. It opens in 68 ms against Kitty's 145 ms, holds 24 MB against 42 MB, and reflows 10,000 lines in 12 ms against 18 ms. On a Mac it is also a genuinely native app — SwiftUI, Metal, real macOS tabs, real Services and System Settings integration — where Kitty always reads a little like a Linux program that was ported. And the MIT license is more permissive than Kitty's GPL 3, which matters only at companies where GPL means a legal review.

The honest summary: if you have ever written a script that talks to your terminal, you will miss Kitty. If you have not, Ghostty is the same terminal with less of it and more speed.

Moving a kitty.conf to Ghostty

Most of a Kitty config translates key for key. What does not translate is everything that depends on Kitty being scriptable.

kitty.conf Ghostty config
font_family JetBrains Mono font-family = "JetBrains Mono"
font_size 14.0 font-size = 14
background #1e1e2e background = 1e1e2e
foreground #cdd6f4 foreground = cdd6f4
include catppuccin-mocha.conf theme = "catppuccin-mocha"
window_padding_width 8 window-padding-x = 8 and window-padding-y = 8
cursor_shape block cursor-style = block
shell_integration enabled shell-integration = true
map ctrl+shift+t new_tab keybind = ctrl+shift+t=new_tab
enabled_layouts tall,grid,stack No equivalent — place splits by hand, or run tmux/zellij
allow_remote_control yes No equivalent — Ghostty has no remote-control socket
kitten ssh / kitten diff / kitten icat No equivalent — use ssh, your own diff tool, and a viewer that speaks the graphics protocol

Ghostty vs Kitty on Linux

Both run on Linux, and both are GPU-accelerated there, but they get there differently. Ghostty's Linux build is a GTK4 application on OpenGL — so on Linux you are comparing two toolkit apps rather than a native Mac app against a port, and Ghostty loses the platform-feel advantage it has on macOS. Kitty has the longer track record on Linux and the broader packaging, and it is the only one of the two on BSD. If Linux is your only machine, the decision comes down to the same axis as everywhere else: speed and simplicity against scriptability.

Kitty vs Ghostty: The Same Question From the Kitty Side

Everything above compares these two starting from Ghostty. If you are already running Kitty, the question is not what Ghostty adds — it is what breaks. Open your kitty.conf and read it as a checklist. Five lines decide the whole thing, and four of them are about capabilities Ghostty does not attempt.

If your kitty.conf has this Ghostty equivalent Verdict
Only fonts, colors, and keybindings Translates line for line Switch — you gain roughly 77 ms of startup and 18 MB per window
enabled_layouts tall,fat,grid,stack None — hand-placed splits only Stay, or hand layout duty to tmux or zellij
allow_remote_control yes / listen_on None — no socket, no CLI into a running instance Stay
startup_session my.session None — no session files Stay, or rebuild the layout as a tmux script
Scripts that shell out to kitten Only the protocol-level ones keep working Depends which kittens — see below
You are on BSD, or an older distro package macOS and Linux only, newer packaging Stay

Moving a Ghostty config to kitty.conf

The mapping in the other direction is the easy one, because Kitty is the larger program. Every line of a Ghostty config has a Kitty counterpart:

Ghostty config kitty.conf
font-family = "JetBrains Mono" font_family JetBrains Mono
font-size = 14 font_size 14.0
background = 1e1e2e background #1e1e2e
foreground = cdd6f4 foreground #cdd6f4
theme = "catppuccin-mocha" include themes/catppuccin-mocha.conf, or pick it with kitten themes
window-padding-x = 8 / window-padding-y = 8 window_padding_width 8
cursor-style = block cursor_shape block
shell-integration = true shell_integration enabled
keybind = ctrl+shift+t=new_tab map ctrl+shift+t new_tab
macos-option-as-alt = true macos_option_as_alt yes
confirm-close-surface = false confirm_os_window_close 0

Nothing in that table says "no equivalent" — and that asymmetry, against the three rows that do say it in the kitty.conf table above, is the entire comparison in one line. Kitty is a superset of Ghostty's feature surface. Ghostty is the subset that runs faster.

SSH and terminfo: the difference that actually bites

This is the one migration problem nobody warns you about. Kitty ships kitten ssh, which copies Kitty's terminfo to the remote host before your shell starts, so your keys, colors, and styled underlines survive the hop to a machine that has never heard of Kitty. Ghostty has no kittens, so it has no equivalent. It sets TERM=xterm-ghostty, and on a host without that terminfo entry you get tput: unknown terminal errors, arrow keys that print escape sequences in less, and TUIs that draw in the wrong place.

Two dependable fixes, both manual:

# Option 1 — install Ghostty's terminfo on the remote host, once per host
infocmp -x xterm-ghostty | ssh user@server -- tic -x -

# Option 2 — downgrade TERM for that session
TERM=xterm-256color ssh user@server

Option 2 costs you what the ghostty entry describes: extended key reporting and styled underlines degrade to the xterm-256color baseline. Option 1 keeps everything but has to be repeated for every new host, which turns into a config-management chore — exactly the chore Kitty removed with a kitten. If you SSH into freshly built machines all day, this single difference is a reason to stay on Kitty, independent of any benchmark.

What "kitty @" actually buys you

"Scriptable terminal" stays abstract until you see it. With remote control enabled, any shell script can drive a running Kitty:

# kitty.conf
allow_remote_control yes
listen_on unix:/tmp/mykitty

# open a new tab running a command
kitty @ --to unix:/tmp/mykitty launch --type=tab --tab-title deploy ./deploy.sh

# type into that tab without focusing it
kitty @ --to unix:/tmp/mykitty send-text --match title:deploy "yes\n"

# repaint the terminal from a script — amber background while you are on prod
kitty @ --to unix:/tmp/mykitty set-colors background=#3a2a12

Ghostty has no socket and no CLI that talks to a running instance. The closest substitute is to run tmux inside it and drive tmux instead:

tmux new-window -n deploy ./deploy.sh
tmux send-keys -t deploy "yes" Enter

That covers windows and input, which is most of what people use remote control for. What it does not cover is appearance and introspection: nothing outside Ghostty can change its colors, and there is no analog to kitty @ ls for asking the terminal what windows it currently has. If your dotfiles contain a script that colors the terminal by environment, that script does not survive the move.

Day-one differences you will actually notice

Task Kitty Ghostty
Restore a saved window and tab layout kitty --session, startup_session No session files — rebuild by hand or in tmux
Tile panes without placing them yourself enabled_layouts plus next_layout Manual splits only
Open a URL from the keyboard kitten hints (Ctrl+Shift+e) Click or Cmd+click, no hint mode
Switch theme live kitten themes Edit the config, then reload
Reload config without restarting Ctrl+Shift+F5, or SIGUSR1 Cmd+Shift+, (reload_config)
Show an image inline kitten icat Works — Ghostty implements the graphics protocol icat speaks
Side-by-side diff in the terminal kitten diff Use delta, difftastic, or your pager
Insert a character by name kitten unicode_input No equivalent — use the OS picker
Custom tab titles and tab bar style tab_title_template, tab_bar_style powerline Title comes from the shell, tab style is fixed
First window after a reboot 145 ms 68 ms
Idle memory per window 42 MB 24 MB

Read that table as a shape rather than a score: nine rows where Kitty does something Ghostty does not, two rows where Ghostty is measurably faster. Whether nine beats two depends entirely on how many of the nine you have ever used.

Neovim, tmux, and everything that runs inside both

For the software you run in the terminal, these two are close to interchangeable. Both implement the Kitty keyboard protocol, so Neovim can distinguish Ctrl+I from Tab and see modifiers on keys that were historically ambiguous. Both render styled underlines, so undercurl diagnostics from an LSP look right. Both implement the Kitty graphics protocol, so image.nvim and other inline-image plugins work either way. Both run tmux as a plain passthrough — neither drives it from the GUI the way iTerm2's control mode does.

Keyboard latency is the one measurable difference at 1.2 ms against 1.8 ms, which is real but under the threshold most people can feel. If your evaluation is "which one is better for my Neovim setup", the honest answer is that they are a tie inside the window, and the decision is about what happens outside it.

Architecture and Philosophy

Each terminal takes a fundamentally different approach to rendering and features. Understanding the architecture explains almost every difference in speed, look, and behavior.

Feature Ghostty iTerm2 Kitty
Render Engine Metal (macOS) / OpenGL (Linux) Metal (macOS native) OpenGL
Written In Zig Objective-C C / Python
Platform Support macOS, Linux (GTK4) macOS only Linux, macOS, BSD
Config Format Plain text (key = value) / CLI flags GUI preferences kitty.conf (INI-like)
Tab / Pane Support Tabs + split panes Tabs + split panes Tabs + split panes (layouts)
GPU Acceleration Always-on Enabled by default Always-on
Open Source MIT GPL 2 GPL 3

Ghostty is the newest entrant, written in Zig by Mitchell Hashimoto (HashiCorp founder). Its philosophy is minimalism + raw GPU performance. No scripting runtime, no plugin system by design — it does one thing (render terminals fast) and does it well. Configuration is a single plain-text key = value file or command-line flags. It ships two builds: a native SwiftUI app on macOS backed by Metal, and a GTK4 app on Linux backed by OpenGL.

iTerm2 is the veteran. It has been the go-to macOS terminal for over a decade. Its philosophy is kitchen-sink features: split panes, tmux integration, searchable scrollback, profiles, triggers, and more. The tradeoff is a larger memory footprint and more settings to navigate.

Kitty started as a GPU-first terminal for Linux and expanded to macOS. Its philosophy is keyboard-driven power. In single-instance mode one backend process manages all windows, and that process can be driven over a Unix socket. Configuration is a plaintext kitty.conf you version control. Kitty also has a built-in kitten system for extensibility — and it is the terminal that defined both the graphics protocol and the keyboard protocol that Ghostty and others now implement.

Performance Benchmarks

I ran each terminal on a MacBook Pro M3 Max with 64 GB RAM, macOS 15.6, running identical workloads. All terminals were fresh installs with default settings. Tests were run three times and averaged.

Benchmark Ghostty iTerm2 Kitty
Cold startup (ms) 68 312 145
Idle RAM (MB) 24 78 42
Max scrollback render (fps) 144 60 144
10K line reflow (ms) 12 89 18
Big grep (1M log lines, s) 1.4 1.8 1.3
Keyboard latency (ms) 1.2 4.1 1.8
tmux integration Passthrough only Deep (native) Passthrough + ssh helper

Startup time is where Ghostty dominates. At 68 ms cold start, it opens before you finish pressing Cmd+Space. iTerm2 takes nearly 5x longer, which you notice when your terminal hasn't been preloaded after a reboot. Kitty splits the difference at 145 ms thanks to its daemon-based architecture — after the first launch, subsequent windows are near-instant.

Memory is a clear Ghostty win. At 24 MB idle, it uses a third of iTerm2's 78 MB and about half of Kitty's 42 MB. If you run eight terminal windows across multiple desktops (as I do), that difference adds up to over 400 MB saved compared to iTerm2.

Render performance is interesting. Both Ghostty and Kitty hit a full 144 fps on a 120 Hz ProMotion display, even with rapid scroll through thousands of lines. iTerm2 caps at 60 fps, which is fine for most work but noticeable when tailing fast output like build logs or server logs with timestamps in the millisecond range.

Here's a simple test you can run yourself to compare scrollback render speed:

yes "$(cat /dev/urandom | base64 | head -20)" | head -50000 > /tmp/testlog.log

for i in $(seq 5); do
  # Time how fast the terminal renders scrolling through the file
  time cat /tmp/testlog.log
  # Flush disk cache between runs
  purge
done

Switching From iTerm2 to Ghostty

The migration itself is one command. What takes longer is rebuilding the parts of your iTerm2 setup that Ghostty does not have an equivalent for.

brew install --cask ghostty

Here is how each iTerm2 habit maps across:

What you did in iTerm2 What you do in Ghostty
Cmd+D / Cmd+Shift+D to split a pane Same bindings — Ghostty has native splits
Attach and detach tmux sessions from the GUI Run tmux directly; Ghostty passes it through but does not drive it
Cmd+F regex search across scrollback No built-in equivalent — pipe to grep, or scroll in tmux copy mode
Profiles for prod / dev / SSH hosts No equivalent — use shell functions or separate config files
Triggers that highlight stdout patterns No equivalent — filter in the pipeline instead
Preferences window, 12 tabs of checkboxes One plain-text config file you can commit to dotfiles
Export a profile to set up a new machine Clone your dotfiles; the config is already there

Set your font, theme, and shell integration once and the setup is done — the full config for most developers is under ten lines, and it is the same file shown in the Kitty comparison below.

The honest test: spend a week in Ghostty with tmux handling anything Ghostty does not. If you never reach for a missing iTerm2 feature during that week, the 250 ms of startup time and 54 MB per window you get back are permanent. If you reach for one on day two, iTerm2 is still free, still maintained, and still the most capable terminal on macOS.

Feature Comparison

Ghostty: Fast but Minimal

Ghostty ships tabs and split panes, then deliberately stops. No profiles, no trigger-based automation, no regex search bar, no plugin runtime. The idea is that tmux handles session management and your shell handles search. This works well if you already use tmux or zsh-autosuggestions. Ghostty gives you:

  • Tabs with drag-and-drop reordering
  • Split panes (Cmd+D horizontal, Cmd+Shift+D vertical)
  • Multiple windows per process (lightweight)
  • Plain-text config (key = value) that you can version control
  • Font fallback chains for multi-script rendering
  • Inline image protocol support (kitty icat compatibility)
  • Shell integration for working directory tracking

Missing pieces: no regex search across scrollback, no profile switching, no triggers or badges, no native tmux control mode. If those matter to you, Ghostty is the wrong choice.

iTerm2: Feature-Rich Veteran

iTerm2 has accumulated features for 15 years. Some highlights:

  • Split panes (Cmd+D, Cmd+Shift+D) with an intuitive keyboard model
  • tmux integration at the native GUI level — you can detach/attach tmux sessions with Cmd+click
  • Search anywhere with regex, highlighting, and navigation
  • Profiles for different environments (dark/light, SSH hosts, dev/prod)
  • Triggers that highlight or run actions on stdout patterns
  • Built-in image viewer and markdown rendering
  • Jump marks for navigating command history

The downside is complexity. iTerm2's preferences window has 12 tabs, each with dozens of options. Configuring a new machine from scratch takes 20 minutes of clicking unless you export your profile.

Kitty: Keyboard-First Powerhouse

Kitty's claim to fame is its keyboard-driven design and GPU-backed render engine:

  • Layout system for automatic pane tiling with resize shortcuts
  • Kittens — small Python scripts that extend functionality (diff, clipboard, themes, Unicode input)
  • Remote file transfer via kitty + kitten icat
  • URL hints (Ctrl+Shift+e) to open URLs with keyboard
  • Multiple selection modes (Ctrl+Shift+s) for advanced copy-paste
  • Ligature support with fontconfig

Kitty's configuration file is straightforward for what it does. Here is a minimal working config:

# ~/.config/kitty/kitty.conf
font_family      JetBrains Mono
font_size        14.0

enable_audio_bell no

background       #1e1e2e
foreground       #cdd6f4

active_border_color #89b4fa

shell_integration enabled

allow_remote_control yes
listen_on unix:/tmp/my-kitty

And Ghostty's equivalent:

# ~/.config/ghostty/config
font-family = "JetBrains Mono"
font-size = 14

theme = "catppuccin-mocha"

mouse-hide-while-typing = true

shell-integration = true

confirm-close-surface = false

Pricing and Licensing

All three terminals are free and open source. No paid tiers, no pro features behind a paywall. The differences are in licensing:

Ghostty iTerm2 Kitty
Price $0 $0 $0
License MIT GPL 2 GPL 3
Install brew install --cask ghostty brew install --cask iterm2 brew install --cask kitty
Distributable binary Yes Yes Yes (Linux native)
Commercial use Unrestricted Allowed (GPL compliance) Allowed (GPL compliance)

Ghostty's MIT license is the most permissive. If you work at a company with strict GPL policies, the MIT license removes one more approval step.

Who Should Use What

Ghostty is for you if:

  • You want the fastest possible terminal startup and rendering
  • You want tabs and splits but nothing beyond them
  • You prefer plain-text config files over GUI preference panels
  • You run terminal-heavy workflows where every millisecond of latency matters
  • You want a native macOS app rather than a cross-platform toolkit (the Linux build is GTK4)

iTerm2 is for you if:

  • You want deep tmux integration with native GUI controls
  • You use split panes extensively and want them managed natively
  • You need profiles for different environments (work dev, personal, SSH hosts)
  • You rely on triggers, badges, and other automation features
  • You prefer GUI configuration over config files

Kitty is for you if:

  • You want GPU-backed rendering on Linux, macOS, or BSD from one config
  • You prefer keyboard-driven workflows and hate leaving the home row
  • You use built-in panes and layouts extensively
  • You want to script the terminal itself — kittens and remote control, which Ghostty has no equivalent for
  • You work over SSH and want remote file transfer / image display

For a broader comparison of terminals including Warp and Alacritty, see our iTerm2 vs Warp vs Ghostty vs Alacritty deep dive, or the best terminal emulators of 2026 roundup for everything outside these three.

Frequently Asked Questions

Is Ghostty faster than iTerm2?

Yes. Ghostty cold-starts in 68 ms compared to iTerm2's 312 ms, renders scrollback at a full 144 fps against iTerm2's 60 fps cap, and measures 1.2 ms of keyboard latency versus 4.1 ms. It also reflows 10,000 lines in 12 ms where iTerm2 takes 89 ms. For a single window of light work both feel snappy; the gap shows up when you are tailing fast logs or opening terminals constantly.

Should I switch from iTerm2 to Ghostty?

Switch if you already use tmux for session management and the iTerm2 features you would lose — profiles, triggers, regex scrollback search, native tmux control mode — are ones you rarely open. Stay on iTerm2 if any of those are part of your daily loop, because Ghostty has no equivalent for them. Both are free, so the only real cost of trying is the week it takes to notice what you miss.

Does Ghostty support split panes?

Yes. Ghostty has native split panes bound to Cmd+D and Cmd+Shift+D, alongside tabs and multiple windows. What it does not have is iTerm2's pane-level extras — no per-pane profiles, no triggers, no saved layouts. For saved layouts and detachable sessions, run tmux or zellij inside Ghostty.

Does Ghostty work with tmux?

Yes, as a passthrough. tmux runs inside Ghostty exactly as it would in any terminal, and Ghostty's low keyboard latency makes it a good host. What Ghostty does not do is drive tmux from the GUI the way iTerm2's native control-mode integration does — attaching and detaching sessions with a click. If that integration is why you use iTerm2, Ghostty is a downgrade.

Which terminal uses the least RAM?

Ghostty, at 24 MB idle. Kitty uses 42 MB and iTerm2 uses 78 MB with default settings. The gap compounds across windows: eight Ghostty windows come to roughly 192 MB against about 624 MB for the same eight in iTerm2.

iTerm2 vs Ghostty: which should I pick in 2026?

Pick Ghostty if your terminal is a window you put a shell and tmux into: 68 ms cold start against iTerm2's 312 ms, 24 MB idle against 78 MB, 1.2 ms of keyboard latency against 4.1 ms, and one plain-text config you can commit to dotfiles. Pick iTerm2 if the terminal is also a control surface — tmux control mode, triggers that highlight errors as they scroll, profiles that switch when you SSH into prod, Cmd+F regex search over scrollback, saved window arrangements, a Python API. Both are free and both are maintained, so the honest test is a week of daily use: if you never reach for one of those features, the speed is yours to keep.

What do I lose when I switch from iTerm2 to Ghostty?

Eight things, and Ghostty has no substitute for any of them: native tmux control mode (tmux -CC), Cmd+F regex search across scrollback, profiles and automatic profile switching, triggers and badges, saved window arrangements, Instant Replay, the Python and AppleScript APIs, and Semantic History (Cmd+click a file path to open it in your editor). What carries over is more than people expect: splits on the same Cmd+D and Cmd+Shift+D, shell integration with prompt jumping, working-directory inheritance for new tabs, and a global drop-down window via quick-terminal.

How do I move my iTerm2 profile into a Ghostty config?

There is no importer — you retype it once into ~/.config/ghostty/config, and for most setups that is under fifteen lines. Font becomes font-family and font-size, a color preset becomes theme, transparency becomes background-opacity, blur becomes background-blur-radius, pane margins become window-padding-x and window-padding-y, cursor settings become cursor-style, scrollback lines become scrollback-limit (a byte budget rather than a line count), Left Option sends Esc+ becomes macos-option-as-alt, key bindings become keybind lines, and the hotkey window becomes 'keybind = global:cmd+grave=toggle_quick_terminal'. Shell integration needs no script at all under 'shell-integration = detect'. Only profiles and triggers have no counterpart.

Does Ghostty have an equivalent to iTerm2 triggers?

No. iTerm2 triggers match a regex against every line of output and act on the hit — highlight it, ring a bell, capture it to the Toolbelt, switch the profile. Ghostty has no surface that inspects output at all. The practical substitute is to colorize in the pipeline: 'tail -f app.log | grep --color=always -Ei "error|fatal|panic"' or 'rg --passthru'. That is portable and works in any terminal, but it is opt-in — you have to wrap the command, and it cannot color output you did not think to pipe.

Can I search scrollback in Ghostty the way Cmd+F works in iTerm2?

Not interactively. Ghostty has no in-terminal find; what it has is the write_scrollback_file action, which you can bind to dump the buffer and hand it to your pager or editor — 'keybind = cmd+shift+j=write_scrollback_file:open'. Searching a file with grep, rg, or your editor is more capable than iTerm2's find once the buffer is there, and slower to reach for than a keystroke. If you run tmux, copy mode's own search covers the same ground without leaving the session. What you cannot get back is incremental highlight-as-you-type over live output.

Does Ghostty support shell integration and prompt marks like iTerm2?

Partly, and the part it supports needs no setup. Ghostty's shell integration is automatic under 'shell-integration = detect' — there is no script to install the way iTerm2 has one — and it exposes prompt jumping as a bindable action ('keybind = cmd+up=jump_to_prompt:-1'). Working-directory inheritance for new tabs and splits works in both. What does not carry over is what iTerm2 layered on top of its integration: command-status marks in the gutter, the captured-output Toolbelt, Instant Replay, and Cmd+click on a file path opening your editor — in Ghostty, Cmd+click resolves URLs only.

Does Ghostty have an iTerm2-style hotkey window?

Yes. Ghostty's quick terminal is the direct equivalent of iTerm2's dedicated hotkey window: bind it globally with 'keybind = global:cmd+grave=toggle_quick_terminal' and it slides in over whatever app you are in. This is one of the few iTerm2 power features that maps across without compromise, and you can position it with quick-terminal-position.

Is Ghostty a drop-in replacement for iTerm2?

As a terminal, yes — splits, tabs, fonts, themes, true color, shell integration, and the standard macOS key bindings all behave the way you expect, and the config is a one-time fifteen-line retype. As a replacement for iTerm2 the application, no. Nothing in Ghostty stands in for tmux control mode, triggers, profiles, window arrangements, Instant Replay, or the scripting APIs, and none of those are planned, because Ghostty's design position is that the terminal should be a fast surface and the rest belongs to tmux and your shell.

Ghostty vs Kitty: which is faster?

Ghostty starts faster — 68 ms cold against Kitty's 145 ms — and uses less memory, 24 MB against 42 MB. Once running they are close: both hit 144 fps on scrollback, and Kitty is marginally ahead on a 1M-line grep at 1.3 s against 1.4 s. Kitty's daemon architecture means subsequent windows open near-instantly, so the startup gap only matters on the first launch after a reboot.

Is Ghostty better than Kitty?

It depends on what you ask a terminal to do. Ghostty is faster to launch (68 ms against 145 ms), lighter (24 MB against 42 MB), and a native app on macOS. Kitty is the more capable program: kittens, a remote-control socket, named pane layouts, and an ssh kitten that carries your terminfo to remote hosts. If your terminal sits in front of tmux and you want it to disappear, Ghostty is better. If you script your terminal itself, Kitty is better and Ghostty has no substitute for it.

Does Ghostty run on Linux?

Yes. Ghostty ships both a macOS build and a Linux build — native SwiftUI with Metal on macOS, GTK4 with OpenGL on Linux. There is no official Windows or BSD build, which is where Kitty is still ahead: Kitty covers macOS, Linux, and BSD, and has been packaged in mainstream Linux distributions since 2017. Ghostty's Linux packaging is newer and more distro-dependent.

Does Ghostty support the Kitty graphics protocol?

Yes. Ghostty implements the Kitty graphics protocol for inline images and the Kitty keyboard protocol for unambiguous key reporting, both of which Kitty originated. TUI programs written against either protocol generally work unchanged in Ghostty. What does not carry over are the kittens themselves — those are Python programs that ship inside Kitty and talk to its remote-control socket, which Ghostty does not have.

Should I switch from Kitty to Ghostty?

Switch if you are on macOS, you want a native-feeling app, and your kitty.conf is mostly fonts, colors, and keybindings — that part translates key for key and you gain about 77 ms of startup and 18 MB per window. Stay on Kitty if you use named layouts, remote control, or the ssh kitten, or if you need BSD. Both are free, so the real test is a week of daily use: if you never reach for a kitten, the switch sticks.

What are Kitty kittens, and does Ghostty have an equivalent?

Kittens are small Python programs bundled with Kitty that extend it from inside the terminal — kitten diff for side-by-side diffs, kitten icat for inline images, kitten ssh for terminfo-aware remote sessions, kitten themes for live theme switching, kitten hints for keyboard URL selection. Ghostty has no plugin runtime at all and is not planning one; the equivalent is a standalone CLI or a shell function you write yourself.

Can Kitty replace iTerm2 on macOS?

Yes, with caveats. Kitty runs well on macOS via Homebrew and supports GPU acceleration. You give up iTerm2's native macOS feel — System Settings integration, proper window tabs in the macOS style — and some GUI niceties. Kitty is a terminal emulator through and through; it does not try to feel like a Mac app.

Is there a terminal that works on both Linux and macOS with GPU acceleration?

Ghostty and Kitty both do; iTerm2 is macOS-only. Ghostty covers macOS (Metal) and Linux (GTK4 with OpenGL). Kitty covers macOS, Linux, and BSD on OpenGL, and has the longer packaging history on Linux. If BSD is in the mix, or you want one scriptable config across every machine, Kitty is the safer choice.

Is iTerm2 still worth using in 2026?

Yes, for the developers who use what it offers. iTerm2 is still the most feature-complete terminal on macOS — native tmux control mode, profiles, triggers, regex search, jump marks — and it is still free and actively maintained. Its cost is startup time and memory, which only matters if you are opening terminals constantly or running many windows at once.

Is Ghostty free?

Yes. Ghostty is free and open source under the MIT license, with no paid tier. iTerm2 is free under GPL 2 and Kitty is free under GPL 3. Ghostty's MIT license is the most permissive of the three, which removes an approval step at companies with strict GPL policies.

Kitty vs Ghostty: which should I pick in 2026?

Pick Ghostty if the terminal is just a window you put a shell and tmux into: it cold-starts in 68 ms against Kitty's 145 ms, idles at 24 MB against 42 MB, and on macOS it is a native app rather than a port. Pick Kitty if you script your terminal, use named layouts or session files, SSH into fresh hosts constantly, or run BSD. The speed difference is real but small in daily use; the capability difference is absolute, because Ghostty has no scripting surface at all and is not adding one.

Why does my prompt or TUI break over SSH with Ghostty?

Ghostty sets TERM=xterm-ghostty, and a remote host that has never seen that terminfo entry cannot drive the terminal correctly — you get tput errors, arrow keys printing escape sequences in less, and misdrawn TUIs. Kitty solves this with kitten ssh, which copies its terminfo to the host automatically. In Ghostty the fix is manual: either install the entry once per host with 'infocmp -x xterm-ghostty | ssh user@server -- tic -x -', or downgrade the session with 'TERM=xterm-256color ssh user@server' and accept the loss of extended key reporting and styled underlines.

Does Ghostty have anything like kitty @ remote control?

No. Kitty exposes a Unix socket with allow_remote_control, so scripts can run 'kitty @ launch' to open windows, 'kitty @ send-text' to type into a pane, or 'kitty @ set-colors' to repaint the terminal. Ghostty has no socket and no CLI that talks to a running instance. The nearest substitute is running tmux inside Ghostty and using 'tmux new-window' and 'tmux send-keys', which covers windows and input but not appearance — nothing outside Ghostty can change its colors or ask it what windows it has open.

Can Ghostty restore a saved session the way kitty --session does?

No. Kitty can boot a named layout of windows, tabs, and commands from a session file via 'kitty --session' or the startup_session option. Ghostty has no session format and no saved layouts; you place splits by hand each time. If you rely on a reproducible workspace, run tmux or zellij inside Ghostty and keep the layout in a tmux script instead — that is the workflow Ghostty is designed around.

Kitty or Ghostty for Neovim?

Close to a tie. Both implement the Kitty keyboard protocol, so Neovim can tell Ctrl+I from Tab and read modifiers on previously ambiguous keys; both render styled underlines for LSP undercurl diagnostics; both implement the Kitty graphics protocol, so image.nvim works in either. Ghostty measures 1.2 ms of keyboard latency against Kitty's 1.8 ms, a real but barely perceptible gap. Inside the editor they behave the same — pick on what you want outside it, which is speed for Ghostty and scriptability for Kitty.

When was this comparison last verified?

These benchmarks were run in May 2026 on a MacBook Pro M3 Max with 64 GB of RAM on macOS 15.6, with all three terminals freshly installed at default settings, three runs averaged. This comparison was last reviewed and expanded on September 22, 2026, when the iTerm2-first head-to-head was added — the iTerm2 settings decision checklist, the iTerm2-to-Ghostty config mapping, tmux control mode, triggers and profiles, scrollback search, and shell integration. The Kitty-first head-to-head was added on September 20, 2026.

Winner

Ghostty (speed and simplicity) / Kitty (scripting and cross-platform) / iTerm2 (power users and tmux control mode)

Independent testing. No affiliate bias.

⚡ Proven System Architecture

Scale 1,000+ Developer Benchmark Pages on Autopilot

We run devtoolreviews.com using the SEO Content OS—the battle-tested Python automation engine that turns technical keywords into structured benchmark tables, FAQ schemas, and de-slopped engineering guides.

Get the SEO Content OS ($19)→

Instant .zip download · Complete Python scripts + Next.js MDX pipelines