Skip to main content

Fonts and Appearance

Kitty gives you fine-grained control over how text is rendered — from font family and size to ligatures, cursor shape, window padding, and background transparency.

Core Idea

Kitty uses the GPU for font rendering. The font atlas is stored in GPU memory, enabling fast glyph lookup, ligature shaping, and sub-pixel positioning for all visible characters.

Font Configuration

~/.config/kitty/kitty.conf
# Primary font
font_family JetBrains Mono
font_size 12.0

# Bold and italic variants (optional — kitty auto-selects if omitted)
bold_font JetBrains Mono Bold
italic_font JetBrains Mono Italic
bold_italic_font JetBrains Mono Bold Italic

# Fine-tuning
adjust_line_height 0
adjust_column_width 0
font_features JetBrains-Mono +liga +calt +ss01 +ss02 +ss03
tip

Use kitty --debug-fonts to verify which fonts kitty is loading and whether ligatures are active.

Font Rendering Pipeline

┌──────────┐ ┌──────────────┐ ┌────────────┐ ┌──────────┐
│ Font │ │ Font Atlas │ │ Glyph │ │ GPU │
│ File │ → │ (VRAM) │ → │ Shaper │ → │ Blitter │
│ .ttf │ │ │ │ (HarfBuzz)│ │ │
└──────────┘ └──────────────┘ └────────────┘ └────┬─────┘

┌──────────────┐
│ Framebuffer │
│ → Screen │
└──────────────┘

Ligature Control

# disable ligatures entirely
disable_ligatures always

# disable in certain modes
disable_ligatures cursor # disable when cursor is on text
disable_ligatures never # always show ligatures (default)
ValueBehavior
neverAlways render ligatures (default)
alwaysNever render ligatures
cursorDisable ligatures when cursor is on the glyph

Cursor Configuration

# shape: block, beam (I-beam), or underline
cursor_shape beam

# blink interval (seconds, 0 to disable)
cursor_blink_interval 0.5

# stop blinking after N seconds of inactivity
cursor_stop_blinking_after 15.0

# cursor color (empty = reverse of text color)
cursor #f5e0dc
cursor_text_color #1e1e2e
Cursor ShapeVisualBest for
blockVi/Vim insert mode replacement
beamStandard text editor feel
underlineTerminal purists

Window Padding and Margins

# padding inside the terminal area (left, top, right, bottom)
window_padding_width 4

# margin outside the terminal area (left, top, right, bottom)
window_margin_width 0

# single value applies to all sides, four values for each side
window_padding_width 2 4 2 4 # left top right bottom

Background Transparency

# opacity: 0.0 (fully transparent) to 1.0 (fully opaque)
background_opacity 0.95

# background blur (requires compositor like picom)
background_blur 8

# dimming intensity of inactive windows
inactive_text_alpha 0.75
warning

background_blur requires a compositor (picom, kwin, etc.) and may not work on all window managers. Test with your desktop environment first.

Tab Bar Customization

# tab bar style
tab_bar_style powerline

# tab bar edge: top or bottom
tab_bar_edge bottom

# tab separator
tab_separator " ┇ "

# active tab colors
active_tab_foreground #1e1e2e
active_tab_background #89b4fa

# inactive tab colors
inactive_tab_foreground #bac2de
inactive_tab_background #313244
Tab Bar StyleVisual
fadeTabs fade to background color
powerlineUnicode powerline separators
slantSlanted tab edges
customArrow-style separators
hiddenNo tab bar

Common Pitfalls

PitfallSymptomFix
Font name mismatchKitty falls back to monospaceUse kitty --debug-fonts to verify
Ligatures not showingFont doesn't have ligaturesCheck font with `fc-list
Transparency not workingBackground is opaqueEnsure compositor is running (picom &)
Adjust values too highCharacters clippedUse small increments (±1) for adjust_line_height
Cursor not blinkingcursor_blink_interval 0Set to a positive value like 0.5

Hands-On Practice

# create a test config
mkdir -p ~/.config/kitty

cat >> ~/.config/kitty/kitty.conf << 'EOF'

# Font settings
font_family JetBrains Mono
font_size 14.0
adjust_line_height 2

# Cursor
cursor_shape beam
cursor_blink_interval 0.5

# Padding
window_padding_width 6

# Transparency
background_opacity 0.92
EOF

# reload
kitty @ load-config

# debug fonts
kitty --debug-fonts 2>&1 | head -20

What's Next