AI Enters the Terminal: A Developer’s Guide to Choosing Terminals in 2025

🌏 閱讀中文版本

The Game Has Changed

In 2024, the way we use terminals fundamentally changed.

Not because Ghostty went open source. Not because WezTerm got an update. It’s because AI entered the terminal.

Claude Code, GitHub Copilot CLI, Aider, Cursor Terminal… more and more developers now spend their days having conversations with AI in the terminal, letting AI write code, letting AI execute commands.

This has completely changed what we need from a terminal:

  • Before: Open terminal, run a few commands, close it
  • Now: Open terminal, have conversations with AI for hours, juggle multiple windows

When your terminal needs to run for extended periods, handle massive AI output, and support special key combinations, choosing the wrong terminal comes at a real cost.

This isn’t just another terminal comparison. I’ll evaluate five mainstream terminals from an AI workflow perspective to help you make the right choice in 2025.


Table of Contents

  1. TL;DR
  2. How AI Has Changed Terminal Requirements
  3. AI CLI Compatibility Testing
  4. Performance Benchmarks
  5. Complete Analysis of Five Terminals
  6. Ghostty vs WezTerm: The AI-Era Showdown
  7. Decision Flowchart
  8. Recommended Configurations
  9. Conclusion: My Choice
  10. Sources

TL;DR

One-line summary: Use Ghostty for daily development, WezTerm when you need advanced features or cross-platform support.

30-Second Decision Table

Your Need Recommended Terminal
macOS only + best experience + heavy AI CLI use Ghostty
Cross-platform (Windows/Linux) WezTerm
Built-in multiplexer (don’t want to learn tmux) WezTerm
GUI for SSH connection management Tabby
Mobile/tablet server access Termius
Managing 50+ servers + mixed RDP/SSH Royal TSX

Overview Comparison

Feature Ghostty WezTerm Tabby Termius Royal TSX
Focus Pure terminal Pure terminal Terminal+SSH SSH client Remote management
Language Zig + Swift Rust TypeScript/Electron Native Native
GPU Acceleration Metal WebGPU/Metal WebGL
Memory Usage ~260MB ~136MB ~840MB ~1300MB ~430MB
Startup Time ~50ms ~200ms 2-3s Medium Medium
AI CLI Suitability ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
Price Free & Open Source Free & Open Source Free & Open Source Free/Subscription Free/Subscription
Cross-platform macOS/Linux All platforms All platforms All + Mobile macOS

How AI Has Changed Terminal Requirements

Traditional vs AI CLI Era

Dimension Traditional Usage AI CLI Era
Session Length Short commands, quick exits Long conversations, hours of runtime
Output Volume Few lines to dozens Hundreds of lines with code blocks
Multitasking Occasional split windows Constant: AI window + editor + execution
Memory Concerns Brief use, negligible Hours of accumulation, impacts system
Scrollback Needs Occasional review Frequent review of AI responses
Key Bindings Standard is fine Need support for Alt+Enter and other AI CLI combos
Rendering Performance Good enough Must handle large Markdown/code smoothly

The Typical AI Workflow

When using Claude Code or similar tools, a typical workflow looks like this:

┌─────────────────────────────────────────────────────────────────┐
│  Terminal Window 1 (Primary)     │  Terminal Window 2 (Secondary)  │
│  ───────────────────────────── │  ─────────────────────────────── │
│  Claude Code / Aider             │  Code editing / Preview          │
│  - Running for hours             │  - Viewing AI-modified files     │
│  - Massive output (hundreds      │  - Running tests / builds        │
│    of lines)                     │  - Git operations / deployment   │
│  - Need to review history        │                                  │
└─────────────────────────────────────────────────────────────────┘

This workflow places new demands on terminals:

  1. Split windows must be smooth: Not just “usable” but genuinely comfortable
  2. Memory efficiency is essential: Running 4-8 hours shouldn’t slow things down
  3. Large scrollback buffer: AI output can be thousands of lines
  4. No rendering stutters: When AI outputs rapidly, no frame drops
  5. No key binding conflicts: Alt+Enter to send, Cmd+K to clear, etc.

Key Insight: In the AI CLI era, terminal “memory efficiency” has gone from nice-to-have to essential. Electron-based terminals (like Tabby and Termius) can balloon to 2GB+ after 4 hours of use, while native terminals (Ghostty, WezTerm) typically stay under 300MB.


AI CLI Compatibility Testing

This is the core section of this article. I tested all five terminals specifically for AI CLI use cases.

Methodology

Test Environment:

  • Hardware: Apple Silicon Mac + Retina Display
  • AI CLI: Claude Code (primary), GitHub Copilot CLI (secondary)
  • Test Duration: 4 hours of continuous use per terminal

Test Items:

  1. Alt+Enter key support (Claude Code’s send shortcut)
  2. Long output rendering smoothness (AI generating hundreds of lines)
  3. Memory change after 4 hours
  4. Scrollback smoothness
  5. Code block readability

AI CLI Compatibility Results

Terminal Alt+Enter Support Long Output Smoothness 4hr Memory Growth Scroll Smoothness AI CLI Rating
Ghostty ✅ Native support ⚡ Excellent +50MB ⚡ 120fps ⭐⭐⭐⭐⭐
WezTerm ⚠️ Config needed ⚡ Excellent +30MB ⚡ 90fps ⭐⭐⭐⭐⭐
Tabby ✅ Supported ⚠️ Occasional stutter +200MB ⚠️ Some delay ⭐⭐⭐
Termius ❌ No local shell N/A N/A N/A
Royal TSX ⚠️ Needs testing ⚠️ Average +100MB ⚠️ Average ⭐⭐

Detailed Breakdown

Alt+Enter Key Handling

Claude Code uses Alt+Enter (or Option+Enter on macOS) to send multi-line messages. This is a critical shortcut—if your terminal intercepts it, your AI CLI experience suffers significantly.

Ghostty:

# ~/.config/ghostty/config
macos-option-as-alt = true

With this setting, Option key behavior works exactly as expected.

WezTerm:

-- ~/.wezterm.lua
config.keys = {
  -- Must explicitly release Alt+Enter, or WezTerm will intercept it
  { key = 'Enter', mods = 'ALT', action = wezterm.action.DisableDefaultAssignment },
}

Key Insight: The Alt+Enter = DisableDefaultAssignment in WezTerm config isn’t nice-to-have—it’s required for Claude Code. Without this line, your Option+Enter will trigger WezTerm’s fullscreen toggle instead of being sent to Claude Code.

Long Output Rendering Performance

When AI generates hundreds of lines of code, your terminal’s rendering capability is put to the test.

Terminal 500-line Output Observation
Ghostty Instant Native Metal rendering, zero delay
WezTerm Instant WebGPU rendering, excellent
Tabby 0.5-1 sec Noticeable delay from Electron rendering
Termius N/A No local shell support
Royal TSX 0.3 sec Native but feature-heavy, slight delay

Long-Running Stability

AI CLI use cases often mean “running all day.” I tested memory changes after 4 hours of continuous use:

Memory Growth (after 4 hours)
──────────────────────────────────────────────────────────────────

WezTerm   ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  +30 MB
Ghostty   ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  +50 MB
Royal TSX ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  +100 MB
Tabby     █████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  +200 MB

Native terminals (Ghostty, WezTerm) clearly outperform Electron-based terminals in memory management.

Key Insight: If you keep your terminal open all day, memory efficiency differences accumulate into noticeable system impact. Choosing a native terminal isn’t just about “being faster”—it’s about “staying smooth after hours of use.”


Performance Benchmarks

Memory and CPU Usage

Test conditions: Each terminal after launch, idle state

Terminal Process Count Memory (RAM) CPU Usage Efficiency Rating
WezTerm 1 136 MB 0.0% ⭐⭐⭐⭐⭐
Ghostty 1 258 MB 4.7% ⭐⭐⭐⭐
Royal TSX 2 429 MB 0.0% ⭐⭐⭐
Tabby 5 844 MB 16.6% ⭐⭐
Termius 6 1300 MB 14.5%

Memory Usage Visualization

Memory Usage (MB) - Idle State
──────────────────────────────────────────────────────────────────

WezTerm   ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  136 MB
Ghostty   ███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  258 MB
Royal TSX ███████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  429 MB
Tabby     ██████████████████████░░░░░░░░░░░░░░░░░░░░░  844 MB
Termius   ██████████████████████████████████░░░░░░░░░ 1300 MB

Performance Analysis

Terminal Architecture Performance Characteristics
WezTerm Rust native Single-process design, highest memory efficiency
Ghostty Zig + Swift native Single-process, Metal rendering, slightly higher CPU possibly due to shell integration
Royal TSX macOS Native Native but feature-heavy, moderate resource usage
Tabby Electron Multi-process architecture, Chromium core leads to high resource consumption
Termius Electron Cloud sync + Electron architecture, highest resource consumption

Startup Speed and Input Latency

Terminal Startup Speed Input Latency Notes
Ghostty ~50ms ~2ms Zig zero-overhead abstractions + native Metal
WezTerm ~200ms ~5ms Rust + WebGPU, excellent performance
Tabby 2-3 sec ~10ms Electron cold start is slow
Termius 1-2 sec N/A Primarily for SSH
Royal TSX 1 sec ~8ms Feature-heavy, slower startup

For heavy Vim/Neovim users, the difference between Ghostty’s 2ms input latency and WezTerm’s 5ms is perceptible. If you type in the terminal for hours every day, this difference is worth considering.


Complete Analysis of Five Terminals

Ghostty

Developer: Mitchell Hashimoto (HashiCorp founder, creator of Vagrant, Terraform, Consul, Nomad)

Positioning

A terminal focused on doing one thing extremely well. Went open source in December 2024.

Pros

├─ Extreme performance: Written in Zig, native Metal rendering
├─ Instant startup (~50ms)
├─ Native macOS experience: Swift/AppKit UI, perfect system integration
├─ Simple configuration: Single text file, key=value format
├─ Deep shell integration: sudo prompts, command tracking, semantic zones
├─ Zero-config usable: Excellent defaults, works out of the box
├─ AI CLI friendly: macos-option-as-alt works perfectly
└─ Completely free and open source

Cons

├─ Relatively basic features (focused on being a great terminal)
├─ No built-in SSH management
├─ No built-in multiplexer (need tmux)
├─ Newer community/ecosystem (open sourced Dec 2024)
├─ No GUI settings interface
└─ No Windows support

AI CLI Suitability: ⭐⭐⭐⭐⭐

  • Option+Enter native support
  • ✅ Long output renders instantly
  • ✅ High memory efficiency
  • ✅ Smooth scrolling (120fps)

Best For

  • Those seeking ultimate performance and lowest input latency
  • Primarily working on macOS
  • Preferring simple configuration without spending time tweaking
  • Using with tmux
  • Heavy AI CLI users

WezTerm

Developer: Wez Furlong (former Facebook engineer)

Positioning

The most feature-rich modern terminal with built-in multiplexer and Lua scripting for programmatic configuration.

Pros

├─ Excellent performance: Written in Rust, WebGPU rendering
├─ Most feature-rich: Built-in multiplexer, no need for tmux
├─ Lua scripting engine: Full programmatic configuration
├─ Cross-platform: macOS / Linux / Windows / FreeBSD
├─ Remote multiplexing: SSH disconnect auto-reconnect (mux domains)
├─ Advanced selection: Quick Select, Copy Mode (vim-like)
├─ Serial port support: Essential for hardware developers
└─ Completely free and open source

Cons

├─ More complex configuration (need basic Lua knowledge)
├─ Occasional minor rendering issues
├─ Steeper learning curve
├─ Not macOS-native-first design (cross-platform priority)
├─ No GUI settings interface
└─ Alt+Enter needs explicit configuration for AI CLI

AI CLI Suitability: ⭐⭐⭐⭐⭐

  • ⚠️ Alt+Enter needs config to release
  • ✅ Long output renders excellently
  • ✅ Highest memory efficiency
  • ✅ Built-in multiplexer convenient for multitasking

Best For

  • Those needing cross-platform use (Windows/Linux/macOS)
  • Wanting built-in multiplexer (don’t want to install tmux)
  • Needing programmatic dynamic configuration (e.g., auto dark/light theme switching)
  • Hardware development (need Serial Port)
  • Need SSH disconnect reconnection

Tabby

Architecture: Electron (TypeScript)

Positioning

Modern tool balancing terminal and SSH management, with the most beautiful GUI interface.

Pros

├─ Most beautiful UI: Modern interface design
├─ SSH management: Built-in connection manager, profile groups
├─ Easy setup: GUI interface, no config file editing needed
├─ Plugin ecosystem: Rich extensions
├─ Cross-platform settings sync
├─ 1Password SSH Agent integration
└─ Free and open source

Cons

├─ Memory hungry: Electron architecture, ~840MB+ idle
├─ Slow startup: 2-3 seconds
├─ Higher CPU usage (16%+ idle)
├─ Occasional stuttering during extended use
└─ Multi-process architecture adds system overhead

AI CLI Suitability: ⭐⭐⭐

  • Alt+Enter supported
  • ⚠️ Long output occasionally stutters
  • ❌ Poor memory efficiency
  • ⚠️ Not ideal for long-running AI CLI sessions

Best For

  • Those needing to manage multiple SSH connections
  • Preferring GUI settings without editing config files
  • Wanting beautiful terminal aesthetics
  • Needing 1Password SSH Agent integration
  • Infrequent AI CLI use

Termius

Positioning: Professional SSH client (not a pure terminal)

Pros

├─ Cross-device sync: Cloud-stored connection settings
├─ Mobile support: Full iOS / Android support
├─ SFTP integration: Built-in file transfer
├─ Team collaboration: Shared connections (paid feature)
├─ Snippets: Manage frequently used command fragments
└─ Polished, beautiful UI

Cons

├─ Many paid features: Advanced features require subscription
├─ Not a pure terminal: Not suitable for local development
├─ No local shell
├─ Cloud service dependency
└─ Highest memory usage (~1300MB)

AI CLI Suitability: ⭐

  • ❌ No local shell support
  • ❌ Cannot use Claude Code or other AI CLIs
  • Only suitable for remote operations after SSH connection

Best For

  • Pure SSH management work (no local development needed)
  • Needing mobile/tablet server access
  • Team sharing connection settings
  • Not using AI CLI

Royal TSX

Positioning: Enterprise-grade remote management platform

Pros

├─ Multi-protocol support: SSH / RDP / VNC / SFTP / Web
├─ Folder management: Organize large numbers of connections
├─ Credential management: macOS Keychain integration
├─ Dynamic folders: Batch import connections
├─ Enterprise features: Team collaboration / audit logs
└─ Native macOS development

Cons

├─ Steep learning curve
├─ Traditional interface design
├─ Full features require paid subscription
├─ Not a pure terminal (overly complex)
├─ Complex setup
└─ macOS only

AI CLI Suitability: ⭐⭐

  • ⚠️ Usable but not optimal
  • ⚠️ Not designed for local development
  • If managing many servers, can use AI CLI after SSH connection in Royal TSX

Best For

  • Managing large numbers of servers (50+)
  • Mixed Windows RDP + Linux SSH environments
  • Enterprise IT management needs
  • Audit logging requirements

Ghostty vs WezTerm: The AI-Era Showdown

For developers seriously considering their terminal choice, the final decision usually comes down to Ghostty versus WezTerm. Both are top-tier modern terminals. Here’s the deep comparison.

Technical Architecture

Dimension WezTerm Ghostty
Language Rust Zig + Swift
Rendering Engine WebGPU / OpenGL Metal (native)
Memory Management Rust ownership system Zig manual management
Developer Wez Furlong (ex-Facebook) Mitchell Hashimoto (HashiCorp founder)
First Release ~2018 Dec 2024
Codebase Size ~200K lines ~100K lines
Design Philosophy Feature-rich, highly customizable Minimal, do one thing well

Architecture Visualization

WezTerm                              Ghostty
┌─────────────────────────┐          ┌─────────────────────────┐
│      Lua Config Layer    │          │    Simple Config File    │
├─────────────────────────┤          ├─────────────────────────┤
│    Rust Application      │          │      Swift UI Layer      │
├─────────────────────────┤          ├─────────────────────────┤
│    WebGPU Abstraction    │          │      Zig Core Layer      │
├─────────────────────────┤          ├─────────────────────────┤
│   Metal/OpenGL/DX12     │          │      Direct Metal        │
└─────────────────────────┘          └─────────────────────────┘
    Cross-platform First                  macOS Native First

Performance Comparison

Measured Data

Metric WezTerm Ghostty Winner
Initial Memory 136 MB 258 MB WezTerm
CPU (idle) 0.0% 4.7% WezTerm
4hr Memory Growth +30 MB +50 MB WezTerm
Process Count 1 1 Tie

Theoretical Performance (User Experience)

Metric WezTerm Ghostty Notes
Startup Speed ~200ms ~50ms Ghostty faster
Input Latency ~5ms ~2ms Ghostty Metal native
Large Output Rendering Excellent Outstanding Zig zero-overhead
Scroll Smoothness 90fps 120fps Metal + ProMotion

Conclusion: WezTerm wins slightly on “numbers” (smaller memory), but Ghostty wins on “feel” (faster startup, lower input latency).

AI CLI Feature Comparison

Feature WezTerm Ghostty
Alt+Enter Support ⚠️ Config needed ✅ Native support
Long-running Stability ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Built-in Multiplexer ⚡ Yes, no tmux needed ❌ Need tmux
SSH Reconnection ⚡ mux domain support ❌ Need tmux
Config Complexity Higher (Lua) Very low (INI)

Key Insight: If you don’t want to learn tmux, WezTerm’s built-in multiplexer is a major advantage. But if you’re already familiar with tmux, Ghostty’s simplicity might be more appealing.

Feature Matrix

Feature Matrix (✅ Has | ⚡ Excellent | ❌ None)

                                    WezTerm    Ghostty
─────────────────────────────────────────────────────────────
Basic Terminal Features
├─ Tabs                                ⚡          ✅
├─ Split Windows                       ⚡          ✅
├─ Font Ligatures                      ⚡          ⚡
├─ Transparency/Blur                   ✅          ⚡
├─ Theme Support                       ⚡ (700+)   ✅ (built-in)
└─ Unicode/Emoji                       ⚡          ⚡

Advanced Features
├─ Built-in Multiplexer                ⚡          ❌
├─ Remote Multiplexing                 ⚡          ❌
├─ SSH Integration                     ✅          ❌
├─ Serial Port                         ✅          ❌
├─ Image Display (Sixel/iTerm2)        ✅          ✅
├─ Command Palette                     ✅          ❌
├─ Quick Select (URL/paths)            ⚡          ✅
└─ Copy Mode (vim-like)                ✅          ❌

Shell Integration
├─ Directory Tracking                  ✅          ⚡
├─ Command Tracking                    ✅          ⚡
├─ Sudo Integration                    ❌          ⚡
└─ Semantic Zones                      ✅          ⚡

Configuration Capabilities
├─ Programmatic Config                 ⚡ (Lua)    ❌
├─ Event Callbacks                     ⚡          ❌
├─ Dynamic Status Bar                  ⚡          ❌
├─ Conditional Logic                   ⚡          ❌
└─ Hot Reload                          ✅          ✅

Configuration Style Comparison

Ghostty: The Minimalist

# ~/.config/ghostty/config
font-family = JetBrainsMono Nerd Font
font-size = 14
theme = Dracula
background-opacity = 0.95
macos-option-as-alt = true
keybind = cmd+d=new_split:right
  • Learning Cost: ⭐ (5 minutes to get started)
  • Customization: ⭐⭐⭐
  • Readability: ⭐⭐⭐⭐⭐

WezTerm: The Programmer

-- ~/.wezterm.lua
local wezterm = require 'wezterm'
local config = wezterm.config_builder()

-- Can write logic: auto dark/light theme switching
local function scheme_for_appearance(appearance)
  if appearance:find 'Dark' then
    return 'Dracula'
  else
    return 'Catppuccin Latte'
  end
end

-- Event callbacks
wezterm.on('window-config-reloaded', function(window, pane)
  local scheme = scheme_for_appearance(window:get_appearance())
  window:set_config_overrides { color_scheme = scheme }
end)

return config
  • Learning Cost: ⭐⭐⭐ (need basic Lua)
  • Customization: ⭐⭐⭐⭐⭐
  • Readability: ⭐⭐⭐

Key Insight: WezTerm’s Lua scripting enables “auto dark/light theme switching following system appearance”—something Ghostty currently cannot do. If you care about these details, WezTerm is better suited for you.

macOS Integration Depth

Feature WezTerm Ghostty
Native UI Framework Cross-platform (self-drawn) Swift/AppKit
System Appearance Following ⚡ Native integration
Trackpad Gestures Basic ⚡ Full support
ProMotion 120Hz ⚡ Native support
Spotlight Integration
System Notifications ⚡ Native

macOS Native Feel Difference:

  • Ghostty: Feels like Apple made this terminal—completely integrated with the system
  • WezTerm: Feels like an excellent cross-platform app, slightly “foreign”

Cross-Platform Support

Platform Support Matrix:

              WezTerm              Ghostty
            ┌─────────┐          ┌─────────┐
macOS       │ ⚡ Excellent │       │ ⚡ Best   │
            ├─────────┤          ├─────────┤
Linux       │ ⚡ Excellent │       │ ✅ Supported │
            ├─────────┤          ├─────────┤
Windows     │ ⚡ Excellent │       │ ❌ Not supported │
            ├─────────┤          ├─────────┤
FreeBSD     │ ✅ Supported │       │ ❌ Not supported │
            └─────────┘          └─────────┘

If you need to work on Windows, WezTerm is your only choice.

Developers and Ecosystem

Dimension WezTerm Ghostty
Author Background Senior Facebook Engineer HashiCorp Founder
Notable Works WezTerm Vagrant, Terraform, Consul, Nomad
Development Time 6+ years 2+ years (private development)
GitHub Stars ~18K ~25K (new but explosive growth)
Documentation Quality ⭐⭐⭐⭐⭐ Very comprehensive ⭐⭐⭐ Continuously improving
Community Activity Stable and mature Rapidly growing
Issue Response Community-driven Author often responds personally

Decision Flowchart

Do you use AI CLI (Claude Code, Copilot CLI, etc.)?
├─ No → Any terminal works, pick what you like
└─ Yes ↓

Do you need cross-platform (Windows/Linux)?
├─ Yes → WezTerm ✅
└─ No ↓

Do you want a built-in multiplexer (don't want to learn tmux)?
├─ Yes → WezTerm ✅
└─ No ↓

Do you need programmatic config (dynamic themes/status bar)?
├─ Yes → WezTerm ✅
└─ No ↓

Do you want the best macOS experience + lowest input latency?
├─ Yes → Ghostty ✅
└─ No → Either works, try Ghostty first

────────────────────────────────────────

Is your main need SSH connection management?
├─ Need GUI management interface → Tabby ✅
├─ Need mobile access → Termius ✅
├─ Managing 50+ servers + RDP → Royal TSX ✅
└─ No special management needs → Use pure terminal + SSH config

Here are configuration examples optimized for AI CLI use cases.

Ghostty Configuration

Path: ~/.config/ghostty/config

# Ghostty Configuration
# Optimized for AI CLI workflows

# ============================================================
# Font Settings
# ============================================================
font-family = JetBrainsMono Nerd Font
font-size = 14
font-feature = calt
font-feature = liga

# Adjust line height (easier to read with lots of AI output)
adjust-cell-height = 20%

# ============================================================
# Color Theme
# ============================================================
theme = Dracula

# Window transparency
background-opacity = 0.95

# macOS blur effect
background-blur-radius = 20

# ============================================================
# Window Settings
# ============================================================
# Initial window size (AI CLI needs more space)
window-width = 140
window-height = 40

# Window padding
window-padding-x = 12
window-padding-y = 12

# Window style
window-decoration = true
macos-titlebar-style = hidden

# ============================================================
# AI CLI Key Settings
# ============================================================
# Make Option key work as Alt (Claude Code needs Alt+Enter)
macos-option-as-alt = true

# Scrollback buffer (AI outputs a lot, set this high)
scrollback-limit = 50000

# ============================================================
# Other Settings
# ============================================================
# Cursor settings
cursor-style = bar
cursor-style-blink = true

# Copy on select
copy-on-select = clipboard

# Confirm close (avoid accidentally closing AI conversations)
confirm-close-surface = true

# Disable sounds
bell-features = no-system,no-audio

# Shell integration
shell-integration = zsh
shell-integration-features = cursor,sudo,title

# ============================================================
# Key Bindings
# ============================================================
# Split windows
keybind = cmd+d=new_split:right
keybind = cmd+shift+d=new_split:down

# Navigate splits
keybind = cmd+left=goto_split:left
keybind = cmd+right=goto_split:right
keybind = cmd+up=goto_split:top
keybind = cmd+down=goto_split:bottom

# Clear screen
keybind = cmd+k=clear_screen

# Adjust font size
keybind = cmd+equal=increase_font_size:1
keybind = cmd+minus=decrease_font_size:1
keybind = cmd+zero=reset_font_size

# Tab switching
keybind = cmd+one=goto_tab:1
keybind = cmd+two=goto_tab:2
keybind = cmd+three=goto_tab:3
keybind = cmd+four=goto_tab:4
keybind = cmd+five=goto_tab:5

WezTerm Configuration

Path: ~/.wezterm.lua

-- WezTerm Configuration
-- Optimized for AI CLI workflows

local wezterm = require 'wezterm'
local config = wezterm.config_builder()

-- ============================================================
-- Font Settings
-- ============================================================
config.font = wezterm.font_with_fallback {
  { family = 'JetBrainsMono Nerd Font', weight = 'Medium' },
  { family = 'JetBrains Mono', weight = 'Medium' },
  { family = 'SF Mono', weight = 'Medium' },
  'Menlo',
}

config.font_size = 14.0
config.line_height = 1.2

-- Enable ligatures
config.harfbuzz_features = { 'calt=1', 'clig=1', 'liga=1' }

-- ============================================================
-- Color Theme (with auto dark/light switching)
-- ============================================================
local function scheme_for_appearance(appearance)
  if appearance:find 'Dark' then
    return 'Dracula'
  else
    return 'Catppuccin Latte'
  end
end

wezterm.on('window-config-reloaded', function(window, pane)
  local overrides = window:get_config_overrides() or {}
  local scheme = scheme_for_appearance(window:get_appearance())
  if overrides.color_scheme ~= scheme then
    overrides.color_scheme = scheme
    window:set_config_overrides(overrides)
  end
end)

config.color_scheme = 'Dracula'

-- Window transparency
config.window_background_opacity = 0.95
config.macos_window_background_blur = 20

-- ============================================================
-- Window Settings
-- ============================================================
-- Initial window size (AI CLI needs more space)
config.initial_cols = 140
config.initial_rows = 40

-- Window padding
config.window_padding = {
  left = 12,
  right = 12,
  top = 12,
  bottom = 12,
}

-- Title bar style
config.window_decorations = 'RESIZE'
config.hide_tab_bar_if_only_one_tab = true

-- Native macOS fullscreen
config.native_macos_fullscreen_mode = true

-- ============================================================
-- GPU Rendering (Apple Silicon optimized)
-- ============================================================
config.front_end = 'WebGpu'
config.webgpu_power_preference = 'HighPerformance'

-- Scrollback buffer (AI outputs a lot, set this high)
config.scrollback_lines = 50000

-- ============================================================
-- AI CLI Key Settings
-- ============================================================
config.keys = {
  -- [IMPORTANT] Release Alt+Enter for Claude Code
  { key = 'Enter', mods = 'ALT', action = wezterm.action.DisableDefaultAssignment },

  -- Ctrl+Cmd+F: Fullscreen
  { key = 'f', mods = 'CTRL|CMD', action = wezterm.action.ToggleFullScreen },

  -- Cmd+T: New tab
  { key = 't', mods = 'CMD', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },

  -- Cmd+W: Close tab
  { key = 'w', mods = 'CMD', action = wezterm.action.CloseCurrentTab { confirm = true } },

  -- Cmd+D: Vertical split
  { key = 'd', mods = 'CMD', action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' } },

  -- Cmd+Shift+D: Horizontal split
  { key = 'd', mods = 'CMD|SHIFT', action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' } },

  -- Cmd+Arrow: Navigate splits
  { key = 'LeftArrow', mods = 'CMD', action = wezterm.action.ActivatePaneDirection 'Left' },
  { key = 'RightArrow', mods = 'CMD', action = wezterm.action.ActivatePaneDirection 'Right' },
  { key = 'UpArrow', mods = 'CMD', action = wezterm.action.ActivatePaneDirection 'Up' },
  { key = 'DownArrow', mods = 'CMD', action = wezterm.action.ActivatePaneDirection 'Down' },

  -- Cmd+K: Clear screen
  { key = 'k', mods = 'CMD', action = wezterm.action.ClearScrollback 'ScrollbackAndViewport' },

  -- Cmd+F: Search
  { key = 'f', mods = 'CMD', action = wezterm.action.Search { CaseInSensitiveString = '' } },

  -- Cmd+Plus/Minus: Adjust font size
  { key = '=', mods = 'CMD', action = wezterm.action.IncreaseFontSize },
  { key = '-', mods = 'CMD', action = wezterm.action.DecreaseFontSize },
  { key = '0', mods = 'CMD', action = wezterm.action.ResetFontSize },

  -- Cmd+1-9: Switch tabs
  { key = '1', mods = 'CMD', action = wezterm.action.ActivateTab(0) },
  { key = '2', mods = 'CMD', action = wezterm.action.ActivateTab(1) },
  { key = '3', mods = 'CMD', action = wezterm.action.ActivateTab(2) },
  { key = '4', mods = 'CMD', action = wezterm.action.ActivateTab(3) },
  { key = '5', mods = 'CMD', action = wezterm.action.ActivateTab(4) },
}

-- ============================================================
-- Other Settings
-- ============================================================
-- Cursor settings
config.default_cursor_style = 'SteadyBar'
config.cursor_blink_rate = 500

-- Tab bar style
config.use_fancy_tab_bar = true
config.tab_bar_at_bottom = false

-- Disable update check
config.check_for_updates = false

-- Sounds
config.audible_bell = 'Disabled'

-- Confirm close window (avoid accidentally closing AI conversations)
config.window_close_confirmation = 'AlwaysPrompt'

return config

Configuration Comparison

Setting Ghostty WezTerm Consistency
Font JetBrainsMono Nerd Font 14pt JetBrainsMono Nerd Font 14pt
Theme Dracula Dracula (auto-switchable)
Transparency 0.95 0.95
Blur blur-radius=20 blur=20
Scrollback 50000 50000
Alt+Enter Native support Config needed ⚠️
Dark/Light Switch ❌ Not supported ✅ Lua implementation

Conclusion: My Choice

After deep testing and daily use, here’s my recommendation:

Best Combination Strategy

Use Case Recommended Terminal Usage Ratio Reason
Daily local dev + AI CLI Ghostty 80% Native Metal, lowest latency, native Alt+Enter support
When needing advanced features WezTerm 15% Built-in multiplexer, Lua scripting, cross-platform
SSH connection management Tabby or SSH config 5% GUI management is convenient, or pure CLI is lighter

Why Ghostty Is the Top Choice for the AI CLI Era

  1. Native Alt+Enter support: No extra configuration, Claude Code works out of the box
  2. Lowest input latency: The smoothest typing experience when conversing with AI
  3. Long-running stability: High memory efficiency, runs all day without slowing down
  4. Native macOS experience: Feels like Apple made this terminal

When to Choose WezTerm

  1. Need Windows support: Ghostty doesn’t support Windows
  2. Don’t want to learn tmux: WezTerm has built-in multiplexer
  3. Need programmatic config: Auto dark/light theme switching, dynamic status bar, etc.
  4. Need SSH disconnect reconnection: WezTerm’s mux domains are very useful

Final Recommendation

If you’re a macOS user and starting to use AI CLI tools (Claude Code, Copilot CLI, etc.), Ghostty is currently the best terminal for you. Its design philosophy—focusing on doing the terminal thing well—has become an advantage in the AI era.

But WezTerm remains an excellent alternative. If you need cross-platform support, built-in multiplexer, or auto dark/light theme switching, WezTerm is the better choice.

Both are top-tier terminals. The choice depends on whether you value ultimate experience (Ghostty) or ultimate flexibility (WezTerm).


Sources

  1. Ghostty Official Website and GitHub

  2. WezTerm Official Documentation

  3. Mitchell Hashimoto’s Ghostty Introduction

  4. Tabby Official Website

  5. Claude Code Official Documentation

Leave a Comment