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, andset-optionno 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 -Tand per-client runtime switching throughswitch-client -T; existing prefix, root (-n/-T root), and named mouse bindings continue to work. - Added tmux-compatible
select-layoutandnext-layoutcommands for tiled, even-horizontal, even-vertical, main-horizontal, and main-vertical pane arrangements, with defaultprefix Spacecycling. - Added
capture-panefor visible-screen/scrollback text capture to stdout or paste buffers, pluspipe-panefor 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, interactivechoose-bufferonprefix =, andclear-historyfor pane scrollback. - Added partial
choose-clientsupport onprefix D: browse attached clients with session and terminal-size context, then safely detach the highlighted client withEnterord. 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 whilebell-actionandvisual-bellcontinue 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
qand standaloneEscreliably reach the server instead of being consumed locally. load-bufferandset-buffernow 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-beforenow preserves quoting in the wrapped command, soconfirm-before send-keys "a b"runssend-keyswith a singlea bargument 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, andfind-window, with defaultprefix l,prefix f, andprefix .bindings. - Pane rearrangement commands:
swap-pane,rotate-window,last-pane,break-pane,join-pane, andmove-pane, with defaultprefix !,prefix ;, andprefix Ctrl+obindings. - Command infrastructure now supports top-level
;command sequences, tmux-style command aliases throughset -g command-alias name=value, andconfirm-beforey/n prompts for destructive actions. clock-modeshows a large 12- or 24-hour clock in the active pane with configurable digit color and exits on any key press.synchronize-panesduplicates typed input to every live pane in the current window, withprefix S,set-window-option, and#{synchronize_panes}status-format support.remain-on-exitkeeps exited panes visible with a dead-pane marker, andrespawn-pane/respawn-windowrestart 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 withshow-option -g @name;show-options -glists the ones that are set. Plugins configure themselves through these — a plugin reads its own@options via the new hostGetUserOption(and writes them withSetOption). - Plugin format variables now receive the full pane/window context: the in-process
FormatContextgains window flags, pane title, pane pid, pane current path, session window count, window activity, and host name, and COM plugins can implement the additiveIWtmuxComPlugin2.ExpandVariable2to get the same — enabling real status segments such as a git indicator from the pane's current path. show-option/show-optionsruntime commands for querying global or session-effective option values.- Plugins can run wtmux commands through the host: a new
RunCommandmethod on the in-processIPluginHostand the additive COMIWtmuxComPluginHost3interface executes a client-independent command (globalset-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 runtimeset-option -g <option> ''behavior; an emptydefault-shellstill 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-menunow supports mouse selection whenmouseis on, including outside-click dismissal, anddisplay-message -alists 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 asprefix,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|setand theShmuelie.WTmux/Optionsresource 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;4progress 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-unattachedsession cleanup option (defaultoff) that destroys a session after its last attached client detaches, switches away, or disconnects- Complete configuration option reference documenting every parsed
set-optionoption, 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, andswitch-clientsession commands, including defaultprefix $,prefix (,prefix ), andprefix Lbindings for renaming and switching attached clients between sessions- On-screen overlays with
display-message,display-menu, anddisplay-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/sourceandreload-config/reload, so config edits can take effect withoutkill-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 onnow updates the attached terminal title usingset-titles-string(default#S:#I:#W) and applies runtime option changes immediately
Fixed
default-commandnow overridesdefault-shellfor new panes and windows instead of being parsed but ignoredset-clipboard offnow suppresses Windows clipboard writes from copy-mode yanks while still creating wtmux paste buffers; the default remains clipboard integration enabled.default-terminalnow exportsTERMto newly spawned panes so applications see the configured terminal type; explicitset-environment TERM ...values still take precedence- Corrected the configuration reference:
status-intervalis honored (it sets the status-bar refresh interval), not a no-op. base-indexandpane-base-indexare now honored (previously parsed but ignored): they control the first window and pane numbers used by status formats (#I/#P), window switching,new-windowtargets, prefix-digit selection, anddisplay-panesselection- 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, andbind -n <key> <command>now binds a keyboard key to fire without the prefix (the root key table). Underset -g mouse on,WheelUpPane/WheelDownPane(scrollback) andMouseDown1Pane(select pane) have built-in defaults that anybind/unbind -noverrides. 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 newIWtmuxComPluginHost2COM interface (and the in-processIPluginHostgainsBindMouse/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. Togglingmouseat 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 assplit-window -h,new-window,rename-window,set-option,bind,unbind, andsend-keyswhile 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,F1–F12, 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, anddelete-buffercommands. Copy mode now retains multiple numbered buffers, named buffers can be managed explicitly, andprefix ]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 settingstatus-rightto git status); every attached client repaints immediatelywtmux set-environmentandwtmux show-environmentcommands plus config-fileset-environmentsupport, allowing global or per-session environment variables to be added, overridden, or unset for newly created panes while preserving inherited variables and wtmux'sWTMUX/WTMUX_PANEmarkersif-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, thethen-command(exit 0) or optionalelse-command(non-zero) runs as a wtmux command — enabling conditional.tmux.conf/.wtmux.confblocks. The-bflag is accepted for compatibility but evaluated synchronously- Pane resizing:
prefix Ctrl+arrowgrows/shrinks the active pane by one cell toward the arrow andprefix Alt+arrowby five cells, adjusting the split ratio of the containing node. Theresize-pane -L/-R/-U/-D [amount]directive is now bindable in the config file - Interactive pickers:
prefix wopens a window/pane tree for switching, andprefix qbriefly 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 offnow hides the status bar and gives its row back to panes, andstatus-position topnow 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.
VtParserenumerates 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.
ConPtyProcesspreviously readGetLastWin32Error()after attribute-list cleanup calls, so a failedInitializeProcThreadAttributeList/UpdateProcThreadAttributecould 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
WTMUXenvironment variable (formatted as<pipe-name>,<server-pid>,<session-id>) and aWTMUX_PANEvariable (%<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.Resizenow 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 indicatorLineFeedandReverseLineFeednow 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-renameis off or after an explicitrename-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
x64andARM64, 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/ARM64app 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.confor~/.tmux.conffor prefix key, keybindings, shell, and status bar settings - Custom key bindings via
bind/unbind, config file inclusion viasource-file, PowerShell scripts viarun-shell - COM-based plugin system with MSIX AppExtension discovery (
com.wtmux.plugincontract) - 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) andDeploy.ps1for loose-file registration