Change Log
On this page
-
Changelog - wakamex/wakterm fork
- Changes from 2026-10-16 through 2026-10-25 (commits bdcaca827 through d70428695)
- Changes from 2026-09-27 through 2026-10-16 (commits 3d0a6cdb8 through bfe9f4e72)
- Changes from 2026-08-23 through 2026-09-27 (commits 6f9043880 through 09a30ab99)
- Changes from 2026-03-20 through 2026-08-23 (commits 711022567 through 8b4429a98)
- Historical Features and Fixes (prior to 2026-03-20)
- Observability
- Security
- Compatibility
- Test Coverage
For a concise overview of current Wakterm features, see Features. For release-specific highlights, see GitHub Releases.
Changelog - wakamex/wakterm fork#
All changes relative to upstream wakterm/wakterm main at 05343b387.
Changes from 2026-10-16 through 2026-10-25 (commits bdcaca827 through d70428695)#
Agent Harnesses and Agent API#
- Devin as an agent harness: detection, exact binding to the session its process holds a lock on, busy and idle from its session database,
turn_started,input_accepted, assistant andturn_finalevents (a message sent mid-turn isinput_acceptedon that turn), send admission from its input box, exact restore withdevin --resume,wakterm agent start devin, and the database read from itsdevin acpworker's environment, withDEVIN_SESSIONS_DIRandXDG_DATA_HOMEbefore the worker starts (a4fbc9b, c2c8cd5, ec21d47, 0c39f38, d21d6fe) - Devin permission prompts as
devin_permissionapprovals (capabilitydevin_permission.v1) withallow_onceanddeny, answered by keys checked against the screen; interrupted, denied and errored Devin turns end instead of staying busy (575ea96, ba4a1ef, f669795) agent sendacknowledges a send only by the agent's recorded input for harnesses that record it, reading the event stream after its oldest events were dropped, and reports a steer agy's input box took back as aninput_blockedrefusal (666d131, f85a060)- agy is treated as idle only while its footer shows "? for shortcuts", since a queued message or other hint replaces "esc to cancel" mid-turn; a turn agy stops on an on-screen error or its feedback survey is reported waiting, and a send skips the survey with its Skip choice (3a1ea62, c150032, 3382dcd, 9354ec3, f2e36d1)
- Claude Code, Codex, Gemini CLI and OpenCode sessions are found under the home or data directory the harness process's own environment names (
CLAUDE_CONFIG_DIR,CODEX_HOME,GEMINI_CLI_HOME,XDG_DATA_HOME) (86ed147, 7a81015) wakterm agent callerreports the caller's tab, with the effective title Panetone routes by (c9f1bb5)- Codex: a steer left in the composer when its turn ended is submitted as the next turn, and the TUI proxy relays app-server messages up to the TUI client's 128 MiB limit and forwards larger ones uninspected instead of closing, which had put every Codex TUI into a reconnect loop on a 17.7 MB
plugin/listresponse (9185061, 6f3a63a, 46c2e7a) - Claude: confirming a
/clearfrom the new session file, choosing a menu row by its number, not reporting history copied into a new session, and following a parked job's status and a window's own conversation after its job finished (3062035, 00cb71a, bd8a339, 627f35c, 4c9d057, 64b7efa) - OpenCode replies are reported once their streamed text part is finished (980f50a)
- Restore: an agent the Wakterm CLI launched is restored by its own resume rather than refused as supervised, and a restore whose candidate describes a replaced process stays pending instead of failing, which had re-adopted agents under new IDs (95fc6b9, 2f543be)
Tabs and Tab Navigator#
ActivateOldestTabNeedingAttentionreviews the attention queue from its other end, andActivateNextTabNeedingAttentionskips hidden tabs (083f22e, 434610d, 74b9e1b)- Closing a tab passes focus to its neighbor in activity order, and a working agy tab keeps its place in the activity order (4362110, 1feccb7)
- The working marker blinks, and shows only where a dimmed tab does not already say it (99a55a3, ce70a76)
- A Devin tab icon, traced from Devin's official mark; stacked harness icons grow to seven (3db8d82)
Fonts, Multiplexer, and Platform Portability#
- A deadlock between installing an agent and reading a tab badge, which hung the mux server after a restart, is gone (7c9f73d)
- A second mux server is refused on the same saved session (d291c0a)
- Upstream wezterm fixes and selected enhancements through 86d223ec8 (b97adbf)
Docs, Packaging, and Tooling#
- v0.1.0 release, with bundled third-party crate and Windows licenses and the LGPL xcb-imdkit source (031c14b, b6215ba, a2a46b7, 2aa174b, e2ce5fc)
- Windows
OSTYPEmatching indeploy.sh, and no tar SIGPIPE invalidation.yml(ba51b74) - Test fixes for a spawn race in a Codex observer test and for pane IDs taken by concurrent tests (d05a082, d704286)
- The periodic changelog and docs sweep is documented in AGENTS.md (bdcaca8, e4fcbae)
Changes from 2026-09-27 through 2026-10-16 (commits 3d0a6cdb8 through bfe9f4e72)#
Agent Harnesses and Agent API#
- Idle Claude agent freezing (
agent_idle_freeze) on Linux and Windows (NtSuspendProcessand working-set trim), started once the GUI is running, with Windows session-status reading (3e6b477, 03a187d, ebf8c9d, 75aa077). - Mux-owned agent reminders (
wakterm agent remind add|list|cancel) that persist across restarts and deliver one-shot or repeating messages to agents at a scheduled time or after a delay, waking frozen agents (94cc26e, 75aa077). - Exact interactive approvals and question forms (
wakterm agent approval): managed Codex approvals and questions, Claude single-question and multi-question forms (user_questionanduser_question_form), ClaudeSession pausedsafeguard menus, and general Claude confirmation menus (dfe0b21, e022a74, ba4aff4, 56dea77, e8051b2, ea23a4d, 8f354f2). - Return-final support (
--return-final) for Claude and Agy agents, observer-backed return correlation from provider events,input_sha256recorded onturn_startedand encoded across Agent API events (with tabs hashed as four spaces as Claude records them), and skipping finals from turns that ended before a return request existed (f09987f, 20d3ec1, e26a0ac, 60ccd4c, 594e35b, 12a9c41, e9b1a1a, 2fbf7b3). - Draft-safe and keyboard-safe prompt submission: refuse sends when a Claude or Codex input box holds an active draft or does not have focus, automatically stash an idle Claude draft (using the user's configured stash keybinding) before sending, hold prompts until Claude finishes starting, wait for the typed prompt to be drawn before pressing Enter, and report blocked sends as structured refusals naming the blocking input (1ec92f9, 71a9135, 05c0c3c, cbc4698, f510fa8, ca51bee, 9db2dc4, 00e7b40, fc60f3a, 74544e7, 6193c7a, d770451, e821922).
- Prompt confirmation and turn tracking: confirm sends only once the provider records the exact input or starts working on it, acknowledge queued Claude input, slash commands, background-shell input, and managed Codex steers, and keep Claude turns open across tool runs, skipped records, and conversation compaction while closing turns stopped by provider errors or idle transitions (3c23896, 79e9261, 682a13a, 637249b, e3b8961, 18d5053, 1c84b59, 2ba419e, b6416c5, 324cf69, a6635ed, cb7eb48, 56ed2fc, 658adba, f7be4c1, 3bd93f5, 4ab57e3, c8bf849).
- Calling-agent resolution (
wakterm agent caller) for managed Codex tool commands and explicit caller inputs (bb3ea77, 90b7578). - Agent list and event consumer ergonomics: filter
wakterm agent listby status, show last turn as an age, let Agent API consumers skip unknown event kinds, and retry opening the SQLite event store when busy (e0bce8f, 78c0fc0, 9587493, d5f8d55). - Observation and discovery: release unconfirmed managed Codex bindings to other harnesses, observe manually launched remote Codex TUIs through their resumed thread, find Codex rollouts held by child processes of launcher threads, explain Codex TUIs running in Codex's background daemon, read Claude transcripts from the end with per-record rules, find Claude transcripts for working directories with dots or underscores, ignore trailing slashes in declared working directories, and skip invalid JSON lines (2d0dfdd, a25a5d4, db2fb80, 9acb05c, 07f7b73, db21bec, 39dca5e, f5c9bf8, 431300a, 6adae03, 0f5d30f, 84605fb, f4c6aff).
- Agent restoration and deploy recovery: notify the user when an agent restore fails, record Claude folder trust before resuming, keep a resumed agent's seen-reply state across mux restarts, focus the first pane of each restored tab, save the agent list and catalog before
deploy.shrestarts the mux, and adddeploy.sh --notifyto resume interrupted agents and ask the repo's agent to verify the deploy (d1f3544, e07bd08, 1a4314b, 46bfe6e, e3b659a, 0544ea5, 7d12edc).
Tabs and Tab Navigator#
- Live activity-order tab sorting (
ToggleTabActivityOrder,Ctrl-Shift-B) that orders tabs by most recent agent turn completion on the client while keeping the server's tab order authoritative (989f1b9, 064d1fe, 668aee0). - Overflowing fancy tab titles shrink to a shared measured width, fade smoothly by color, and narrow down to their harness icon when space is tight (
tab_titles_shrink_to_fit) (796cd6c, c06dd65, 254258c). - Working agent tabs dim with a blinking activity marker, and tabs whose latest agent reply was already reviewed can optionally dim (
agent_tab_dim_reviewed) (4f27a27, bfe9f4e). - Switch tabs with
Alt-1..9, open the tab navigator withAlt-E(alt_tab_shortcuts), and hide or show the selected tab withCtrl-Hinside the tab navigator (8a78423, 2b8a200).
Fonts, Multiplexer, and Platform Portability#
- Load WOFF and WOFF2 fonts directly, and bundle JetBrains Mono 2.304, Roboto 3.016, Noto Color Emoji 2.057, and Symbols Nerd Font Mono 3.5.1 as WOFF2 with updated glyph names and licenses (521f39d, fae0e02, ea54f3c, 36b0e01).
- Load configuration without live reload when the OS has no file watcher handles left, instead of failing startup (19a8801).
- Exit quietly when the CLI output reader closes, detect closed pipe readers on macOS and Linux (
POLLOUT), and identify Codex output files by volume and file index on Windows (981476a, eaef9ad, dc92e22, 511c4b1). - Cross-platform mux test portability across Linux, macOS, and Windows (c762814, 6397542, 42baad2, 7db4131, b0f1102, 24f12f8, bba7235, 78146f0, 14739d2, 8724c9d, 9e702c5).
Docs, Packaging, and Tooling#
- GUI startup smoke check (
ci/gui-smoke.sh,make smoke, anddeploy.sh) run under Xvfb in CI (9b22588). - Release policy alignment:
VERSIONandRELEASES.md, validated release workflows (validation.yml,release-eligibility.yml,publish.yml) with pinned runners and action SHAs, standalone Fedora.rpmpackaging, Homebrew tap (wakamex/tap) and Scoop bucket (wakamex/scoop-bucket) templates and sync script, bundled licenses in all archives, and trimmed installation docs (0079c7a, 2a5899f, dcc023b). - Regenerated CLI help and shell completions, and documented derived-file regeneration, lowercase default shortcut rules, and field-stable mux codec encoding in
AGENTS.md(1deaa80, e6a64be, 259ee63, 3c9329d).
Changes from 2026-08-23 through 2026-09-27 (commits 6f9043880 through 09a30ab99)#
Agent Harnesses and Agent API#
- ZCode (Z.ai's coding CLI) as a harness: detection, status and events from its OpenCode-schema session database, exact restore with
zcode --resume,wakterm agent start zcode, and a tab icon traced from the official ZCode mark (d7751d4, d757cbd). - OpenCode-schema event projection skips injected runtime messages instead of opening phantom turns, and reports provider failures such as rate limits once per turn (d7751d4).
- Claude panes that show a background job, either the window that sent it there or
claude attach, are observed through the job's live worker; the pane reports the job with a hint for moving the conversation back, and a clear error when the worker is gone (c1005ec, 2fe9827, df7b155). - Exact Claude restoration through shared agent recovery, keeping the values of options such as
--append-system-prompt-fileand--system-prompt-snapshot(fcc15c5, 2eea046). - Exact Agy conversation restoration (8b34ef2, 94acdec).
- Foreground harnesses running under a sandbox supervisor are observed and bound by process incarnation, and restoration keeps the supervised session instead of launching the inner harness unconfined (638ca88, efedff3).
- Managed Codex:
- Restore through the current app server, promote connected sessions to managed restore, and preserve managed identity and last-turn timestamps (57a2e8b, e9999e8, 329358b, 44b5180, c033720, 47d2e3e).
- Follow thread changes, native forks, and TUI replacement within a pane; make launch readiness atomic (7941d17, 14d51ca, 8aa0bda, afff1fe).
- Model and reasoning-effort overrides, options kept across argument positions, and permission flags kept off remote resume, which current Codex rejects (720002d, 39bef1f, 60d8548, 541ac25).
--return-finalsupport, a resume picker scoped to the pane's working directory, and bounded resume responses (9f266b7, d19b9cf, 160734b).- Failed turns expose safe terminal details and distinguish model capacity from connection failures; terminal turn state survives delayed activity (5df52d3, 1dd8d46, f6279a6, e5ec1b1).
- Internal worker sessions and ephemeral threads stay out of pane identity; rollouts are discovered from process descriptors (2206725, df1b673, 6265dcf).
- App-server events are persisted, bound replies are recovered, and oversized provider records are skipped (360d7be, b35c94f, e292fa0, c28ee97).
- Agent status updates are driven by pane output and provider artifacts instead of polling, with artifact events routed by exact session, bounded watcher state, lossless observer batches, and owed trailing refreshes (e7b57f8, f804bd9, 828cd0a, 6583a2e, 1a31165, 2dead1c, d363c22).
- Agent event and catalog consistency: single-snapshot event pages, blocking idle reads, reused output workers, unique catalog identities, catalog aligned with durable turns, primed cursors for adopted sessions, and return correlation kept through steering (3fbd2e7, d3521ca, a188c57, 4a00853, 3ccdb7e, eb90e52, 24ae141, f98775d, fac0ead, a150a30).
Shell Integration#
- Local bash, zsh, fish, and Wsh shells load Wakterm's shell integration automatically without changes to their startup files;
shell_integration = falseturns it off (2f27987). - Each pane has a durable
WAKTERM_PANE_TOKENthat survives mux restarts (84190a6). - Pane-local shell history: Up recalls the pane's own commands first, and commands merge into the shared history on exit, including those of a killed shell (902d052, d40862b).
- Wsh owns OSC 7, OSC 133, pane history, and restored foreground jobs natively where it implements them (6f4377e, e33307f, 4147a3d).
Tabs and Tab Navigator#
- Parked tabs are presented as hidden tabs (75f37a4).
- Tab navigator: filter by tab name, select the best search match, clearer agent indicators, and mux-scoped Codex memory totals (bb74a62, afa6811, 174984d, 43bf07d).
ToggleTabBarPosition(Ctrl-Shift-A) moves the tab bar between the top and bottom of the window (8639ea0).- Automatic tab titles persist across nested shells (a133db1).
- Exhaustive generated tab color palettes (d6d0c16).
Multiplexer Security and Reliability#
- On Linux, clients from a different user, mount, PID, or IPC namespace get metadata-only mux access (97932a0, 033ec8b, d558c19).
- Crash-safe session recovery: restorable panes stay in the layout when their processes exit, and snapshots are written atomically with one previous generation retained (def8bad).
- Remote clients no longer loop on resize echoes and replace agent status atomically across reconciliation (c132108, 934fe55, 8346f0f).
- App-server terminal state is preserved, and the user service includes user binaries in
PATH(d6e8bfb, 2b6e6af).
Performance and Benchmarks#
- Repeatable 20-workspace benchmark: restoring 20 tabs and 27 PTYs takes 149 ms and holds 34.44 MiB PSS at 0.0016% of one core (5b35480).
- Repeatable agent infrastructure workloads and tab navigator resource-sampling profiles; cached process-tree lookups fell from 1.321 s to 7.33 ms for 200 lookups (0746c2d, 3510ac0, e7b57f8).
Docs, Packaging, and Tooling#
- Documentation moved from MkDocs to Zola, with a mobile drawer, route-driven navigation, a full-width layout, and a separate configuration reference (7b5b447, b477fee, 6ccece7, 72f9e55, d81ece3, 6feaab8).
- Default key documentation is generated from a versioned
wakterm show-keysJSON catalog (ac5d20a). - Public documentation audit and hardened derived generation (6f90438, 78d6b8c).
- Regenerated app icons, an optional Linux desktop launcher in
install.sh, and cold Nix CI builds fixed (8cafe2a, 956f9f2, e305c98, feafa8c). - Tab icon review sheets render transparently at full resolution, and the icon tracing steps are documented (c7e8f00).
Changes from 2026-03-20 through 2026-08-23 (commits 711022567 through 8b4429a98)#
Agent Harnesses and Agent API#
- Top-level
wakterm agentCLI command for starting, adopting, observing, and controlling agent harnesses (a4716fd, ae2019f). - Automatic adoption: promote detected harness processes (Agy, Claude, Codex, Gemini, OpenCode) with confirmed backing sessions to persistent agent metadata automatically (7c6b731, a4d1fdb, 8b4429a).
- Add Agy agent detection, tab bar harness icon, and observer-backed session adoption (6ec0b15, 4b344f0, 8b4429a).
- Refresh agent identity and observer binding when an agent harness restarts inside an existing pane (39d5c4a).
- Exact Codex session restoration: restore Codex sessions with persisted restore intent across multiplexer restart and system reboot in their declared working directory, resuming exact provider threads and settling interrupted turns without guaranteeing that an in-flight turn continues (2053ce0, 820d911, 734be6b, ca10d85).
- Mux-supervised Codex app-server TUI (
wakterm agent launch codex): multiplexer manages shared app-server over private Unix socket while the pane runs native Codex TUI (ae2019f, 5e8bca8). - Versioned Agent API v1:
- Golden schema fixtures and specification (efea923)
- Narrow agent catalog (
wakterm agent catalog) with stable agent ID, ephemeral pane ID, and sequence cursor (c65d27a) - Authoritative prompt admission (
wakterm agent admit) with process incarnation checks and idempotency keys (f0dce1e) - Durable normalized event stream (
wakterm agent events) with strictly increasing sequence numbers (af748ff) - Asynchronous return requests (
wakterm agent send --return-finalandwakterm agent request get|watch|cancel) (1ac7932)
- Experimental shadow output page (
wakterm agent output) for normalized assistant message comparisons (d403026). - Native harness tab icons for Agy, Claude, Codex, Gemini, and OpenCode in the fancy tab bar (5f1927b, 66afcca, 4b344f0).
- Agent attention pulse (
agent_tab_attention_pulse): smooth icon fade when an agent completes a turn and awaits review, with shared review acknowledgement across clients (419db5a, 5c25cc4, 0f6aefb). ActivateNextTabNeedingAttention: shortcut action to jump directly to the next tab with an unreviewed completed turn (419db5a).- Automatic tab naming: unnamed tabs derive titles from the active agent leaf directory, with numeric suffixes to resolve collisions (4f7242c, f8d9ae6).
Parked Tabs and Tab Navigator#
- Parked tabs (
ParkCurrentTab/ Ctrl-Shift-S on Linux/Windows, Cmd-Shift-S on macOS): hide inactive tabs from the tab strip while keeping processes, PTYs, and sessions alive in the multiplexer (419db5a, 3661dc4). - Dedicated tab navigator (
ShowTabNavigator/ Ctrl-Shift-E on Linux/Windows, Cmd-E on macOS) (419db5a, f183c9d, 701a2c6):- Visible, Parked, and All views
- Instant fuzzy search across title, CWD, branch, harness, and agent name
- Responsive metadata columns: status, last response age, CWD, branch, pane count, and approximate process RSS
- In-place parking and unparking (Ctrl-Shift-S)
- Permanent tab close with confirmation (Ctrl-X)
- Sort by tab order or response time (Ctrl-R)
- Dense single-line or comfortable multi-line pane layout (Ctrl-O)
Appearance and Theming#
- Built-in per-tab generated colors (
tab_bar_color_mode = "Off"|"Hash"|"Assign",tab_bar_color_palette = "Dark"|"Light"|"Mixed",tab_bar_color_intensity) (c02b576, 3dbcf35, f608264). - Color similarity search in the interactive color scheme browser (e5565cb).
- Configurable agent tab badge mode (
agent_tab_badge_mode = "identity"|"attention"|"turn"|"off") (66afcca).
Layout and Navigation#
PaneSelect(mode="SwapWithActive")bound to Ctrl-Shift-M (c7736da).- macOS pane navigation shortcuts (Cmd-Alt-Left/Right/Up/Down) (0f9963b).
- Shift-Enter compatibility binding (8016097).
Multiplexer Persistence and Reliability#
- Systemd service integration:
install-user-service.shfor user service management with lingering, andinstall-system-service.shfor system-wide service boot persistence (cd0a922, 21f6417, 9b09fc1). - Explicit resize origin tracking: suppresses client self-echoes without timing heuristics, eliminating resize flicker and feedback loops (a961262).
- Synchronized tab ordering: authoritative server tab order with drift reconciliation on client reconnect (6c6b4fa, 63e94d1).
- Fix deadlock in session save vs main thread executor (2ff8f7c).
- Fix mux subscriber lifetime leak (bba995d).
- Prevent notification backlog disconnects during heavy event traffic (4dacab7).
- Wake mux loop for clean shutdown on server termination (18467f6).
- Settle interrupted Codex turns after restore (734be6b).
- Restore agents in declared working directory (820d911).
- Preserve hosted pane paths across platforms (738575c).
- OpenSSH symlink compatibility: resolve binary path across symlinked OpenSSH binaries (0cf3fe0).
- Fix duplicate tempdir stores idempotency in blob leases (8d7abe4).
- Avoid sync agent detection blocking during client attach (c3d57f8).
Terminal and Input Fixes#
- Reset extended state and modes on RIS escape sequence, #26 (5cc8708).
- Prevent divide-by-zero panic in inline image placement, #22 (8699d68).
- Stop pane search after regex errors, #24 (f42a581).
- Route IME composed text through prompt overlays, #25 (9a7c66d).
- Encode Escape correctly with Kitty keyboard disambiguation, #23 (1d7c5d7).
- Disable DECRQCRA screen scraping responses by default, #21 (1a3f253).
- Terminate tmux send-keys commands with LF, #28 (29b3d49).
- Support Unicode input in tmux control mode, #29 (5d108e0).
- Guard ZSH_NAME under Bash nounset (set -u), #38 (174b81a).
- Avoid reentrant window lock during title updates and IME borrow operations (6a67d08).
Linux and Wayland Fixes#
- Detect WSL case-insensitively, #37 (a6245e0).
- Honor disabled titlebar decorations on Wayland, #33 (f6d6bd6).
- Ignore data-device events for non-toplevel surfaces on Wayland, #32 (4c8e004).
- Share clipboard offers across windows on Wayland, #31 (3b4e56f).
- Align Wayland buffers to buffer scale, #30 (bd5495a).
- Keep render subscription alive across workspace closure, #36 (561a6e4).
Windows and macOS Fixes#
- Restore window placement on Windows (2d4098f).
- Handle TerminateProcess result correctly on Windows, #35 (6e1f0cc).
- Avoid reentrant IME borrow panic on Windows, #34 (9b497c5).
- Reconcile focus after showing window on Windows (27d7673).
- Prevent GUI freeze and delayed tab opening on macOS during client attach and background spawn handoff (9630dbe, 07422e2, 455f3cb).
Memory and Resource Bounds#
- Bound SynchronizedOutput buffer to 4MB to prevent memory leaks from unresponsive TUI applications (0dc472e).
- Bound adversarial terminal sequence parsing memory allocation (a905a0a).
- Bound Kitty image memory allocation work (af5542e).
- Prevent stack overflow from process tree cycles in procinfo, #20 (7729b72).
- Update serde_with for GHSA-7gcf-g7xr-8hxj, #27 (803456f).
- Bound diagnostic log retention (0c4b3c7).
Historical Features and Fixes (prior to 2026-03-20)#
Agent Harnesses#
-
Add pane-owned agent identity and persistence (dcd1d10) Agents (Claude, Codex, Gemini, OpenCode) are first-class mux panes with identity, state tracking, and persistence across server restarts.
-
Add agent lifecycle commands (9def1d0)
wakterm cli agent start|stop|listfor managing agent harness panes. -
Add agent runtime, send, and client-side badges (58ddee7) Send prompts and interrupts to running agents. Tab badges show agent status (waiting/working/your turn).
-
Add native harness watch and observer-backed PTY runtime (10e219e)
wakterm cli agent watchandwakterm cli agent list -ffor live progress across running harnesses. -
Fix raw input path for gemini agent sends (fbe9ccd)
Tab Management#
-
Add prompt rename tab action (86e661f) New
PromptRenameTabaction lets users rename tabs interactively. -
Add default shortcut for prompt rename tab (01d3ab0) Bound to Ctrl+Shift+< by default, later moved to Shift+Comma (f249f9f).
-
Add move-tab bracket shortcuts (de89169) Ctrl+Shift+[ and Ctrl+Shift+] to reorder tabs.
-
Preserve user-set tab titles from escape sequences (63c30dc) Titles set via
PromptRenameTabor the Lua API are no longer overwritten by terminal escape sequences. -
Add safe tab effective title for Lua (1624be0) Exposes a Lua-accessible effective title that respects user overrides.
GUI#
-
Remember window position and size on macOS (05ed9a7) Uses native
NSWindowautosave so window geometry persists across restarts. -
Make tab reordering atomic (946d01b) Tab drag-reorder is now a single atomic operation, avoiding intermediate invalid states.
-
Clip pane glyphs to pane bounds (d16d9b4) Glyphs that extend past a pane's edges are now clipped instead of bleeding into adjacent panes.
-
Invalidate line quads when pane width changes (3c82389) Fixes stale rendered content after pane resizes.
-
Repaint window on tab resize (7f4a541)
-
Improve
wakterm cli listtable layout (a5a9966)
Docs Site#
-
Replace colorscheme index pages with interactive browser (839988a) Removed hundreds of static colorscheme pages and replaced them with a searchable, filterable browser with live previews.
-
Modernize docs site (839988a) Dropped legacy asciinema player, mdbook assets, and custom CSS. Trimmed global page load cost.
Split & Resize Reliability#
-
Sync divider drags via atomic ResizeTab batches
resize_split_by()now sends the same tab-levelResizeTabbatch used by full window resizes, so dragging a split divider updates the mux server coherently instead of leaving client-only pane widths behind. -
Fix spawn sizing across entry points
wakterm cli spawn, delegation into an already-running GUI instance, and existing-window mux spawns now use the live tab size instead of falling back to tiny server defaults. -
Fix client ResizeTab pane id mapping Batched resize messages now translate client-local pane ids back to remote mux pane ids before sending them to the server, fixing fresh-session tabs that stayed at 80x24 despite correct pane sizes.
-
Fix nested split pane sizes diverging after window resize (de54b07) Per-pane
Pdu::Resizemessages interleave during rapid resizing, causing the mux server's tree to diverge. Addedreconcile_tree_sizes()-- a top-down constraint enforcement pass after every tree mutation. 14 unit tests covering 6 layout patterns. Fixes #6052, #5011, #5117. -
Fix infinite loop on extreme window shrink (80447df)
adjust_y_size/adjust_x_sizeloop forever when both split children reach 1 row/col. Added early return when no progress is made. Fixes #4878. -
Batch per-pane resize PDUs into atomic ResizeTab message (f39b4cc) Eliminates the root cause of resize interleaving. New
ResizeTabPDU (codec type 63) sends all pane sizes atomically. IndividualPdu::Resizestill sent as fallback for older servers. -
Stop sending individual Pdu::Resize, rely on batched ResizeTab (5adbc17)
-
Fix split-pane race by sending tab size with SplitPane PDU (5d94a78)
-
Force tab resize after split_pane to sync PTY sizes with tree (fffb3f8)
-
Clamp tiny resize geometry to at least 1x1 cells (8968ff4) Prevents zero-dimension resize requests from reaching the mux layer.
-
Restore tab size after top-level split (9b04ef8)
split_and_insertwithtop_level=truedidn't restoreself.sizeafter pre-resizing, causing subsequent splits to fail with "No space for split!". Fixes #7654, #2579, #4984. -
Focus new pane after split (1fa85af)
Multi-Client Stability#
-
Break resize feedback loop (76a1695) Client no longer resyncs on
TabResized, breaking the loop where resize -> resync -> resize spiralled. -
Suppress self-echo TabResized, forward from other clients (daa899b) Server no longer echoes
TabResizedback to the client that triggered it. -
Restore TabResized resync after self-echo filtering (ec0250f) With self-echo gone, resync on
TabResizedfrom other clients is safe again. -
Debounce resync storms instead of dropping (039980c)
-
Avoid pane focus feedback loops across clients (cae82e4)
-
Make active tab state client-local (ff0b2a5) Each connected client tracks its own active tab instead of fighting over a shared global.
-
Avoid reentrant window lock when moving tabs (0a05f94)
-
Fix mux client registration handshake ordering (d3993c2)
Session Persistence#
-
Rewrite session restore with recursive tree walk (26cc34b) Replays the exact split tree instead of reconstructing from flat pane rectangles.
-
Use percentage splits for session restore (d81bd83) Proportional sizing instead of absolute cell counts, so restores adapt to different window sizes.
-
Heal degenerate splits before saving, clamp to 10-90% (27dc63d)
-
Use generous initial size for session restore (42299768)
-
Reconcile tree after session restore to fix column height mismatches (6cb68dc)
-
Preserve active tab selection in manual and automatic restore
ListPanesResponsenow carries the active tab per window,wakterm cli save-layoutrecords it, manual restore focuses the saved tab after rebuilding the window, client attach/resync tracks it, and built-in mux session restore reapplies the saved active tab. -
Add Rust
wakterm cli save-layout/restore-layoutand removewez-tabsManual layout snapshots now use the real mux pane tree instead of reconstructing split order from flat pane rectangles. Restore replays exact split cells, preserves tab/window grouping, titles, workspaces, active tab selection, per-tab active pane selection, and zoom state.
Mux Protocol / Server#
-
Fix OOM from unbounded SynchronizedOutput buffer When a TUI app enables SynchronizedOutput (
CSI?2026h) and crashes or gets stuck without disabling it, the mux server accumulated parsed actions without bound. Over days, this grew to 25GB+ and triggered the OOM killer. Added a 4MB safety valve that force-flushes the buffer during hold. Also added 60-second memory reporting (RSS + per-pane action buffer sizes) at INFO log level. -
Reject oversized PDUs before allocation (e1e8510) Both
decode_rawanddecode_raw_asyncallocated buffers from untrusted wire data without bounds. AddedMAX_PDU_SIZE(64 MiB) check. Fixes #7527. -
Fix deadlock in domain_was_detached (1a9b10d) Held
windows.write()while calling intotab.kill_panes_in_domain(), creating a lock-ordering deadlock with the GUI render path. Downgraded towindows.read()and released before operating on tabs. Fixes #7661. -
Add RotatePanes PDU (3ebe927)
rotate_clockwise/rotate_counter_clockwisewere local-only -- the server's tree diverged after rotation. AddedRotatePanesPDU (codec type 64) to keep server in sync. Fixes #6397. -
Pass --attach flag through try_spawn (f283ee0)
wakterm start --attach --domain Xdelegated to an existing instance but always spawned a new tab, ignoring--attach. Now checks for existing panes and skips spawning. Fixes #7582. -
Clarify stale mux server version mismatch errors (55f3de1)
-
Log client version on connect (95d16ce)
Codec#
-
Accept legacy tab title PDUs without badge (9eceae0) Backward compatibility for older clients that don't send the agent badge field.
-
Restore codec version 46 (1a16da1) Both client and server are built from the fork, so the intermediate version bump was unnecessary.
Parser / Misc#
-
Fix tmux CC parser error on empty line during detach (701b950) Empty lines during tmux
-CCdetach caused parser errors in the debug overlay. Fixes #7656. -
Add chrono clock feature (6e5b38a) The workspace chrono dependency was missing the
clockfeature, preventingUtc::now()from compiling.
Observability#
-
Add mux observability for layout issues The mux server logs hard errors for
ResizeTabpane-count mismatches, unknown pane ids, and split-tree invariant failures. -
Add
check-pane-layout.pylive layout validator Validateswakterm cli list --format jsonoutput against a legal split tree so offscreen panes, overlaps, gaps, and degenerate rectangles are easy to catch from a live session. -
Track .git/HEAD and refs/heads for version string freshness (dcd417b)
Security#
- Disable DECRQCRA checksum responses by default to prevent terminal screen
contents from being queried silently. Set
enable_checksum_rectangular_area = trueonly when compatibility requires it.
Compatibility#
The mux protocol has diverged from upstream. wakterm clients and servers must be the same build; connecting to an upstream wezterm mux server is not supported.
Test Coverage#
26 tests added (17 mux, 9 codec) covering:
- 6 layout patterns (L-shape, T-shape, grid, deep-nested, first-pane-stale, column-width)
- Interleaved PDU scenarios from rapid resize events
- Pane removal, split+resize, extreme shrink/grow cycles
- Oversized PDU rejection
- tmux CC empty line handling
- Top-level split tab size preservation
- Tab rename title fallbacks
- Headless agent watch smoke test
- SetClientId handshake regression
For changes before the fork, see the upstream WezTerm changelog.