wtmux vs tmux
wtmux is inspired by tmux and aims for a familiar experience on Windows. This page compares the two, highlighting what's shared, what's different, and what's not yet implemented.
Architecture
| Aspect | tmux | wtmux |
|---|---|---|
| Platform | Unix/Linux/macOS | Windows 10 2004+ |
| Language | C | C# (Native AOT) |
| PTY layer | Unix pseudo-terminals | Bundled official stable Microsoft ConPTY runtime |
| IPC | Unix domain sockets | Named pipes |
| Binary size | ~1 MB (varies) | ~3.5 MB (single file, no runtime) |
| Runtime | None | None (Native AOT) |
Both use a client–server model: a background server manages sessions, and thin clients connect to render output.
Feature Comparison
Supported in wtmux
| Feature | tmux | wtmux | Notes |
|---|---|---|---|
| Sessions (create/list/attach/detach/kill/rename/has/switch-client) | ✅ | ✅ | Same CLI syntax plus prefix $ / ( / ) / L |
destroy-unattached option |
✅ | ✅ | Runtime-settable; destroys only after an attached session becomes unattached |
| Differently sized attached terminals | ✅ | ✅ | Shared panes fit the smallest attached terminal, including linked-window owners; each client has its own status row. Configurable window-size policies and larger-canvas viewports are not implemented |
| Windows (create/switch/rename/kill/last/move/swap/link/unlink/find) | ✅ | ✅ | Same common prefix keys, plus prefix l, prefix f, and prefix . |
| Pane splitting (horizontal/vertical) | ✅ | ✅ | Same key bindings |
| Pane navigation (arrow keys) | ✅ | ✅ | |
| Pane resize | ✅ | ✅ | prefix Ctrl+arrow (1 cell), prefix Alt+arrow (5 cells) |
| Pane zoom | ✅ | ✅ | prefix z |
| Pane rearrangement | ✅ | ✅ | swap-pane, rotate-window, last-pane, break-pane, join-pane, and move-pane; default prefix !, prefix ;, prefix Ctrl+o |
| Predefined pane layouts | ✅ | ✅ | select-layout supports tiled/even/main layouts; next-layout and prefix Space cycle them |
| Synchronize panes | ✅ | ✅ | synchronize-panes; prefix S toggles the active window |
| Retain/respawn panes | ✅ | ✅ | remain-on-exit, respawn-pane, and respawn-window |
| Window/pane/buffer selection UI | ✅ | ✅ | prefix w (window/pane tree), prefix = (buffers), prefix q (pane numbers) |
| Attached-client chooser | ✅ | Partial | prefix D or choose-client from the attached command prompt lists all attached clients and detaches with Enter or d; HUP and suspend actions remain deferred |
| Copy mode / scrollback | ✅ | ✅ | prefix [; scroll, select, copy, and clear-history |
| Capture and pipe panes | ✅ | ✅ | capture-pane supports visible/scrollback ranges, paste buffers, -p, -J, and best-effort -e; pipe-pane supports -I, -O, and -o |
| Clock mode | ✅ | ✅ | prefix t / clock-mode; any key exits |
| Paste buffers | ✅ | ✅ | prefix ] / prefix =; set-buffer, show-buffer, save-buffer, load-buffer, paste-buffer, list-buffers, delete-buffer, and choose-buffer |
Command-line mode (: prompt) |
✅ | ✅ | prefix : runs any wtmux/tmux command while attached |
| Command sequences and aliases | ✅ | ✅ | Top-level ; command sequences, escaped \;, and command-alias including common supported tmux short aliases |
confirm-before prompts |
✅ | ✅ | Server asks the attached client for y/n confirmation before running the command; prefix x confirms kill-pane |
Scripting / send-keys |
✅ | ✅ | Named keys, C-/M- modifiers, literal text (-l), pane targets |
| On-screen overlays | ✅ | ✅ | display-message including -a, mouse/keyboard-driven display-menu, and ConPTY-backed display-popup; menu/popup commands work from the standalone CLI with validated caller context or an explicit target |
| Environment variable passing | ✅ | ✅ | set-environment / show-environment; WTMUX / WTMUX_PANE |
| Runtime option query | ✅ | ✅ | show-option / show-options, including -g global option queries |
| Status bar | ✅ | ✅ | Configurable format, colors, position |
| Status format language and inline styles | ✅ | ✅ | Common variables, conditionals/comparisons, substitutions, padding/trimming, #{t:...} time formatting, window/pane loops, and inline #[fg=...,bg=...] styles; session loops remain deferred |
| Mouse support | ✅ | ✅ | Wheel scrollback, click-to-select-pane, right-click paste (Windows clipboard, falling back to the paste buffer), pane drag-select, border drag-resize; app passthrough (modes 1000/1002/1003) |
| Pane terminal input modes | ✅ | ✅ | Cursor/keypad application modes, bracketed paste, and multi-client focus reporting |
| Config file | ✅ | ✅ | Reads ~/.tmux.conf (subset) |
| Custom key bindings | ✅ | ✅ | bind / unbind, -n / -T root, one-shot named tables via bind -T and switch-client -T, and named mouse keys |
if-shell / run-shell conditionals |
✅ | ✅ | Evaluated synchronously at config load |
| 256-color and truecolor | ✅ | ✅ | |
| OSC palette/default colors | ✅ | ✅ | Per-pane OSC 4/10-19 set/query/reset, host consensus, isolated truecolor rendering, and active cursor restoration when the original cursor is readable; mouse/Tektronix/highlight roles are modeled only |
| Sixel graphics | ✅ | ✅ | Decoded server-side, modeled in pane buffers, and re-emitted for Sixel-capable clients |
| Unicode / wide characters | ✅ | ✅ | CJK, emoji |
| Window title (OSC 0/1/2) | ✅ | ✅ | |
| OSC 8 hyperlinks | ✅ | ✅ | Modeled per-cell metadata gated by hyperlink-schemes/hyperlink-parameters; canonicalized on render/capture and independently revalidated by the client |
| Automatic window rename | ✅ | ✅ | |
| Activity / silence / bell monitoring | ✅ | ✅ | monitor-activity, monitor-bell, monitor-silence, visual alerts, and #F/#{window_flags} status flags |
| OSC 52 clipboard writes | ✅ | ✅ | set-clipboard on, or the default-off allow-application-clipboard opt-in with external, trusts eligible active panes; set-clipboard off always blocks writes. Writes/clears use a bounded, acknowledged queue (osc52-queue-limit). Queries/readback are not implemented and raw OSC 52 is never passed through |
| DSC v3 global option resource | ❌ | ✅ | Declarative Windows configuration for global options |
| Plugin system | Plugins via run-shell |
COM + built-in | Different architecture |
Not yet implemented in wtmux
| Feature | tmux | wtmux | Notes |
|---|---|---|---|
| Hooks | ✅ | ❌ | Running commands automatically on session, window, or pane lifecycle events (set-hook) is not yet supported |
Remaining advanced key bindings (-r, -N, list-keys, send-prefix) |
✅ | Partial | Root and custom one-shot key tables are supported; repeatable bindings, notes/listing, and send-prefix remain |
Control mode (-CC) |
✅ | ❌ | External terminal integration |
| Session groups | ✅ | ❌ | Niche tmux feature |
Configuration Compatibility
wtmux reads ~/.wtmux.conf or ~/.tmux.conf using a subset of tmux configuration syntax. Supported directives include:
set -g— Global options (prefix, default-shell, mouse, status bar, etc.)bind/unbind— Key bindingsset -g status-left/status-right— Format strings with common variables, conditionals, comparisons, substitutions, padding/trimming, and inline#[fg=...,bg=...]styles; runtimeset-optioncan override these per sessionrun-shell— Execute commands at config load timeif-shell— Conditionally apply config based on a shell command's exit status
Many tmux options are silently ignored if not supported. Complex tmux configs will likely need adaptation.
See configuration.md for the full list of supported options.
Unique to wtmux
- Native AOT compilation — Single-file native binary, no .NET runtime required
- MSIX packaging — Install via Windows execution alias
- COM plugin API — Language-agnostic contracts; automatic MSIX AppExtension discovery is planned
- Built-in plugins — Prefix highlight included out of the box
- ConPTY integration — Bundles the official stable Microsoft pseudo-console runtime for consistent VT transport across supported Windows versions
- 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
- Server-modeled Sixel — Graphics are decoded into pane buffers and clipped/repositioned during server-side frame composition
- 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
When to Use Which
- Use tmux if you're on Linux/macOS, or need the full tmux feature set — hooks, control mode, and the complete command/key-binding surface.
- Use wtmux if you want a native Windows terminal multiplexer without WSL, prefer Native AOT performance, or want COM-based plugin extensibility.