Skip to main content
Ghostty is a modern terminal emulator written in Zig that emphasizes native platform integration, blazing-fast performance, and stunning visual customization through GLSL shaders. It brings cutting-edge features while maintaining the speed of traditional terminals.

Why Ghostty?

Native Performance

Written in Zig with Metal/Vulkan rendering for maximum speed

Custom Shaders

GLSL shader support for cursor effects and visual customization

Modern Features

Splits, tabs, and modern terminal protocols

Platform Native

True native feel on macOS and Linux
Ghostty is currently in early access and rapidly evolving. The Gentleman.Dots configuration showcases its powerful shader system with 50+ custom cursor effects.

Installation

1

Install Ghostty

# Currently requires early access or building from source
brew install --cask ghostty

# Or from official releases
# Download from https://ghostty.org/
2

Install IosevkaTerm Nerd Font

# macOS
brew tap homebrew/cask-fonts
brew install font-iosevka-term-nerd-font

# Linux - Download from nerdfonts.com
3

Link Gentleman.Dots configuration

# Create config directory
mkdir -p ~/.config/ghostty

# Link the entire GentlemanGhostty directory
# This includes config, themes, and shaders
ln -sf ~/Gentleman.Dots/GentlemanGhostty/* ~/.config/ghostty/
4

Launch Ghostty

Open Ghostty and enjoy your modern terminal with shader effects!

Configuration Breakdown

The Gentleman.Dots Ghostty config (GentlemanGhostty/config) is feature-rich and includes shader customization:

Custom Shader System

config
# Enable custom GLSL shader for cursor effects
custom-shader = shaders/cursor_smear_gentleman.glsl
This is the standout feature of the Ghostty config. The shader creates a smooth cursor trail effect as you type.
The GentlemanGhostty/shaders/ directory contains 50+ shader options! Change custom-shader to any of these:
  • cursor_blaze.glsl - Fiery cursor trail
  • cursor_frozen.glsl - Icy, crystalline effect
  • cursor_smear_rainbow.glsl - Rainbow gradient trail
  • crt.glsl - Retro CRT monitor effect
  • starfield.glsl - Space background
  • And many more!

Transparency & Blur

config
background-opacity = 0.95
background-blur-radius = 20
Ghostty’s blur implementation is particularly smooth:
  • 95% opacity - Subtle transparency
  • 20px blur radius - Soft, modern background blur
  • Platform-native - Uses Metal on macOS, Vulkan on Linux

Window Decoration

config
gtk-tabs-location = hidden
window-decoration = false
Creates a minimal, distraction-free interface:
  • Hidden tab bar (use splits instead)
  • No window decorations for maximum screen space

Color Palette

The config uses a custom color scheme (not standard Kanagawa):
config
# Background and foreground
background = 06080f  # Deep blue-black
foreground = f3f6f9  # Soft white

# Cursor
cursor-color = e0c15a  # Golden yellow

# Selection
selection-background = 263356  # Deep blue
selection-foreground = f3f6f9  # Soft white
This unique color scheme complements the shader effects, with the golden cursor (#e0c15a) standing out beautifully against the deep background.

Normal Colors (0-7)

config
palette = 0=#06080f  # Black (background)
palette = 1=#cb7c94  # Red
palette = 2=#b7cc85  # Green
palette = 3=#ffe066  # Yellow
palette = 4=#7fb4ca  # Blue
palette = 5=#ff8dd7  # Magenta
palette = 6=#7aa89f  # Cyan
palette = 7=#f3f6f9  # White

Bright Colors (8-15)

config
palette = 8=#8a8fa3   # Bright black (gray)
palette = 9=#de8fa8   # Bright red
palette = 10=#d1e8a9  # Bright green
palette = 11=#fff7b1  # Bright yellow
palette = 12=#a3d4d5  # Bright blue
palette = 13=#ffaeea  # Bright magenta
palette = 14=#7fb4ca  # Bright cyan
palette = 15=#f3f6f9  # Bright white

Font Configuration

config
font-family = IosevkaTerm NF
font-size = 14
# font-size = 20  # Commented alternative for larger text

Window Sizing

config
window-padding-color = extend
window-step-resize = false
window-padding-balance = true
window-height = 100
window-width = 100
These settings create:
  • Full window coverage - 100% width and height
  • Balanced padding - Symmetric window padding
  • Extended padding color - Padding matches background

macOS Option Key Fix

config
# Make Option key work as Alt (left side only)
macos-option-as-alt = left

# Unbind conflicting shortcuts
keybind = alt+left=unbind
keybind = alt+right=unbind
The macos-option-as-alt = left setting enables Alt+f/Alt+b for word navigation in shells, but unbinds Alt+Arrow keys which macOS uses for word jumping in GUI apps.

Split Management

config
# Create splits
keybind = alt+v=new_split:right  # Vertical split
keybind = alt+d=new_split:down   # Horizontal split

# Navigate splits
keybind = alt+k=goto_split:up
keybind = alt+j=goto_split:down
keybind = alt+h=goto_split:left
keybind = alt+l=goto_split:right

# Resize splits
keybind = ctrl+shift+j=resize_split:up,10
keybind = ctrl+shift+k=resize_split:down,10
keybind = ctrl+shift+h=resize_split:left,10
keybind = ctrl+shift+l=resize_split:right,10
These Vim-style keybindings (hjkl) make split navigation feel natural for Vim/Neovim users. The config integrates seamlessly with the GentlemanNvim setup.

Special Keybindings

config
# Clear screen
keybind = cmd+k=clear_screen

# Write screen to file and paste path (for Neovim integration)
keybind = alt+s=write_screen_file:paste

# Shift+Enter sends proper escape sequence
keybind = shift+enter=text:\x1b\r
The alt+s binding is particularly clever:
  1. Captures terminal screen content to a file
  2. Pastes the file path
  3. Useful for opening terminal output in Neovim: alt+s then prepend nvim
The Gentleman.Dots config includes 50+ GLSL shaders in GentlemanGhostty/shaders/:

Cursor Trail Shaders

  • cursor_smear_gentleman.glsl - Default smooth trail (current config)
  • cursor_smear_fade.glsl - Fading trail effect
  • cursor_smear_glow.glsl - Glowing trail
  • cursor_smear_rainbow.glsl - Rainbow gradient trail
  • cursor_blaze.glsl - Fiery particle effect
  • cursor_blaze_tapered.glsl - Tapered flame effect
  • cursor_frozen.glsl - Icy, crystalline cursor
Example:
config
custom-shader = shaders/cursor_smear_rainbow.glsl

Key Features

Native Platform Integration

Ghostty feels truly native:
  • macOS: Uses native Swift/Metal for window management and rendering
  • Linux: Integrates with GTK and uses Vulkan for rendering
  • Proper font rendering: Uses platform font APIs (CoreText on macOS)

Performance

Startup

~50ms cold start

Memory

~20MB idle

Rendering

Metal/Vulkan GPU acceleration
Ghostty rivals Alacritty for raw speed while offering more features.

Split & Tab Management

Built-in tiling with intuitive keybindings:
# Create splits
Alt+V    # Split right
Alt+D    # Split down

# Navigate
Alt+H/J/K/L    # Vim-style navigation

# Resize
Ctrl+Shift+H/J/K/L    # Resize splits

Shell Integration

Works perfectly with all Gentleman.Dots shells:
# Full compatibility with Zsh features
# oh-my-zsh, powerlevel10k, etc. all work

Working with Gentleman.Dots

With or Without Tmux

Ghostty’s native splits mean tmux is optional: Option 1: Use Ghostty splits alone
# Ghostty's native splits with shaders work great
# Alt+V/Alt+D to create splits
# Alt+H/J/K/L to navigate
Option 2: Combine with tmux
# Use tmux for:
# - Session persistence
# - Remote sessions
# - Complex automation
tmux attach || tmux new
Ghostty’s shader effects work whether you use tmux or not, making it visually distinctive either way.

Neovim Integration

The alt+s keybinding creates a powerful Neovim workflow:
# Run a command with lots of output
npm run build

# Press Alt+S to capture output to file
# Then type:
nvim <cursor-is-here-with-path>

# Opens the output in Neovim for analysis

Customization Examples

Change Shader Effect

Try different cursor effects:
config
# Smooth trail (default)
custom-shader = shaders/cursor_smear_gentleman.glsl

# Rainbow trail
# custom-shader = shaders/cursor_smear_rainbow.glsl

# Fiery effect
# custom-shader = shaders/cursor_blaze.glsl

# CRT monitor
# custom-shader = shaders/crt.glsl

# No shader (maximum performance)
# custom-shader = 

Adjust Transparency

config
# More transparent
background-opacity = 0.85

# Less transparent
# background-opacity = 0.98

# Fully opaque
# background-opacity = 1.0

Alternative Font Sizes

config
# Smaller (more content)
font-size = 12

# Default
# font-size = 14

# Larger (presentations)
# font-size = 20

Custom Color Schemes

The config includes the Catppuccin Mocha theme:
# Try the included Catppuccin theme
# Edit config to import it:
# In config file, add:
import = themes/catppuccin-mocha.conf

Advanced Features

Conditional Configuration

Ghostty supports conditional config based on OS:
config
# macOS-specific settings
[macos]
macos-option-as-alt = left

# Linux-specific settings  
[linux]
gtk-titlebar = false

Configuration Reloading

Ghostty can reload config without restart:
# Edit config file, then:
# Send SIGUSR1 to reload
killall -SIGUSR1 ghostty

Multiple Configurations

Create different configs for different workflows:
# Create alternate config
cp ~/.config/ghostty/config ~/.config/ghostty/config-minimal

# Launch with specific config
ghostty --config ~/.config/ghostty/config-minimal

Performance Optimization

Shader Performance

Complex shaders impact performance:

Lightweight

  • cursor_smear*.glsl
  • gradient-background.glsl
  • dither.glsl

Performance-Heavy

  • inside-the-matrix.glsl
  • gears-and-belts.glsl
  • galaxy.glsl
  • crt.glsl (with scanlines)
For maximum performance on battery: set custom-shader = (empty) to disable shaders entirely.

Reduce Blur

config
# Less blur = better performance
background-blur-radius = 10

# No blur (fastest)
# background-blur-radius = 0

Troubleshooting

Shader Not Working

1

Check shader path

Ensure the shader file exists:
ls ~/.config/ghostty/shaders/cursor_smear_gentleman.glsl
2

Verify shader syntax

Ghostty logs shader errors. Check logs:
ghostty --verbose
3

Try simpler shader

Test with a minimal shader:
config
custom-shader = shaders/negative.glsl

Font Issues

Ghostty is strict about font names. Use exact PostScript name:
# Find exact font name
fc-list | grep -i iosevka

# Use exact name in config
font-family = IosevkaTerm NF

Split Navigation Not Working

# Ensure keybindings aren't conflicting
# Check if another app is capturing Alt+H/J/K/L

# Try alternative bindings in config:
keybind = ctrl+alt+k=goto_split:up
keybind = ctrl+alt+j=goto_split:down
keybind = ctrl+alt+h=goto_split:left
keybind = ctrl+alt+l=goto_split:right

Comparison

FeatureGhosttyAlacrittyWezTermKitty
Speed⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡
Shaders✅ GLSL✅ Limited
Splits✅ Native✅ Native✅ Layouts
Memory~20MB~15MB~50MB~30MB
Native Feel⭐⭐⭐⭐⭐⭐⭐⭐⭐
Config LanguageConfTOMLLuaConf
Maturity🆕 Early✅ Stable✅ Stable✅ Stable

Next Steps

Explore Shaders

Try different visual effects

Shell Configuration

Set up Zsh, Fish, or Nushell

Neovim Setup

Complete your development environment

Compare Terminals

See all terminal options

Resources

Build docs developers (and LLMs) love