Skip to content
Go back

Ghostty vs Kitty vs WezTerm in 2026

By KingPin 12 min read
Ghostty vs Kitty vs WezTerm in 2026
Contents

Ghostty finally shipped. Time to redo this comparison.

Every terminal emulator comparison you read before December 2024 has a hole in it: no Ghostty. Mitchell Hashimoto’s terminal spent years in a private beta, then landed 1.0 and dropped straight into every Linux desktop subreddit’s default recommendation. That changes the math for anyone who already settled on Kitty or WezTerm and now has three tabs open wondering if they should switch.

Short answer, up front: no, Ghostty does not replace Kitty as the daily driver for a Linux user who lives in tmux over SSH. Kitty’s remote terminfo handling is more mature, and that one gap matters more than raw rendering speed when your job is hopping between six servers a day. WezTerm remains the pick if you want a terminal that also acts as a persistent multiplexer without installing tmux at all. Ghostty is good and worth running locally, but it is the newest kid at the table, and that still shows in a couple of specific places. Let’s get into why.

Who you’re actually choosing between

Three different projects, three different languages, three different philosophies:

Platform support is where the field splits hard. Ghostty officially supports macOS and Linux only. Windows is, in the project’s own words, planned for the future, not available today. Kitty covers Linux and macOS. WezTerm ships binaries for Windows, macOS, Linux, FreeBSD, and NetBSD, the only one of the three that is actually cross-platform. If you need one terminal that behaves identically on a work laptop running Windows and a home server running Debian, WezTerm is your only choice among these three today.

All three are free with no paid tier, so pricing is not a factor here.

Rendering: what “GPU-accelerated” means per project

All three market themselves as GPU-accelerated, but they get there differently.

Ghostty uses native platform toolkits: a proper macOS app built on the platform’s own frameworks, and GTK4 on Linux, with Metal doing the drawing on macOS and OpenGL on Linux. That native-toolkit choice is why Ghostty windows feel like they belong on your desktop instead of looking like a web app wearing a terminal costume.

Kitty rolls its own rendering pipeline on top of OpenGL rather than leaning on a GUI toolkit. It has done this since well before “GPU-accelerated terminal” was a marketing checkbox, and the kitty graphics protocol it invented exists specifically because that custom pipeline made drawing images cheap.

WezTerm also writes its own renderer, in Rust, again avoiding a heavyweight GUI toolkit in favor of direct GPU access.

None of the three projects publish a head-to-head startup or frame-time benchmark against the other two, and no one else has numbers recent enough to trust either. Every “X is 3x faster than Y” chart floating around predates Ghostty 1.0 or compares old builds. Treat startup speed claims you see elsewhere as anecdotal until someone runs all three on the same machine on the same day. What we can say with a straight face: all three are fast enough that shell startup and config load dominate what you actually feel, not the renderer underneath.

Config files: flat text versus real code

This is where daily-driver preference actually gets decided, because you touch this file constantly.

Ghostty uses key = value syntax with no nesting, and reads it from $XDG_CONFIG_HOME/ghostty/config.ghostty by default:

~/.config/ghostty/config.ghostty
background = 282c34
foreground = ffffff
font-family = JetBrains Mono
font-size = 12
keybind = ctrl+z=close_surface
keybind = ctrl+d=new_split:right

Every key in that file also works as a CLI flag, so ghostty --font-size=16 overrides the config for one launch. Comments start with # on their own line, and setting a key to nothing resets it to default. It is about as low-friction as config gets.

Kitty’s kitty.conf looks similar at a glance, space separated instead of =, living at ~/.config/kitty/kitty.conf:

~/.config/kitty/kitty.conf
font_family JetBrains Mono
font_size 12.0
background #282c34
foreground #ffffff
map ctrl+shift+enter new_window
map ctrl+shift+t new_tab

WezTerm throws that whole approach out and hands you Lua, loaded from ~/.wezterm.lua or $XDG_CONFIG_HOME/wezterm/wezterm.lua:

wezterm.lua
local wezterm = require("wezterm")
local config = wezterm.config_builder()
config.font = wezterm.font("JetBrains Mono")
config.font_size = 12.0
config.color_scheme = "OneDark (base16)"
config.keys = {
{ key = "d", mods = "CTRL", action = wezterm.action.SplitHorizontal({ domain = "CurrentPaneDomain" }) },
}
return config

If you want conditionals, loops, or a config that changes behavior based on hostname, WezTerm is the only one of the three that gives you a real language for it without shelling out to a template generator. If you just want to set colors and a font and move on with your life, the flat files in Ghostty and Kitty get there faster and read back cleaner six months later.

Tabs and splits are not multiplexing

Here is the distinction that actually matters for the audience this article is written for: does the terminal survive you closing your laptop mid-session?

Ghostty and Kitty both give you tabs and splits natively, no tmux required for basic window management. But that windowing lives inside a single process. Close the window, kill the process, lose the SSH connection to the terminal itself, and the session is gone. You still need tmux or zellij underneath if you want a session that survives a disconnect.

WezTerm is the odd one out here: it ships an actual persistent multiplexer, and it can reconnect to a remote session over SSH on its own. Configure a named SSH domain in your Lua config:

wezterm.lua
config.ssh_domains = {
{
name = "homelab",
remote_address = "192.168.1.50",
username = "kingpin",
},
}

Then connect (or reconnect after your laptop sleeps) with:

Terminal window
wezterm connect homelab

WezTerm reattaches to the same panes on that remote box, no local tmux session required, as long as a compatible WezTerm binary is installed on the remote end too. That’s a real overlap with what tmux does, running inside the terminal emulator itself instead of as a separate program. It does not replace tmux for everyone (tmux’s scripting and plugin ecosystem is still deeper), but if your whole reason for running tmux is keeping a session alive across a dropped connection, WezTerm’s SSH domains cover that natively. Ghostty and Kitty have no equivalent, so if you’re on either one, tmux stays non-negotiable.

The terminfo problem, or why your prompt turns into garbage on a fresh server

Every terminal announces itself to the shell through the TERM environment variable, and the remote host needs a matching terminfo entry to understand it. Ghostty sets TERM=xterm-ghostty, Kitty sets TERM=xterm-kitty, and both are exotic enough that a fresh Debian or Alpine box you SSH into will not have the matching entry installed. You SSH in, run clear or fire up vim, and get a screen full of garbled escape codes or a flat “unknown terminal type” error.

Ghostty’s own docs walk through two fixes. Copy the terminfo entry over yourself:

Terminal window
infocmp -x xterm-ghostty | ssh remote-host -- tic -x -

Or tell SSH to fall back to something the remote box already knows, in your SSH config:

~/.ssh/config
Host remote-host
SetEnv TERM=xterm-256color

Kitty solved this earlier and more conveniently, with a kitten ssh wrapper that copies the terminfo entry to the remote host automatically as part of connecting, so you swap the ssh habit for one command and stop thinking about it:

Terminal window
kitty +kitten ssh remote-host

WezTerm sidesteps the whole mess by defaulting TERM to the boring, universally available xterm-256color instead of shipping its own terminfo name. You give up a few WezTerm-specific escape sequences on the remote end, but you never see a broken prompt on a box you’ve never touched before. An optional custom wezterm terminfo entry exists if you want the full feature set and are willing to install it yourself.

This is the single biggest reason Kitty still wins for someone who SSHes into unfamiliar machines all day. kitty +kitten ssh has been solving this problem on autopilot for years, while Ghostty’s fix today is a manual copy-paste or an SSH config tweak.

Image protocols: cat a PNG straight into your prompt

Kitty invented its own image protocol, unsurprisingly called the kitty graphics protocol, and tools like icat, chafa, and TUI dashboards target it directly. Ghostty implements that same kitty graphics protocol rather than inventing a competing one, so anything built for Kitty’s image support (thumbnails in a file manager TUI, image previews in a script) works unmodified in Ghostty too.

WezTerm goes further and supports three protocols at once: the iTerm2 image protocol, the kitty graphics protocol, and Sixel, marked experimental since a 2020 build. If you bounce between tools that were written against different protocols, WezTerm is the one that will not leave you patching a script to detect which terminal you’re in.

Fonts and ligatures

All three handle programming ligatures (the -> and != glyphs from fonts like JetBrains Mono or Fira Code) and color emoji with no extra plugins, which was not universally true a few years back. Ghostty and Kitty both expose a single font-family or font_family key plus separate bold and italic overrides if you want to mix font files. WezTerm’s font stack runs through the same Lua config and supports fallback chains, so you can list a primary font and a CJK or emoji fallback in one array instead of fighting fontconfig by hand. If your font setup is simple, one monospace font with ligatures on, you will not notice a practical difference between any of the three.

The verdict: does Ghostty replace Kitty on Linux

Not yet, and the gap is narrower than a version number implies. Ghostty wins on config simplicity (flat files beat Lua for most people’s actual needs) and on feeling like a native GTK4 app instead of a toolkit-agnostic renderer. But for the reader this article is written for, someone who lives in tmux and SSHes into a pile of servers, Kitty’s kitten ssh terminfo automation is a small feature that saves real annoyance every single day, and Ghostty has not matched it.

If persistent multiplexing without tmux is the priority, WezTerm is still the only one of the three that actually does it, full cross-platform support included.

If you’re happy on Kitty today, there’s no urgent reason to jump. If you’re picking a terminal fresh in 2026 and don’t SSH into strange boxes often, Ghostty is a completely reasonable place to land. Your 2 AM self debugging a broken prompt on a rescue server will still be happier with Kitty’s automatic terminfo handling, or WezTerm’s TERM fallback, than with Ghostty’s current manual fix.

Common Questions

Does Ghostty run on Windows?

No. Ghostty officially supports only macOS and Linux as of 2026. Windows support is listed on Ghostty’s own site as planned for the future, with no shipped date. For one terminal across Windows and Linux machines, use WezTerm instead, since it ships native binaries for Windows, macOS, Linux, FreeBSD, and NetBSD.

Do I still need tmux if I switch to Ghostty or Kitty?

Yes. Ghostty and Kitty both give you tabs and splits inside a single process, but neither runs a persistent multiplexer. Closing the window or losing the SSH connection ends the session. Keep tmux or zellij if you need a session that survives a disconnect. WezTerm is the exception, since it can reconnect to a remote session through its own SSH domains.

Why does my prompt break when I SSH from Ghostty or Kitty into a new server?

The remote host is missing the terminfo entry for xterm-ghostty or xterm-kitty. Fix it by copying the entry with infocmp -x xterm-ghostty | ssh host -- tic -x -, setting SetEnv TERM=xterm-256color in your SSH config, or, on Kitty, running kitty +kitten ssh host, which copies the terminfo automatically on every connection.

Can I copy my Kitty config to Ghostty?

Not directly. Both use flat key = value style files, but the key names and syntax differ (Kitty uses font_family JetBrains Mono, Ghostty uses font-family = JetBrains Mono), so you rewrite the file by hand. Expect 15 to 30 minutes for a typical config, since no automated converter exists as of 2026.

Does Ghostty support Sixel images?

No confirmed Sixel support exists in Ghostty’s official documentation as of 2026. Ghostty implements the kitty graphics protocol instead, which covers the same use case (rendering images in the terminal) for tools already targeting Kitty. For Sixel specifically, WezTerm supports it as an experimental feature.


Share this post on:

Send a Webmention

Written about this post on your own site? Send a webmention and it'll show up above once verified.


Previous Post
RomM and EmulatorJS: Retro on a NAS
Next Post
Tinyauth vs Pocket ID vs Authelia

Discussion

Powered by Garrul . Sign in with GitHub or Google, or post anonymously.

Related Posts