Skip to content

First module is free — start with a sampler of plugins, skills & e-books.Access for free

Terminal · 5 min

Your first Zellij session: install, name it, keep it

This Zellij tutorial has one destination: ten minutes from now you'll close a terminal window mid-task on purpose — and lose nothing. One brew install, one named session, and the same Cmd+W that kills ordinary terminal work becomes a non-event. Most of the ten minutes is spent enjoying the result.

Studio Schema

One install, one name

Homebrew carries Zellij, so the install is one command. The part that deserves a moment of thought is the name. Sessions are addressed by name — zellij attach studio only works because something is called studio — and naming sessions after the work they hold is a habit worth starting on day one. (If you're still weighing whether a multiplexer is worth learning at all, Zellij vs tmux makes the case and compares the options honestly.)

Two questions verify the install: brew list --versions zellij reports Homebrew's record, and zellij --version asks the binary itself. Both should answer zellij 0.43.1 — the version current as of June 2026 — or newer. A fresh install prints download-and-pour lines first, then leaves you able to ask exactly those two questions.

The ten-minute Zellij tutorial, in seven steps

  1. 01Install Zellij. In any terminal: brew install zellij. Under a minute on most connections.
  2. 02Verify the binary answers. Run zellij --version. You want zellij 0.43.1 or newer.
  3. 03Start a named session. Run zellij -s studio — the -s names it. Your prompt comes back, now framed: a tab bar across the top, and a status bar across the bottom listing keybindings. Those hints are training wheels, and for this week they're exactly what you want — read them like a menu.
  4. 04Split a pane. Press Alt+n (hold Option, tap n). A second pane opens. Run ls in it, then hop back and forth with Alt+h and Alt+l.
  5. 05Close the window — really. Start a counter in one pane: for i in $(seq 1 600); do echo "tick $i"; sleep 1; done — then hit Cmd+W and confirm. Out of the box, Zellij reacts to a force-closed window by detaching, not dying.
  6. 06Confirm the survivor. Open a fresh window and run zellij list-sessions. There it is: studio, with its age, utterly unbothered.
  7. 07Reattach. Run zellij attach studio. Both panes return — and the counter never skipped a tick.

Step 4 leans on one piece of terminal plumbing: on a Mac, the Option key types special characters by default, so Alt+n only reaches Zellij if your terminal sends Option as Alt. In Ghostty that's one line, macos-option-as-alt = true, covered in the 12-line Ghostty config. If pane splits type strange characters instead, that line is the fix.

Terminal showing zellij list-sessions piped through grep printing the single line: studio [Created 6m 51s ago]
The proof, from a window that didn't exist when the session started.

That single line is the whole promise of a multiplexer: a session with an age measured from its own birth, not the window's. The grep in the frame trims a long session history down to the one row that matters here — yours will likely show studio alone.

Read the furniture

While you're inside the session, spend thirty seconds actually reading the interface. The top bar lists tabs. The bottom bar lists modes — pane behind Ctrl+p, tab behind Ctrl+t, session behind Ctrl+o — each opening a submenu of keys when pressed. You don't need to memorize any of it; you need to notice that the interface carries its own manual. That discoverability is most of the reason to pick Zellij over tmux in the first place.

A word on names while the habit is fresh: keep them lowercase, hyphenated, and project-shaped — studio, client-site, foreignfm-universe. A launcher script like the dev command generates session names from project folders exactly that way (it lowercases, swaps spaces for hyphens, and trims to 32 characters), so the names you type by hand now will sit naturally beside the ones it generates later.

Why the training wheels stay on (for now)

Stock Zellij is chatty by design: the bottom bar advertises modes and keys, pane frames draw borders, the tab bar labels everything. A tuned config eventually strips most of that away — simplified_ui true, pane_frames false, a compact layout — because once the keybindings live in your hands, the chrome is noise.

Terminal showing cat ~/.config/zellij/config.kdl with Alt-based keybindings, theme catppuccin-mocha, default_layout compact, pane_frames false, simplified_ui true, and on_force_close quit
Where this is headed: a tuned config.kdl with the chrome stripped — simplified_ui true, pane_frames false, and a deliberate on_force_close change.

The order matters. Learning the quiet config first means memorizing keys from a reference page; learning the loud default first means the interface itself teaches you, and the config change later feels like removing scaffolding from a finished wall. A few days of visual clutter is cheap tuition. Every install path beyond Homebrew — cargo, prebuilt binaries, third-party repositories — is documented at zellij.dev/documentation/installation.

Detaching is also something you'll do on purpose, not just by accident — stepping away from a session at the end of the day and picking it up tomorrow from a new window. Detach and reattach covers that lifecycle, including the full argument for changing the force-close default.

Your session lifecycle card

The four commands you'll use daily, complete and in order:

brew install zellij      # once per machine
zellij -s studio         # start a named session
zellij list-sessions     # what's alive right now
zellij attach studio     # come back to it, from any window
Install once; the other three become daily reflexes.
  • zellij --version answers 0.43.1 or newer
  • Started a session named studio with zellij -s studio
  • Split a pane with Alt+n and moved focus with Alt+h / Alt+l
  • Closed the window mid-task with Cmd+W
  • Saw studio listed in zellij list-sessions from a new window
  • Reattached with zellij attach studio and found everything alive