Skip to content

tmux vs Zellij: Which Multiplexer?

tmux has been holding the internet together since 2007, and the standard criticism of it is not that it is bad. It is that nothing about it is guessable. The prefix key is a convention you must be told, the split keys are % and " for reasons lost to history, and the only way in is somebody else’s dotfiles.

Zellij is the most serious attempt yet to fix that, and it fixes rather more than it breaks. It also loses, decisively, on the one axis that matters most to the people who need a multiplexer in the first place.

tmux Zellij
Around since 2007 2021
Written in C Rust
Config ~/.tmux.conf ~/.config/zellij/config.kdl
How you drive it One prefix key, then a key Modes, with an on-screen menu
Discoverable? No Yes, aggressively
Survives a reboot Only with a plugin Yes, by default
Floating / stacked panes No Yes
Plugins Shell scripts, via TPM WebAssembly
On the server already Almost certainly Almost certainly not

If you SSH into machines you do not control, learn tmux. Everything else on this page is Zellij winning, and none of it survives contact with a box that does not have Zellij installed.

Start Zellij and the bottom of the screen lists your options. Press Ctrl+P and it lists what pane mode can do. Press Ctrl+T and it lists what tab mode can do. There is no moment where you must go and find out; the thing you need is already on screen.

This sounds trivial and is not. It is the difference between a tool you can explore and a tool you must be taught, and it is why people who bounced off tmux twice get on with Zellij in an afternoon. The tmux cheat sheet on this site exists precisely because tmux gives you nothing: prefix ? lists every binding at once, alphabetically, which is a reference rather than a hint.

tmux has one modifier: press Ctrl+B, release, then press a key. Zellij instead has modes, each entered with its own chord and each with its own single-letter bindings:

Mode Enter with For
Pane Ctrl+P New, close, split, focus, fullscreen, float
Tab Ctrl+T New, rename, close, move between
Resize Ctrl+N Grow and shrink with h j k l
Move Ctrl+H Shuffle panes around the layout
Scroll Ctrl+S Scrollback, search, edit in $EDITOR
Session Ctrl+O Detach, session manager, plugins
Locked Ctrl+G Pass everything through to the shell
Quit Ctrl+Q Exactly what it says

Inside a mode, Esc or Enter returns you to normal. It is a genuinely nicer model — related commands cluster, and the status bar narrates the whole thing.

Here is Zellij’s best feature, and it is not the one it advertises.

tmux sessions live in memory. Reboot the machine and they are gone — the one hole in an otherwise excellent persistence story, and the reason tmux-resurrect and tmux-continuum exist as third-party plugins you have to know about, install and configure.

Zellij serialises sessions to disk by default. Tabs, panes, working directories and the commands that were running come back after a reboot, with no plugin and no configuration. It is the single most convincing argument for switching, and most comparisons bury it under the screenshots.

That does mean two kinds of ending, which trips people up:

Terminal window
zellij kill-session work # stop it running; the saved state stays
zellij delete-session work # bin the saved state as well
zellij ls # running sessions, and resurrectable ones

kill is a pause you can come back from. delete is the real goodbye. zellij da deletes every saved session at once, for when the list has got out of hand.

tmux gives you a grid. Panes tile, and that is the deal.

Zellij adds two things the grid cannot do. Floating panes (Ctrl+P then w) hover above the layout — ideal for a quick git status you do not want to rearrange the screen for — and can be pinned to stay visible while you work behind them. Stacked panes (Ctrl+P then s) collapse into a pile showing only the focused one, which keeps six panes usable in a space that would fit two.

Both are genuinely good, and both are the sort of thing you stop noticing until you go back to tmux and reach for them.

Config: KDL versus thirty years of convention

Section titled “Config: KDL versus thirty years of convention”

Zellij configures in KDL, in ~/.config/zellij/config.kdl, and layouts are KDL too — so a project’s window and pane arrangement is a file you commit alongside the code:

Terminal window
zellij setup --dump-config > ~/.config/zellij/config.kdl

That dumps the entire default config, every option documented in comments, which is a far kinder starting point than a blank ~/.tmux.conf. Useful defaults are already on: mouse support, copy-on-select, pane frames, 10,000 lines of scrollback.

tmux’s config is a flat list of commands in its own small language. It is less tidy, but it has one advantage KDL cannot match: every snippet written in the last fifteen years still works. Both files belong in your dotfiles repo either way.

tmux plugins are shell scripts, usually installed through TPM, and the ecosystem is enormous and slightly chaotic. Zellij plugins are WebAssembly modules, which means they can be written in any language that targets WASI and run sandboxed — the status bar, tab bar, file explorer and session manager are all plugins, which is a tidy proof of the architecture.

Zellij’s approach is clearly better engineered. tmux’s has fifteen more years of people having already solved your problem. Take your pick.

This is the part that decides it, so it gets said plainly.

A multiplexer’s entire purpose is that the session keeps running when your connection does not. That means it has to be on the far end. Not on your laptop — on the server, the container, the jump host, the ancient CentOS box nobody will admit to owning.

tmux is in every distribution’s repositories, is frequently preinstalled, and an eighteen-year-old version will still hold your session. Zellij is a single Rust binary, which is easy to install — right up until the host has no outbound internet, or you have no root, or there are forty of them, or it is someone else’s production machine and you have no business installing anything on it.

So the honest recommendation is split, and annoying:

  • Locally, where you control the machine, Zellij is the better tool.
  • Remotely, tmux, because it is already there.

Which means learning both, or learning the one that works everywhere. Most people quite reasonably choose the second, and that — not features — is why tmux is still winning.

tmux is C, has been optimised for eighteen years, and costs almost nothing to run. Zellij is a modern Rust application with a WebAssembly plugin runtime and a rendering model that redraws more: heavier on memory and CPU, and noticeable on a small VPS or a Raspberry Pi even if you never see it on a laptop.

Zellij is also still pre-1.0 at 0.45, and behaves like it — rapid development, occasional breaking changes to config and layout formats, and a smaller pool of answers when something goes odd. tmux’s boring stability is a feature that only announces itself when you need it.

  • SSH into machines you do not control? tmux. Not close.
  • Only ever work locally, and bounced off tmux before? Zellij. It is the more pleasant tool and you will actually keep using it.
  • Want sessions back after a reboot without configuring anything? Zellij.
  • Want your Ctrl keys left alone? tmux, or Zellij with default_mode "locked".
  • Running on something small? tmux.
  • Want floating panes and committed layouts? Zellij.
  • Want to learn one thing, once, that works everywhere for the next decade? tmux, and the cheat sheet is the shortest path through the bit that puts people off.

Zellij is what a multiplexer would look like if it were designed today, and that is a real compliment rather than a consolation. It is just that “designed today” is not the property you want from the program keeping your deploy alive on a server built in 2019.

Whichever you run, it wants a decent window around it — the terminal emulator roundup covers that, and several of them (kitty especially) do tabs and splits natively, which is worth knowing before you reach for a multiplexer you may not need.