Persistent sessions, windows, and panes with tmux keybindings — attach as plain text over SSH from inside Windows Terminal, conhost, or any VT terminal. No GPU, no GUI. Runs natively on Windows, Linux, and macOS from a single binary.
Server-side terminal emulation parses each pane into a cell grid and streams damage-tracked VT to every client — so any dumb terminal can render a full multiplexer.
Detach, drop the SSH, reconnect — your shells and their processes are still running. Switch between sessions with prefix s.
Create, cycle, rename, and jump to windows by index. A styled status bar shows the live window list with the active one marked *.
Split horizontally or vertically (new panes inherit the dir), move focus by direction, resize with Ctrl/Alt+arrows, zoom one pane fullscreen with z, and cycle preset layouts.
vim, less, and htop render and restore correctly — full DEC alt-screen, cursor-visibility, and autowrap support.
Scroll history with arrows or vi keys, select, and yank straight to your local clipboard via OSC-52.
TOML config with a tmux-parity surface — prefix, bindings, shells, status bar. Reload without restarting.
Click to select a pane, scroll the wheel into history, and drag a divider to resize. Optional, off by default.
Press prefix s for an interactive list of every session, or prefix ? for a help overlay generated from your live keymap.
PowerShell 5.x, pwsh, cmd, or anything else — ConPTY translates legacy console output to VT for free.
WezTerm already offers persistence and panes on Windows — but it reattaches only through its own GPU GUI. lumux exists for the one thing that needs: plain-text attach from inside a terminal.
SSH into a Windows host, run lumux attach, and you get your running session back as text — exactly like tmux attach on Linux. The session, and its processes, survive a dropped connection.
It's a single binary written in Rust that plays two roles, like tmux: a background server that owns the pseudo-terminals and the session tree, and a thin client that shuttles bytes over a named pipe. The client auto-starts the server, so you only ever run lumux.
Because the whole multiplexer is platform-independent and talks to the OS through two small traits (PTY + transport), the same daemon and client run on Windows (ConPTY + named pipe) and Unix (PTY + socket) alike.
lumux exists because Windows had no tmux. But it's built cross-platform from the ground up — one codebase, one binary, native on each OS. No WSL, no emulation.
the target
ConPTY drives any shell — PowerShell 5.x, pwsh, cmd. Connects over a named pipe. Tested over real ConPTY on Windows CI. Requires Windows 10 1809+.
primary dev / CI
Native Unix-PTY backend over a Unix socket. The full test suite runs here every commit — attach, detach/reattach, splits, copy-mode, the lot.
universal binary
Same Unix backend as Linux. Ships as a universal2 binary — one file, native on both Apple Silicon and Intel.
Prefix is Ctrl-b (rebindable). After the prefix:
Without the prefix (configurable root bindings) — e.g. Alt+↑↓←→ jumps panes instantly. With mouse = true: click selects a pane, the wheel scrolls history, and dragging a divider resizes.
.tomlLives at %APPDATA%\lumux\config.toml. Reload live with lumux source-file <path>.
# prefix & behavior prefix = "C-a" # Ctrl-a mouse = true # click/scroll/drag scrollback = 10000 # history per pane base_index = 1 # number from 1 default_shell = "ps5" # styled status bar status_justify = "centre" status_left = "#[bg=colour124] REMOTE " status_right = "%H:%M %d-%b-%y"
# shell profiles [[shells]] name = "ps5" argv = ["powershell.exe", "-NoLogo"] # bindings after the prefix [bindings] "C-s" = "split-vertical" "r" = "reload-config" # fire without the prefix (bind -n) [root_bindings] "M-Left" = "select-pane-left" "M-Right" = "select-pane-right"
Grab a prebuilt binary for your platform — one line, no toolchain. Each command downloads the latest release and verifies its checksum.
Requires Rust (stable). Produces a single lumux binary that runs as both client and server.
# native build — Windows, Linux, or macOS $ cargo build --release # or cross-compile to another OS $ cargo build --release --target \ x86_64-pc-windows-msvc # first run auto-starts the daemon $ lumux new -s work $ lumux ls $ lumux attach -t work
# scripting the active session $ lumux split-window -h $ lumux new-window $ lumux send-keys "cargo test" $ lumux source-file ./my.toml $ lumux kill-session -t work # Windows 10 1809+ · Linux · macOS
lmLike tmux, you live inside lumux once attached, so you only type the name to start or reattach. Drop it to two characters:
# PowerShell ($PROFILE) > Set-Alias lm lumux # or, to pass args through: > function lm { lumux @args }
# bash / zsh (~/.bashrc, ~/.zshrc) $ alias lm=lumux # then: $ lm new -s work # lm a / lm ls …
Sessions survive client/connection loss, but not a full OS logout or reboot — a Windows Service for cross-logout survival is a future idea.