Releases

Released, user-facing changes are listed below. Unreleased and implementation-only entries are intentionally omitted.

[0.9.2] - 2026-09-01

Fixed

  • Pane borders can now be grabbed for mouse resizing from either adjacent cell or the border itself.

[0.9.1] - 2026-09-01

Fixed

  • The server continues accepting runtime/control clients while an interactive session remains attached, so commands such as list-sessions, show-option, and set-option no longer report that the live server is unavailable.

[0.9.0] - 2026-09-01

Added

  • Added a complete default bindings reference covering prefix, root, custom tables, mouse, and copy mode, with CLI help links and generated drift checks.
  • Added a searchable DocFX documentation site with sidebar navigation, dedicated configuration-option and default-binding reference pages, and generated plugin API documentation.

Fixed

  • Arrow keys and mouse-wheel input now scroll alternate-screen pagers such as less/git diff: wtmux mirrors the active pane's application cursor-key mode and translates unbound wheel events without stealing them for copy mode.
  • OSC 9 notifications from the active pane are forwarded to each eligible host terminal through bounded, sanitized events; background, detached, and stale-session events are dropped.
  • The attached host terminal now follows the active pane's sanitized OSC 7/OSC 9;9 working directory across pane, window, and session switches, so Windows Terminal duplicate-tab and duplicate-pane actions use the current pane's path.

[0.8.0] - 2026-08-27

Added

  • Added generated shell completion for PowerShell, bash, zsh, and fish, including command flags, configuration options and format variables, plus live session and paste-buffer candidates when the server is running.
  • Added custom one-shot key tables with bind -T / unbind -T and per-client runtime switching through switch-client -T; existing prefix, root (-n / -T root), and named mouse bindings continue to work.
  • Added tmux-compatible select-layout and next-layout commands for tiled, even-horizontal, even-vertical, main-horizontal, and main-vertical pane arrangements, with default prefix Space cycling.
  • Added capture-pane for visible-screen/scrollback text capture to stdout or paste buffers, plus pipe-pane for piping pane output to commands or command output back into panes.
  • Added the full tmux-style paste-buffer command set: show-buffer, save-buffer, load-buffer, interactive choose-buffer on prefix =, and clear-history for pane scrollback.
  • Added partial choose-client support on prefix D: browse attached clients with session and terminal-size context, then safely detach the highlighted client with Enter or d. HUP and suspend actions remain deferred.

Changed

  • Copy-mode drag selection now skips redundant full-frame repaints when mouse motion remains within the same terminal cell.
  • Scrolling down to the live bottom now exits copy mode automatically for mouse-wheel and keyboard downward navigation; active selections remain in copy mode.

Fixed

  • Pane BEL (0x07) events now reach eligible attached host terminals, allowing Windows Terminal to apply its configured sound/flash behavior while bell-action and visual-bell continue to control scope and audible/visual policy.
  • Copy-mode exit keys now bypass client-side prefix, root, and custom key tables while copy mode is active, so q and standalone Esc reliably reach the server instead of being consumed locally.
  • load-buffer and set-buffer now report a clear 10 MB IPC size-limit error instead of a misleading server disconnect when buffer content is too large.
  • Elevated clients now create and attach to a separate elevated server, so panes opened from an elevated terminal inherit the elevated token instead of reusing an unelevated same-user server.
  • Right-clicking a pane with mouse support enabled now pastes the most recent paste buffer instead of doing nothing.
  • Left-button dragging over a pane with mouse support enabled now enters copy mode, selects text, and copies on release.
  • confirm-before now preserves quoting in the wrapped command, so confirm-before send-keys "a b" runs send-keys with a single a b argument instead of two.

Security

  • Hardened elevated control pipes against same-user lower-integrity access: each pipe instance is mandatory-integrity-labeled with NO_WRITE_UP, and the server rejects clients whose integrity level is lower than the server's or cannot be determined, preventing a medium-integrity process from driving a high-integrity server.

[0.7.0] - 2026-08-26

Added

  • Window management commands: kill-window, last-window, move-window, swap-window, link-window, unlink-window, and find-window, with default prefix l, prefix f, and prefix . bindings.
  • Pane rearrangement commands: swap-pane, rotate-window, last-pane, break-pane, join-pane, and move-pane, with default prefix !, prefix ;, and prefix Ctrl+o bindings.
  • Command infrastructure now supports top-level ; command sequences, tmux-style command aliases through set -g command-alias name=value, and confirm-before y/n prompts for destructive actions.
  • clock-mode shows a large 12- or 24-hour clock in the active pane with configurable digit color and exits on any key press.
  • synchronize-panes duplicates typed input to every live pane in the current window, with prefix S, set-window-option, and #{synchronize_panes} status-format support.
  • remain-on-exit keeps exited panes visible with a dead-pane marker, and respawn-pane / respawn-window restart dead panes or replace live panes with -k.
  • tmux-style @ user options: set -g @name value (config file or runtime) stores arbitrary user-defined options, readable with #{@name} in any format string and with show-option -g @name; show-options -g lists the ones that are set. Plugins configure themselves through these — a plugin reads its own @ options via the new host GetUserOption (and writes them with SetOption).
  • Plugin format variables now receive the full pane/window context: the in-process FormatContext gains window flags, pane title, pane pid, pane current path, session window count, window activity, and host name, and COM plugins can implement the additive IWtmuxComPlugin2.ExpandVariable2 to get the same — enabling real status segments such as a git indicator from the pane's current path.
  • show-option / show-options runtime commands for querying global or session-effective option values.
  • Plugins can run wtmux commands through the host: a new RunCommand method on the in-process IPluginHost and the additive COM IWtmuxComPluginHost3 interface executes a client-independent command (global set-option, source-file/reload-config, bind/unbind, show-option) in the server's global context and returns its success state and output.

Fixed

  • Config-file set -g <option> '' (an explicitly quoted empty value) now clears the option, matching the runtime set-option -g <option> '' behavior; an empty default-shell still falls back to the auto-detected shell rather than leaving panes unable to spawn.

[0.6.0] - 2026-08-24

Added

  • Added status format loops (#{W:...} for windows and #{P:...} for panes), #{t:...} timestamp formatting, #{window_activity}, and live #{pane_current_path} updates from shell OSC 7/OSC 9;9 working-directory reports
  • display-menu now supports mouse selection when mouse is on, including outside-click dismissal, and display-message -a lists supported format variables and operators
  • Expanded status format language support: inline #[fg=...,bg=...] styles, common session/window/pane variables, variable-driven conditionals, comparisons, match expressions, substitution, and width-aware pad/trim operators
  • Per-session runtime overrides now cover server-resolved options beyond status-left/status-right, including status layout/style, window status formats, title formats, monitoring and visual alert options, numbering, pane defaults, and destroy-unattached; client-resolved options such as prefix, mouse, key bindings, and clipboard remain global-only
  • DSC v3 command resource support for declaratively getting, testing, and setting global wtmux options through wtmux dsc get|test|set and the Shmuelie.WTmux/Options resource manifest

Fixed

  • Copy-mode yanks now write the Windows clipboard from the attached client, so copied text is available to other interactive apps while paste buffers continue to work.
  • Emoji grapheme clusters split across ConPTY read boundaries now render as a single wide glyph instead of losing ZWJ, skin-tone, or variation-selector modifiers.
  • Emoji grapheme clusters such as ZWJ sequences, skin-tone variants, VS16 emoji presentation, and regional-indicator flags now render as a single wide glyph in panes without shifting following text.

[0.5.0] - 2026-08-21

Added

  • Taskbar progress forwarding: an application's OSC 9;4 progress indicator (for example a PowerShell progress bar with $PSStyle.Progress.UseOSCIndicator) now drives the host terminal's taskbar progress. wtmux forwards the active pane's progress state to the attached client, updates it when the active window/pane changes (clearing it for a pane with no active progress), and clears it on detach/exit
  • destroy-unattached session cleanup option (default off) that destroys a session after its last attached client detaches, switches away, or disconnects
  • Complete configuration option reference documenting every parsed set-option option, accepted values, defaults, runtime support, and current compatibility-only no-op options
  • Activity, bell, and silence monitoring with monitor-activity, monitor-bell, monitor-silence, alert scope/visual options, transient status-line alerts, and tmux-style #F/#{window_flags} window flags (*, -, #, !, ~, Z)
  • rename-session, has-session, and switch-client session commands, including default prefix $, prefix (, prefix ), and prefix L bindings for renaming and switching attached clients between sessions
  • On-screen overlays with display-message, display-menu, and display-popup: formatted messages can temporarily replace the status line or print to stdout with -p, menus can run commands from a keyboard-driven popup, and ConPTY-backed popups can run a shell command above the pane layout and close on exit with -E
  • Runtime config reload with source-file/source and reload-config/reload, so config edits can take effect without kill-server; attached clients reload the same sourced file or standard config, so prefix-key, key binding, and mouse settings update live
  • Configurable host terminal titles: set -g set-titles on now updates the attached terminal title using set-titles-string (default #S:#I:#W) and applies runtime option changes immediately

Fixed

  • default-command now overrides default-shell for new panes and windows instead of being parsed but ignored
  • set-clipboard off now suppresses Windows clipboard writes from copy-mode yanks while still creating wtmux paste buffers; the default remains clipboard integration enabled.
  • default-terminal now exports TERM to newly spawned panes so applications see the configured terminal type; explicit set-environment TERM ... values still take precedence
  • Corrected the configuration reference: status-interval is honored (it sets the status-bar refresh interval), not a no-op.
  • base-index and pane-base-index are now honored (previously parsed but ignored): they control the first window and pane numbers used by status formats (#I/#P), window switching, new-window targets, prefix-digit selection, and display-panes selection
  • Menu and picker selection cursors now fall back to ASCII on terminals that can't render (for example, conhost's default font)

[0.4.0] - 2026-08-18

Added

  • Mouse and root-table key bindings: bind -n <mouse-key> <command> binds tmux-style named mouse keys (WheelUpPane, WheelDownPane, MouseDown1Pane, MouseDrag1Pane, MouseDown2Status, etc.) to commands, and bind -n <key> <command> now binds a keyboard key to fire without the prefix (the root key table). Under set -g mouse on, WheelUpPane/WheelDownPane (scrollback) and MouseDown1Pane (select pane) have built-in defaults that any bind/unbind -n overrides. Left-click selects the pane under the cursor and dragging a pane border resizes the split. In copy mode, dragging with the left button selects text (release copies it to the paste buffer and clipboard). Mouse events forwarded to applications that request mouse tracking are now translated to pane-local coordinates (and re-encoded in the application's mouse encoding). Plugins can register mouse and root bindings through the new IWtmuxComPluginHost2 COM interface (and the in-process IPluginHost gains BindMouse/BindRootKey)
  • Mouse-wheel scrollback: with set -g mouse on, scrolling the wheel over a pane now scrolls its scrollback (automatically entering copy mode on scroll up), and mouse events are passed through to applications that request mouse tracking. Toggling mouse at runtime takes effect on the attached client without re-attaching. When mouse support is off, the wheel is handled by the host terminal as before
  • Sixel graphics support: wtmux now decodes bounded Sixel DCS image payloads, tracks image placements in pane buffers, advertises Sixel via Device Attributes when the attached terminal supports it, and re-emits modeled images into composed frames for Sixel-capable clients
  • Interactive command prompt: prefix : now opens a status-line prompt for running wtmux/tmux commands such as split-window -h, new-window, rename-window, set-option, bind, unbind, and send-keys while attached to a session
  • DCS (Device Control String) sequences are now captured with bounded buffering and dispatched through an extensible parser hook, laying groundwork for future terminal graphics/control extensions such as Sixel
  • wtmux send-keys [-t target] [-l] <keys...> command to programmatically send input to a pane, enabling scripting and automation. Supports named keys (Enter, Tab, arrow keys, F1F12, etc.), C-/M- modifier combinations (e.g. C-c), and literal text; synthesized input is routed through the target pane's ConPTY
  • Paste buffer stack support with set-buffer, paste-buffer, list-buffers, and delete-buffer commands. Copy mode now retains multiple numbered buffers, named buffers can be managed explicitly, and prefix ] pastes the most recent buffer into the active pane through ConPTY
  • wtmux set-option [-g] <option> <value> command to change an option at runtime over the control pipe. A pane/shell can now push dynamic content into the status bar (e.g. a prompt setting status-right to git status); every attached client repaints immediately
  • wtmux set-environment and wtmux show-environment commands plus config-file set-environment support, allowing global or per-session environment variables to be added, overridden, or unset for newly created panes while preserving inherited variables and wtmux's WTMUX/WTMUX_PANE markers
  • if-shell [-b] shell-command then-command [else-command] conditional config support. The shell command is evaluated at config load time and, based on its exit status, the then-command (exit 0) or optional else-command (non-zero) runs as a wtmux command — enabling conditional .tmux.conf/.wtmux.conf blocks. The -b flag is accepted for compatibility but evaluated synchronously
  • Pane resizing: prefix Ctrl+arrow grows/shrinks the active pane by one cell toward the arrow and prefix Alt+arrow by five cells, adjusting the split ratio of the containing node. The resize-pane -L/-R/-U/-D [amount] directive is now bindable in the config file
  • Interactive pickers: prefix w opens a window/pane tree for switching, and prefix q briefly overlays pane numbers for quick pane focus
  • Copy mode via prefix [ with stable pane scrollback snapshots, cursor-based selection, and copying to the server paste buffer plus the Windows clipboard

Fixed

  • status off now hides the status bar and gives its row back to panes, and status-position top now renders the status bar above the pane area.
  • Supplementary-plane (surrogate-pair) and zero-width supplementary code points are now handled correctly by the terminal parser. VtParser enumerates Unicode scalar values on the string path so a surrogate pair is treated as one code point (rather than two split cells), zero-width supplementary marks (e.g. variation selectors) no longer occupy a cell or advance the cursor, and supplementary code points arriving inside an escape/control string are consumed as sequence payload instead of leaking onto the screen
  • Process-launch failures now report the correct Win32 error. ConPtyProcess previously read GetLastWin32Error() after attribute-list cleanup calls, so a failed InitializeProcThreadAttributeList/UpdateProcThreadAttribute could surface an error code overwritten by the intervening cleanup rather than the real cause
  • Splitting a pane no longer fails when the pane is just large enough to divide. The new-pane size now accounts for the 1-cell border between panes ((size - 1) / 2), so an exactly-fitting split such as a 5-column or 5-row pane succeeds instead of being rejected

[0.3.0] - 2026-08-11

Added

  • Shells spawned inside wtmux now get a WTMUX environment variable (formatted as <pipe-name>,<server-pid>,<session-id>) and a WTMUX_PANE variable (%<pane-id>), so tools, scripts, and shell prompts can detect a wtmux session — mirroring tmux's $TMUX/$TMUX_PANE. Inherited environment variables are preserved

Changed

  • The Store MSIX now packages the Native AOT output (self-contained ~3.6 MB native binary), reducing the package from ~103 MB to ~1.6 MB. Build with dotnet publish -p:PublishAppxPackage=true (requires the MSVC toolchain for AOT linking)

Security

  • Hardened the control named pipe against cross-user squatting: the pipe name is now scoped to the current user's SID, the server applies a restrictive DACL granting access only to the current user and SYSTEM, and the client verifies the pipe endpoint's owner before trusting it (refusing to attach to a spoofed server)
  • The client now connects with Identification-level impersonation so a spoofed server cannot impersonate the user
  • Defense in depth: server frames are sanitized before being written to the terminal, dropping dangerous escape sequences (OSC 52 clipboard, OSC 8 hyperlinks, DCS/APC/PM/SOS strings, and response-eliciting CSI queries) that a compromised server could otherwise inject

Fixed

  • Fixed a crash (IndexOutOfRangeException) when exiting an alternate-screen application (vim, less, etc.) after the terminal had been resized. TerminalBuffer.Resize now also resizes the saved main-screen grid and clamps the saved cursor/scroll region, so switching back to the main screen no longer indexes a stale, wrongly-sized buffer
  • #{prefix_highlight} no longer hard-codes ^B; it is now owned by the built-in plugin and renders the actual configured prefix key (e.g. ^A), no longer shadowing the plugin/config indicator
  • LineFeed and ReverseLineFeed now clear the pending auto-wrap flag, so a line feed after a glyph filled the last column no longer inserts an extra blank line before the next character
  • Windows are no longer auto-renamed when automatic-rename is off or after an explicit rename-window, and only the active pane's title drives automatic renaming (previously any pane's title change overwrote the window name)

[0.2.0] - 2026-08-04

Added

  • Build platforms for x64 and ARM64, each producing a self-contained build (the .NET and Windows App SDK runtimes are bundled with the app)

Changed

  • MSIX packaging now produces a self-contained x64/ARM64 app bundle
  • App now displays as "Windows TMUX", and its MSIX package is associated with the Microsoft Store listing

[0.1.0] - 2026-05-10

Added

  • Client–server architecture with background server process and thin client connections over named pipes
  • Session management — create, list, attach, detach, and kill sessions
  • Window management — multiple windows per session with switching by number or next/previous
  • Pane splitting — horizontal and vertical splits with binary-tree layout engine
  • Pane navigation with arrow keys and zoom (fullscreen toggle)
  • VT100/xterm terminal emulator — cursor movement, SGR attributes (256 + truecolor), scroll regions, alternate screen, origin mode
  • OSC sequence support — window title (OSC 0/1/2), working directory (OSC 7), desktop notifications and progress bar (OSC 9)
  • Full UTF-8 decoding with wide character (CJK/emoji) support and correct cursor advancement
  • Mouse tracking passthrough (modes 1000/1002/1003, SGR encoding)
  • Configurable status bar with format string expansion, colors, and top/bottom positioning
  • tmux-compatible config file parser — reads ~/.wtmux.conf or ~/.tmux.conf for prefix key, keybindings, shell, and status bar settings
  • Custom key bindings via bind/unbind, config file inclusion via source-file, PowerShell scripts via run-shell
  • COM-based plugin system with MSIX AppExtension discovery (com.wtmux.plugin contract)
  • Built-in prefix highlight plugin (#{prefix_highlight}) and session save/restore
  • Conditional format variables (#{?client_prefix,yes,no})
  • Native AOT compilation — single-file ~3.5 MB binary, no runtime required
  • MSIX packaging with execution alias (wtmux.exe) and Deploy.ps1 for loose-file registration