The Right Terminal for Claude Code

Sound alerts when Claude finishes. Fast tab switching. The setup that lets you actually multitask while your AI codes.

edge_of_chaos · Feb 2026

The Problem

Claude Code runs long. You fire off a task, switch to another tab, check email, read docs—and five minutes later realize Claude finished ages ago and has been sitting there waiting for your input.

The fix is three things: sound notifications when Claude finishes, fast tab switching between sessions, and a terminal that doesn't fight you on either. Here's what actually works.

Sound Notifications

Three approaches, from zero-config to fully custom.

1. Terminal Bell (30 seconds)

The simplest setup. One command, system beep when Claude finishes:

Terminal
claude config set --global preferredNotifChannel terminal_bell

Test it works: echo -e "\a" — if you hear a beep, you're set.

WSL users
If terminal bell doesn't work (common on Windows WSL), use PowerShell:
powershell.exe -c "[System.Media.SystemSounds]::Question.Play()"

2. Native Desktop Notifications (zero config)

Some terminals show OS-level notifications automatically when Claude finishes:

CC
Claude Code
Task complete. Waiting for input.
Terminal Native Notifications Setup Needed
Ghostty None — works out of the box
Kitty None — works out of the box
iTerm2 ~ Settings → Profiles → Terminal → Enable "Notification Center Alerts"
WezTerm Use hooks (see below)
Warp Use hooks (see below)
Alacritty Use hooks (see below)
VS Code terminal Use hooks (see below)

3. Custom Sound Hooks (the power move)

Claude Code Hooks let you run arbitrary commands at lifecycle events. This means custom sounds—not just beeps, but actual audio files for different events.

macOS
Linux
Windows / WSL
~/.claude/settings.json
{ "hooks": { "Stop": [ { "hooks": [ { "type": "command", "command": "afplay /System/Library/Sounds/Glass.aiff &" } ] } ], "Notification": [ { "hooks": [ { "type": "command", "command": "afplay /System/Library/Sounds/Purr.aiff &" } ] } ] } }

Available sounds: Glass, Submarine, Frog, Purr, Basso, Blow, Bottle, Funk, Hero, Morse, Ping, Pop, Sosumi, Tink.
Path: /System/Library/Sounds/[name].aiff

~/.claude/settings.json
{ "hooks": { "Stop": [ { "hooks": [ { "type": "command", "command": "paplay /usr/share/sounds/freedesktop/stereo/complete.oga &" } ] } ], "Notification": [ { "hooks": [ { "type": "command", "command": "paplay /usr/share/sounds/freedesktop/stereo/message.oga &" } ] } ] } }

Alternatives: aplay (ALSA), mpv --no-video sound.mp3, or play (sox).
For desktop notifications too: notify-send "Claude Code" "Done!" &

~/.claude/settings.json
{ "hooks": { "Stop": [ { "hooks": [ { "type": "command", "command": "powershell.exe -c \"[System.Media.SystemSounds]::Exclamation.Play()\" &" } ] } ], "Notification": [ { "hooks": [ { "type": "command", "command": "powershell.exe -c \"[System.Media.SystemSounds]::Question.Play()\" &" } ] } ] } }

Available sounds: Asterisk, Beep, Exclamation, Hand, Question.
For richer notifications: install BurntToast PowerShell module.

Hook events you can use
Stop — fires when Claude finishes its response (task complete)
Notification — fires when Claude needs your input
SessionStart — fires when a new session begins
PreCompact — fires before context window compaction
The & at the end is critical — runs the sound in the background so Claude isn't blocked.

Fast Tab Switching

The real workflow: multiple Claude sessions running in parallel. One refactoring, one researching, one testing. You need to jump between them fast.

Option A: Terminal Native Tabs

Every modern terminal has tabs. The shortcuts:

Cmd+1-9
Jump to tab N (macOS)
Cmd+T
New tab (macOS)
Ctrl+Tab
Next tab (most terminals)
Alt+1-9
Jump to tab N (Linux)

Option B: tmux (the multiplier)

tmux is worth learning for one reason: Agent Teams. Claude Code's multi-agent mode uses tmux panes natively. Each teammate gets its own pane, visible simultaneously.

tmux: 3 panes — [agent-team]
$ tmux new-session -s agents
# Split into 3 panes: Ctrl-b + % (vertical) or " (horizontal)
# Each pane runs its own Claude Code instance

Pane 0: claude "refactor auth module"
Pane 1: claude "write tests for API"
Pane 2: claude "update documentation"

All three running in parallel. Switch: Ctrl-b + arrow keys
Ctrl-b c
New window
Ctrl-b 0-9
Jump to window N
Ctrl-b %
Split vertical
Ctrl-b "
Split horizontal
Ctrl-b arrows
Switch between panes
Ctrl-b d
Detach (sessions persist)

Option C: Zellij (tmux, but friendlier)

If tmux's keybindings make you want to cry, Zellij is the modern alternative. Discoverable shortcuts, floating panes, session management built in.

Heads up
Zellij doesn't support Agent Teams split-pane mode yet (there's an open issue). You can still run multiple Claude sessions in separate Zellij panes manually—just no auto-orchestration.
Ctrl-o Tab
Switch tabs (Zellij)
Alt arrows
Switch panes (Zellij)
Ctrl-o w
Session picker (Zellij)

Find Your Terminal

Answer three questions. Get a recommendation.

Full Comparison

iTerm2
Mac classic, Agent Teams ready
  • Notifications (needs config)
  • Not GPU-accelerated
  • Shift+Enter works natively
  • Agent Teams split-pane
  • Mature, well-documented
  • macOS only
Kitty
Power user's paradise
  • Native notifications
  • GPU-accelerated
  • Shift+Enter works natively
  • Graphics protocol (images in terminal)
  • No Agent Teams split-pane
  • macOS + Linux
WezTerm
Cross-platform, Lua scriptable
  • No native notifications
  • GPU-accelerated (WebGPU)
  • Shift+Enter works natively
  • Lua scripting for everything
  • No Agent Teams split-pane
  • macOS + Linux + Windows
Warp
AI-native, modern UX
  • No native notifications
  • GPU-accelerated
  • Shift+Enter (needs /terminal-setup)
  • Built-in AI command suggestion
  • No Agent Teams split-pane
  • macOS + Linux
Alacritty
Minimal, blazing fast
  • No native notifications
  • GPU-accelerated (fastest)
  • Shift+Enter (needs /terminal-setup)
  • No tabs (use tmux)
  • No Agent Teams split-pane
  • macOS + Linux + Windows

My Setup

I run on Linux. My combo: Ghostty + tmux + sound hooks. Ghostty handles rendering and native notifications. tmux handles session persistence and splits. A hook plays a sound on Stop.

ghostty — tmux [claude-work]
~$ cat ~/.claude/settings.json | jq '.hooks.Stop'
[
{
"hooks": [
{
"type": "command",
"command": "paplay /usr/share/sounds/freedesktop/stereo/complete.oga &"
}
]
}
]

Done. Claude finishes, sound plays, I switch over.
The recommendation
Mac users: Ghostty (or iTerm2 if you want Agent Teams).
Linux users: Ghostty + tmux.
Windows users: Windows Terminal + WSL + tmux + hooks.
Everyone: Set up at least the terminal bell. One command, instant payoff.

Bonus: Claude Code Terminal Tips

Shift+Enter for multiline input

Works natively in Ghostty, Kitty, iTerm2, WezTerm. For others, run /terminal-setup inside Claude Code.

Vim mode

Type /vim in Claude Code. Full hjkl navigation, yank/paste, text objects. If you're a Vim person, this changes everything.

Custom status line

Show model, git branch, and working directory at the bottom of your terminal via /config. Useful when you have 4 sessions running and forget which is which.

Don't paste walls of text

Large pastes get truncated, especially in VS Code's terminal. Write content to a file first, then ask Claude to read it: "read the error log at /tmp/errors.txt".