// written in Rust · ConPTY · pure-text attach · single binary

tmux, for the Windows host.

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.

ssh winhost — lumux

 

Everything you reach for in tmux

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.

◰ session

Persistent sessions

Detach, drop the SSH, reconnect — your shells and their processes are still running. Switch between sessions with prefix s.

▤ windows

Windows & tabs

Create, cycle, rename, and jump to windows by index. A styled status bar shows the live window list with the active one marked *.

▦ panes

Split, resize & zoom

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.

▥ vt

Alternate screen

vim, less, and htop render and restore correctly — full DEC alt-screen, cursor-visibility, and autowrap support.

⎘ copy

Copy-mode

Scroll history with arrows or vi keys, select, and yank straight to your local clipboard via OSC-52.

⚙ config

Live config

TOML config with a tmux-parity surface — prefix, bindings, shells, status bar. Reload without restarting.

🖱 mouse

Mouse support

Click to select a pane, scroll the wheel into history, and drag a divider to resize. Optional, off by default.

⮂ switch

Session switcher

Press prefix s for an interactive list of every session, or prefix ? for a help overlay generated from your live keymap.

$ shell

Shell-agnostic

PowerShell 5.x, pwsh, cmd, or anything else — ConPTY translates legacy console output to VT for free.

Pure-text, in-terminal attach

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.

┌───────────── lumux (one binary) ─────────────┐ │ │ │ client ──raw keys──▶ server / daemon │ │ (raw mode) ◀──VT frames── (owns PTYs) │ │ │ │ │ │ ▼ ▼ │ │ your terminal ConPTY × N │ │ (any VT, SSH) PowerShell · cmd · … │ │ │ └──────────────────────────────────────────────┘ Terminal emulation is server-side: each pane's output is parsed into a cell grid and re-rendered as damage-tracked VT to every attached client.

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.

Windows-first, not Windows-only

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.

🪟

Windows

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+.

🐧

Linux

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.

🍎

macOS

universal binary

Same Unix backend as Linux. Ships as a universal2 binary — one file, native on both Apple Silicon and Intel.

Muscle memory included

Prefix is Ctrl-b (rebindable). After the prefix:

"split top / bottom
%split left / right
cnew window
n  pnext / previous window
llast (previous) window
0–9select window by index
&kill the current window
↑↓←→select pane in that direction
;last (previously focused) pane
Ctrl+↑↓←→resize the active pane
Alt+↑↓←→resize the active pane (larger step)
zzoom / unzoom the active pane
Spacecycle preset layouts
xkill the active pane
,rename the current window
$rename the session
[enter copy-mode
schoose / switch session
ddetach (session keeps running)
?show the key-binding help
Ctrl-bsend a literal Ctrl-b to the shell

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.

A familiar .toml

Lives 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"

Install lumux

Grab a prebuilt binary for your platform — one line, no toolchain. Each command downloads the latest release and verifies its checksum.

🍎

macOS

Homebrew
brew install hgaol/tap/lumux
Apple Silicon & Intel binaries →
🐧

Linux

curl | sh
curl -fsSL https://hgaol.github.io/lumux/scripts/install.sh | sh
view the script
🪟

Windows

PowerShell
irm https://hgaol.github.io/lumux/scripts/install.ps1 | iex
view the script
Also available: cargo install lumux · cargo binstall lumux · direct downloads

…or build from source

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
Tip — alias it to lm

Like 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.