LabHub

Blog

Terminal & Shell Tools 2026 — Ghostty / Wezterm / Alacritty / Kitty / Warp / Fish 4 / Nushell / Zellij / Starship Deep Dive

한국어English日本語

Prologue — terminals got interesting again

For ten years the terminal was the boring tool. The xterm model from the 1990s plus iTerm2 (2008), GNU screen (1987), and tmux (2007) covered nearly everything. After that the only real changes were "slightly nicer fonts" and "slightly faster rendering."

Between 2024 and 2026 that picture shifted hard.

This post walks the 2026 landscape in one breath: emulator -> shell -> multiplexer -> prompt -> utilities -> dotfiles. At the end there is a matrix for who should pick what across macOS, Linux, Windows, design-first, and speed-first scenarios.


1. The 2026 terminal map — four layers

One picture first. The single word "terminal" hides four different things.

[your keyboard]
      |
      v
+----------------------+
|  Terminal Emulator   |   <- draws pixels (GUI)
|  (Ghostty, iTerm2,   |     Ghostty / Wezterm / Alacritty / Kitty
|   Wezterm, Warp ...) |     Warp / iTerm2 / Windows Terminal
+----------+-----------+
           |
           |  pty (virtual terminal)
           v
+----------------------+
|        Shell         |   <- parses commands
|  (bash, zsh, fish,   |     bash / zsh / fish / nushell
|   nushell, ...)      |     elvish / xonsh / Oils sh
+----------+-----------+
           |
           |  fork / exec
           v
+----------------------+
|     Multiplexer      |   <- sessions, windows, panes
|   (tmux, zellij,     |     tmux / zellij / screen / dvtm
|    screen, ...)      |
+----------+-----------+
           |
           v
+----------------------+
|   CLI utils + prompt |   <- bat / eza / zoxide / fd / rg / fzf / atuin
+----------------------+   <- starship / p10k / oh-my-zsh / oh-my-posh

If you don't separate these four layers, tool decisions tangle. Saying "Warp is great" really means the product that bundles emulator + shell + multiplexer + parts of the prompt is great — not that it is somehow faster than tmux. By contrast, "Ghostty + zsh + tmux + starship + atuin" keeps each layer cleanly separated.

One-liner to remember: emulator = pixels, shell = semantics, multiplexer = sessions, prompt = information.


2. Ghostty — Mitchell Hashimoto's two-year project, GA Dec 2024

The most interesting newcomer first.

Ghostty is what Mitchell Hashimoto (co-founder of HashiCorp, the company behind Terraform, Vault, and Consul) built after leaving full-time. Two years, mostly solo, in Zig. The 1.0 release shipped in December 2024 after a long private beta; the first week of GA added 20,000+ stars on GitHub.

Key traits:

Config example (the simplicity is the point):

# ~/.config/ghostty/config
font-family = "JetBrains Mono"
font-size = 14
theme = "GruvboxDarkHard"
background-opacity = 0.95
window-padding-x = 12
window-padding-y = 12
macos-titlebar-style = "tabs"
keybind = cmd+t=new_tab
keybind = cmd+shift+enter=toggle_fullscreen

The reason Ghostty became a talking point is not just "another new terminal." It was proof that one person, given two full-time years, can ship system software of this quality. No prior terminal had simultaneously hit xterm compatibility, GPU rendering, and native GUIs on two platforms.

The limits are real too.

One-liner: Ghostty is "just a fast, clean terminal." That is the strongest selling point.


3. Wezterm — the Lua-scripted Rust terminal

Wezterm (Wez Furlong) has been under heavy development since 2020. One-liner: Lua config + built-in multiplexer + multi-OS.

Traits:

Config example:

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

config.font = wezterm.font 'JetBrains Mono'
config.font_size = 14
config.color_scheme = 'GruvboxDark'
config.window_background_opacity = 0.95
config.hide_tab_bar_if_only_one_tab = true

-- key bindings
config.keys = {
  { key = 't', mods = 'CMD',       action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
  { key = 'd', mods = 'CMD',       action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' } },
  { key = 'D', mods = 'CMD|SHIFT', action = wezterm.action.SplitVertical   { domain = 'CurrentPaneDomain' } },
}

-- event hook
wezterm.on('update-right-status', function(window, pane)
  window:set_right_status(wezterm.strftime '%H:%M:%S')
end)

return config

The reason to pick Wezterm is clear: you want all config as code, and you want the multiplexer built in. People who want Wezterm's expressive power over Ghostty's simplicity.


4. Alacritty — the simplest Rust terminal

Alacritty (2017–) is the grandparent of Rust terminals. Philosophy in one line: render fast, do nothing else.

Config example:

# ~/.config/alacritty/alacritty.toml
[font]
normal = { family = "JetBrains Mono", style = "Regular" }
size = 14

[colors.primary]
background = '#1d2021'
foreground = '#d4be98'

[window]
opacity = 0.95
padding = { x = 12, y = 12 }
decorations = "buttonless"

[keyboard]
bindings = [
  { key = "T", mods = "Command", action = "SpawnNewInstance" },
]

Alacritty's appeal is simplicity. "A terminal only draws characters; sessions belong to tmux." If that resonates, Alacritty is the answer. In 2026 Ghostty matches the simplicity story while also shipping a SwiftUI GUI, but Alacritty still wins on pure cross-platform coverage.


5. Kitty — GPU acceleration plus Python config

Kitty (Kovid Goyal, 2017–) is C plus Python. Same vintage as Alacritty, opposite philosophy: put features in.

Config example:

# ~/.config/kitty/kitty.conf
font_family      JetBrains Mono
font_size        14.0
background_opacity 0.95
window_padding_width 12

# tabs
map cmd+t new_tab
map cmd+shift+enter toggle_fullscreen

# splits
enabled_layouts splits,stack
map cmd+d launch --location=vsplit
map cmd+shift+d launch --location=hsplit

Kitty fits the user who wants everything in one tool, hates Lua and JS, and likes Python. Common in scientific computing, research, and ML.


6. Warp — the AI-first bet

Warp (2020–) made the biggest bet of any new terminal. Y Combinator alum, raised through Series B, with the slogan "we are redesigning the terminal for the first time in 30 years."

Differentiators:

Tradeoffs:

People who pick Warp:

People who avoid it:

One-liner: Warp is the bet that "if the editor's evolution was VS Code, the terminal's evolution is us."


7. iTerm2 / Windows Terminal / Tabby / Hyper — the incumbents in 2026

iTerm2 — the macOS classic (2008–)

George Nachman's ObjC project. The de-facto macOS terminal for 17 years.

Windows Terminal — Microsoft's official (2019–)

Tabby (formerly Terminus) — Electron cross-platform (2017–)

Hyper — JS/HTML/CSS Electron terminal (2016–)

One-liner: In 2026, if you're starting fresh on macOS, the answer is Ghostty or Wezterm. On Windows, it's Windows Terminal.


8. Fish 4 (2024) — the Rust rewrite

To the shell layer. The biggest event is Fish 4.

Fish (Friendly Interactive Shell) has been around since 2005, long written in C++. Fish 4, released in 2024, is the major release that moved almost all of the C++ codebase to Rust. It is the case study frequently cited when projects like PostgreSQL or CPython discuss Rust migrations.

Fish's appeal (carried from version 1):

What Fish 4 actually changes:

Config example:

# ~/.config/fish/config.fish
set -gx EDITOR nvim
set -gx PATH $HOME/.cargo/bin $PATH

# abbreviations — expand as you type
abbr -a gst git status
abbr -a gco git checkout
abbr -a k kubectl

# starship prompt
starship init fish | source

# zoxide
zoxide init fish | source

# keybinding
bind \cr 'atuin search'

What Fish 4 signals:

  1. The opening shot for shells themselves being rewritten in Rust. Nushell started in Rust; Fish 4 is the first major example of moving an existing shell.
  2. A C++-to-Rust migration case study. Staged ports, interop layers, build system rewrites — patterns documented in public.
  3. No visible change for the user. The definition of a well-executed migration: users don't notice.

9. Nushell — the structured-data shell

Nushell (2019–, by Jonathan Turner, Yehuda Katz, and others) is the attempt to change the shell paradigm.

Old shell assumption: what flows through pipes is text. In bash or zsh, what moves between commands is newline-delimited strings: ls | grep foo | awk '{print $1}'.

Nushell's assumption: what flows through pipes is a structured table. ls emits a table with rows and columns, and the next command can reference columns by name.

Comparison:

# bash: text parsing
ls -la | awk '{print $5, $9}' | sort -n
# nushell: structured data
ls | select name size | sort-by size
# JSON, CSV, TOML, YAML, SQLite — same shape
open data.csv | where age > 30 | select name email
open package.json | get dependencies | columns

# HTTP fits the same model
http get https://api.github.com/repos/nushell/nushell | get stargazers_count

# SQL-ish queries
ls | where modified > (date now) - 7day | sort-by modified

Nushell's strengths:

Limits:

Where Nushell shines: data wrangling, ops automation, day-to-day SRE work. "Too small for a Python script, too tangled for a jq/awk pipeline." That gap.


10. Elvish / Murex / xonsh / Oils sh — the other newcomers

Beyond Nushell, there are several other shells rethinking the model.

Elvish

Murex

xonsh

Oils sh (formerly Oil)

These four are at 5k–20k GitHub stars each. Nushell dominates the new-shell space, but each shows a different philosophy. Elvish for Go users, Murex for people who can't drop POSIX, xonsh for data scientists, Oils for "better bash" people.


11. tmux vs Zellij — comparing multiplexers

Session, window, and pane management was tmux's monopoly (2007–) for a long time. GNU screen (1987–) is alive but effectively in maintenance, dvtm appeals only to minimalists.

The 2026 challenger is Zellij (2020–, Rust).

tmux — the standard

Config example:

# ~/.tmux.conf
set -g prefix C-a
unbind C-b
bind C-a send-prefix

set -g mouse on
set -g history-limit 10000
set -g base-index 1
set -g renumber-windows on

# splits
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"

# pane navigation
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# status
set -g status-style 'bg=#1d2021 fg=#d4be98'

Zellij — the modern challenger

Comparison matrix:

AspecttmuxZellij
MaturityVery highMid
Learning curveSteepGentle
Default UXPrefix keysDiscoverable hints
Config formattmux DSLKDL
PluginsTPMWASM
MemoryVery lightLight
Remote SSHFirst-classWorkable
Installed everywhereYesNo

Pick tmux: if you live in remote SSH, need it on every server, and have the keystrokes burned in.

Pick Zellij: if most work is local, you're starting fresh, or you don't want to memorize keys.


12. Starship — the universal prompt

The prompt layer. This market has been effectively unified by Starship (2019–, Matt Knox).

Why Starship wins:

Install:

# install
curl -sS https://starship.rs/install.sh | sh

# enable in your shell (one line in your shell rc)
# bash:  eval "$(starship init bash)"
# zsh:   eval "$(starship init zsh)"
# fish:  starship init fish | source

Config example:

# ~/.config/starship.toml
add_newline = true

format = """
$username\
$hostname\
$directory\
$git_branch\
$git_status\
$nodejs\
$python\
$rust\
$kubernetes\
$character"""

[character]
success_symbol = "[➜](bold green)"
error_symbol = "[➜](bold red)"

[directory]
truncation_length = 3
truncate_to_repo = true

[git_branch]
symbol = " "
format = "[$symbol$branch]($style) "

[kubernetes]
disabled = false
format = '[⛵ $context \($namespace\)](dimmed green) '

Other options:

One-liner: In 2026, if you're starting fresh, Starship is the answer. The zsh + oh-my-zsh + p10k combo is still valid but has no reason to be new.


13. The Rust CLI series — bat / eza / zoxide / fd / ripgrep / fzf / atuin

The group of utilities that rewrote standard Unix tools in Rust. All over 10k stars on GitHub.

bat — a better cat

bat README.md
# syntax highlighting + git diff markers + automatic pager

alias cat=bat is the usual move.

eza (formerly exa) — a better ls

eza -la --git --icons
eza -T --level=2  # tree view

After the original exa went unmaintained, eza forked to keep it alive. A similar alternative is lsd.

zoxide — a better cd

# go in once normally
cd ~/work/yj-next-blog2

# next time, anywhere
z next-blog2     # full name from anywhere
z blog2          # partial match
zi               # fzf interactive mode

Learns the directories you visit and lets you jump by a fragment of the name. Once it's wired up, going back to cd ../../../foo is impossible.

fd — a better find

fd README           # any file with README in the name
fd -e mdx           # extension mdx
fd -t f --changed-within 1d  # files modified in last day

Translates find's arcane syntax (-name '*foo*' -type f) into something humans can type.

ripgrep (rg) — a better grep

rg "fn main"                # recursive grep from cwd
rg -t rust "TODO"           # only Rust files
rg -i -A 3 "error"          # case-insensitive + 3 lines after

Powers the GitHub code search engine. Respects .gitignore automatically and uses multi-threading plus SIMD — typically an order of magnitude faster than grep.

fzf — fuzzy finder

# pick a file
vim "$(fzf)"

# Ctrl-R for shell history
# Ctrl-T for files in cwd
# Alt-C for cd

# pipe anything into fzf
ls | fzf | xargs cat

After installation, enabling the shell integration immediately rewires Ctrl-R (history), Ctrl-T (files), and Alt-C (cd). Hard to live without after a week.

atuin — a better shell history

# after install
atuin init zsh | source
atuin import auto

# Ctrl-R is now the atuin UI
# search by exit code, duration, directory, session, host
# optional sync (can self-host)

Much more powerful search than the default .zsh_history. If you want machines to share history, sync to Atuin's cloud or a self-hosted instance.

Install everything (Homebrew flavor):

brew install bat eza zoxide fd ripgrep fzf atuin starship

Wire it all into zsh:

# at the end of ~/.zshrc
eval "$(starship init zsh)"
eval "$(zoxide init zsh --cmd cd)"
eval "$(atuin init zsh)"
source <(fzf --zsh)
alias ls='eza --icons --git'
alias cat='bat --plain'
alias find='fd'
alias grep='rg'

One-liner: Install these seven tools and your shell becomes a different shell. The first week is awkward; after that you forget some of the GNU coreutils names.


14. Korea and Japan — Toss dotfiles, Mercari shell setups

Korea — the Toss / Naver / Kakao picture

Look inside dotfiles repos from senior engineers at modern Korean startups like Toss (Viva Republica) and a pattern shows up.

A typical Toss-senior macOS setup:

Backend work at Naver leans differently — Linux + bash + tmux + ripgrep + fzf, Starship occasionally. "Only install what's on every server" is more or less the rule for production work.

Kakao varies a lot by silo. AI teams experiment with zsh + Starship + Nushell, conservative backend teams stay on bash + tmux.

Korean OSS: global tools like karpathy's scripts and gleitz/howdoi show up in Korean dotfiles. Beyond that, mostly the same trends as anywhere else.

Japan — Mercari, LINE, CyberAgent

Mercari's SRE team publishes an exemplary dotfiles repo that doubles as a reference.

The Mercari-style macOS setup:

LINE Yahoo, with massive infrastructure, tends to be conservative: Linux + bash + tmux. Some Nushell experimentation inside SRE.

CyberAgent's AI Lab is the most progressive: Warp with AI heavily, Nushell for data work, Zellij in trial.

Japanese OSS worth knowing:

One-liner: Korean and Japanese senior engineer dotfiles are fast adopters of the global stack. Japan blends in more domestic OSS (pet, peco, ghq).


15. Who should pick what — the scenario matrix

The final chapter. A matrix to help you decide.

macOS — new user

LayerPickAlternative
EmulatorGhosttyWezterm
Shellzshfish 4
MultiplexertmuxZellij
PromptStarshipp10k
Utilitiesbat + eza + zoxide + fd + rg + fzf + atuin

macOS — AI / design forward

LayerPickAlternative
EmulatorWarpGhostty
Shell(Warp built-in)
Prompt(Warp built-in)Starship

Linux desktop

LayerPickAlternative
EmulatorGhosttyWezterm, Alacritty, Kitty
Shellzsh or fish 4bash
MultiplexertmuxZellij
PromptStarship

Linux server over SSH

LayerPickNote
ShellbashInstalled everywhere
MultiplexertmuxInstalled almost everywhere
Utilitiesapt-get just ripgrep / fd / batToo much breaks ops hygiene

Windows

LayerPickAlternative
EmulatorWindows TerminalWezterm, Tabby
ShellPowerShell 7WSL + bash/zsh
Promptoh-my-poshStarship

Speed-first

Design-first


Epilogue — the terminal is interesting again

Ask "what terminal do you use" in 2014 and you got two answers — iTerm2 or GNOME Terminal. The shell was bash or zsh. The multiplexer was tmux. The prompt was some oh-my-zsh theme.

Ask the same question in 2026 and there are five answers per layer. Ghostty, Wezterm, Alacritty, Kitty, Warp. zsh, fish 4, Nushell, bash, Elvish. tmux, Zellij. Starship, p10k, oh-my-posh.

Three forces produced that diversity:

  1. Rust rewrites. The wave of rewriting systems software in Rust reached shells, utilities, and multiplexers.
  2. Solo full-time projects returning. Mitchell Hashimoto's Ghostty is the cleanest example — two years full-time, one person, shipping system software at this quality.
  3. AI integration. Warp leans hardest, but tools like Cursor, Claude Code, and Cline are blurring the line between shell and terminal.

Hopefully this post made you re-examine your setup once. You don't need to swap everything. One emulator change, one prompt change, plus installing ripgrep, fzf, zoxide, and atuin is enough to change how daily shell work feels.

14-step checklist

  1. Switch the emulator to one of Ghostty, Wezterm, or Warp.
  2. Clean up your shell rc file and install Starship.
  3. Migrate from Powerlevel10k to Starship (skip if you already love p10k).
  4. Install ripgrep and forget grep.
  5. Install fd and forget find.
  6. Install fzf and enable shell integration (Ctrl-R changes meaning).
  7. Install zoxide and alias cd to it.
  8. Install bat and alias cat to it.
  9. Install eza and alias ls to it.
  10. Install atuin (self-host the sync server if needed).
  11. Pick one multiplexer flow in tmux or Zellij.
  12. Create a dotfiles repo and manage it with chezmoi or a bare git repo.
  13. Switch fonts to a Nerd Font variant (so Starship icons render).
  14. Install the same setup again in WSL or a container — work feels identical everywhere.

10 anti-patterns

  1. Installing Hyper fresh today. It's slow; better options exist.
  2. Enabling every oh-my-zsh plugin. Shell startup pays for it.
  3. Building a 1000-line tmux config. You won't read it six months later.
  4. Starting fresh with p10k. Go to Starship.
  5. Running Nushell in server automation scripts. 0.x risk.
  6. Using Warp without thinking about the cloud dependency cost over years.
  7. Using zsh, bash, and fish simultaneously as the main shell. Three rc files, pick one.
  8. Setting up new machines without dotfiles. Turns a 30-minute job into 3 hours.
  9. Installing atuin without reviewing sync. Your history may end up in the cloud.
  10. Mandating Ghostty company-wide the week it shipped. Wait a year and validate on your own machine first.

Next-post teasers


References

Comments

No comments yet.

Sign in to leave a comment