Kitty Key Concepts
Before you can use kitty fluently, you need to internalize five core concepts: GPU rendering, the server/client model, windows, tabs, and kittens.
Kitty is both a terminal emulator (the GUI window you see) and a rendering engine (GPU pipeline). Everything else — windows, tabs, kittens — is built on top of this architecture.
The Five Core Concepts
1. GPU Rendering
Kitty uses the GPU for all text rendering. The font atlas and glyph cache live in GPU memory, and the compositor runs as a graphics shader.
# check if GPU rendering is active
kitty @ ls | grep -i render
Rendering Pipeline:
┌──────────┐ ┌─────────────┐ ┌──────────────┐
│ Text │ → │ Font Atlas │ → │ GPU Shader │
│ Input │ │ (VRAM) │ │ Compositor │
└──────────┘ └─────────────┘ └──────┬───────┘
▼
┌──────────────┐
│ Framebuffer │
│ → Display │
└──────────────┘
If no GPU is available, kitty falls back to a CPU renderer. Performance degrades but functionality is preserved.
2. Server / Client Model
Kitty runs a background server process that manages all windows and tabs. The OS window is just a client view into that server.
# list all kitty instances (server processes)
kitty @ ls
# send a command to a specific kitty instance
kitty @ --to unix:/tmp/kitty-XXXX new-window
| Component | Role |
|---|---|
| Kitty server | Background daemon, owns GPU state, manages windows/tabs |
| OS window | Front-end viewer, receives input, renders frames |
kitty @ | Remote control interface, sends commands to server |
3. Windows
A window is a terminal shell inside kitty — like a tmux pane. Windows fill the available space inside a tab or are split with other windows.
| Shortcut | Action |
|---|---|
Ctrl+Shift+Enter | New window (vertical split) |
Ctrl+Shift+Alt+Enter | New window (horizontal split) |
Ctrl+Shift+arrows | Move focus between windows |
Ctrl+Shift+Alt+arrows | Resize current window |
Ctrl+Shift+q | Close current window |
# from the command line
kitty @ new-window --cwd /var/log
kitty @ close-window
4. Tabs
A tab is a container for one or more windows — like a browser tab. Each tab has its own set of window splits.
| Shortcut | Action |
|---|---|
Ctrl+Shift+t | New tab |
Ctrl+Shift+Alt+t | Name current tab |
Ctrl+Shift+left/right | Previous/next tab |
Ctrl+Shift+1-9 | Switch to tab by number |
Ctrl+Shift+q | Close current tab (when only one window) |
# from the command line
kitty @ new-tab --tab-title "monitoring"
kitty @ set-tab-title "logs"
5. Kittens
A kitten is a small kitty-specific program that extends functionality. Kittens are invoked with kitty +kitten <name>.
# display an image in the terminal
kitty +kitten icat screenshot.png
# diff two files with syntax highlighting
kitty +kitten diff file1.txt file2.txt
# clipboard access
kitty +kitten clipboard --text "hello"
# interactive help
kitty +kitten help
| Kitten | Purpose |
|---|---|
icat | Display images inline in terminal |
diff | Side-by-side diff with syntax highlighting |
clipboard | Read/write system clipboard |
remote-control | Enable kitty @ commands |
update-extensions | Update kitty extensions |
The Prefix Key
The default prefix for kitty is Ctrl+Shift. Unlike tmux, kitty uses chorded keybindings — you hold all keys simultaneously:
Ctrl+Shift+Enter (hold all three at once)
Ctrl+Shift+t (hold all three at once)
Kitty keybindings are chords, not sequences. Hold Ctrl and Shift together while pressing the action key. This is different from tmux where you press-and-release the prefix.
Command Palette
Press Ctrl+Shift+p to open the command palette — a searchable list of all available actions:
Ctrl+Shift+p → Opens command palette
Type to filter → "new tab", "close", "resize"...
Enter to execute
The Config File
Kitty loads its configuration from ~/.config/kitty/kitty.conf:
# check if you have one
cat ~/.config/kitty/kitty.conf 2>/dev/null || echo "no config yet"
# create default config
kitty +runpy 'from kitty.config import *; print(commented_out_default_config())' > ~/.config/kitty/kitty.conf
# reload config without restarting
kitty @ load-config
# or inside kitty: Ctrl+Shift+F5
Concept Map at a Glance
┌──────────────────────────────────────────────────────────┐
│ Kitty Terminal │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Tab 1: "editor" Tab 2: "monitoring" │ │
│ │ ┌──────────┬──────────┐ ┌──────────────────┐ │ │
│ │ │ Window 0 │ Window 1 │ │ Window 0: htop │ │ │
│ │ │ (vim) │ (shell) │ │ │ │ │
│ │ ├──────────┼──────────┤ ├──────────────────┤ │ │
│ │ │ Window 2 │ Window 3 │ │ Window 1: logs │ │ │
│ │ │ (git) │ (server) │ │ │ │ │
│ │ └──────────┴──────────┘ └──────────────────┘ │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Kitten: icat │ Kitten: diff │ kitty @ │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ GPU Pipeline (OpenGL → Shader → Framebuffer) │ │
│ └──────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
Quick Reference Summary
| Concept | What it is | Managed with |
|---|---|---|
| GPU rendering | Hardware-accelerated text output | Auto (configurable via kitty.conf) |
| Server | Background kitty daemon | Auto-started with first window |
| Window | Terminal shell inside a tab | Ctrl+Shift+Enter, kitty @ new-window |
| Tab | Container for windows | Ctrl+Shift+t, kitty @ new-tab |
| Kitten | Extensions invoked via kitty +kitten | kitty +kitten <name> |
| Prefix | Modifier for shortcuts | Ctrl+Shift (default) |