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 bindings
  • set -g status-left / status-right — Format strings with common variables, conditionals, comparisons, substitutions, padding/trimming, and inline #[fg=...,bg=...] styles; runtime set-option can override these per session
  • run-shell — Execute commands at config load time
  • if-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.