Install
# Linux / macOS
cargo install --locked zellij
# Or single binary
curl -L 'https://github.com/zellij-org/zellij/releases/latest/download/zellij-x86_64-unknown-linux-musl.tar.gz' \
| sudo tar -xz -C /usr/local/bin
# Debian / Ubuntu via mise (see /tutorials/mise-polyglot-runtime-versions.html)
mise use -g zellij@latest
# Homebrew
brew install zellij
# Arch
sudo pacman -S zellij
First launch
zellij
The status bar at the bottom shows the active mode and its keybindings. The default mode is Normal with one entry point keychord per action. The list:
Ctrl-p Pane mode — manage panes
Ctrl-t Tab mode — manage tabs (workspaces)
Ctrl-n Resize mode — resize panes interactively
Ctrl-o Session mode — attach / detach / new session
Ctrl-s Scroll mode — scroll back through the buffer
Ctrl-g Locked mode — pass all keystrokes through (useful for nested terminals)
Ctrl-q Quit zellij
Esc Back to Normal mode
Each mode shows its sub-bindings in the status bar. There's no memorization needed — if you press Ctrl-p and the status bar shows "n - new pane right, d - new pane down, h/j/k/l - move focus, x - close pane," you don't have to look up anything.
Basic workflow
# Split a pane vertically
Ctrl-p, n
# Or horizontally
Ctrl-p, d
# Move focus between panes
Ctrl-p, h/j/k/l
# Or just Alt-Arrow keys in Normal mode
# Close the focused pane
Ctrl-p, x
# New tab
Ctrl-t, n
# Switch to tab by number
Alt-1, Alt-2, ... Alt-9
# Rename current tab
Ctrl-t, r <new-name> Enter
Sessions: detach, reattach, list
This is the value of any multiplexer: a long-running process keeps running after you disconnect.
# Start a named session
zellij attach --create my-session
# Detach (without ending the session)
Ctrl-o, d
# List sessions
zellij list-sessions
# Reattach
zellij attach my-session
# Kill a session
zellij kill-session my-session
Combine with mosh + zellij as the standard "ssh and never lose work" pattern:
mosh user@server -- zellij attach --create main
Layouts
A layout describes a multi-pane multi-tab setup that boots ready-to-work. Save under ~/.config/zellij/layouts/dev.kdl:
layout {
default_tab_template {
children
pane size=1 borderless=true {
plugin location="zellij:status-bar"
}
}
tab name="edit" focus=true {
pane command="hx" {
args "."
}
}
tab name="run" {
pane split_direction="vertical" {
pane name="server" command="bash" {
args "-c" "npm run dev"
}
pane name="logs" command="tail" {
args "-f" "/tmp/app.log"
}
}
}
tab name="db" {
pane command="psql" {
args "postgres://localhost/dev"
}
}
}
zellij --layout dev
Three tabs preloaded with editor, dev server, log tail, and a psql connection — one command. Layouts make project bootstrap reproducible without a shell function.
Config
~/.config/zellij/config.kdl — the language is KDL (a tree-document format similar to JSON / YAML / TOML, intentionally minimal):
// Defaults that pay off immediately
default_shell "fish" // or bash, zsh
default_layout "compact" // less chrome
mouse_mode true
copy_command "wl-copy" // Wayland; xclip for X11; pbcopy on macOS
scroll_buffer_size 100000
pane_frames false
simplified_ui false
// Theme
theme "catppuccin-mocha"
// Keybinding overrides — just one example; defaults are fine
keybinds clear-defaults=false {
shared_except "locked" {
bind "Alt h" { MoveFocus "Left"; }
bind "Alt l" { MoveFocus "Right"; }
bind "Alt j" { MoveFocus "Down"; }
bind "Alt k" { MoveFocus "Up"; }
}
}
Plugins
zellij has a WebAssembly plugin system. Out-of-the-box plugins include the status bar, tab bar, scroll-back search, file picker. Community plugins:
- zellij-forgot — a keybinding cheat sheet floating window.
- zjstatus — alternative status bar with more theming.
- monocle — project-aware tab management.
Install plugins by dropping their .wasm file in ~/.config/zellij/plugins/ and referencing them in layout or config.
zellij vs tmux
- Discoverability — tmux's bindings are entirely invisible until you've memorized them. zellij's are on screen at all times.
- Defaults — tmux out of the box (no
.tmux.conf) is functional but rough. zellij out of the box is what most people want without configuration. - Sessions — both handle persistent sessions, attach/detach, named multiplexing.
- Resource usage — zellij uses more memory (~20-50 MB vs tmux's ~5 MB). On a server, tmux still wins for "I'll run a hundred concurrent multiplexer sessions for different users."
- Ecosystem — tmux has 15 years of plugins (tmuxinator, tmux-resurrect, oh-my-tmux). zellij's is smaller but growing.
- Stability — tmux is rock solid. zellij is solid but newer; bugs are still found and fixed regularly.
For "I want to start using a terminal multiplexer today," zellij is dramatically easier. For "I've been using tmux for a decade and have it tuned," there's no urgency to switch — both fill the same role.
Pairing with shell prompts
For the full effect, pair with a modern prompt (starship, oh-my-posh) and the modern CLI tools (see that tutorial): ripgrep, fd, bat, zoxide, fzf. The terminal becomes a productive workspace without needing an IDE in many cases.