Command Center Comparison
Deploying reconnaissance units... Full battlefield scan of all terminal emulators in the current meta. Identify strengths, weaknesses, and optimal deployment scenarios at a glance.
| Terminal | Platform | GPU | Config Format | Tabs | Splits | Images | Ligatures | Multiplexer | License |
|---|---|---|---|---|---|---|---|---|---|
| Kitty | Linux macOS | OpenGL | kitty.conf |
✓ | ✓ | ✓ | ✓ | Built-in | GPLv3 |
| WezTerm | All | OpenGL | .wezterm.lua |
✓ | ✓ | ✓ | ✓ | Built-in | MIT |
| Alacritty | All | OpenGL | alacritty.toml |
✗ | ✗ | ✗ | ✗ | ✗ | Apache 2 |
| Windows Terminal | Windows | DirectX | settings.json |
✓ | ✓ | Sixel | ✓ | ✗ | MIT |
| iTerm2 | macOS | Metal opt. | GUI / Profiles | ✓ | ✓ | ✓ | ✓ | tmux CC | GPLv2 |
| Ghostty | Linux macOS | Native | ghostty.conf |
✓ | ✓ | ✓ | ✓ | ✗ | MIT |
| GNOME Terminal | Linux | CPU | dconf / GUI | ✓ | ✗ | ✗ | ✗ | ✗ | GPLv3 |
| Konsole | Linux | CPU | GUI / Profiles | ✓ | ✓ | ✗ | ✗ | ✗ | GPLv2 |
| Foot | Linux | CPU | foot.ini |
✗ | ✗ | ✓ | ✓ | ✗ | MIT |
| xterm.js | Web | WebGL opt. | JS API | N/A | N/A | ✗ | ✓ | N/A | MIT |
Ghostty (platform-native: Metal on macOS, OpenGL on Linux), Kitty (OpenGL with custom renderer), WezTerm (OpenGL with glyph atlas), Alacritty (OpenGL with batch rendering)
Windows Terminal (DirectX 11/12 via ATLAS engine), iTerm2 (optional Metal renderer), xterm.js (optional WebGL addon for canvas rendering)
GNOME Terminal (VTE + Cairo), Konsole (QPainter), Foot (CPU but highly optimized for Wayland with damage-based rendering), xterm (X11 core rendering)
Initializing base operations manual... Before deploying specialized units, commanders must understand the underlying communication infrastructure.
A terminal emulator is a graphical application that emulates the behavior of a hardware video terminal. It provides a text-based interface to the operating system's shell by managing a pseudo-terminal (PTY) pair.
The architecture follows a well-defined chain of communication:
1┌──────────────────────────────────────────────────────────────┐
2│ USER INPUT (keyboard/mouse) │
3│ │ │
4│ ▼ │
5│ TERMINAL EMULATOR (Kitty, Alacritty, etc.) │
6│ │ writes to PTY master fd │
7│ ▼ │
8│ PTY MASTER ←────→ PTY SLAVE (/dev/pts/N) │
9│ (kernel tty layer: line discipline, ECHO, signals) │
10│ │ │ │
11│ │ ▼ │
12│ │ SHELL (bash, zsh, fish) │
13│ │ │ │
14│ │ ▼ │
15│ │ CHILD PROCESS (vim, htop, etc.) │
16│ │ │ │
17│ ▼ │ writes ANSI sequences │
18│ TERMINAL EMULATOR ◄──────┘ │
19│ │ parses escape codes, updates cell grid │
20│ ▼ │
21│ GPU/CPU RENDERER → SCREEN OUTPUT │
22└──────────────────────────────────────────────────────────────┘
The PTY master/slave pair is created via posix_openpt() or openpty(). The terminal emulator holds the master file descriptor; the shell reads from and writes to the slave. The kernel's line discipline layer handles signal generation (Ctrl+C → SIGINT), input echoing, and line buffering.
Terminal emulators interpret escape sequences embedded in the output stream. These sequences control cursor position, text styling, colors, and terminal state. All modern sequences start with ESC[ (CSI, Control Sequence Introducer).
1# Cursor movement
2\e[H # Move cursor to home (0,0)
3\e[5;10H # Move cursor to row 5, column 10
4\e[A # Move cursor up 1 line
5\e[2J # Clear entire screen
6
7# Text styling (SGR — Select Graphic Rendition)
8\e[0m # Reset all attributes
9\e[1m # Bold
10\e[3m # Italic
11\e[4m # Underline
12\e[31m # Set foreground color to red (3-bit)
13
14# 256-color mode
15\e[38;5;82m # Set fg to color 82 (bright green)
16\e[48;5;236m # Set bg to color 236 (dark gray)
17
18# 24-bit true color (16.7 million colors)
19\e[38;2;255;140;0m # Set fg to #FF8C00 (amber)
20\e[48;2;26;28;30m # Set bg to #1A1C1E (gunmetal)
Modern terminals must handle the full Unicode standard, which introduces complex rendering challenges beyond simple ASCII:
wcwidth() to determine character width, but ambiguous-width characters (e.g., some symbols) vary by locale.U+0301 (combining acute accent) must overlay the preceding base character without consuming a cell.👨💻 is actually three codepoints joined. Terminals must understand grapheme cluster boundaries.U+FE0E (text) and U+FE0F (emoji) control whether a character renders as text or as a color emoji glyph.font.fallback configuration in alacritty.toml for complete coverage.
24-bit true color (16.7 million colors) is supported by all modern GPU-accelerated terminals. Legacy terminals and some remote environments are limited to 256 colors or 16-color ANSI palettes.
// TEST TRUE COLOR SUPPORT1# Print a gradient to test 24-bit color
2awk 'BEGIN{
3 for (i = 0; i <= 255; i++) {
4 printf "\033[48;2;%d;%d;0m ", i, 255-i
5 }
6 printf "\033[0m\n"
7}'
8
9# Check COLORTERM environment variable
10echo $COLORTERM # Should output "truecolor" or "24bit"
Open-source font rasterizer and text shaper. FreeType handles glyph rasterization with optional subpixel antialiasing; HarfBuzz performs OpenType layout (ligatures, kerning). Used by Kitty, Alacritty, and Foot.
Apple's native text rendering framework. Provides high-quality subpixel antialiasing tuned for Retina displays. Used by iTerm2 and Ghostty on macOS. Handles font fallback and emoji color glyphs natively.
Microsoft's hardware-accelerated text rendering API. Supports ClearType subpixel rendering and variable fonts. Used by Windows Terminal and WezTerm on Windows. Integrated with Direct2D for GPU-accelerated layout.
GPU-accelerated terminals pre-rasterize glyphs into texture atlases uploaded to the GPU. Each cell references an atlas coordinate, enabling batch rendering of the entire grid in a single draw call. This is why Alacritty and Kitty feel instant even at 4K resolution.
Modern terminals offload rendering from the CPU to the GPU, dramatically improving performance for large scrollback buffers, rapid output, and high-DPI displays.
cat hugefile.log). For typical interactive shell usage, even CPU-rendered terminals like GNOME Terminal and Foot perform adequately. The real advantage of GPU rendering is latency: input-to-screen time drops below 5ms in terminals like Ghostty and Alacritty.
Elite reconnaissance unit deployed. Kovid Goyal's GPU-accelerated terminal with a scripting framework, graphics protocol, and built-in multiplexer. A high-APM power user's weapon of choice.
curl -L sw.kovidgoyal.net/kitty/installer.sh | sh /dev/stdin
brew install --cask kitty
sudo apt install kitty
sudo pacman -S kitty
Kitty uses a simple key-value configuration file at ~/.config/kitty/kitty.conf. No TOML, YAML, or Lua — just plain key value pairs with comments. The configuration is live-reloadable with ctrl+shift+f5.
1# Font configuration
2font_family JetBrains Mono
3bold_font auto
4italic_font auto
5font_size 13.0
6
7# Cursor
8cursor_shape beam
9cursor_blink_interval 0.5
10
11# Scrollback
12scrollback_lines 10000
13scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER
14
15# Performance
16repaint_delay 10
17input_delay 3
18sync_to_monitor yes
19
20# Window layout
21enabled_layouts splits,tall,fat,grid,stack
22window_padding_width 8
23
24# Tab bar
25tab_bar_style powerline
26tab_powerline_style slanted
27
28# Color scheme (Catppuccin Mocha)
29foreground #CDD6F4
30background #1E1E2E
31background_opacity 0.95
32
33# Key mappings
34map ctrl+shift+enter launch --cwd=current
35map ctrl+shift+t new_tab_with_cwd
36map ctrl+shift+h neighboring_window left
37map ctrl+shift+l neighboring_window right
Python-based extension system. Built-in kittens include icat (image display), diff (side-by-side diff viewer), unicode_input (character picker), hints (URL/path extractor), and clipboard. Write custom kittens with the kitty Python API.
The Kitty graphics protocol enables inline image display with full alpha compositing, animation support, and Unicode placeholder positioning. Adopted by WezTerm, Konsole, and wayland-native terminals. Supports PNG, GIF, JPEG, and BMP.
Control kitty instances programmatically via kitty @ set-colors, kitty @ launch, kitty @ focus-window, etc. Enables scripted workspace setups and dynamic theming. Requires allow_remote_control yes in config.
The kitten ssh command replaces plain SSH with automatic shell integration on remote hosts. Transfers terminfo, copies shell config, and enables remote image display over the Kitty graphics protocol without any setup on the remote machine.
Kitty's graphics protocol allows displaying images directly in the terminal. The icat kitten provides a simple CLI interface:
1# Display an image inline
2kitty +kitten icat image.png
3
4# Display with specific dimensions
5kitty +kitten icat --place 40x20@0x0 photo.jpg
6
7# Display from URL
8kitty +kitten icat https://placekitten.com/800/600
9
10# Use in scripts (e.g., file manager previews)
11# Works with ranger, lf, yazi for image previews
12kitty +kitten icat --clear
13kitty +kitten icat --transfer-mode=stream < image.png
14
15# Animated GIFs play inline
16kitty +kitten icat animation.gif
notcurses, chafa, and timg. Applications like ranger, yazi, and neovim (via plugins) can detect and use the protocol automatically.
Kitty ships with 300+ built-in themes and supports automatic dark/light mode switching based on OS appearance settings.
// THEME MANAGEMENT1# Browse and apply themes interactively
2kitty +kitten themes
3
4# Apply a theme by name
5kitty +kitten themes --reload-in=all Catppuccin-Mocha
6
7# Live-reload colors without restarting
8kitty @ set-colors --all ~/.config/kitty/themes/nord.conf
9
10# Include theme file in kitty.conf
11include themes/catppuccin-mocha.conf
| Platform | Status | Notes |
|---|---|---|
| Linux | ✓ Full Support | Primary development target. X11 and Wayland native. Best feature coverage including all kittens and graphics protocol. |
| macOS | ✓ Full Support | Native .app bundle. Uses CoreText for rendering. Some macOS-specific keybinding differences. Homebrew cask available. |
| Windows | ✗ Not Supported | No native Windows support. Can be used through WSL2 with an X server (XWayland) or natively in WSL2 GUI apps (WSLg). |
Heavy assault unit online. Wez Furlong's Rust-built GPU terminal combines a built-in multiplexer, SSH domain management, and full Lua scripting into a single cross-platform powerhouse. Maximum firepower on every front.
brew install --cask wezterm
winget install wez.wezterm
flatpak install flathub org.wezfurlong.wezterm
curl -fsSL https://apt.fury.io/wez/gpg.key \
| sudo gpg --dearmor -o /usr/share/keyrings/wezterm.gpg
sudo apt install wezterm
WezTerm uses Lua for its entire configuration, giving you the full power of a real programming language. The config file lives at ~/.wezterm.lua (or $XDG_CONFIG_HOME/wezterm/wezterm.lua on Linux). Changes are hot-reloaded automatically — no restart needed.
1local wezterm = require 'wezterm'
2local config = {}
3
4-- Use config_builder for better error messages
5if wezterm.config_builder then
6 config = wezterm.config_builder()
7end
8
9-- Font & appearance
10config.font = wezterm.font 'JetBrains Mono'
11config.font_size = 13.0
12config.color_scheme = 'Catppuccin Mocha'
13config.enable_tab_bar = true
14config.window_background_opacity = 0.95
15
16-- Window chrome
17config.window_decorations = "RESIZE"
18config.window_padding = { left = 8, right = 8, top = 8, bottom = 8 }
19
20-- Multiplexer & tabs
21config.use_fancy_tab_bar = false
22config.tab_max_width = 25
23
24-- Leader key (like tmux prefix)
25config.leader = { key = 'a', mods = 'CTRL', timeout_milliseconds = 1000 }
26
27return config
WezTerm includes a full multiplexer with tabs, panes (splits), and workspaces — no tmux required. Panes can be split horizontally or vertically, resized, and zoomed. Supports session persistence through the wezterm connect domain system.
Connect to remote hosts as native multiplexer domains. Remote tabs and panes feel local — WezTerm handles the mux protocol over SSH. Supports agent forwarding, jump hosts, and automatic reconnection on network interruptions.
Full Lua 5.4 runtime embedded in the config. Define custom keybindings, event handlers, dynamic tab titles, status bar widgets, and conditional logic based on hostname, OS, or time of day. Supports wezterm.action callbacks and wezterm.on() event hooks.
Configurable leader key system inspired by tmux and Vim. Chain multi-key sequences like LEADER + | for vertical split, LEADER + - for horizontal split. Timeout is adjustable and visual indicator shows when leader is active.
WezTerm's SSH domain feature allows you to treat remote machines as native multiplexer domains. Tabs opened in an SSH domain run on the remote host with full mux capabilities.
// SSH DOMAIN CONFIGURATION 1-- Define SSH domains in wezterm.lua
2config.ssh_domains = {
3 {
4 name = 'production',
5 remote_address = 'prod.example.com',
6 username = 'deploy',
7 remote_wezterm_path = '/usr/local/bin/wezterm',
8 },
9 {
10 name = 'devbox',
11 remote_address = '192.168.1.50:22',
12 username = 'dev',
13 multiplexing = 'WezTerm',
14 },
15}
16
17-- Connect from CLI:
18-- wezterm connect production
19-- wezterm connect devbox
wezterm-mux-server --daemonize. Clients connect via wezterm connect unix for local sessions or wezterm connect <domain> for remote ones. Sessions persist even after the GUI disconnects — like tmux, but integrated.
WezTerm's Lua scripting has spawned a growing ecosystem of community plugins and configuration modules, collected in the awesome-wezterm repository.
-- plugin: wezterm-session-manager
local session = require 'session-manager'
wezterm.on('save_session', function(win)
session.save_state(win)
end)
-- plugin: smart-splits.nvim integration
local smart = require 'smart-splits'
smart.setup(config)
wezterm.on('update-right-status',
function(window, pane)
window:set_right_status(
wezterm.format({
{Text = pane:get_domain_name()}
})
)
end)
local scheme = wezterm.gui
.get_appearance()
if scheme == 'Dark' then
config.color_scheme = 'Catppuccin Mocha'
else
config.color_scheme = 'Catppuccin Latte'
end
WezTerm supports three inline image display protocols, making it one of the most compatible terminals for TUI applications that render graphics.
| Protocol | Status | Details |
|---|---|---|
| iTerm2 Image Protocol | ✓ Supported | Full support for imgcat and iTerm2 inline images. Works with tools like imgcat, chafa, and viu. |
| Kitty Graphics Protocol | ✓ Supported | Native support for the Kitty graphics protocol. Works with kitty +kitten icat, ranger, yazi, and Neovim image plugins. |
| Sixel | ✓ Supported | Sixel graphics rendering for legacy compatibility with tools like libsixel, lsix, and gnuplot sixel output. |
| Platform | Status | Notes |
|---|---|---|
| Linux | ✓ Full Support | X11 and Wayland. Flatpak, AppImage, and distro packages available. Full GPU acceleration via OpenGL. |
| macOS | ✓ Full Support | Native .app bundle. Metal GPU backend. Homebrew cask available. Retina display support. |
| Windows | ✓ Full Support | Native Windows build. DirectX GPU backend. Winget, Scoop, and Chocolatey packages. Full ConPTY integration. |
| FreeBSD | ✓ Full Support | Available in FreeBSD ports and can be built from source with Cargo. OpenGL rendering. |
Surgical strike unit deployed. Built for one purpose: raw speed. No tabs, no splits, no images — just the fastest terminal rendering on the battlefield. Pair it with tmux for an unstoppable offensive line.
brew install --cask alacritty
cargo install alacritty
sudo apt install alacritty
winget install Alacritty.Alacritty
scoop install alacritty
sudo pacman -S alacritty
Alacritty uses TOML for its configuration (migrated from YAML in v0.13). The config file lives at ~/.config/alacritty/alacritty.toml (or %APPDATA%\alacritty\alacritty.toml on Windows). Changes are detected and applied automatically on save.
1# Window settings
2[window]
3opacity = 0.95
4padding = { x = 8, y = 8 }
5decorations = "Full"
6dynamic_title = true
7
8# Font configuration
9[font]
10size = 13.0
11
12[font.normal]
13family = "JetBrains Mono"
14style = "Regular"
15
16[font.bold]
17style = "Bold"
18
19# Color scheme
20[colors.primary]
21background = "#1a1c1e"
22foreground = "#d0d4d8"
23
24[colors.normal]
25black = "#1a1c1e"
26red = "#cc2222"
27green = "#00cc44"
28yellow = "#ffa500"
29blue = "#3366ff"
30magenta = "#cc66ff"
31cyan = "#00b4b4"
32white = "#d0d4d8"
33
34# Scrollback
35[scrolling]
36history = 10000
37multiplier = 3
font.builtin_box_drawing = false), and no scripting engine. The philosophy: do one thing — render terminal output — and do it faster than anything else. Every feature request is evaluated against the question: "Does this belong in a terminal emulator, or in another tool?"
Alacritty has a built-in Vi mode for keyboard-driven scrollback navigation and text selection. Activate it with Ctrl+Shift+Space (default binding).
| Key | Action | Details |
|---|---|---|
h/j/k/l |
Directional movement | Move cursor left, down, up, right through scrollback buffer |
w/b/e |
Word motions | Jump by word forward, backward, end-of-word |
0 / $ |
Line start/end | Jump to beginning or end of current line |
* / # |
Search word under cursor | Search forward (*) or backward (#) for the word under the cursor |
{ / } |
Paragraph motions | Jump to previous or next empty line (paragraph boundary) |
/ / ? |
Search | Forward search (/) or backward search (?) with regex support |
v / V |
Visual selection | Start character (v) or line (V) selection mode |
y |
Yank | Copy selected text to clipboard |
Alacritty migrated from YAML to TOML configuration in v0.13. The built-in migration tool handles the conversion automatically.
// MIGRATION COMMANDS1# Automatically convert alacritty.yml to alacritty.toml
2alacritty migrate
3
4# Dry run — preview changes without writing
5alacritty migrate --dry-run
6
7# Migrate a specific file
8alacritty migrate -c ~/.config/alacritty/alacritty.yml
9
10# The old YAML file is kept as a backup (.yml.bak)
11# Alacritty ignores .yml files when .toml exists
Alacritty's minimalist architecture translates directly to best-in-class performance metrics. These benchmarks represent typical measurements on modern hardware.
| Metric | Alacritty | Kitty | WezTerm | GNOME Terminal |
|---|---|---|---|---|
| Input Latency | ~2ms | ~5ms | ~8ms | ~12ms |
| Memory (Idle) | ~30 MB | ~55 MB | ~80 MB | ~45 MB |
| Throughput (cat large file) | Fastest | Fast | Moderate | Slow |
| Startup Time | ~50ms | ~80ms | ~120ms | ~60ms |
| GPU VRAM | Minimal | Low | Moderate | N/A (CPU) |
cat of multi-GB log files, heavy compiler output). For typical interactive use, the difference between GPU-accelerated terminals is imperceptible to most users.
The recommended Alacritty workflow pairs it with tmux for multiplexing. This combination gives you Alacritty's raw speed with tmux's tabs, splits, session persistence, and remote attach capabilities.
// ALACRITTY + TMUX CONFIGURATION 1# alacritty.toml — auto-launch tmux
2[terminal]
3shell = { program = "/usr/bin/tmux", args = ["new-session", "-A", "-s", "main"] }
4
5# Keybindings that pass through to tmux
6[[keyboard.bindings]]
7key = "N"
8mods = "Control|Shift"
9chars = "\u0001c" # Ctrl-A + c = new tmux window
10
11[[keyboard.bindings]]
12key = "D"
13mods = "Control|Shift"
14chars = "\u0001%" # Ctrl-A + % = vertical split
// TMUX.CONF — OPTIMIZE FOR ALACRITTY
1# Enable true color and undercurl
2set -g default-terminal "tmux-256color"
3set -ag terminal-overrides ",alacritty:RGB"
4set -ag terminal-overrides ',*:Smulx=\E[4::%p1%dm'
5
6# Reduce escape time for snappy Vim/Neovim
7set -sg escape-time 10
8
9# Enable focus events (for Neovim autoread)
10set -g focus-events on
| Platform | Status | Notes |
|---|---|---|
| Linux | ✓ Full Support | X11 and Wayland. Available in most distro repos. Primary development target alongside macOS. |
| macOS | ✓ Full Support | Native .app bundle. Homebrew cask. Uses Core Graphics for font rendering with OpenGL display. |
| Windows | ✓ Full Support | Native Windows build via ConPTY. Winget and Scoop packages. Works with PowerShell, cmd, and WSL shells. |
| FreeBSD | ✓ Full Support | Available in FreeBSD ports. Builds from source with Cargo. Community-maintained port. |
Microsoft's garrison fortification complete. The modern terminal for Windows 10 and 11 — GPU-rendered, tab-enabled, profile-driven, and deeply integrated with WSL, PowerShell 7, and the Windows shell ecosystem. The default command post for the entire Windows platform.
# Search "Windows Terminal" in Microsoft Store
# Or open directly:
ms-windows-store://pdp/?productid=9N0DX20HK701
winget install Microsoft.WindowsTerminal
scoop bucket add extras
scoop install windows-terminal
# Already installed and set as default
# Verify: Settings > Privacy > For developers
# > Terminal: Windows Terminal
Windows Terminal uses a JSON settings file with a GUI settings editor. Open settings with Ctrl+, (GUI) or Ctrl+Shift+, (JSON). The file lives at %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json.
1{
2 "defaultProfile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
3 "theme": "dark",
4 "profiles": {
5 "defaults": {
6 "font": {
7 "face": "CaskaydiaCove Nerd Font",
8 "size": 13
9 },
10 "opacity": 90,
11 "useAcrylic": true,
12 "padding": "8",
13 "cursorShape": "bar"
14 },
15 "list": [
16 {
17 "name": "PowerShell 7",
18 "source": "Windows.Terminal.PowershellCore",
19 "colorScheme": "Catppuccin Mocha"
20 },
21 {
22 "name": "Ubuntu (WSL)",
23 "source": "Windows.Terminal.Wsl",
24 "startingDirectory": "~"
25 }
26 ]
27 }
28}
Each shell gets its own profile with independent settings: font, color scheme, starting directory, icon, background image, and more. Profiles auto-detect installed shells including PowerShell, cmd, WSL distros, Azure Cloud Shell, Git Bash, and Cygwin.
First-class Windows Subsystem for Linux support. WSL distros appear as automatic profiles. Supports wsl.exe launch, \\wsl$ path navigation, and GPU passthrough for CUDA/OpenCL workloads in WSL2. Run Linux GUIs alongside Windows shells.
Drop-down terminal window activated with a global hotkey (default: Win+`). The terminal slides down from the top of the screen like a Quake console. Configurable with "launchMode": "focus" and wt -w _quake.
VS Code-style command palette activated with Ctrl+Shift+P. Search and execute any action: switch profiles, change color schemes, split panes, adjust font size, toggle focus mode. Supports fuzzy matching and keybinding hints.
Windows Terminal v1.15+ introduced shell integration via semantic zones, command marks, and scroll-to-mark navigation. This allows the terminal to understand command boundaries, detect success/failure, and enable structured navigation.
// POWERSHELL SHELL INTEGRATION 1# Add to $PROFILE for PowerShell 7.x
2# Enables command marks, semantic zones, and CWD tracking
3
4$Global:__LastHistoryId = -1
5
6function Global:__Terminal-Get-LastExitCode {
7 if ($? -eq $True) { return 0 }
8 return -1
9}
10
11# Scroll between commands: Ctrl+Shift+Up / Down
12# Select command output: Ctrl+Shift+Click
13# Recent command menu: Ctrl+Shift+P > "scroll to mark"
Windows Terminal offers deep visual customization including acrylic/mica transparency, background images, color schemes, and multi-window layouts.
// VISUAL CUSTOMIZATION (settings.json) 1// Acrylic transparency
2"useAcrylic": true,
3"opacity": 85,
4
5// Mica material (Windows 11)
6"useAcrylic": false,
7"opacity": 50,
8
9// Background image
10"backgroundImage": "C:/Users/me/bg.png",
11"backgroundImageStretchMode": "uniformToFill",
12"backgroundImageOpacity": 0.15,
13
14// Focus mode (hides tabs and title bar)
15// Toggle: Ctrl+Shift+P > "Toggle focus mode"
16"launchMode": "focus",
17
18// Startup actions (open split layout)
19"startupActions": "new-tab -p PowerShell ; split-pane -p Ubuntu -H"
Windows Terminal pairs best with PowerShell 7.x (pwsh), Microsoft's cross-platform successor to Windows PowerShell 5.1. Combining them unlocks modern prompt engines, predictive IntelliSense, and rich shell integration.
// POWERSHELL 7 SETUP 1# Install PowerShell 7
2winget install Microsoft.PowerShell
3
4# Install Oh My Posh for prompt theming
5winget install JanDeDobbeleer.OhMyPosh
6
7# Add to $PROFILE (pwsh):
8oh-my-posh init pwsh --config
9 "$env:POSH_THEMES_PATH\catppuccin_mocha.omp.json" |
10 Invoke-Expression
11
12# Enable predictive IntelliSense
13Set-PSReadLineOption -PredictionSource HistoryAndPlugin
14Set-PSReadLineOption -PredictionViewStyle ListView
15
16# Enable icons in terminal (Terminal-Icons module)
17Install-Module -Name Terminal-Icons -Repository PSGallery
18Import-Module Terminal-Icons
Windows Terminal supports custom color schemes defined in settings.json and includes several bundled themes. The community has built hundreds of additional schemes.
Bundled: Campbell, One Half Dark,
One Half Light, Solarized Dark,
Solarized Light, Tango Dark,
Tango Light, Vintage
// Add to "schemes" array:
{
"name": "Catppuccin Mocha",
"background": "#1E1E2E",
"foreground": "#CDD6F4",
"cursorColor": "#F5E0DC"
}
"theme": "dark",
// Or custom:
"themes": [{
"name": "HUD",
"tab": {
"background": "#1a1c1eFF"
}
}]
// Install via package managers
// Fragments auto-merge into settings
// Location: %LOCALAPPDATA%\
// Microsoft\Windows Terminal\
// Fragments\{app-name}\
| Platform | Status | Notes |
|---|---|---|
| Windows 11 | ✓ Default Terminal | Pre-installed since 22H2. Set as the default terminal for all console applications. Receives updates via Microsoft Store. |
| Windows 10 | ✓ Full Support | Requires Windows 10 1903 (build 18362) or later. Install from Microsoft Store or winget. Not the default — must be set manually. |
| Linux | ✗ Not Available | Windows Terminal is Windows-only. The underlying rendering engine (Cascadia) is open source, but no Linux build exists. |
| macOS | ✗ Not Available | No macOS support. Consider iTerm2 or one of the cross-platform alternatives (WezTerm, Kitty, Alacritty) instead. |
conhost.exe that powered cmd.exe and PowerShell windows since Windows 7. Conhost is still present on the system for backward compatibility, but all new console allocations on Windows 11 are routed through Windows Terminal by default. You can revert to conhost in Settings if needed, though there is rarely a reason to do so.
macOS command post establishing secure channel. Apple's platform-exclusive powerhouse terminal with deep shell integration, AI-assisted operations, and a Python API for custom automation. The veteran commander of the macOS theatre.
brew install --cask iterm2
# Download from https://iterm2.com/downloads.html
# Drag iTerm.app to /Applications
# Or use the stable release direct link:
curl -L https://iterm2.com/downloads/stable/latest -o iTerm2.zip
unzip iTerm2.zip && mv iTerm.app /Applications/
iTerm2's profile system lets you define independent configurations for fonts, colors, key mappings, window behavior, and shell commands. Profiles can auto-switch based on the current hostname, username, directory path, or running application — detected via shell integration escape sequences.
The it2 shell integration toolkit injects escape sequences into your prompt to enable semantic zones, command marks, per-command exit status tracking, and automatic profile switching. Install with iTerm2 > Install Shell Integration or source the script manually in your shell profile.
Triggers perform actions when text matching a regex appears in the terminal: highlight text, send notifications, run scripts, set badges, or stop scrolling. Badges display a large, semi-transparent watermark label in the terminal showing dynamic info like hostname or git branch.
iTerm2 exposes a full Python 3 API via a WebSocket connection. Automate window creation, monitor sessions, react to events, inject text, inspect terminal state, and build custom toolbelt panels. Install with pip3 install iterm2 and run scripts from Scripts > Manage.
iTerm2 can automatically switch profiles based on runtime context detected through shell integration. This enables different colors, fonts, and behaviors per environment without any manual switching.
// PROFILE SWITCHING RULES 1# Profiles > Advanced > Automatic Profile Switching
2# Rules use the format: criteria:value
3
4# Switch to "Production" profile when SSH'd to prod hosts
5Hostname: prod-*.example.com
6
7# Switch to "Root" profile when running as root
8Username: root
9
10# Switch to "Project" profile in specific directories
11Path: /Users/dev/projects/frontend*
12
13# Combine criteria with "Application" matching
14Application: python3
Shell integration transforms iTerm2 from a passive text renderer into an intelligent command environment. Once installed, the terminal understands command boundaries, tracks exit codes, and enables structured navigation.
// SHELL INTEGRATION SETUP 1# Install shell integration (adds to .bash_profile/.zshrc)
2# iTerm2 > Install Shell Integration (menu)
3# Or manually source the script:
4source ~/.iterm2_shell_integration.zsh
5
6# it2 utilities installed alongside shell integration:
7it2attention fireworks # trigger attention animation
8it2check # verify shell integration is active
9it2copy < file.txt # copy to clipboard (works over SSH)
10it2dl remote-file.txt # download file via terminal (works over SSH)
11it2ul # upload file to remote host
12it2setcolor preset Solarized Dark # change color preset
13it2setkeylabel set F1 "Deploy" # set Touch Bar labels
With shell integration active, these navigation features become available:
Cmd+Shift+Up/Down.Configure a system-wide hotkey to toggle a dedicated terminal window that drops down from the top of the screen (or slides from any edge). Operates independently from regular windows with its own profile. Activate via Preferences > Keys > Hotkey. Supports multiple hotkey windows with different profiles.
iTerm2 v3.5+ includes a built-in AI assistant that can read terminal contents, explain errors, suggest commands, and compose scripts. Connects to OpenAI, Anthropic, or local LLMs. Accessible via Edit > Engage AI or Cmd+Shift+.. The Composer feature provides AI-assisted command completion inline at the prompt.
Display images directly in the terminal with the imgcat utility. Supports PNG, JPEG, GIF, and PDF rendering inline. Works over SSH when shell integration is installed on the remote host. Applications like ranger, yazi, and matplotlib can detect and use the iTerm2 image protocol.
Send keyboard input simultaneously to all panes in a tab, all tabs in a window, or all sessions across all windows. Essential for running the same commands on multiple servers at once. Toggle with Shell > Broadcast Input or Cmd+Opt+I.
Save the complete layout of windows, tabs, splits, and profiles as a named arrangement. Restore instantly with Window > Restore Window Arrangement. Set a default arrangement to open on launch. Includes session state, working directories, and running commands.
Full regex search through scrollback with Cmd+F. Matches highlight instantly as you type. Supports capture groups, case-insensitive mode, and search history. Results persist while scrolling. Combined with triggers, you can permanently highlight patterns like error codes or IP addresses.
iTerm2's tmux integration mode is a unique feature that translates tmux windows and panes into native iTerm2 tabs and split panes. Instead of rendering tmux's own UI inside a terminal, iTerm2 becomes the tmux client — so you get native scrollback, native split panes, and native keyboard shortcuts while tmux manages the sessions on the server.
// TMUX INTEGRATION 1# Start a new tmux session with iTerm2 integration
2tmux -CC
3
4# Attach to an existing tmux session with integration
5tmux -CC attach -t mysession
6
7# How it works:
8# - tmux -CC starts tmux in "control mode"
9# - iTerm2 reads tmux's control protocol output
10# - Each tmux window becomes a native iTerm2 tab
11# - Each tmux pane becomes a native iTerm2 split
12# - Native scrollback replaces tmux's scroll mode
13# - Disconnect/reconnect preserves all sessions
14
15# Works over SSH too:
16ssh server -t 'tmux -CC attach || tmux -CC'
Cmd+C/V for copy/paste instead of tmux's prefix-based copy mode. The sessions persist on the remote server even if iTerm2 crashes.
| Platform | Status | Notes |
|---|---|---|
| macOS | ✓ Full Support | Primary and only platform. Requires macOS 10.15 (Catalina) or later. Native .app bundle with Metal GPU rendering. Apple Silicon and Intel supported. |
| Linux | ✗ Not Available | No Linux port exists. Consider Kitty, WezTerm, or Ghostty for comparable feature sets on Linux. |
| Windows | ✗ Not Available | No Windows support. Windows Terminal or WezTerm are the closest alternatives on Windows. |
Stealth unit materializing on the battlefield. Mitchell Hashimoto's Zig-powered native terminal, built from scratch with platform-native rendering, an embeddable core library, and performance benchmarks that challenge every existing unit on the field.
brew install --cask ghostty
sudo pacman -S ghostty
flatpak install flathub com.mitchellh.ghostty
git clone https://github.com/ghostty-org/ghostty
cd ghostty && zig build -Doptimize=ReleaseFast
Ghostty uses a simple key-value configuration file at ~/.config/ghostty/config. No TOML, YAML, or JSON — just key = value pairs. The format is intentionally minimal and easy to read. Changes require restarting the terminal or pressing Cmd+Shift+, (macOS) to reload.
1# Font configuration
2font-family = "JetBrains Mono"
3font-size = 13
4
5# Theme (300+ built-in themes)
6theme = catppuccin-mocha
7
8# Window appearance
9window-decoration = false
10background-opacity = 0.95
11window-padding-x = 8
12window-padding-y = 8
13
14# Cursor
15cursor-style = bar
16cursor-style-blink = true
17
18# Mouse & clipboard
19copy-on-select = clipboard
20mouse-scroll-multiplier = 3
21
22# Keybindings (override defaults)
23keybind = ctrl+shift+t=new_tab
24keybind = ctrl+shift+enter=new_split:right
Ghostty uses SwiftUI and AppKit on macOS and GTK4 on Linux — not a cross-platform UI toolkit. This means native window management, native font rendering, native accessibility APIs, and native look-and-feel on each platform. Tabs, splits, and menus all use the platform's own widget toolkit.
On macOS, Ghostty uses Apple's Metal API for GPU-accelerated rendering with minimal driver overhead. On Linux, it uses OpenGL. The custom renderer handles glyph atlases, background decoration, and cursor animation with sub-5ms input-to-screen latency in typical usage.
Full support for the Kitty graphics protocol, enabling inline image display from tools like kitty +kitten icat, chafa, timg, and TUI file managers like yazi. Supports PNG, JPEG, GIF, and animated image rendering within the terminal grid.
The terminal emulation core is a standalone C-ABI compatible library called libghostty. This architecture enables embedding Ghostty's terminal engine in other applications. The VT parser component (libghostty-vt) can be used independently for parsing terminal escape sequences.
Ghostty was designed from the ground up for speed. Benchmarks from the initial release show significant advantages over established terminals in several key metrics.
| Benchmark | Ghostty | vs. Competitors |
|---|---|---|
| Plain text throughput (cat large file) | Baseline | ~4x faster than iTerm2 and Kitty in vtebench plain text reading |
| Scrolling performance | ~2x faster | Approximately 2x faster than Terminal.app at rapid scrolling with dense output |
| Memory usage (idle, single tab) | ~129 MB | vs. ~207 MB (iTerm2), ~180 MB (Kitty), ~95 MB (Alacritty) |
| Startup time | <100ms | Cold start to first frame rendered. Native app startup, no runtime initialization overhead. |
Ghostty is written from scratch in Zig, a systems programming language designed as a successor to C. This choice has significant implications for the project:
Ghostty's architecture cleanly separates the terminal emulation engine (libghostty) from the platform-specific UI shell. This design enables several use cases beyond a standalone terminal app:
// LIBGHOSTTY ARCHITECTURE 1# Ghostty's layered architecture:
2
3+---------------------------+
4| macOS App (SwiftUI) | <-- Platform Shell
5+---------------------------+
6| libghostty (C ABI) | <-- Core Engine
7| - VT parser |
8| - Grid/state management |
9| - GPU renderer |
10+---------------------------+
11
12+---------------------------+
13| Linux App (GTK4) | <-- Different Shell, Same Core
14+---------------------------+
15| libghostty (C ABI) | <-- Identical Engine
16+---------------------------+
The Neovim project has explored adopting libghostty-vt as a replacement for its internal VT parser, which would bring Ghostty's fast, well-tested parsing to the editor. Other applications — IDE embedded terminals, TUI frameworks, and testing tools — could similarly benefit from a shared, high-quality terminal emulation library.
Ghostty is a young project that shipped its first public release in December 2024. While it is stable and full-featured for daily use, some areas are still maturing:
| Platform | Status | Notes |
|---|---|---|
| macOS | ✓ Full Support | Native SwiftUI app. Metal GPU rendering. Requires macOS 13 (Ventura) or later. Apple Silicon and Intel supported. Homebrew cask available. |
| Linux | ✓ Full Support | Native GTK4 app. OpenGL rendering. X11 and Wayland support. Available via Flatpak, AUR, and distro packages. PPA for Ubuntu/Debian. |
| Windows | ✗ Planned | Windows support is on the roadmap but no timeline has been committed. The libghostty architecture makes a Windows port feasible with a native Win32/WinUI shell. |
Veteran units reporting for briefing. These long-serving terminals form the backbone of desktop Linux, macOS, and X11 environments. Some are being phased out by GPU-accelerated replacements; others remain entrenched in their niches. Know your roster.
A comparative assessment of the classic terminal units still active on the battlefield. These terminals prioritize stability and integration with their respective desktop environments over cutting-edge features.
| Terminal | Platform | Engine | GPU Accel. | True Color | Images | Splits | Status |
|---|---|---|---|---|---|---|---|
| GNOME Terminal | Linux | VTE | ✗ | ✓ | ✗ | ✗ | Being replaced by Ptyxis |
| Konsole | Linux | Custom (KDE) | ✗ | ✓ | ✓ Kitty Protocol | ✓ | Active development |
| Terminal.app | macOS | Apple (private) | ✗ | ✓ | ✗ | ✗ | Maintenance mode |
| xterm | Linux | Custom (X11) | ✗ | ✓ | ✗ | ✗ | Legacy reference |
| rxvt-unicode | Linux | Custom (X11) | ✗ | ✗ | ✗ | ✗ | Legacy / declining |
| Foot | Linux | Custom (Wayland) | ✗ | ✓ | ✓ Sixel | ✗ | Active development |
The default terminal on GNOME desktops, built on the VTE (Virtual Terminal Emulator) library shared by dozens of GTK-based terminals including Tilix, Terminator, and Guake.
1# List profiles
2dconf list /org/gnome/terminal/legacy/profiles:/
3
4# Set font for default profile
5dconf write /org/gnome/terminal/legacy/profiles:/:default/font \
6 "'JetBrains Mono 13'"
7
8# Open new window with specific profile
9gnome-terminal --window-with-profile="Development"
KDE's default terminal emulator, deeply integrated with the Plasma desktop. One of the most feature-rich "classic" terminals, with capabilities that rival some modern GPU-accelerated options.
1# Open Konsole with a specific profile
2konsole --profile "Development"
3
4# Run a command in a new tab
5konsole --new-tab -e htop
6
7# Profiles stored at:
8# ~/.local/share/konsole/*.profile
Apple's built-in terminal, shipped with every Mac since Mac OS X 10.0. No installation required — it is always available as a fallback, even when your preferred terminal is not installed.
/Applications/Utilities/Terminal.app or via Spotlight.Cmd+Up/Down) and working directory tracking. Resume sessions after reboot via window restoration.1# Set default shell (macOS uses zsh by default since Catalina)
2chsh -s /bin/zsh
3
4# Import a .terminal theme file
5open ~/Downloads/Catppuccin-Mocha.terminal
6
7# Set via defaults (programmatic configuration)
8defaults write com.apple.Terminal "Default Window Settings" -string "Pro"
9defaults write com.apple.Terminal "Startup Window Settings" -string "Pro"
The original X Window System terminal emulator, first released in 1984. Still actively maintained by Thomas Dickey, xterm serves as the reference implementation for terminal escape sequences and the TERM=xterm-256color identifier that almost every terminal emulates.
~/.Xresources or ~/.Xdefaults). All settings are key-value pairs prefixed with xterm* or XTerm*.1! xterm configuration
2xterm*faceName: JetBrains Mono
3xterm*faceSize: 13
4xterm*background: #1a1c1e
5xterm*foreground: #d0d4d8
6xterm*saveLines: 10000
7xterm*selectToClipboard: true
8
9! Apply changes: xrdb -merge ~/.Xresources
A lightweight, highly customizable X11 terminal popular in the tiling window manager community (i3, bspwm, dwm) throughout the 2010s. Known for its Perl extension system and daemon mode.
urxvtd (daemon) and open new terminals with urxvtc (client). Client windows share the daemon's memory footprint, making new terminal windows nearly instant and extremely lightweight..Xresources configuration made it the terminal of choice for riced i3/bspwm desktops for years.1# Start the daemon (typically in .xinitrc or WM startup)
2urxvtd --quiet --opendisplay --fork
3
4# Open a new terminal via the client (near-instant)
5urxvtc
6
7# Perl extensions in .Xresources:
8URxvt.perl-ext-common: default,matcher,resize-font,clipboard
9URxvt.url-launcher: /usr/bin/xdg-open
A fast, lightweight, Wayland-native terminal emulator. Foot does not support X11 — it is built exclusively for the Wayland display protocol, making it the natural choice for Sway, Hyprland, and other Wayland compositors.
lsix, chafa --format=sixel, and libsixel.foot --server / footclient) for fast startup of additional windows. 1[main]
2font = JetBrains Mono:size=13
3pad = 8x8
4
5[colors]
6background = 1a1c1e
7foreground = d0d4d8
8
9[cursor]
10style = beam
11blink = yes
Browser-based operations center online. This unit is not a standalone terminal — it is an embeddable engine that powers the terminal panels inside VS Code, code-server, JupyterLab, and dozens of cloud IDEs. When you open a terminal in your browser, odds are xterm.js is running beneath the surface. Deploying for web-theater operations.
xterm.js is a terminal front-end component, not a terminal emulator in the traditional sense. A traditional terminal (Kitty, WezTerm, Alacritty) runs as a native desktop application and spawns a PTY (pseudo-terminal) connected to your shell. xterm.js, by contrast, is a JavaScript/TypeScript library that renders a terminal UI inside a browser DOM element. It handles:
The host application is responsible for connecting xterm.js to an actual shell process. In web applications, this is typically done via a WebSocket connection to a server that manages a PTY using node-pty or a similar library.
npm install @xterm/xterm
npm install @xterm/addon-fit @xterm/addon-webgl
yarn add @xterm/xterm
yarn add @xterm/addon-fit @xterm/addon-webgl
<link rel="stylesheet"
href="https://unpkg.com/@xterm/xterm/css/xterm.css" />
<script src="https://unpkg.com/@xterm/xterm"></script>
npm install node-pty
npm install ws # WebSocket server
The following example creates a terminal instance with custom theming, loads the fit and WebGL addons, and renders the terminal into a DOM element. In a real application, you would connect the terminal's onData event to a WebSocket that streams data to/from a server-side PTY.
1import { Terminal } from '@xterm/xterm';
2import { FitAddon } from '@xterm/addon-fit';
3import { WebglAddon } from '@xterm/addon-webgl';
4
5const term = new Terminal({
6 fontFamily: 'JetBrains Mono',
7 fontSize: 14,
8 theme: {
9 background: '#1a1c1e',
10 foreground: '#d0d4d8',
11 cursor: '#ff8c00'
12 }
13});
14
15// Load addons
16const fitAddon = new FitAddon();
17term.loadAddon(fitAddon);
18
19// Attach to DOM and fit to container
20term.open(document.getElementById('terminal'));
21fitAddon.fit();
22
23// Enable WebGL rendering for better performance
24term.loadAddon(new WebglAddon());
25
26// Handle window resize
27window.addEventListener('resize', () => fitAddon.fit());
28
29// Connect to backend via WebSocket
30const ws = new WebSocket('ws://localhost:3000/terminal');
31term.onData(data => ws.send(data));
32ws.onmessage = (e) => term.write(e.data);
xterm.js uses a modular addon architecture. The core library provides basic terminal emulation, while addons extend it with optional capabilities. Each addon is installed as a separate npm package and loaded at runtime.
| Addon | Package | Description | Use Case |
|---|---|---|---|
| FitAddon | @xterm/addon-fit |
Automatically sizes the terminal to fit its container element by calculating the optimal rows/cols | Essential for responsive layouts; use in virtually every xterm.js integration |
| WebglAddon | @xterm/addon-webgl |
Replaces the default canvas renderer with a WebGL2-based renderer for significantly faster drawing | High-throughput applications, large scrollback, dense output (build logs, CI) |
| SearchAddon | @xterm/addon-search |
Provides find-in-buffer functionality with regex support and match highlighting | Log viewers, debugging sessions, any terminal with significant scrollback |
| SerializeAddon | @xterm/addon-serialize |
Serializes the terminal buffer state to a string, preserving ANSI formatting and content | Session recording, state persistence, terminal snapshots for tests |
| WebLinksAddon | @xterm/addon-web-links |
Detects URLs in terminal output and makes them clickable hyperlinks | Any terminal where users need to follow URLs in command output |
| Unicode11Addon | @xterm/addon-unicode11 |
Provides Unicode 11+ width calculation for proper rendering of CJK, emoji, and wide characters | Internationalized applications, terminals displaying non-Latin scripts |
By default, xterm.js renders to a 2D canvas context. The WebGL addon replaces this with a WebGL2-based renderer that achieves dramatically better performance for text-heavy workloads.
1try {
2 term.loadAddon(new WebglAddon());
3 console.log('WebGL renderer active');
4} catch (e) {
5 console.warn('WebGL not available, using canvas renderer');
6}
xterm.js powers the terminal component in a wide range of production applications. These are the most prominent deployments:
The integrated terminal in Visual Studio Code uses xterm.js with the WebGL renderer. Microsoft is the primary maintainer of the xterm.js project. VS Code's terminal adds shell integration, command decorations, and link detection on top of the core library.
Coder's open-source project that runs VS Code in a browser. Since VS Code's terminal is xterm.js, code-server inherits the same terminal experience over a WebSocket connection to the remote host's shell.
Cloud development environments from Gitpod and GitHub Codespaces both use VS Code-based editors in the browser, and therefore use xterm.js for their terminal panels. The shell runs in a cloud container.
The JupyterLab IDE includes a terminal panel powered by xterm.js. This gives data scientists browser-based shell access alongside their notebooks, running on the same server as the Jupyter kernel.
The Theia IDE framework, used as the basis for several cloud IDEs (including Arduino IDE 2.0 and Google Cloud Shell Editor), uses xterm.js for its integrated terminal component.
The Proxmox Virtual Environment web interface uses xterm.js for its browser-based console access to virtual machines and containers, providing noVNC-alternative shell access directly in the management UI.
To build your own web-based terminal, you need a backend server that spawns a PTY and bridges it to the browser via WebSocket. The standard architecture uses node-pty for PTY management and the ws library for WebSocket transport.
1const { WebSocketServer } = require('ws');
2const pty = require('node-pty');
3
4const wss = new WebSocketServer({ port: 3000 });
5
6wss.on('connection', (ws) => {
7 // Spawn a shell process with a pseudo-terminal
8 const shell = pty.spawn('bash', [], {
9 name: 'xterm-256color',
10 cols: 80,
11 rows: 24,
12 cwd: process.env.HOME
13 });
14
15 // PTY output → WebSocket → browser (xterm.js)
16 shell.onData(data => ws.send(data));
17
18 // Browser input → WebSocket → PTY
19 ws.on('message', data => shell.write(data));
20
21 // Cleanup on disconnect
22 ws.on('close', () => shell.kill());
23});
Browser [xterm.js] ↔ WebSocket ↔ Server [node-pty + shell]shell.resize(cols, rows) when the terminal is resized).
| Browser | Status | WebGL Renderer | Notes |
|---|---|---|---|
| Chrome / Chromium | ✓ Full Support | ✓ | Primary development target. Best performance. |
| Microsoft Edge | ✓ Full Support | ✓ | Chromium-based; identical to Chrome support. |
| Firefox | ✓ Full Support | ✓ | WebGL2 fully supported. Slightly different text rendering. |
| Safari | ✓ Full Support | ✓ | WebGL2 support since Safari 15. Some minor rendering differences with font ligatures. |
xterm.js targets evergreen browsers — the current and previous two major versions of Chrome, Edge, Firefox, and Safari. Internet Explorer is not supported.
While xterm.js dominates the browser terminal space, a few alternatives exist for specific use cases:
Establishing standard operating procedures across all units. These terminal-agnostic configurations — fonts, color schemes, multiplexing, and shell integration — apply regardless of which terminal you deploy. Master these systems and every unit in your roster benefits.
Nerd Fonts are patched versions of popular programming fonts that include thousands of additional glyphs: file-type icons, powerline symbols, devicons, Font Awesome icons, Material Design icons, and more. They are essential for modern CLI tools like starship (prompt), lsd/eza (ls replacements), yazi (file manager), and lazygit which use these glyphs for a richer visual interface.
| Font | Nerd Font Name | Ligatures | Style | Notes |
|---|---|---|---|---|
| JetBrains Mono | JetBrainsMono NF | ✓ | Modern, tall x-height | Default in JetBrains IDEs. Excellent readability. The most popular choice for 2024-2026. |
| Fira Code | FiraCode NF | ✓ | Geometric, clean | Pioneered coding ligatures. Arrows, comparisons, and operators render as single glyphs. |
| Hack | Hack NF | ✗ | Neutral, utilitarian | Optimized for source code. Clear distinction between similar characters (0/O, 1/l/I). |
| Meslo LG | MesloLGS NF | ✗ | Menlo-based, Apple-like | Recommended by Powerlevel10k. Based on Apple's Menlo with adjusted line spacing. |
| Cascadia Code | CaskaydiaCove NF | ✓ | Microsoft, friendly | Default in Windows Terminal. Includes Cascadia Mono (no ligatures) variant. |
| Iosevka | Iosevka NF | ✓ | Narrow, customizable | Extremely narrow by default. Highly customizable via build parameters. Great for splits. |
| Victor Mono | VictorMono NF | ✓ | Cursive italics | Distinctive cursive italic style. Popular for themes that style comments in italic. |
1# macOS — Homebrew
2brew install --cask font-jetbrains-mono-nerd-font
3brew install --cask font-fira-code-nerd-font
4brew install --cask font-meslo-lg-nerd-font
5
6# Arch Linux
7sudo pacman -S ttf-jetbrains-mono-nerd
8
9# Ubuntu/Debian — download from GitHub releases
10wget https://github.com/ryanoasis/nerd-fonts/releases/download/v3.3.0/JetBrainsMono.zip
11unzip JetBrainsMono.zip -d ~/.local/share/fonts/
12fc-cache -fv
Ligature support matrix: Not all terminals render font ligatures. Ligatures combine multiple characters (e.g., != becomes ≠, => becomes ⇒) into single typographic glyphs.
| Terminal | Ligatures | Notes |
|---|---|---|
| Kitty | ✓ | Full ligature support via HarfBuzz |
| WezTerm | ✓ | Full ligature support via HarfBuzz |
| Ghostty | ✓ | Full ligature support |
| iTerm2 | ✓ | Enabled via Preferences > Profiles > Text |
| Windows Terminal | ✓ | Supported since early releases with DirectWrite |
| Alacritty | ✗ | Intentionally excluded; maintainer considers them incompatible with terminal grid model |
| Foot | ✓ | Supported via HarfBuzz shaping |
| GNOME Terminal | ✗ | VTE does not support ligatures |
A color scheme defines the 16 ANSI colors (8 normal + 8 bright), plus the foreground, background, cursor, and selection colors. Most modern terminals also support 256-color and 24-bit true color, but the 16 ANSI colors remain the foundation of your terminal's visual identity.
| Scheme | Style | Background | Vibe | Availability |
|---|---|---|---|---|
| Catppuccin | Pastel | Mocha: #1E1E2E | Soft, warm, easy on the eyes. Four flavors: Latte (light), Frappe, Macchiato, Mocha (dark). | All terminals |
| Dracula | Vibrant | #282A36 | High-contrast with saturated purples, pinks, and greens. Iconic and instantly recognizable. | All terminals |
| Tokyo Night | Cool blue | #1A1B26 | Inspired by Tokyo city lights. Subdued blues and purples. Storm and Day variants available. | All terminals |
| Gruvbox | Retro warm | #282828 | Earthy tones with high contrast. Warm oranges, yellows, and greens. Light variant available. | All terminals |
| Nord | Arctic | #2E3440 | Cool, desaturated blues and teals. Clean, professional, low visual noise. | All terminals |
| Solarized | Precise | Dark: #002B36 | Scientifically designed color relationships. Both dark and light modes. The OG rice theme. | All terminals |
| One Dark | Balanced | #282C34 | Atom editor's default theme. Balanced contrast. One of the most widely ported themes. | All terminals |
Where to find themes:
gogh-co.github.io) — One-click theme installer for GNOME Terminal, Tilix, xfce4-terminal, and other VTE-based terminals. 250+ themes. 1# ── Kitty (~/.config/kitty/kitty.conf) ──
2include themes/catppuccin-mocha.conf
3
4# ── WezTerm (~/.wezterm.lua) ──
5config.color_scheme = 'Catppuccin Mocha'
6
7# ── Alacritty (~/.config/alacritty/alacritty.toml) ──
8[general]
9import = ["~/.config/alacritty/catppuccin-mocha.toml"]
10
11# ── Ghostty (~/.config/ghostty/config) ──
12theme = catppuccin-mocha
13
14# ── Windows Terminal (settings.json) ──
15"colorScheme": "Catppuccin Mocha"
16# (Install via the built-in theme gallery or add to "schemes" array)
Multiplexing lets you run multiple terminal sessions inside a single window, with the ability to split panes, create tabs, detach sessions, and reattach later. You can use an external multiplexer (tmux, Zellij) or your terminal's built-in multiplexing features.
| Feature | tmux | Zellij | WezTerm Built-in | Kitty Built-in |
|---|---|---|---|---|
| Session persistence | ✓ Detach/reattach | ✓ Detach/reattach | ✓ Mux server mode | ✗ No detach |
| Remote persistence | ✓ SSH disconnect safe | ✓ SSH disconnect safe | ✓ Mux over SSH | ✗ Local only |
| Splits/panes | ✓ | ✓ | ✓ | ✓ |
| Tabs | ✓ Windows | ✓ Tabs | ✓ | ✓ |
| Layouts | ✓ Custom layouts | ✓ KDL layout files | ✓ Lua-defined | ✓ 6 built-in layouts |
| Plugin system | ✓ TPM ecosystem | ✓ WASM plugins | ✓ Lua scripting | ✓ Python kittens |
| Config format | tmux.conf (custom) | KDL | Lua | kitty.conf (k=v) |
| Learning curve | Steep | Gentle (discoverable UI) | Moderate (Lua) | Low |
| Scrollback access | Copy mode (vi/emacs keys) | Scroll mode + search | Native scrollback | Native scrollback |
When do you need an external multiplexer?
tmux-resurrect / tmux-continuum or Zellij's layout persistence is battle-tested.Shell integration refers to a set of invisible escape sequences (OSC sequences) that your shell emits to communicate metadata to the terminal emulator. This metadata enables the terminal to understand where commands start and end, whether they succeeded or failed, and what the current working directory is.
The shell marks the prompt, the command input, and the command output as distinct "zones." The terminal can then highlight errors (red gutter marks for failed commands), enable click-to-navigate between commands, and allow selecting a command's output independently from surrounding content.
The terminal knows which text is a command and which is output. This enables features like "scroll to previous command," "copy last command output," and per-command timing/exit-code display in the prompt decorations.
The shell reports its current directory to the terminal via OSC 7. This enables features like "open new tab in the same directory," clickable file paths resolved against the working directory, and window title updates showing the current path.
Some terminals use shell integration data to offer inline command suggestions, recent command history popups, or enhanced tab completion that goes beyond what the shell provides natively.
Terminal shell integration support:
| Terminal | Shell Integration | Auto-Install | Key Features |
|---|---|---|---|
| Kitty | ✓ | ✓ Automatic | Command marks, jump between prompts, open output in pager, last command output selection |
| iTerm2 | ✓ | Manual (source script) | Command history, automatic profile switching, recent directories sidebar, upload/download |
| WezTerm | ✓ | ✓ Automatic | Semantic zones, CWD tracking, clickable output, new pane in CWD |
| Windows Terminal | ✓ | Manual (profile setting) | Marks, jump between commands, recent command menu, intelligent copy |
| Ghostty | ✓ | ✓ Automatic | Prompt marks, CWD tracking, jump between prompts, new tab in CWD |
| VS Code (xterm.js) | ✓ | ✓ Automatic | Command decorations, run recent command, go to recent directory, sticky scroll |
1# ── Bash (~/.bashrc) — generic OSC 7 for CWD tracking ──
2__osc7_cwd() {
3 printf '\e]7;file://%s%s\e\\' "$HOSTNAME" "$PWD"
4}
5PROMPT_COMMAND="__osc7_cwd;${PROMPT_COMMAND}"
6
7# ── Zsh (~/.zshrc) — Kitty auto-loads; for others: ──
8autoload -Uz add-zsh-hook
9__osc7_chpwd() {
10 printf '\e]7;file://%s%s\e\\' "$HOST" "$PWD"
11}
12add-zsh-hook chpwd __osc7_chpwd
13__osc7_chpwd
14
15# ── Fish (~/.config/fish/config.fish) ──
16# Fish emits OSC 7 by default since v3.0 — no config needed.
17
18# ── iTerm2 (manual install) ──
19curl -L https://iterm2.com/shell_integration/install_shell_integration.sh | bash
$KITTY_WINDOW_ID for Kitty, $WEZTERM_PANE for WezTerm, $GHOSTTY_RESOURCES_DIR for Ghostty, $TERM_PROGRAM=iTerm.app for iTerm2. Guard your integration scripts with these checks to avoid conflicts.
Final strategic assessment complete. All units have been scouted, benchmarked, and field-tested. This section provides the decision framework for selecting and deploying the right terminal for your mission parameters. Study the flowchart, consult the recommendation matrix, and commit to your loadout.
Follow the decision tree below to narrow your search. Each branch leads to the terminal best suited for that combination of requirements.
// STRATEGIC DECISION TREE 1What is your primary platform?
2│
3├─► Windows only
4│ └──► Windows Terminal (native, best WSL integration)
5│
6├─► macOS
7│ ├─► Want native look & feel?
8│ │ ├─► Yes, cutting-edge → Ghostty
9│ │ └─► Yes, battle-tested → iTerm2
10│ └─► Want cross-platform config?
11│ └──► WezTerm or Kitty
12│
13├─► Linux
14│ ├─► Minimalist / tiling WM?
15│ │ ├─► Wayland → Foot or Alacritty
16│ │ └─► X11 → Alacritty + tmux
17│ ├─► Feature-rich with scripting?
18│ │ ├─► Python kittens → Kitty
19│ │ └─► Lua scripting → WezTerm
20│ └─► Fast, simple, native feel?
21│ └──► Ghostty
22│
23├─► Cross-platform (same config everywhere)
24│ └──► WezTerm (Linux + macOS + Windows, Lua config)
25│
26└─► Building a web application?
27 └──► xterm.js (browser-based terminal component)
The recommendation matrix below maps common developer profiles to the terminals that best serve their workflows. The "Runner-up" column provides an alternative with different trade-offs.
| Use Case | Recommended | Runner-up | Why |
|---|---|---|---|
| Speed purist | Ghostty | Alacritty | Ghostty benchmarks at the top for throughput and latency. Alacritty is the proven minimalist alternative with years of stability. |
| Power user | Kitty | WezTerm | Kitty's kittens framework, graphics protocol, and remote control API provide unmatched extensibility. WezTerm offers similar depth with Lua scripting. |
| Remote SSH work | Kitty | WezTerm | Kitty's SSH kitten auto-transfers terminfo and shell integration. WezTerm's mux server can persist sessions across SSH disconnects. |
| macOS native | Ghostty | iTerm2 | Ghostty uses SwiftUI for native macOS look and feel with top-tier performance. iTerm2 is the proven workhorse with the deepest macOS integration. |
| Windows developer | Windows Terminal | WezTerm | Windows Terminal has first-party WSL/PowerShell/Azure integration. WezTerm offers cross-platform config portability. |
| Linux ricing | Alacritty | Foot / Kitty | Alacritty's TOML config and minimal footprint pair perfectly with tiling WMs. Foot is ideal for Wayland-only setups. Kitty adds built-in splits. |
| Web development | xterm.js | hterm | xterm.js is the industry standard for browser-based terminals. Powers VS Code, code-server, and all major cloud IDEs. |
| Beginner | Ghostty | Windows Terminal | Ghostty's simple config format and sensible defaults require minimal setup. Windows Terminal is the easiest starting point on Windows. |
Migrating terminals is less painful than you think. Most of the hard work is in your shell configuration (which travels with you) rather than the terminal itself. Here is what to focus on:
| Config Aspect | Kitty | WezTerm | Alacritty | Ghostty | Win Terminal |
|---|---|---|---|---|---|
| Format | key value (.conf) | Lua (.lua) | TOML (.toml) | key = value | JSON |
| Location | ~/.config/kitty/ | ~/.wezterm.lua | ~/.config/alacritty/ | ~/.config/ghostty/ | settings.json |
| Live reload | ✓ Ctrl+Shift+F5 | ✓ Automatic | ✓ Automatic | ✓ Cmd+Shift+, | ✓ Automatic |
| Conditional logic | ✗ | ✓ Full Lua | ✗ | ✗ | ✗ |
| Theme includes | ✓ include | ✓ require() | ✓ import | ✓ Built-in themes | ✓ schemes array |
Final benchmarks across all major units. These numbers are approximate and vary by hardware, OS, and configuration. They represent typical values on a modern system (2023-2025 hardware, 16 GB RAM, integrated or discrete GPU).
| Terminal | Startup | Memory (idle) | Throughput | Input Latency | GPU |
|---|---|---|---|---|---|
| Ghostty | <100ms | ~130 MB | Excellent | ~2-4ms | Metal / OpenGL |
| Alacritty | <50ms | ~55 MB | Excellent | ~2-5ms | OpenGL |
| Kitty | ~100ms | ~110 MB | Very Good | ~3-5ms | OpenGL |
| WezTerm | ~200ms | ~170 MB | Good | ~5-8ms | OpenGL |
| Windows Terminal | ~150ms | ~80 MB | Good | ~5-8ms | DirectX |
| iTerm2 | ~300ms | ~200 MB | Moderate | ~8-15ms | Metal (GPU renderer) |
| Foot | <50ms | ~30 MB | Good (PGO) | ~3-5ms | CPU (no GPU) |
| GNOME Terminal | ~200ms | ~70 MB | Moderate | ~10-20ms | CPU (Cairo) |
| xterm.js (browser) | N/A (in-page) | ~50 MB (tab) | Moderate | ~10-30ms | WebGL2 (addon) |
cat. Input latency is the measured delay from keypress to character rendering using tools like typometer or is-fast. Real-world perception depends heavily on your workflow — for interactive use, any modern GPU-accelerated terminal feels instantaneous.
All units have been deployed, benchmarked, and assessed on the battlefield. The recon data is in, the stat bars are filled, and the strategic map is complete. So — which terminal wins?
None of them. All of them.
The "best" terminal is the one that matches your workflow, your platform, and your priorities. A speed purist on a minimal Sway desktop will deploy Alacritty + tmux and never look back. A macOS developer who lives in the GUI will reach for Ghostty or iTerm2. A power user who scripts everything will build their environment in WezTerm's Lua or Kitty's Python kittens. A web developer embedding terminals in their product will integrate xterm.js without question.
The good news: the terminal ecosystem has never been stronger. GPU-accelerated rendering is now standard. True color support is universal across modern terminals. Font ligatures, inline images, and shell integration have moved from novelty features to baseline expectations. Every terminal reviewed in this guide is a capable, well-maintained tool backed by active communities.
Pick one. Configure it. Learn its keybindings. When it stops serving your needs, the migration path is straightforward — your shell config, your color scheme, and your Nerd Fonts travel with you.