zz is tmux, ghostty and gpui love triangle
Yes.
zz := gpui(tmux ∪ ghostty)
A multiplexer that ships as a native GPU app. A background daemon owns your sessions, so closing the window detaches instead of killing your work.
tmuxsuperset implemented in Rust, bring your.tmux.confand muscle memory.- Remote machines over plain ssh. Their sessions, windows, and panes sit in the same control plane.
- Browser panes: a real Chromium composited on the same surface as your terminals, split and targeted like any other pane.
- macOS, Linux (Wayland). Experimental Windows and WSL support.
- Browser client with the shared GPUI interface: build and run.
zzcore is at least ~8x faster thantmux+ any terminal emulator
macOS · Metal — Apple M4 Max
| terminal | cat-ascii (MB/s) | cat-unicode (MB/s) | doom-fire (fps) |
|---|---|---|---|
| zz | 328 | 98 | 668 |
| ghostty-tip | 294 | 94 | 650 |
| cmux | 285 | 86 | 627 |
| kero | 273 | x | x |
| ghostty | 94 | 69 | 630 |
| iterm2 | 87 | x | x |
| ghostty+tmux | 44 | 19 | 194 |
| rio | 28 | 30 | 125 |
Linux · Vulkan — AMD Ryzen 7 7800X3D, Radeon 7900 XTX, Wayland
| terminal | cat-ascii (MB/s) | cat-unicode (MB/s) | doom-fire (fps) |
|---|---|---|---|
| zz | 645 | 81 | 1285 |
| ghostty-tip | 637 | 61 | 1216 |
| rio | 487 | 124 | 1191 |
| alacritty | 129 | 91 | 1255 |
| ghostty | 98 | 45 | 653 |
| limux | 94 | 54 | 618 |
| ghostty+tmux | 56 | 17 | 201 |
Median of 5 runs at 180×50. cat-ascii and cat-unicode are throughput,
doom-fire is frame rate; higher is better. x means crashed or timed out.
Reproduce with bench/run.sh and bench/summarize.sh.
One command on macOS (Apple Silicon) and Linux:
curl -fsSL https://zzmux.sh/install.sh | sh
curl -fsSL https://zzmux.sh/install.sh | sh -s -- --headless # CLI + daemon only, for hosts you ssh intoIt picks the route for the machine: the notarized app into /Applications
with zz linked on your PATH, the .deb through apt where dpkg runs, and
the release tarball under ~/.local everywhere else. Add -s -- --beta for the
newest beta, --version 0.3.0 to pin one; rerun to upgrade.
Or through a package manager. macOS, Apple Silicon:
brew install --cask demfabris/zz/zzAUR:
paru zz-binBetas ship to their own channel, demfabris/zz/zz@beta and zz-beta-bin, which
stable releases also update. Each conflicts with its stable sibling, so pick one.
Debian/Ubuntu 24.04+, from a release .deb:
sudo apt install ./zz-<version>-linux-<arch>.debInstall just 1.52 or newer. Run just to browse command
groups, just web to list browser commands, or just --list --list-submodules for the full tree.
Related commands use just <group> <action> [arguments]; run, watch, and build stay at the root.
- Rust 1.97.0
- Zig 0.16.0
- CMake 3.21+ and Ninja: the CEF C++ wrapper is compiled from source.
- Linux:
cmake curl desktop-file-utils ninja-build libfontconfig-dev libwayland-dev libx11-xcb-dev libxcb1-dev libxkbcommon-dev libxkbcommon-x11-dev. - Windows x64: Git for Windows (including Git Bash), the MSVC Rust toolchain, and Visual Studio 2022 Build Tools with the C++ tools and a Windows SDK.
just build mac
just install mac
just package mac
just package arch
just install arch
just package deb
just install deb
just web run
just web build --releaseOn Windows, build from PowerShell:
powershell -ExecutionPolicy Bypass -File scripts/build-windows.ps1The script loads the x64 Visual Studio environment and selects Microsoft's linker explicitly
to avoid Git Bash's link.exe. It runs just build windows, producing the complete app at
dist/zz/zz.exe. Keep the adjacent DLLs and resources with the executable. To package the bundle:
powershell -File scripts/package-windows.ps1 dist/zz dist/zz-windows.zipBefore rebuilding an existing bundle, close its app and stop its daemon after finishing your sessions: Windows cannot replace DLLs that those processes have loaded.
The sidebar shows every machine you have added, each expanding into its own sessions, windows, and panes. Click a session to attach to it. Add one from the menu on your own machine's row, remove one from the menu on its own row, or from a shell:
zz fleet add desktop you@desktop
zz list-hosts
zz fleet remove desktopOr directly in zz's config file:
host-desktop = ssh://you@desktop
host-gpu = ssh://gpu-box:2222
Any verb runs on a host with --host before it, such as
zz --host desktop list-panes -a, and zz --host all inspect -a reads every
host at once. zz fleet sync shares zz's own ssh key across your machines so
logins stop asking, and zz fleet install desktop installs or updates zz there.
Browser panes always render locally, but a pane opened while you are attached to
a remote host sends its traffic back out through that host over ssh -D, so
localhost:3000 is the dev server there. Set browser-egress = false to keep
browsing local.
Dual-licensed under MIT or Apache-2.0.
What zz forks, bundles, and read on the way here is credited in THIRD_PARTY_NOTICE.md.

