zeshion is a session manager for tmux and Zellij. It keeps the sesh command shape where practical, while making the selected multiplexer explicit and supporting both tmux sessions and Zellij sessions from one CLI.
The project is derived from the MIT-licensed joshmedeski/sesh codebase.
zeshion is usable locally, but first public release packaging is still being prepared. The current install path is Go-based.
Install from the module path:
go install github.com/OneNoted/zeshion@latestBuild from a checkout:
go build -o zeshion .Build into GOPATH/bin with version metadata:
just build devIf you want existing sesh muscle memory:
alias sesh=zeshion- Go 1.25 or newer to build from source.
tmuxfor tmux session management.zellijfor Zellij session management.zoxidefor zoxide-backed directory sessions.- A picker-compatible terminal for
zeshion picker.
Most commands follow the sesh shape:
zeshion list
zeshion list --tmux
zeshion list --zellij
zeshion list --config --zoxide
zeshion connect my-session
zeshion connect --root "$PWD"
zeshion picker
zeshion preview my-session
zeshion last
zeshion window
zeshion window ~/projects/my-appAliases are preserved where practical:
| Command | Aliases |
|---|---|
list |
l |
connect |
cn |
clone |
cl |
picker |
pick, pk |
preview |
p |
root |
r |
last |
L |
window |
w |
zeshion defaults to --multiplexer auto.
Auto mode chooses:
- Zellij when running inside Zellij.
- tmux when running inside tmux.
- The
multiplexervalue from config. - tmux as the compatibility fallback.
Override the multiplexer per command:
zeshion --multiplexer tmux list
zeshion --multiplexer zellij list
zeshion --multiplexer zellij connect my-session| Action | tmux | Zellij |
|---|---|---|
| List live sessions | tmux list-sessions |
zellij list-sessions |
| Connect outside a session | Attach to the tmux session | Attach to the Zellij session in the current terminal |
| Connect inside a session | Switch tmux client | Switch Zellij session |
| Create session | New tmux session | Zellij attach/create flow |
| Window command | tmux windows | Zellij tabs |
| tmuxinator/tmuxp | tmux-only path | Not used for native Zellij sessions |
For Zellij, the important rule is simple: outside Zellij, selecting a Zellij session opens that session in the current terminal; inside Zellij, selecting a Zellij session switches the active Zellij session.
Use the interactive picker:
zeshion pickerFilter the picker input sources:
zeshion picker --tmux
zeshion picker --zellij
zeshion picker --config --zoxide
zeshion picker --hide-duplicatesCustomize picker text:
zeshion picker --prompt "session> " --placeholder "Find session"zeshion looks for config files in this order:
- The path passed with
--config. ~/.config/zeshion/zeshion.toml.- Legacy
~/.config/zesh/zesh.toml. - Legacy
~/.config/sesh/sesh.toml. - Built-in defaults when no config exists.
Minimal config:
multiplexer = "auto"
tmux_command = "tmux"
zellij_command = "zellij"
[default_session]
startup_command = "nvim"
preview_command = "ls -la {}"
[[session]]
name = "dotfiles"
path = "~/dotfiles"
startup_command = "nvim"Use the JSON schema from zeshion.schema.json.
From sesh:
- Keep your existing
~/.config/sesh/sesh.toml;zeshionwill read it if nozeshionorzeshconfig exists. - Add
multiplexer = "auto"ormultiplexer = "tmux"if you want the choice to be explicit. - tmux-specific features such as tmuxinator stay on the tmux path.
- Add
zellij_command = "zellij"if you use a wrapper or custom Zellij binary name.
From pre-release zesh:
- Rename
~/.config/zesh/zesh.tomlto~/.config/zeshion/zeshion.tomlwhen convenient. - The old
zeshconfig path remains a fallback for local migration. - The binary is now
zeshion.
Selecting a Zellij session from a normal terminal should open the Zellij UI.
If it only sends actions to an existing Zellij pane, make sure you are running an up-to-date zeshion binary and not an old zesh binary. Check:
command -v zeshion
zeshion --version--multiplexer auto chooses the wrong multiplexer.
Use an explicit override while debugging:
zeshion --multiplexer tmux list
zeshion --multiplexer zellij listThen set multiplexer = "tmux" or multiplexer = "zellij" in config if you do not want auto-selection.
No config is found.
Run with an explicit config path:
zeshion --config ~/.config/zeshion/zeshion.toml listjust mock
go test ./...
go test -race ./...
go vet ./...
go build -o zeshion .Generate the man page:
just manManual release checks live in docs/release-smoke-test.md.
Version-control work in this repo uses Jujutsu (jj).
zeshion is based on joshmedeski/sesh, which is distributed under the MIT License. The original copyright notice is preserved in LICENSE; the upstream derivation is also recorded in NOTICE.