How To

Install Kitty Terminal on Linux and macOS

The Kitty package in your distro repo can be seventeen releases behind upstream. On Ubuntu 24.04 and Linux Mint, apt install kitty gives you a build from early 2024 that has no font picker, no command palette and no cursor trail. Arch is current to the day. Fedora, Debian and Ubuntu 26.04 sit in between. Where your distro lands decides how you should install Kitty terminal in the first place.

Original content from computingforgeeks.com - post 76100

This guide covers every install path that works: apt on Ubuntu, Debian and Mint, dnf on Fedora, pacman on Arch, Homebrew on macOS, and the official binary installer for the latest release on any of them. After that we configure kitty.conf, switch themes with the themes kitten, build a splits layout, fix the xterm-kitty SSH error and drive Kitty from scripts. Every command was run on Ubuntu 26.04 and 24.04, Debian 13, Fedora 44, Arch Linux, Linux Mint 22.3 and macOS 26 in October 2026, with Kitty 0.49.2 from the official installer as the reference build.

Which Kitty version each distro ships

We installed Kitty from the default repos on fresh VMs and recorded what landed. The last two columns are the features people search for most once Kitty is running.

PlatformInstall commandKitty versionkitten choose-fontsCommand palette
Arch Linuxpacman -S kitty0.49.2YesYes
macOS (Homebrew cask)brew install --cask kitty0.49.2YesYes
Fedora 45 Betadnf install kitty0.48.2YesYes
Fedora 44dnf install kitty0.47.1YesYes
Ubuntu 26.04 LTSapt install kitty0.45.0YesNo
Debian 13apt install kitty0.41.1YesNo
Ubuntu 24.04 LTSapt install kitty0.32.2NoNo
Linux Mint 22.3apt install kitty0.32.2NoNo
Official installer (any Linux, macOS)curl ... | sh0.49.2YesYes

The short version: on Arch, Fedora and macOS the package manager is fine. On Ubuntu 24.04, Mint and Debian, use the official installer if you want current features and security fixes. The latest release also patched a file transfer issue where a program on a remote host could skip the confirmation prompt; older distro builds get that fix only if their maintainers backport it.

Install Kitty on Ubuntu, Debian and Linux Mint

Kitty lives in universe on Ubuntu and in main on Debian. One command on all three:

sudo apt update && sudo apt install -y kitty

Ubuntu pulls in kitty-terminfo, kitty-shell-integration and kitty-doc alongside the main package. Confirm the build you got:

kitty --version

Ubuntu 26.04 reports this version:

kitty 0.45.0 created by Kovid Goyal

Ubuntu 24.04 and Linux Mint 22.3 print kitty 0.32.2 instead, and Debian 13 prints kitty 0.41.1. If that’s too old for you, skip ahead to the official installer. It installs into your home directory and coexists with the apt package without conflicts.

Halve the launch time of the Ubuntu 26.04 package

The Ubuntu 26.04 package ships no optimized bytecode. Kitty runs its Python code with -OO, finds no .opt-2.pyc files, and tries to write them into /usr/lib/kitty on every launch. As a normal user that fails, so strace shows 135 EACCES errors per start and Kitty compiles everything again in memory. Compile the bytecode once as root:

sudo python3 -OO -m compileall -q /usr/lib/kitty

On our GNOME VM (software rendering, so the absolute numbers are high) launch to exit dropped from about 1.2 seconds to about 0.6 seconds, measured over six runs each. The official installer build already ships compiled bytecode and came in at roughly 0.4 seconds on the same VM. A package upgrade replaces the source files and makes the compiled files stale, so rerun the command after apt upgrade updates Kitty. Our terminal emulator benchmark measured the same problem as first-frame latency.

Install Kitty on Fedora

Fedora packages Kitty in the main repos and keeps it reasonably current through updates:

sudo dnf install -y kitty

dnf splits Kitty into four packages. On a server you only SSH into, kitty-terminfo alone is enough (more on that below):

Installing:
 kitty                      x86_64 0:0.47.1-1.fc44   updates     14.9 MiB
Installing dependencies:
 kitty-kitten               x86_64 0:0.47.1-1.fc44   updates     24.6 MiB
 kitty-shell-integration    noarch 0:0.47.1-1.fc44   updates    122.8 KiB
 kitty-terminfo             noarch 0:0.47.1-1.fc44   updates     38.0 KiB

That is Fedora 44. The Fedora 45 Beta repo already carries a newer build. If you are setting up a fresh workstation, the Fedora 44 post-install guide covers the rest of the desktop.

Install Kitty on Arch Linux

Arch had the upstream release packaged the same day it was tagged. Install it with a full system upgrade in the same transaction:

sudo pacman -Syu kitty

On a minimal Arch box this pulls 44 packages. That is an 87 MiB download and 356 MiB on disk, because Mesa and the X11 and Wayland libraries come along. The kitty-terminfo and kitty-shell-integration split packages install automatically. Our pacman cheat sheet covers the -Sy partial upgrade trap if you are tempted to skip -u.

Install Kitty on macOS with Homebrew

Kitty is a Homebrew cask, not a formula. Install it with:

brew install --cask kitty

The shorter brew install kitty works too, because no formula with that name exists. A dry run shows it falling through to the cask:

==> Would install 1 cask:
kitty

The cask requires macOS 12 or later and installs /Applications/kitty.app. A kitty@nightly cask exists too if you want builds from the master branch. Homebrew users who also want a better prompt can pair Kitty with Zsh and Oh My Zsh on macOS.

Install the latest Kitty with the official installer

The upstream installer downloads the prebuilt release and drops it in ~/.local/kitty.app on Linux or /Applications/kitty.app on macOS. It touches nothing else. The launch=n argument stops it from opening a window when it finishes, which matters over SSH:

curl -L https://sw.kovidgoyal.net/kitty/installer.sh | sh /dev/stdin launch=n

The download is about 44 MB and unpacks to 160 MB. On Debian, install curl and xz-utils first if the image is minimal. On macOS the app it installs is notarized under the Developer ID of Kovid Goyal, so Gatekeeper opens it without complaint.

On Linux, link the binaries into a directory on your PATH and register the desktop entry. These are the upstream commands, run as your normal user:

mkdir -p ~/.local/bin ~/.local/share/applications
ln -sf ~/.local/kitty.app/bin/kitty ~/.local/kitty.app/bin/kitten ~/.local/bin/
cp ~/.local/kitty.app/share/applications/kitty.desktop ~/.local/share/applications/
cp ~/.local/kitty.app/share/applications/kitty-open.desktop ~/.local/share/applications/
sed -i "s|Icon=kitty|Icon=$(readlink -f ~)/.local/kitty.app/share/icons/hicolor/256x256/apps/kitty.png|g" ~/.local/share/applications/kitty*.desktop
sed -i "s|Exec=kitty|Exec=$(readlink -f ~)/.local/kitty.app/bin/kitty|g" ~/.local/share/applications/kitty*.desktop
echo 'kitty.desktop' > ~/.config/xdg-terminals.list

Do not copy the kitty binary out of kitty.app. It needs the bundled libraries next to it, which is why upstream tells you to symlink. Ubuntu and Debian add ~/.local/bin to PATH from ~/.profile only if the directory existed at login, so log out and back in once. Then check which Kitty wins:

type -a kitty

With both the apt package and the installer present, the installer copy comes first:

kitty is /home/josphat/.local/bin/kitty
kitty is /usr/bin/kitty
kitty is /bin/kitty

Launching it from the GNOME dock on Ubuntu 26.04 confirms both builds side by side. The window title, prompt and TERM=xterm-kitty are the defaults before any configuration:

Kitty terminal default window on Ubuntu 26.04 showing installer and apt versions

To update, rerun the same installer command. To uninstall, delete ~/.local/kitty.app plus the symlinks and desktop files you created. The installer also accepts installer=nightly for nightly builds and installer=version-X.Y.Z to pin a release; check the Kitty releases page for the current tag.

Configure Kitty with kitty.conf

Kitty reads ~/.config/kitty/kitty.conf. Press ctrl+shift+f2 (cmd+, on macOS) inside Kitty and it creates the file with every default commented out, all 3,500 lines of it. Most people want a short file they actually understand instead. Create the directory and open a fresh file:

mkdir -p ~/.config/kitty
vim ~/.config/kitty/kitty.conf

This is the exact file we ran on Ubuntu 26.04. It loaded with zero errors on the installer build, the Fedora package and the Debian package:

# Fonts
font_family      JetBrains Mono
bold_font        auto
italic_font      auto
bold_italic_font auto
font_size        12.0

# Window
remember_window_size  no
initial_window_width  120c
initial_window_height 34c
window_padding_width  6
confirm_os_window_close 0

# Scrollback and clipboard
scrollback_lines 10000
copy_on_select   clipboard
enable_audio_bell no

# Tabs
tab_bar_edge        top
tab_bar_style       powerline
tab_powerline_style slanted

# Layouts: splits first so new windows split the current one
enabled_layouts splits,stack,tall
map kitty_mod+alt+v launch --location=vsplit --cwd=current
map kitty_mod+alt+h launch --location=hsplit --cwd=current
map kitty_mod+alt+z toggle_layout stack

# Cursor
cursor_shape          beam
cursor_blink_interval 0
cursor_trail 3

# Remote control over a local socket only
allow_remote_control socket-only
listen_on unix:/tmp/kitty

Sizes ending in c are cells, so the window opens at 120 columns by 34 rows regardless of font size. kitty_mod defaults to ctrl+shift on Linux and macOS alike. JetBrains Mono comes from the fonts-jetbrains-mono package on Ubuntu and Debian; for icons in prompts, install a patched font from the Nerd Fonts guide and put its name in font_family.

Fully quit Kitty and start it again after creating this file. Two reasons: Kitty only auto-reloads a kitty.conf that existed when it started, and listen_on is never applied by a reload. Recent builds (the Arch, Fedora, Homebrew and installer versions in the table) then pick up later edits automatically. The Ubuntu, Debian and Mint packages are too old for auto-reload, so press ctrl+shift+f5 (ctrl+cmd+, on macOS) after each edit. ctrl+shift+f6 shows the effective settings. A typo does not stop Kitty from starting. It opens an extra window titled “Errors parsing configuration” that names the line, which is how we caught a bad cursor_shape value in the first draft of this file.

On macOS, add these two lines. The first makes Option behave as Alt for shell shortcuts such as alt+b, the second quits Kitty when the last window closes. Restart Kitty afterwards, because a reload does not apply the Option key setting:

macos_option_as_alt yes
macos_quit_when_last_window_closed yes

One config can serve both systems. Put the macOS lines in macos.conf, create an empty linux.conf, and add include ${KITTY_OS}.conf as the last line of kitty.conf. Kitty sets KITTY_OS to linux, macos or bsd when it expands includes, and a later line wins, so keep the include at the bottom.

Change the Kitty theme with kitten themes

Skip hand-copying color values. The themes kitten downloads the kitty-themes collection and previews every theme live in the current window:

kitten themes

Our run listed 413 themes, filterable by Dark, Light and Recent. Press / to search and Enter to apply:

Kitty themes kitten picker listing 413 color themes

For dotfiles and provisioning scripts, pass the theme name and the kitten applies it without the picker:

kitten themes --reload-in=all "Tokyo Night"

It writes the colors to current-theme.conf, saves your previous config as kitty.conf.bak, and appends a marked block to the end of kitty.conf:

# BEGIN_KITTY_THEME
# Tokyo Night
include current-theme.conf
# END_KITTY_THEME

It also comments out any color lines already in kitty.conf so they do not fight the theme. If you keep colors you want to win over the theme, move them into a separate file and include it after that block.

Fonts get the same treatment with kitten choose-fonts, an interactive picker with live previews of regular, bold and italic faces. It writes the result to kitty.conf for you. The Ubuntu 24.04 and Mint package predates it and fails with Error: choose-fonts is not a known subcommand for kitten.

Use tabs, windows and splits

Kitty calls a pane a window and the desktop window an OS window. With the config above, ctrl+shift+alt+v splits the current window side by side and ctrl+shift+alt+h splits it top and bottom, both opening in the same directory. Here is a three-way split with fastfetch, htop and a shell in one tab, with two more tabs on the powerline tab bar:

Kitty splits layout with tabs and Tokyo Night theme on Ubuntu 26.04

These are the default shortcuts worth memorizing, checked against the defaults Kitty generates for itself:

ActionLinuxmacOS
New tabctrl+shift+tcmd+t
Close tabctrl+shift+qcmd+w
Next / previous tabctrl+shift+right / leftshift+cmd+] / [
Set tab titlectrl+shift+alt+tshift+cmd+i
New window (pane)ctrl+shift+entercmd+enter
Close windowctrl+shift+wshift+cmd+d
Next / previous windowctrl+shift+] / [ctrl+shift+] / [
Resize windowctrl+shift+rctrl+shift+r
Next layoutctrl+shift+lctrl+shift+l
New OS windowctrl+shift+ncmd+n
Search scrollbackctrl+shift+/cmd+f
Last command output in pagerctrl+shift+gctrl+shift+g
Open URL with hintsctrl+shift+ectrl+shift+e
Font size up / down / resetctrl+shift+= / – / backspacecmd++ / – / 0
Command palettectrl+shift+f3ctrl+shift+f3

Forget a shortcut and the command palette has it. ctrl+shift+f3 lists every action, grouped by category, with its current binding or “(unmapped)”. Type to filter, Enter to run:

Kitty command palette listing shortcuts and actions

Kitty splits cover most of what people install tmux for on a local machine. On remote servers where sessions must survive a dropped connection, tmux still wins; the tmux cheat sheet has the key bindings.

Use Kitty over SSH with kitten ssh

Shell integration for bash, zsh and fish is on by default. It is what makes ctrl+shift+g show the output of the last command and lets new splits open in the current directory. No rc file edits are needed locally, and the stock Ubuntu ~/.bashrc works with it as shipped.

Remote hosts are a different story. Kitty sets TERM=xterm-kitty, and a server without the Kitty terminfo entry has no idea what that is. Use the SSH kitten instead of plain ssh:

kitten ssh josphat@web02

We tested it against a Fedora server with no Kitty packages. On first connect, the kitten copied the terminfo into ~/.terminfo and a 92 KB bootstrap into ~/.local/share/kitty-ssh-kitten, all over the SSH connection itself. The server needs no internet access for that. Full-screen tools work and shell integration follows you to the remote prompt:

[josphat@web02 ~]$ echo $TERM; infocmp xterm-kitty | head -2
xterm-kitty
#	Reconstructed via infocmp from file: /home/josphat/.terminfo/./x/xterm-kitty
xterm-kitty|KovIdTTY,

The first time you run kitten itself on the remote (for kitten icat or file transfers), the bootstrap downloads the 30 MB kitten binary from GitHub. That one step needs outbound internet. Set remote_kitty no in ~/.config/kitty/ssh.conf to skip it. Add alias ssh="kitten ssh" to your shell rc file if you want the kitten everywhere.

Display images in the terminal with kitten icat

The Kitty graphics protocol draws real pixels, not block characters. The icat kitten uses it:

kitten icat --place 90x22@0x2 /usr/share/backgrounds/Resolute_Raccoon_Wallpaper_Dimmed_3840x2160.png

The --place value is columns x rows @ left x top, measured in cells. Without it, icat shrinks images wider than the window to fit and leaves smaller ones at their native size. kitten icat --clear removes it again:

Kitty icat kitten displaying an image inside the terminal

Terminal file managers such as yazi use the same protocol for image previews, so they show real thumbnails inside Kitty.

Control Kitty from scripts

With allow_remote_control socket-only and listen_on set, kitten @ drives a running Kitty from any shell: open tabs, split windows, send keystrokes, read text back. The screenshots in this guide were staged that way. Inside a Kitty window, no extra flags are needed because Kitty exports the socket path:

kitten @ launch --type=tab --tab-title logs --cwd=current
kitten @ launch --location=vsplit --cwd=current htop
kitten @ ls | jq -r '.[].tabs[].layout'

The catch is the socket name. Kitty appends its PID to the path in listen_on, so unix:/tmp/kitty becomes /tmp/kitty-9569. Each window gets the real path in its environment:

env | grep -E '^(KITTY_LISTEN_ON|KITTY_PID|KITTY_WINDOW_ID|TERM)='

The output from one of our windows:

KITTY_LISTEN_ON=unix:/tmp/kitty-9569
KITTY_PID=9569
KITTY_WINDOW_ID=4
TERM=xterm-kitty

From outside Kitty, such as a cron job or a script started over SSH, pass the real path with --to unix:/tmp/kitty-9569. Keep socket-only rather than yes: with yes, any program printing escape codes into the terminal can issue remote control commands. The socket is not a sandbox either. Any local process that can open it can read window text and send keystrokes, so do not enable this on a shared login host.

Make Kitty the default terminal

GNOME on Ubuntu 26.04 resolves its default terminal through xdg-terminal-exec. It checks ~/.config/ubuntu-xdg-terminals.list before the generic xdg-terminals.list the installer steps wrote. When the Ubuntu file named Ptyxis on our VM, Ptyxis won over Kitty. Write Kitty into the Ubuntu-specific list:

echo 'kitty.desktop' > ~/.config/ubuntu-xdg-terminals.list

After that, ctrl+alt+t opened a new Kitty window on the GNOME desktop. Ubuntu 24.04 and Debian use the alternatives system instead. The apt package registers /usr/bin/kitty as an x-terminal-emulator candidate, and an installer build needs registering by hand first:

sudo update-alternatives --install /usr/bin/x-terminal-emulator x-terminal-emulator "$HOME/.local/kitty.app/bin/kitty" 50
sudo update-alternatives --config x-terminal-emulator

Cinnamon on Linux Mint launches the terminal shortcut from its own setting, which defaulted to gnome-terminal on our VM. Setting it made ctrl+alt+t open Kitty on our Mint VM. Use the full path for the installer build, or plain kitty for the apt package:

gsettings set org.cinnamon.desktop.default-applications.terminal exec "$HOME/.local/kitty.app/bin/kitty"

On macOS there is no system default terminal setting. Keep Kitty in the Dock, or bind a global hotkey with a launcher such as Raycast.

Kitty errors we hit and how to fix them

Every message below was captured on the lab machines, word for word.

‘xterm-kitty’: unknown terminal type.

This appears when you SSH from Kitty with plain ssh into a host that lacks the terminfo entry. clear fails with that message, tput reports unknown terminal "xterm-kitty", and editors draw garbage. Use kitten ssh. When you have to use plain ssh (scripts, or a client that is not Kitty), push the entry once:

infocmp -a xterm-kitty | ssh web01 tic -x -o \~/.terminfo /dev/stdin

tic warns that “older tic versions may treat the description field as an alias” and installs the entry anyway. The next interactive session on Ubuntu 24.04 found it in ~/.terminfo/x/xterm-kitty and tput cols worked. Installing the kitty-terminfo package on the server fixes it for every user.

Errors parsing configuration: Invalid cursor shape

Kitty opened a second window with this text when our first config used a blink setting as a shape:

In file /home/josphat/.config/kitty/kitty.conf:
32:Invalid cursor shape: blink_off allowed values are block, beam, underline in line: cursor_shape blink_off

The fix is cursor_shape beam plus cursor_blink_interval 0 to stop the blink. The same window reports any misspelled option, so read it rather than closing it.

Ignoring unknown config key: cursor_trail

The Ubuntu 24.04 and Mint package (0.32.2) logs this for our config, because the cursor trail option arrived in a later release. It’s a warning, not an error, and the rest of the file applies. Every other option in the config above loaded on that build, so the file is safe to share across machines. Remove the line or install the upstream build if you want the effect.

Error: Failed to connect to unix:/tmp/kitty

The full message was Error: Failed to connect to unix:/tmp/kitty with error: dial unix /tmp/kitty: connect: no such file or directory. Remote control is working; the path is wrong because of the PID suffix covered above. List the real socket with ls /tmp/kitty-*, or read $KITTY_LISTEN_ON from inside a Kitty window.

Kitty prints libEGL or MESA warnings in a VM

Inside a VM without GPU passthrough, Kitty logs lines such as libEGL warning: egl: failed to create dri2 screen and MESA: error: ZINK: failed to choose pdev when started from a shell, then falls back to the Mesa software renderer and runs normally. On real hardware these do not appear. If Kitty refuses to start at all and prints OpenGL version is X.Y, version >= 3.1 required for kitty, the driver is too old. Kitty needs OpenGL 3.1 on Linux and 3.3 on macOS.

Keep reading

macOS Keyboard Shortcuts Cheat Sheet (Golden Gate and Tahoe) Cheat Sheets macOS Keyboard Shortcuts Cheat Sheet (Golden Gate and Tahoe) Fix “apt-key is deprecated. Manage keyring files in trusted.gpg.d instead” Debian Fix “apt-key is deprecated. Manage keyring files in trusted.gpg.d instead” Best Terminal Shell Prompts for Zsh, Bash and Fish Featured Best Terminal Shell Prompts for Zsh, Bash and Fish EC2 Mac Instance on AWS: Run mac-m4.metal for Just 24 Hours AWS EC2 Mac Instance on AWS: Run mac-m4.metal for Just 24 Hours Best USB-C Hub and Thunderbolt Dock for MacBook Air and Pro macos Best USB-C Hub and Thunderbolt Dock for MacBook Air and Pro Enable Bash Completion in Zsh on Linux Cheat Sheets Enable Bash Completion in Zsh on Linux

Leave a Comment

Press ESC to close