Kitty Terminal: Why GPU Acceleration Changes Everything

Human-led research + AI-written, Human-editedThe research, experiments, and conclusions are mine. An LLM drafted the prose from my notes and I edited it; I am responsible for its accuracy.

The Core Insight

Every terminal emulator makes a fundamental choice: where does rendering happen?

Traditional terminals (xterm, gnome-terminal, konsole) render on the CPU. This made sense when GPUs were expensive and specialized. But today, your GPU sits idle while your CPU struggles to render a 50MB log file.

Kitty flips this. Text rendering moves to the GPU via OpenGL. The result isn’t just faster—it’s a different experience. Scrolling becomes butter-smooth. Font rendering stays crisp at any size. And your CPU is free to run your actual programs.

The Tradeoff

GPU rendering requires OpenGL support. This means:

  • No SSH without forwarding (use the kitten ssh wrapper instead)
  • Slightly higher memory footprint
  • Won’t work in pure framebuffer consoles

For my use case (local development, modern hardware), these tradeoffs are invisible. For a sysadmin SSH’ing into headless servers all day, they matter more.

Design Philosophy: Modifier Consistency

Kitty’s keybindings follow a single pattern: Ctrl+Shift+<key>. This isn’t arbitrary. Terminals pass most key combinations to the shell—Ctrl+C is SIGINT, Ctrl+Z is SIGTSTP, Ctrl+R is reverse search—so any keybinding the terminal claims is one the shell can’t use. Ctrl+Shift combinations are rarely used by CLI programs, so Kitty claims that space: Ctrl+Shift+T for a new tab, Ctrl+Shift+C for copy, and so on. (I write more about designing modifier schemes in the Niri shortcuts post, where the same logic applies at the compositor level.)

Layouts: Solving the Split Problem

Terminal multiplexers like tmux solve splits with complex nested containers. Kitty takes a simpler approach: predefined layouts you cycle through.

block-beta
  columns 2
  block:stack["stack (only one visible)"]:1
    a["Active Window"]
  end
  block:tall["tall layout"]:1
    columns 2
    main["Main Window"]:1
    block:others:1
      columns 1
      w1["Stacked 1"]
      w2["Stacked 2"]
    end
  end

Press Ctrl+Shift+L to cycle. No need to remember split commands or resize syntax.

The compromise: Less flexibility than tmux’s arbitrary splits. But for 90% of use cases, cycling through 6 predefined layouts is faster than manually constructing the perfect split.

All available layouts
LayoutDescriptionBest For
tallOne main + stacked rightEditor + terminals
fatOne main + stacked bottomWide content + helpers
stackOnly active visibleFocus mode
gridEqual gridMonitoring multiple things
horizontalSide by sideComparing files
verticalStacked verticallyLogs + commands
splitsArbitrary splitstmux-like flexibility

Configuration: The Essential Decisions

Kitty’s config lives at ~/.config/kitty/kitty.conf. Rather than dump the whole file, here are the decisions that matter:

Decision 1: New tabs should inherit directory

By default, new tabs open in $HOME. This breaks flow—you open a tab to run a quick command here, not start over from home.

map ctrl+shift+t launch --cwd=current --type=tab
map ctrl+shift+enter launch --cwd=current

This requires shell integration (covered in post 3) to work reliably.

Decision 2: Disable the audio bell

It’s 2025. No one wants terminal beeps.

enable_audio_bell no

Decision 3: Font choice affects everything

Kitty supports ligatures natively. If you use a ligature font (JetBrains Mono, Fira Code), != becomes and -> becomes .

font_family JetBrains Mono
font_size 12.0

The tradeoff: Ligatures look beautiful but can confuse beginners who see in code but must type !=. I keep them on because I’m past that confusion.

Everything else in my config is cosmetic. If you only change three things, change these.

Compared to Alternatives

The serious competition is other GPU terminals. Alacritty is lighter but has no multiplexing—you need tmux. WezTerm has built-in multiplexing like Kitty, but configures in Lua (more powerful, more complex) and renders via WebGPU (newer, less tested).

Kitty’s balance of power and simplicity fits my workflow. The kitten extension system (next post) seals the deal.

Next in this series: Kitty Superpowers: Kittens, Hints, and Remote Control