wtmux vs psmux
Both wtmux and psmux are native Windows terminal multiplexers that bring tmux-like functionality without WSL. This page compares the two projects.
Overview
| Aspect | psmux | wtmux |
|---|---|---|
| Language | Rust | C# (Native AOT) |
| Binary size | Small, single binary | ~3.5 MB, single binary |
| Runtime required | None | None (Native AOT) |
| PTY layer | Windows ConPTY | Bundled official stable Microsoft ConPTY runtime |
| IPC model | Client–server | Client–server |
| License | — | MIT |
| Minimum Windows | Windows 10 | Windows 10 2004+ (build 19041+) |
Installation
| Method | psmux | wtmux |
|---|---|---|
| WinGet | ✅ winget install psmux |
❌ (planned) |
| Cargo | ✅ cargo install psmux |
❌ |
| Scoop | ✅ | ❌ |
| Chocolatey | ✅ | ❌ |
| Microsoft Store | ❌ | ✅ (MSIX packaged) |
| MSIX sideload | ❌ | ✅ |
| Standalone binary | ✅ | ✅ |
psmux has broader package manager coverage. wtmux is distributed through the Microsoft Store using MSIX packaging with execution alias registration; MSIX sideloading and standalone execution are both supported by that same packaging, but the Microsoft Store is currently wtmux's only publicly supported way to acquire it — there is no separate public sideload package or standalone-binary download today.
Feature Comparison
| Feature | psmux | wtmux |
|---|---|---|
| Sessions (create/list/attach/detach) | ✅ | ✅ |
| Windows (create/switch/rename/kill/last/move/swap/link/unlink/find) | ✅ | ✅ |
| Pane splitting | ✅ | ✅ |
| Pane navigation | ✅ | ✅ |
| Pane zoom | ✅ | ✅ |
| Pane rearrangement | ✅ | ✅ |
| Layouts (tiled, even-horizontal, even-vertical, main-horizontal, main-vertical) | ✅ | ✅ |
| Synchronize panes | ✅ | ✅ |
| Retain/respawn panes | ✅ | ✅ |
| Status bar | ✅ | ✅ |
| Status format language | ✅ | ✅ |
| Mouse support | ✅ | ✅ |
| Pane terminal input modes (keypad, bracketed paste, focus reporting) | Partial | ✅ |
Config file (.tmux.conf) |
✅ | ✅ (subset) |
| Custom key bindings | ✅ | ✅ (bind -n, named mouse keys, and one-shot -T tables) |
| 256/truecolor | ✅ | ✅ |
| Per-pane OSC palette/default colors | Not documented | ✅ (OSC 4/10-19 set/query/reset, host consensus, isolated cell colors, active cursor restoration when the original is readable) |
| Sixel graphics | ❌ | ✅ |
| Unicode / wide characters | ✅ | ✅ |
| OSC 8 hyperlinks | ❌ | ✅ |
| Copy mode / clear-history | ✅ | ✅ |
| OSC 52 clipboard writes | ✅ | ✅ (bounded, acknowledged; set-clipboard on or default-off application clipboard opt-in with external; off always blocks writes; no queries/readback) |
capture-pane / pipe-pane |
✅ | ✅ |
| Clock mode | ✅ | ✅ |
| Full paste buffer commands | ✅ | ✅ |
Command-line mode (: prompt) |
✅ | ✅ |
| Command sequences and aliases | ✅ | ✅ |
| Confirm-before prompts | ✅ | ✅ |
send-keys scripting |
✅ | ✅ |
| On-screen overlays | ✅ | ✅ (menu/popup overlays support standalone invocation with deterministic attached-client targeting) |
Runtime option query (show-option) |
✅ | ✅ |
| Themes | ✅ | Partial (status bar only) |
| Plugin system | ❌ | ✅ (COM + built-in) |
| MSIX AppExtension discovery | ❌ | Not yet enabled at server startup |
| DSC v3 global option resource | ❌ | ✅ |
Ships tmux alias |
✅ | ❌ |
wtmux's choose-client support is currently partial: it lists attached clients
and can safely detach the selected client, while HUP and suspend actions remain
deferred.
For differently sized attached terminals, wtmux fits the shared pane layout to the smallest terminal, including linked-window owners, and renders each client's status row independently. Larger clients may have unused space; configurable window-size policies and larger-canvas viewports are not implemented.
psmux's pane terminal input mode support is marked partial: its documentation describes host-native bracketed paste handling, but not propagating application-keypad mode or reporting focus in/out events to panes.
Architecture Differences
Both projects use Windows ConPTY and a client–server architecture. wtmux bundles the official stable Microsoft ConPTY runtime rather than depending on the inbox runtime's VT behavior. Its unpackaged layout includes native helper files, not just the main executable. Key differences:
- Language: psmux is written in Rust with zero-cost abstractions. wtmux is C# compiled with Native AOT — both produce single-file native binaries with no runtime dependency.
- Plugin system: wtmux has built-in plugins and a language-agnostic COM plugin API. Automatic discovery of installed MSIX AppExtensions is not yet enabled. psmux does not expose a plugin API.
- Packaging: psmux integrates with community package managers (winget, scoop, choco, cargo). wtmux uses MSIX packaging with Windows execution alias and targets the Microsoft Store.
- tmux compatibility: psmux aims for high tmux command compatibility and ships a
tmuxalias. wtmux supports a subset of tmux config syntax but does not alias itself astmux.
Unique to wtmux
- COM plugin API — Language-agnostic extensibility via
[GeneratedComInterface] - MSIX AppExtension contract — Packaging metadata for plugins; automatic discovery is planned
- Built-in plugins — Prefix highlight included out of the box
- Host terminal integration — Active-pane working-directory reports (OSC 7/9;9), notification requests (OSC 9), and taskbar progress (OSC 9;4) are forwarded to the host terminal
- Sixel graphics — Bounded server-side image decoding and placement, re-emitted for Sixel-capable clients
- Policy-gated hyperlinks — OSC 8 links are modeled per-cell and bounded, validated against a configurable scheme/parameter allowlist, namespaced per pane, and independently revalidated by the client before ever reaching the host terminal
- Microsoft Store distribution — MSIX packaging for Store publishing
Unique to psmux
- Broad package manager support — winget, scoop, choco, cargo
tmuxalias — Can be used as a drop-intmuxcommand- Higher tmux compatibility — Supports more tmux commands and options
- Themes — Full theming support
When to Use Which
- Use psmux if you want the highest tmux compatibility on Windows, prefer installing via winget/scoop/choco, or want full theming.
- Use wtmux if you want MSIX packaging or built-in plugins. Its COM contracts support future third-party integrations, but installing an AppExtension does not yet load it automatically.