A terminal workspace for running coding agents across parallel git worktrees.
Built around one problem: long builds. You start one, switch to another worktree to keep working, and then have to remember to check whether the first finished. This setup makes that unnecessary — the workspace tells you, silently, and survives you closing the terminal.
┌────────────────────────────┬──────────────────┐
│ agent │ │
│ (claude, resumed) │ lazygit │
├────────────────────────────┤ │
│ build │ │
└────────────────────────────┴──────────────────┘
tab: bento review docs
One session per worktree. bento opens a zellij session named after the
worktree you're in. Detach with Alt+d, close the terminal, come back later —
the build is still running.
Silent build signals. Any command over 60s renames its tab to ✓ make 47m
when it finishes, and rings a bell that has audio disabled. The status persists,
so it's still there an hour later, and Do Not Disturb can't swallow it. Only
failures raise a notification banner.
Worktrees that share expensive state. promote <branch> swaps a branch into
your main checkout, so it reuses the node_modules, docker volumes and build
caches that already live there instead of rebuilding them per worktree. The
branch moves to the resources, not the other way round.
Worktree awareness everywhere. A wt marker appears in the prompt, the
zellij tab name and the window title whenever you're in a linked worktree, so
you never commit to the wrong tree. Detection is structural (.git/worktrees/),
not name matching.
bento open / re-attach this worktree's session
bentols list sessions
bentorm destroy a session (--all for every one)
wt <branch> create / switch to a worktree
wtls list worktrees: branch, dirty state, live session
promote <branch> swap a branch into the main checkout (--stash if dirty)
mw cd to the main checkout
wtrm [branch] remove a worktree — never deletes branches
Zellij runs locked by default so TUIs in panes receive every keystroke.
Alt+h/j/k/l move between panes
Alt+[ / Alt+] previous / next tab
Alt+d detach
Alt+f fullscreen pane
Alt+n / Alt+w new / close pane
Ctrl+g unlock zellij's own keybindings
Alt+Left/Right is deliberately unbound in zellij — it belongs to the shell
for word movement.
git clone https://github.com/<you>/bento ~/.bento
~/.bento/install.shThe installer symlinks the configs and backs up anything it replaces. It does not install the tools — see below.
Install via mise (or your package manager of choice):
mise use -g zellij lazygit starship fzf zoxide ripgrep fd bat eza jq yq delta glowPlus zsh-autosuggestions and zsh-syntax-highlighting, and a Nerd Font for the
icons. The prompt colors are tuned for a dark background.
- Tested on macOS with Ghostty. The zsh and zellij parts
are portable;
ghostty/configis not. - zellij 0.45 can't combine
-swith-l, sobentowrites the session name into a generated layout under~/.cache/zellij-bento/. - Declaring
local pathin a zsh function destroysPATHinside it — zsh ties the two. Worth knowing before editing these functions.