Changelog
What changed, newest first. Until the first tagged release, everything is listed under “Unreleased”.
Unreleased
Fixed
- A tab that disappears leaves evidence. kitty keeps no record of who closed a tab, so the scanner now writes a
closeddecision for every agent window that vanishes: what the agent was doing when last seen, how many agent windows went in the same seconds and how many shared its tab.kittymux explainsays it in words ("with 1 other agent window (1 in the same tab): a tab or window was closed, the agent did not quit"). Two or more at once means a close action, not an agent exiting. - The panel takes keys the moment you open it. The docked panel only accepted the keyboard after a click, so Super+N and then
jdid nothing. Opening it now *summons* it (an exclusive keyboard grab);esc,q, a jump,kittymux panel dockor 12 s without a key give the keyboard back, so a forgotten summon cannot trap your typing. Newkittymux panel summon|dock; pure rules inkittymux_panelfocus. - kitty crashed (SIGSEGV in libpython) because of how kittymux replaced its timers. kitty runs every due timer from a snapshot; a callback that removes another due timer (a config reload replacing the scanner's timers) left kitty calling a Python function it had already released. Every kittymux timer now gets a callable that cannot be freed (
kittymux_timers), and a tick of a removed timer is ignored.tests/smoke_timers.shreproduces the crash with a raw timer pair and shows the fix survives it. - Your own scripts and their keys stopped working after the control socket moved to
$XDG_RUNTIME_DIR(the scratch-tab chords for nvim/hypr/zsh/kitty config, font toggle, snapshot, session cycling…): they look only at/tmp/mykitty-<pid>. Seesocketlinkabove. - The keymap overlay listed 14 junk rows (
--mode spawn…), raw action names (goto_tab,scroll_page_up), resize keys without a direction, andctrl+alt+[/]as "last pane". Fixed at the source inbin/mux-keys.py; the spawn-mode chord is listed. - A busy line above Devin's idle prompt made a tab read as working (a pasted Codex log line "Working (1s • esc to interrupt)"); Devin's composer says "Ask Devin to build features" only when idle.
- The pace mark on a usage gauge was a hole that looked like a broken bar; it is a notch now. A selected Usage or Inbox card is marked by a stripe, not a band floating above it.
- The mascot glyph vanished from every running kitty after
kittymux upgrade: the installer re-copied the (identical) icon font, and the bar hides the glyph when the font file is "newer than the kitty". The installer now copies only a changed font and the bar judges the font by content fingerprint, not timestamp. - Tab clicks that silently did nothing (the 5–14 px gap between kitty's click rule and
drag_threshold); a stray middle-click no longer closes an agent tab. - Notifications that forced focus to the agent's window (compositor
focus_on_activate+ a bell): no bell is sent where it would steal focus. packaging/PKGBUILDnow shipsopen-actions.conf.tpl.
Changed
- Tabs are called by what they are about. An agent's product name ("Claude Code") or a sentence of its own reply ("I can't do that…") used as the window title no longer becomes the tab's name: the tab is called by its project. Titles are cleaned (markdown, quotes, trailing punctuation, and a
| foldersuffix some agents append when it is exactly the tab's project) and cut at a word. The text of a tab you named yourself is never touched. Bar and panel share one pure module (kittymux_titles);kittymux features off titlesrestores the raw title. - The panel's Agents list is calmer. A split tab starts closed (
▸ 3 panes; click it, or→/o, to list its panes; hovering and refreshes never open one). The session header hides when there is only one unnamed group, saysother tabsotherwise, and shows how many of its tabs ask for you. Rows say how long they have waited (needs you 4m,limit hit 1h,done 3m); the words shorten before they take room from the branch. PR numbers and ports no longer wear the "working" blue. - `?` in the panel shows the keys of the current view (a keycap at the right of every footer does the same). Empty lists and empty searches say why. The preview drawer drops blank lines, box rules and TUI hint footers.
- Number keys: panes on `ctrl+alt`, tabs on `alt`.
ctrl+alt+1..9focuses pane N of the tab (the digitctrl+alt+edraws on each pane) andctrl+alt+0the last pane;alt+1..9jumps to tab N andalt+0to the last tab (the!scratchtab is passed over). Thectrl+alt+shift+1..9aliases are gone: one chord per job. New workflow opskittymux workflow nav lastandworkflow pane last. - Equalize moved to `alt+shift+=` (it was
ctrl+alt+0), next to the resize keysalt+shift+h/j/k/l, which now move the edge about 3 columns a press (they moved about 1).ctrl+alt+=stays Hyprland's. - Every rig that starts a private kitty now clears the identity of the kitty you run it from (
KITTY_WINDOW_ID,KITTY_LISTEN_ON,KITTY_PID,KITTYMUX_TARGET*), andsmoke_panes.shends with a focus tripwire on every other kitty. A key-bound background process inherits kitty's own environment, so a rig started from a terminal inside a live kitty used to drive that live kitty with the CLI-backed keys. ctrl+alt+entersplits below andctrl+shift+enterto the right; the README says so (it used to say "+shift").- Recommended kitty setup is now
allow_remote_control socket-only+listen_on unix:${XDG_RUNTIME_DIR}/mykitty;kittymux doctorwarns aboutyesand a/tmpsocket. Every smoke test runs undersocket-only. - A completion notifies only with a known duration ≥ 15 s after a 5 s settle; a hook-announced turn ends only with the agent's own
Stop. Screen-only completions need ≥ 60 s of work to pop up. - Bar redraw 6.0 → 2.1 ms with 23 tabs; the spinner ticks unfocused windows at half rate; resize touches only the visible tab per event.
Added
- A notification when a plain terminal waits on you.
sudo,doas,suandpkexecasking for your password,sshandgitasking for a passphrase or a login,pacman,paru,yay,aptanddnfwaiting for a yes or a no: one desktop notification with Jump to it and one inbox event, for a pane you are not looking at, after the prompt has stayed up a second. The text is fixed (your user name on the prompt is never stored), and nothing you type is read. Switchessudo,loginprompt,pkgprompt. docs - A usage limit is an episode with an end. The bar and panel show when it lifts (
↻12m, "resets in 12m") instead of how long ago it hit, the red state ends at the reset even while the old message is still on screen, and a retry that hits the same limit is announced once (it used to pop up on every retry: five times in six minutes in one log). - `socketlink`: a link at
/tmp/mykitty-<pid>to kitty's real control socket, so scripts written forlisten_on unix:/tmp/mykittystill find kitty when the socket lives in$XDG_RUNTIME_DIR.kittymux doctorsays how many of your scripts depend on it. - A pane guide with real screenshots (Tabs and panes): pane numbers and
ctrl+alt+e, resizing withalt+shift+h/j/k/l, and equalizing withalt+shift+=. The images are taken bytests/shot_panes.shwith real key events, and the page now says which key goes to the last pane (ctrl+alt+0) and which goes back to the previous one (ctrl+alt+o). - Agents view redesign. One bright thing per row (the title), a state mark at the right edge, a stripe and a faint warm tint on rows that need you, and detail (PR, ports) only on the picked or hovered row. Rows are drawn by a pure module,
kittymux_agentsview, tested at every width in both themes. - Clickable buttons in every panel view. A row of keycaps under the list (
⏎ jump,/ find,a join,t detach;r/din Usage;⏎/x/tabin Inbox) does what its key does when clicked, and lights up under the pointer. Narrow panels drop buttons from the right, so the most useful stay. - Usage numbers you can trust. The Codex collector picks the newest limit *event* by its own timestamp (not the newest file name), reads only the tail of each rollout, uses the window length the event reports, and shows a window that has already ended as
window reset · no newer sampleinstead of its old percentage. A provider's report older than ten minutes is dated on its card, and trend history is recorded at the time a snapshot describes and keyed by quota label (5h,wk), not by row position. - Usage trend and live age on the card (ported from the first text dashboard): a 48-hour sparkline, the age and any failure of a live fetch, and
dfor source notes. The render is bounded however many rows a cache claims. - Dismiss can be undone. In the panel's Inbox,
zbrings back what the lastxorXhid; the footer offers it for 8 seconds and then drops the offer on its own. New inbox oprestore(older readers ignore it). - `motion` switch (
kittymux features off motion,KITTYMUX_MOTION=off): the working spinner holds one still frame in the bar and the panel, and the 10 fps redraw timers stop. On by default. - Open the panel from anywhere: a documented Hyprland bind and an optional
layerrulefor a slide-in from the screen edge (the panel's layer name iskittymux-panel). - Wait ledger: how long agents waited on you, from when a permission or question event first appeared to when you first looked at it. A card in the panel's Inbox view (today, median, a week of bars, who is waiting now) and
kittymux inbox ledger [--json]. The inbox fold keeps two new optional fields,t0andack_t(schema version unchanged). - Command palette (
ctrl+alt+shift+space,kittymux palette): one searchable list, inside the kitty you are in, of what needs you, every tab, conversations to reopen, a new agent (with its provider's quota headroom; the first four CLIs show, type to find the rest) and a few fixed actions. Type to filter,⏎or a click does it. It only chooses:kittymux actre-validates the choice (a tab id, an installed agent, one of a fixed list) and acts after the overlay has closed. - Pick the agent that still has room. The new-agent rows of
kittymux pickshow their provider's headroom (◔ 5h 99% used,◔ limit hit, resets 3h 50m) from the usage numbers the panel already keeps; nothing is fetched. - A new look for the panel: Usage and Inbox views. A strip of pills switches Agents / Usage / Inbox (
aui, or click). Usage is a row of provider tiles (logo, worst share, a thin gauge) and one card for the pick: gauges that go green → amber → red with a tick for where an even spend would be and the time to reset, a big token number with a week of bars, state chips, and a seven-day heat strip. Inbox is every typed event as a card with Jump and Dismiss and four filters. One pure component kit (kittymux_ui) draws both from your live theme colours, and one meter model (kittymux_meters: quota, counter, state, spend) draws every provider, so a new provider needs no UI code. Collectors keep their text rows and gain numeric sidecars (rem_s,window_s,tok,sess, …). The usage overlay now also shows the elapsed-window line for Codex. docs - Every tab says where it is.
project[:worktree]/inner branchunder each vertical tab, the project name highlighted; a stable per-project hue from your theme's accent; tabs that look alike get their project emphasised. Each piece is its own switch —kittymux features [on|off NAME | preset minimal|default|full]. - Sessions that come back with their conversations.
kittymux sessions save|restore|list|new|check|history|recover: kitty's ownsave_as_sessionplus the resume command of each agent window (claude --resume <id>,codex resume <id>,devin -r <name>,opencode -s <id>,agy --conversation <id>,cursor-agent --resume <id>, grok, droid), autosave, templates (plain,agent,duo,review). Each CLI's resume flags are probed against its own--help; ambiguous cases are restored as saved rather than opening one conversation twice. docs/sessions.md - Restored agents ask before resuming (
kittymux resume-prompt: Enter resume · n new · s shell · a all · i commands).KITTYMUX_RESUME=autoskips the question. - Agent journal — every agent session recorded as it runs (agent, session id, directory, command, runs, work time) in a private bounded file;
sessions historyfor insights,sessions recoverafter a crash. - One event model / inbox — typed events (permission, question, limit, done) from the agent's own notifications, hooks and the screen; one popup per occurrence;
kittymux inbox; a documented contract for widgets (docs/inbox.md,addons/quickshell). - `kittymux explain` — why every agent pane is in its state and every notification decision, with its reason.
- Native divider (kitty ≥ 0.49.2): drawn and hit-tested by kitty itself — the real resize arrow and drag in tabs with split panes.
kittymux dim,kittymux screenshot, clickablepath/file.py:42:7(kitty ≥ 0.49.2),kittymux demoshowcase tabs,docs/try-it.md.SECURITY.md,CONTRIBUTING.md, issue and PR templates;tests/smoke_socket.sh.- Spawn, pick, reopen, mute (docs/launcher.md):
kittymux spawn claude,codex [--vsplit](keys:ctrl+alt+shift+othenc x d u o a g),kittymux pick(one searchable list — needs-you longest-waiting first, running agents, closed conversations, new agent — in fzf, rofi or fuzzel;⚠ no approvalsmarks agents started with approvals off),kittymux reopen(ctrl+alt+shift+u),kittymux notify mute|status|unmute,kittymux snooze(muting quiets popups and bells, never the inbox). - Bar insights: beside the state glyph, how long a tab has been waiting / working / done-unseen (
1m !,1h ◐, refreshed every 20 s); a red⚠on agents started with their approvals off; the armed-mode badge shows the right keys forleaderandspawn(width-aware). Rofi look: mascot header, per-agent icons, accent rail, colours read from your live kitty theme.kittymux inbox --waybarfor a status-bar module. - Pin and settle (
kittymux pin|unpin|settle|unsettle,alt+p/alt+sinpick): pinned conversations lead the list and are never aged out; closed ones untouched for 3 days settle away behind one "show settled" row. Flags merge by their own timestamp so the scanner cannot undo them. - What did the agent change? (
kittymux changes):7 files +142 −30since the run started, on a finished tab, on that agent's row inpick, and as a command. Snapshots use a temporary index and a private object store — your repository is never written to. - Fan-out (
kittymux fanout "PROMPT" claude,codex,devin): the same task to several agents at once, each in its own git worktree + branch + tab, with the prompt given in each CLI's own (verified) form;fanout compareshows what each did relative to the base,fanout cleantidies up. - Join a tab into another (
ctrl+alt+shift+j,kittymux join): all panes of a tab (or one pane) become splits of a tab you pick, keeping their shape. A list takes the keyboard and the mouse (type to filter, hover or arrows to choose,⏎or a click to join,Tabfor the side,ctrl+tfor tab or pane). The deck'sa(pull a tab in) uses the same mover, which fixes panes arriving as 7-column slivers. docs - Quick look (
ctrl+alt+shift+q,kittymux peek [TAB_ID | --waiting]): the peek card of the agent that has waited on you longest, from the keyboard — read its question,⏎goes there,escstays. docs - Your own shortcuts are left alone.
ctrl+alt+shift+h k v z f xstay unbound; the keymap overlay (ctrl+alt+/) lists your own kitty maps (YOURS · KITTY) and Hyprland's terminal and scratchpad binds (YOURS · HYPRLAND);kittymux keysandkittymux doctorreport any chord both your config and kittymux define. Pane title bars are onctrl+alt+shift+cand pane swap onctrl+alt+shift+y. docs - Docs tree for a docs site (
docs/index.mdx,docs/users/,docs/developer/,meta.json,feature-status.yaml,promotion-manifest.yaml,troubleshooting-symptoms.yaml) with drift tests (tests/test_docs.py) and a generated status table (tools/docs_status.py).
Security
kittymux pickrendered raw window titles: a title with a newline/NUL/ESC/bidi override (any program can set one) could forge rows or shift the indexes a menu answers with. All shown text is sanitised and a row with a control character is refused at the menu boundary;mux-agents.shscrubs the same characters. Snooze moved from a window variable (settable by any program in the window) to a private file.uninstall --purgerefuses to delete aKITTYMUX_STATEthat is/, your home or above it, a symlink, or not recognisably ours. A command started inside a kitty acts on that kitty, never on "the focused one". See docs/audit-2026-10-02.md.- Secret-looking flag values are redacted from printed
sessions list/sessions history --json; see SECURITY.md for the threat model.