βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βββββββ ββββββββββββ βββββββ ββββββ βββ β
β βββββββββββββββββββββ ββββββββ βββββββββββ β
β ββββββββββββββββββββββββββββββ βββ ββββββ β
β βββββββ ββββββββββββββββββββββ βββ ββββββ β
β βββ βββββββββββ βββ ββββββββββββββββ βββ β
β βββ βββββββββββ βββ βββββββ βββ βββ β
β Born in PowerShell. Made in Rust. π¦ β
β Terminal Multiplexer for Windows β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The native Windows tmux. Born in PowerShell, made in Rust.
Full mouse support Β· tmux themes Β· tmux config Β· 76 commands Β· blazing fast
Install Β· Usage Β· Performance Β· Compatibility Β· Features Β· Keys Β· Scripting Β· Config Β· FAQ
The real tmux for Windows. Not a port, not a wrapper, not a workaround.
psmux is a native Windows terminal multiplexer built from the ground up in Rust. It uses Windows ConPTY directly, speaks the tmux command language, reads your .tmux.conf, and supports tmux themes. All without WSL, Cygwin, or MSYS2.
π‘ Tip: psmux ships with
tmuxandpmuxaliases. Just typetmuxand it works!
π On Windows π
winget install psmuxcargo install psmuxThis installs psmux, pmux, and tmux binaries to your Cargo bin directory.
scoop bucket add psmux https://github.com/marlocarlo/scoop-psmux
scoop install psmuxchoco install psmuxDownload the latest .zip from GitHub Releases and add to your PATH.
git clone https://github.com/marlocarlo/psmux.git
cd psmux
cargo build --releaseBuilt binaries:
target\release\psmux.exe
target\release\pmux.exe
target\release\tmux.exe
- Windows 10 or Windows 11
- PowerShell 7+ (recommended) or cmd.exe
- Download PowerShell:
winget install --id Microsoft.PowerShell - Or visit: https://aka.ms/powershell
- Download PowerShell:
If you've used tmux on Linux/macOS and wished you had something like it on Windows, this is it.
| psmux | Windows Terminal tabs | WSL + tmux | |
|---|---|---|---|
| Session persist (detach/reattach) | β | β | |
| Synchronized panes | β | β | β |
| tmux keybindings | β | β | β |
Reads .tmux.conf |
β | β | β |
| tmux theme support | β | β | β |
| Native Windows shells | β | β | β |
| Full mouse support | β | β | |
| Zero dependencies | β | β | β (needs WSL) |
| Scriptable (76 commands) | β | β | β |
Split panes, multiple windows, session persistence, 76 commands, full mouse, tmux themes, 126+ format variables, 53 vim copy-mode keys. Full details: docs/features.md
psmux is built for speed. The Rust release binary is compiled with opt-level 3, full LTO, and single codegen unit. Every cycle counts.
| Metric | psmux | Notes |
|---|---|---|
| Session creation | < 100ms | Time for new-session -d to return |
| New window | < 80ms | Overhead on top of shell startup |
| New pane (split) | < 80ms | Same as window, cached shell resolution |
| Startup to prompt | ~shell launch time | psmux adds near-zero overhead; bottleneck is your shell |
| 15+ windows | β Stable | Stress-tested with 15+ rapid windows, 18+ panes, 5 concurrent sessions |
| Rapid fire creates | β No hangs | Burst-create windows/panes without delays or orphaned processes |
- Lazy pane resize : only the active window's panes are resized. Background windows resize on-demand when switched to, avoiding O(n) ConPTY syscalls
- Cached shell resolution :
whichPATH lookups are cached withOnceLock, not repeated per spawn - 10ms polling : client-server discovery uses tight 10ms polling for sub-100ms session attach
- Early port-file write : server writes its discovery file before spawning the first shell, so the client connects instantly
- 8KB reader buffers : small buffer size minimizes mutex contention across pane reader threads
Note: The primary startup bottleneck is your shell (PowerShell 7 takes ~400-1000ms to display a prompt). psmux itself adds < 100ms of overhead. For faster shells like
cmd.exeornushell, total startup is near-instant.
psmux is the most tmux-compatible terminal multiplexer on Windows:
| Feature | Support |
|---|---|
| Commands | 76 tmux commands implemented |
| Format variables | 126+ variables with full modifier support |
| Config file | Reads ~/.tmux.conf directly |
| Key bindings | bind-key/unbind-key with key tables |
| Hooks | 15+ event hooks (after-new-window, etc.) |
| Status bar | Full format engine with conditionals and loops |
| Themes | 14 style options, 24-bit color, text attributes |
| Layouts | 5 layouts (even-h, even-v, main-h, main-v, tiled) |
| Copy mode | 53 vim keybindings, search, registers |
| Targets | session:window.pane, %id, @id syntax |
if-shell / run-shell |
β Conditional config logic |
| Paste buffers | β Full buffer management |
Your existing .tmux.conf works. psmux reads it automatically. Just install and go.
psmux has a full plugin ecosystem β ports of the most popular tmux plugins, reimplemented in PowerShell for Windows. Themes, key bindings, session management, clipboard integration, and more.
Browse available plugins and themes: psmux-plugins
Install & manage plugins with a TUI: Tmux Plugin Panel (tppanel) β a terminal UI for browsing, installing, updating, and removing plugins and themes.
| Plugin | Description |
|---|---|
| psmux-sensible | Sensible defaults for psmux |
| psmux-yank | Windows clipboard integration |
| psmux-resurrect | Save/restore sessions |
| psmux-pain-control | Better pane navigation |
| psmux-prefix-highlight | Prefix key indicator |
| ppm | Plugin manager (like tpm) |
Themes: Catppuccin Β· Dracula Β· Nord Β· Tokyo Night Β· Gruvbox
Quick start:
# Install the plugin manager
git clone https://github.com/psmux-plugins/ppm "$env:USERPROFILE\.psmux\plugins\ppm"Then add to your ~/.psmux.conf:
set -g @plugin 'psmux-plugins/ppm'
set -g @plugin 'psmux-plugins/psmux-sensible'
run '~/.psmux/plugins/ppm/ppm.ps1'
Press Prefix + I inside psmux to install the declared plugins.
Use psmux, pmux, or tmux, they're identical:
# Start a new session
psmux
pmux
tmux
# Start a named session
psmux new-session -s work
tmux new-session -s work
# List sessions
psmux ls
tmux ls
# Attach to a session
psmux attach -t work
tmux attach -t work
# Show help
psmux --help
tmux --helppsmux has first-class mouse support over SSH when the server runs Windows 11 build 22523+ (22H2+). Click panes, drag-resize borders, scroll, click tabs β everything works, from any SSH client on any OS.
| Client β Server | Keyboard | Mouse | Notes |
|---|---|---|---|
| Linux β Windows 11 (22523+) | β | β | Full support |
| macOS β Windows 11 (22523+) | β | β | Full support |
| Windows 10 β Windows 11 (22523+) | β | β | Full support |
| Windows 11 β Windows 11 (22523+) | β | β | Full support |
| WSL β Windows 11 (22523+) | β | β | Full support |
| Any OS β Windows 10 | β | β | ConPTY limitation (see below) |
| Any OS β Windows 11 (pre-22523) | β | β | ConPTY limitation (see below) |
| Platform | Keyboard | Mouse |
|---|---|---|
| Windows 11 (local) | β | β |
| Windows 10 (local) | β | β |
Mouse works perfectly when running psmux locally on both Windows 10 and 11.
Windows 10's ConPTY consumes mouse-enable escape sequences internally and does not forward them to sshd. The SSH client never receives the signal to start sending mouse data. This is a Windows 10 ConPTY limitation that was fixed in Windows 11 (build 22523+). Keyboard input works fully on both versions β only mouse over SSH is affected.
Recommendation: Use Windows 11 build 22523+ (22H2 or later) as your psmux server for full SSH mouse support.
Default prefix: Ctrl+b (same as tmux). Full reference: docs/keybindings.md
| Key | Action |
|---|---|
Prefix + c |
Create new window |
Prefix + % / " |
Split pane horizontally / vertically |
Prefix + Arrow |
Navigate between panes |
Prefix + d |
Detach from session |
Prefix + z |
Toggle pane zoom |
Prefix + [ |
Enter copy/scroll mode (53 vim keybindings) |
Ctrl+q |
Quit |
76 tmux-compatible commands, hooks, targets, capture-pane, pipe-pane. Full reference: docs/scripting.md
Reads ~/.psmux.conf, ~/.tmux.conf, or ~/.config/psmux/psmux.conf. Fully tmux-compatible syntax β your existing config works. Full reference: docs/configuration.md
MIT
Contributions welcome β bug reports, PRs, docs, and test scripts via GitHub Issues.
If psmux helps your Windows workflow, consider giving it a β on GitHub!
docs/faq.md Β· docs/features.md Β· docs/keybindings.md Β· docs/scripting.md Β· docs/configuration.md
Made with β€οΈ for PowerShell using Rust π¦
