mpmux by Mighty Painting
~/mpmux/docs ❯ less changelog/contents ↓

Changelog#

0.1.17 — 2026-11-03#

  • Terminal output is processed faster. libghostty-vt now comes from Ghostty's main of 2026-11-03 (1.4.1-dev) instead of the 1.4.0 release, with Ghostty's speed work since then: a smaller style record, a faster path for printing runs of text (also with wide characters and inside hyperlinks), and no work for rows that are already blank. On lpfw, output goes into a pane 2.1 times as fast for coloured compiler output, about 1.4 times for plain log lines and 1.5 times for full-screen redraws (as in htop or vim); lines mixing CJK and ASCII text are about 12% slower. It also brings the column and index sequences DECIC, DECDC, DECBI and DECFI, tmux control mode's window-close notice, and wrapping fixes at the right margin.

0.1.16 — 2026-10-30#

  • Change Host opens on your paired hosts. With more saved hosts than fit on one page of the pie, Change Host opened on its last page, which could hold only old addresses, Pairing and Edit, and offered no way back: a paired host on the first page looked gone. Paired hosts (the ones with a name) now come before bare addresses, the pie opens on the page with them, and on the last page of any pie Next leads back to the first. The session pie (Ctrl+Alt+X) pages the same way.

0.1.15 — 2026-10-30#

  • A paired host is still there after a restart. On the desktop, once the local session host had a session, Session Management in the command palette listed only those sessions: a host paired by short code or invite seemed gone after reopening mpmux, though it was saved. The list now offers Change Host, Pair Iroh Invite and Accept Short Code after the sessions; Change Host lists the saved hosts and connects with the saved pairing. A host paired by short code is listed under its own name, no longer under this device's label ("mpmux desktop").

0.1.14 — 2026-10-28#

  • Terminal emulation from Ghostty 1.4.0. libghostty-vt now comes from Ghostty's 1.4.0 release instead of a development snapshot of 2026-10-08. It brings Ghostty's fixes since then: tmux control mode keeps its parser state between notifications and rejects broken pane layouts, cursor moves respect the margins in origin mode, Kitty images in erased history are removed, a crash when scrollback dropped the cursor's page is gone, and the terminal answers more reports (DECXCPR, CSI 19 t) and supports DECSTR.
  • Makepad from upstream of 2026-10-21, with mpmux's 46 changes carried over. On Android, mpmux keeps running and keeps its session through a change of display size, rotation, folding or split screen; a scroll gesture stays with the list it began in; animated images play correctly. One more change gets the pairing QR scanner ready for Android's predictive back, which would otherwise send Back past the camera to the app behind it.
  • Building mpmux needs Zig 0.17.0, which Ghostty 1.4.0 requires: just toolchain-bootstrap installs it under .tools/.

0.1.13 — 2026-10-23#

  • A sleeping phone no longer holds up the programs in its session. While the phone or tablet showing a hosted session had its screen off (or showed another app), every mpmux-cli call from that session, an agent's run-monitor hooks among them, waited 15 s and then failed. Now the app tells the session host when it goes to sleep, and those calls fail at once with "the device showing this session is asleep"; they work again as soon as the app is back in front. A session with no app attached says so at once too, instead of after 15 s. Media still works in both cases: the session keeps it.
  • The Events panel reads like a sidebar. Its messages are cards, newest first, each with its number and the time it came; errors carry a red ERROR pill and bar, the Errors chip leaves only those, and on the desktop a filter field keeps the messages that hold every word you type (Escape clears it). When a sidebar the dock showed goes away, the panel says which ("Todos closed"), and a todo sidebar that stopped on an error says that /todos-sidebar starts it again.
  • The overview stays light with busy tabs behind it. Output in hidden tabs redrew the whole overview on every change; now it redraws a few times a second at most, with a last redraw when the output stops.
  • Open a todo's file from its dialog. The todo dialog's Open file opens the todo's .md in your editor ($VISUAL, else $EDITOR) in a new pane beside the agent's; in a hosted session the editor runs on the session host, where the file is.
  • Scripts: split-pane and new-tab take run (a program and its arguments) and cwd: the new pane runs that program instead of the shell and closes when it ends (mpmux-cli split-pane -- nvim notes.md). The session host's CreateSession takes them too.
  • /todos-sidebar says why it did not start. It reported "started" for a sidebar that then gave up (while the device slept, for one); now it waits for the sidebar to show and otherwise prints the reason.
  • Scripts and other clients: the session host takes SetAttachmentPresence (awake, asleep) from the attached app, and its relay answers device-asleep and no-attached-app itself.

0.1.12 — 2026-10-22#

  • The run panel waits behind a dot. A new run no longer opens the agent's run panel, which on a phone covered the whole terminal, also right after you had closed it. A small dot at the right of the top bar breathes while the agent works, glows amber while the run is paused, and is dim when it is your turn; a tap opens the panel on at most half the screen (at the bottom of a phone held upright) and the next one closes it. Closed, it stays closed. This works with the run monitor of mpmux-cli 0.1.11 too.
  • Scripts: a sidebar can say it follows work with activity (active, waiting, idle); it then gets the dot and never opens the dock by itself.
  • The todo dialog has chips. Its status (in the colour of the list's pill), id and tags sit as chips under the title, with a quiet line on who works on it and when it changed; the facts card keeps its parent, steps and dependencies. The notes no longer repeat the parent (the Parent: TODO-… line a step's notes start with) or a ## Children list the dialog shows above them.
  • Scripts: dialogs take a chips section, short labels with a tone (neutral, info, success, warning, destructive) in the hues of the sidebar's status pills. An mpmux without them turns the dialog down with "unknown variant", so a script can send it again without.
  • The overview is in the pie menu: Panes, then Overview, for the touch screen without a three-finger swipe, and the mouse.
  • Hosted sessions get attention markers too, and hidden tabs stay live in the overview. A card in the overview marked new output and bells only for local panes and the full snapshots of hosted ones; the incremental updates a session host sends most of the time, and everything a hidden tab received, went unnoticed. And while the overview was open, the card of a hosted session in another tab did not change at all.
  • A version mismatch says which side to update. A script of another host-control version than the app (the todos sidebar after an update of only one of them) failed with "expected 23, got 22"; now the message says whether to update mpmux or the script, and the todos sidebar says so for older apps too.
  • Events keep their numbers. The Events panel numbered its messages from the newest, so every new message renumbered the rest; now each keeps the number it arrived with (newest still on top), and errors are marked with ⚠.
  • The overview's card pie names its session in the middle ("Session" and the card's name), and each entry has a fitting icon of its own.
  • Android: the overview's header stays below the status bar. Its buttons began inside the status bar; now the header leaves the same room at the top as the title bar.
  • The app no longer competes with the session host service. An app started while systemd was restarting mpmux-sessiond.service started a session host of its own; that one took the socket, and the service then failed every two seconds without end. The app now waits for the service.
  • A session host that cannot start as configured stops once. Its socket served by another process, an option the binary lacks (--iroh-listen without Iroh), or an unknown argument: mpmux-sessiond exits with 78, says what to do, and the units no longer restart it (RestartPreventExitStatus=78; run mpmux-cli service install again to rewrite an older unit). It prints "listening on" only once it listens. --socket 127.0.0.1:4097 is refused with a hint to --tcp; it used to make a socket file of that name, which no client would reach.
  • A clipboard that does not answer no longer stops the desktop app from starting. At startup the app looks for a pairing link in the clipboard; a clipboard tool that hung (xclip under Xvfb) kept the window from ever appearing. Now only the tools for the running display server are asked, for 400 ms at most together.
  • Android: an update is checked once per download, in a file of its own, so two checks can no longer delete each other's copy (an ENOENT in the log during an update; the update itself went through).
  • The todo dialog's buttons fit a phone. The footer wraps; Work on was cut off at the dialog's edge.

0.1.11 — 2026-10-21#

  • Each script's sidebar is a panel of its own. The run monitor no longer replaces the todos sidebar (or the other way round): the dock menu lists both, and switching between them keeps each one as it was.
  • A split dock shows two of them at once. Split Panel in the dock menu puts a second sidebar below the first (beside it with the dock at the top or bottom), for example the run below the todos, or below a document in the Viewer. The second panel is a card of its own; drag the bar between the halves, and ⌄ on the second panel folds it away. The dock stays split while runs come and go. A pinch or Ctrl +/- scales only the panel it is on; each keeps its own size.
  • The Viewer goes back to where you were. Closing an object a script or a link brought up (a todo's Show in the Viewer, an agent's chart) returns the dock to what it showed before, instead of an empty Viewer.
  • Double-tap the Viewer for full screen. A double tap or double click on a picture, document or table folds the terminal and the second panel away; another brings them back.
  • Fixed: a dock menu item over a sidebar card could stay pressed and do nothing (on a touch screen): the card under it took the tap's release.
  • Scripts: clear-custom-sidebar and the other sidebar commands take a sidebar_id, the UI state lists every sidebar in custom_sidebars with where it is shown, each sidebar sends its own state events, and set-dock-split splits the dock. A script should act only on events with its own id; the todos sidebar and the run monitor do.
  • Pairing explains a session host without device auth. After a plain mpmux-cli service install (or with the service the Linux packages ship), mpmux-cli pair failed with only "auth-unavailable: sessiond was started without --auth-store". It now says to run mpmux-cli service install --remote --restart, service install without --remote says that only this machine can connect, and the guide, quickstart, reference and troubleshooting pages say that pairing needs --remote.

0.1.10 — 2026-10-21#

  • The todos sidebar filters by status. Chips under the filter field show Open, In progress, Mine, Claimed, Closed or All todos; is:closed, is:mine and the like in the field do the same, and the sidebar remembers the chip for each project. Closed todos can be found again, and the filter searches tags and notes too (title matches first). Custom sidebars get the chips through the filter's new chips field.
  • The work in progress comes first in the todos sidebar, marked "Working on": todos in progress and those assigned to this agent.
  • Reopen in a closed todo's pie menu, in place of Close.
  • A larger, clearer todo dialog. It grows with the window (up to 1240 px wide and the window's height), shows the title once, the facts in one card (status and assignment, tags, "updated 3 h ago", parent, steps with "2 of 3 done", dependencies) and the notes as Markdown. Scripts get this through the document dialog width and the markdown section; older mpmux versions get the previous dialog. Todo ids in it are links that open that todo (its parent, its steps, TODO-… in the notes), and Copy ID and Show in the Viewer are links too. Scripts write [label](action:<id>) in a dialog's lines or Markdown for a link that reports action <id>; web links open in the browser.
  • Fixed: a hidden side panel kept coming back. Each update of a script's sidebar (the run monitor reports every step) opened the dock again and widened it to the default width, over the terminal on a phone. Now an update of the sidebar already there stays where you left it: hidden, behind another tab, narrowed. A new sidebar still opens the dock; show-custom-sidebar takes reveal for a script that wants it shown again (the todos sidebar's start).
  • Pinch the side panel to scale it, as in the Viewer; Ctrl + / Ctrl − scale it while it has the keys. It keeps its size from one script's sidebar to the next.
  • Fixed: todos with the status completed counted as open.
  • Security: TLS certificate checks updated (rustls-webpki 0.103.16, webpki-roots 1.0.10): distrusted intermediates and emSign roots are no longer accepted (RUSTSEC-2026-0381, -0382, -0383).

0.1.9 — 2026-10-20#

  • The agent integrations come with mpmux. The packages (and the macOS app) carry the Claude Code plugins (the /todos-sidebar command, the media skill, the run monitor, prompt marks) and the Pi package (the todos tool and sidebar, the host-control and run-monitor extensions, the skills). mpmux-cli agents install installs them into Claude Code and Pi, which load them from mpmux's folder, so updating mpmux updates them; agents status shows what is installed and finds copies set up by hand before. mpmux-cli todos-sidebar runs the todos sidebar (with Node 22.18 or newer).
  • Fixed: Enter in a dialog without fields presses its main button (the todo dialog's Work on, not Refine), unless that button is destructive.
  • The todos sidebar redraws in about 7 ms instead of 115 with 250 todos.

0.1.8 — 2026-10-20#

  • Fixed: scrolling goes the way your desktop says. The terminal turned the wheel and the touchpad around: scrolling down went back into the history, unlike Ghostty. The terminal, the todo pane, the command palette and the pickers now follow the desktop's natural or traditional scrolling. mouse-scroll-invert = true in [host-ui] turns it around.
  • Fixed: a wheel click scrolls three lines, not about 180 (mouse-scroll-multiplier-discrete is lines per click again).
  • Todo pane: double-click a parent to open or close it, as ← and → do; a double click on a todo without children opens it. ← and → now also work right after moving onto a parent, which sometimes did nothing.
  • Fixed: text in a Wasm canvas stayed hidden under a busy frame's shapes (in a guest that draws a few thousand shapes a frame).
  • Docs: a Wasm canvases chapter, the Viewer in the mpmux-cli reference and the agent docs, an install table for every platform in the README, and the quickstart's host setup with mpmux-cli service install.

0.1.7 — 2026-10-20#

  • Fixed: Tab stays in the terminal. Tab completion in the shell moved the keyboard focus to the next field of the window (the sidebar's filter, the Viewer's address), so the following keys went there. A Tab the terminal takes no longer reaches the window's tab navigation.
  • The .deb has no Whistle voice input. Its speech engine needs a newer system (glibc 2.38) than the package's floor, Ubuntu 22.04; the Arch package and the Android app keep it. The 0.1.6 .deb was built the same way.
  • macOS: the first Mac build since 0.1.5. It leaves out Parakeet for now: its ONNX Runtime needs macOS 13.4 and did not link in the cross build. Whistle voice input stays on Apple silicon.

0.1.6 — 2026-10-20#

  • Links in the Viewer's documents. A link in a Markdown document opens where it points: a file next to the document runs or shows in its place (a Wasm guest on its canvas, another document, an image), with Back to return; a web address opens as a web link in the Viewer, a media link its object. mpmux-cli media show sends the files a Markdown or HTML document links to with it, so media show README.md in contrib/wasm-canvas is a launcher for the examples. A page in the Viewer that links to a guest or a Markdown file it carries opens it the same way. Links are underlined and sit on the text's line (Makepad patch 0044).

  • Wasm canvases in the Viewer (experimental). A .wasm guest that draws on a canvas and takes touch and mouse runs in the Viewer itself, on Makepad's stitch interpreter, on the desktop and on Android: mpmux-cli media show guest.wasm. A template with an interactive demo is in contrib/wasm-canvas; the runtime is crates/mpmux-wasm-canvas.

  • mpmux-cli media demo shows sample objects to try the Viewer: a chart, a table, a document and an interactive point cloud page with its data file.
  • mpmux-cli errors are one line. A failing command printed Rust's error chain, with a full backtrace when RUST_BACKTRACE was set; it now prints mpmux-cli: <what went wrong>, and media show names a missing file.
  • The Viewer: images, tables and documents beside the terminal. A new dock tab shows media objects that programs send with mpmux-cli media show <file> (host command show-media): PNG, JPEG, GIF, WebP and SVG images, CSV and TSV files as tables, Markdown, JSON and text. show prints a media link, mpmux-media://<id>; clicking or tapping it in the terminal opens the object again. Showing the same id again updates the object in place, so a script can redraw its chart. It works through the session host as well, so an agent on a server can show its results on the tablet. On the desktop, Open hands an object to the system's program for it, e.g. an HTML page to the browser. In a terminal, media show also draws a PNG as a thumbnail that opens the object when clicked. The command palette has Show Viewer, and ← and → step through the objects. A skill (contrib/skills/mpmux-media, linked by the Claude Code and Pi stage-local-links.sh) tells agents to show their charts and tables there. An HTML page opens interactively in the browser of the device you are looking at, Android included: the Viewer's Open serves it from a small server on 127.0.0.1 (a random token per app run, only opened objects). In a hosted session the session host keeps the objects: they survive an app restart, a device that attaches later sees them, and a program can show them while no device is attached. Objects can be up to 8 MB (the CLI sends a file's path over the local socket). mpmux-cli media show <folder> shows a page with its files: the folder's index.html loads the other files (data, models, textures) by relative URL when Open shows it in the browser, also from a session host. On Android the Viewer shows HTML pages itself, interactive, in the system WebView (Makepad patch 0037 adds the platform web view on Android); it hides while a menu, dialog or the command palette is open.
  • Sidebars of any length. The custom sidebar (todos, agent runs) now builds only the cards on screen, so it shows every entry instead of the first 20 (and the todos sidebar every todo instead of 10), and the app starts faster. A swipe that starts on a sidebar and ends over the terminal no longer opens the keyboard.
  • Android: touch gestures run on the app's clock. Android reports touch times as time since the device started, mpmux everything else as time since the app started; mixing them made timed gestures depend on further touch events. A finger held still now opens the pie menu on time, and messages and animations after a touch are timed right.
  • Images from kitten icat, yazi and other programs that ask first. mpmux now answers the kitty graphics query (a=q), so these programs no longer decide that the terminal shows no images. Images sent without a size in cells are placed at their pixel size, and image data without base64 padding is read (kitten icat sends both).
  • Fixed: a tab stuck in "Reconnecting…" after the app restarted. When the owning device reattached a session (its reconnect does that), the session host kept the old attachment in the workspace ownership record and refused every stream as "attachment does not match workspace ownership". It now takes the new attachment (update mpmux-sessiond); with an older session host, restarting the app clears it.
  • Fixed: a dock at the top showed only its title while the keyboard was up (Android): the keyboard's room was taken from the dock as if it ran down to the bottom edge. A dock at the bottom now keeps its height above the keyboard and the terminal gives up the room.
  • Fixed: reload-config on Android forgot the config file and reloaded the built-in defaults; it reads the app's config like startup does.
  • The sidebar at any edge. The dock (messages, the run monitor, the todos) can sit on the left, right, top or bottom of the window: drag it by its title (drop zones show where it lands; on a touch screen hold the title first) or pick the place in its menu. mpmux remembers it ([host-ui].dock-position). On a phone a dock at the bottom keeps the terminal's width, so both stay readable in portrait.
  • Clear and Reset a terminal, like Ghostty. The pie menu's up-left entry is now a Terminal submenu: Interrupt (Ctrl+C, moved there), Clear (screen and scrollback; the shell redraws its prompt) and Reset (a full terminal reset for a terminal a crashed program or binary output left garbled). Also in the command palette and as mpmux-cli reset-terminal [--clear]. In a hosted session the reset happens in the session host (an updated mpmux-sessiond), so every device sees the clean terminal.
  • Watch and steer an agent's run from mpmux. mpmux-cli run-monitor shows a coding agent's plan as a checklist in the sidebar (status icons, progress bars, the current activity, Pause and Stop), and asks the person to approve risky actions in a dialog, with a note back to the agent. Claude Code drives it through hooks (contrib/claude/run-monitor); other agents follow the mpmux-run-monitor skill. Custom sidebars gained the steps and actions sections and a summary progress bar for this.
  • Sidebars and dialogs fit a phone. On a phone the dock opens over the whole screen (Restore Panel puts the terminal back beside it), a tap on a step opens it, button rows wrap, and a dialog being typed in shows just its field above the on-screen keyboard. Closing a dialog no longer pops the keyboard up when it was opened over the sidebar.
  • New app commands work through an older session host. The session host's relay passes host-control requests on unread (it needs only their id), so a new sidebar section or command no longer needs a session host restart; an app that does not know a command says so (unknown-command).
  • Hosted sessions over Iroh: no more frozen app, faster reconnects. The app could freeze for good while it connected: the Iroh endpoint was bound under a lock that the UI thread waits for on every Android network event, and the bind's own network setup sends such events. A reconnect attempt now gives up a stalled handshake after 8 s (16, 24, at most 30 s on later tries) instead of the 30 s connect timeout. With an updated session host, all tabs share one Iroh connection: a tab's stream, and a reconnect, open on it without a new handshake (300 ms instead of seconds on a relay path); an older session host keeps working as before. On Android 15 the Iroh client key could not be created at all (/data/local/tmp); it lives with the pairing files now, which also keeps it from being purged with the app cache.
  • Agents in background tabs, and fewer reconnects. A hidden tab keeps its session stream: switching tabs no longer reconnects (each switch used to open a new Iroh connection, one source of tabs hanging in "Reconnecting…"), and an agent in a tab you are not looking at still updates its run and asks for approval, also after a network drop: a hidden tab reconnects in the background instead of when you open it. Pane commands from a hidden tab are refused instead of reaching the visible pane.
  • Run monitor for current Claude Code, and for Pi. Claude Code's task tools (TaskCreate/TaskUpdate) are the plan now, and the hook tells Claude that it is being monitored, so it neither probes for the setup nor reports twice. Approval dialogs show every line of a command (a multi-line commit message hid the git push after it) and what made them ask. A new Claude or Pi session starts its own run instead of continuing a stale one. Pi gets the same run, Pause/Stop and approvals through the mpmux-run-monitor extension (contrib/pi). A press in the sidebar is no longer lost when the script redraws it before reading it.
  • Screenshots of a phone or tablet. mpmux-cli capture-ui works on Android (Makepad never answered screenshot requests there, patch 0035) and from a pane of a hosted session: the image of the device showing the session comes back through the session host and is saved where you asked, scaled down only if it would not fit.
  • Android: hardware Enter and Tab type once, and so does the last character typed into a dialog field from a hardware keyboard.
  • --version everywhere. mpmux, mpmux-sessiond and mpmux-cli print their version, commit, protocol and the libghostty-vt, Makepad and iroh revisions they were built with (mpmux --version opens no window). mpmux-cli version lists all tools, installed and running; the command palette's About mpmux shows the same in the app, Android included.
  • Voice input inserts what you said after the stop. The transcript went through the keyboard text path, whose filters could drop it on a tablet while the app still reported it inserted. It now goes straight to the active pane; anything that stops it is reported with the text. A final pass that finds nothing falls back to Whistle, then to the live text. A recording whose microphone never starts ends after 15 s instead of showing "Opening the microphone…" forever.
  • --help/--version piped into head no longer panic.
  • Scripts and agents: one key press is one key press. mpmux-cli send-keys … Enter armed key repeat without a release: the key fired about ten more times and the app redrew every frame until the next real key (45 % of a core while idle).
  • Android host-control starts on every device. Its socket was under a temporary directory the app may not write on some Android versions (the Android 15 emulator); it is in the app's own files now.
  • Android: a hardware keyboard types each character once. Keys from a keyboard (a tablet's keyboard cover, Bluetooth) reached the terminal twice, once as the key and once through the on-screen keyboard's buffer: ls became llss. Mixing hardware and on-screen keys works too.
  • Parakeet no longer crashes on Android. The app's thread-local storage ran on Zig's runtime (bundled in libghostty-vt), which writes past a thread's slot array; ONNX Runtime's worker threads hit it, and the first Parakeet recording crashed. It runs on the NDK's runtime now (20 recordings in a row on the Android 15 emulator). A Parakeet that cannot run now says why instead of silently leaving the text to Whistle.
  • No leak per voice recording on Linux. Makepad's ALSA backend never closed a device (patch 0034): each recording through an ALSA device left a handle, and via ALSA's PulseAudio plugin a thread and ~20 MB behind. Android's voice calls also release their JNI references now.
  • Leaner Parakeet. Fewer ONNX Runtime threads, none spinning after a run: 44 instead of 82 app threads after a recording on a 16-core desktop, same speed.
  • Smaller Linux tarball. Its binaries are stripped like the .deb's (mpmux 90 → 66 MB).
  • Security updates: rustls 0.23.46 (RUSTSEC-2026-0346 to -0349) and lru 0.18.5 (RUSTSEC-2026-0253).
  • Docs: setting up mpmux-sessiond on macOS (launchd), and finding out which version is installed.

  • Voice input transcribes on the device, on every platform. mpmux now carries Whistle, a 17 MB speech model (English, German, French, Spanish, Italian, Dutch, Polish), and uses it on Android, Linux and macOS: open Voice Input from the command palette or the keyboard's mic key. Words appear while you speak and the final pass sees the whole recording. The Android system recognizer, still the fallback, now keeps one session across pauses (Android 13+), uses the configured language and favours terminal words. New [voice] settings: engine, language, keywords.

  • More accurate voice input with Whistle. Words on the active pane (file names, commands, identifiers) are favoured, the quiet before and after speaking is cut and long pauses are shortened before the final pass, and the desktop microphone is resampled through a proper low-pass filter. New setting [voice] pane-keywords (on by default).
  • Parakeet for the final voice transcript on the desktop and arm64 Android (ONNX Runtime built from source for Android). NVIDIA's Parakeet TDT 0.6B v3 (CC-BY-4.0), run with ONNX Runtime, transcribes the finished recording when its model is installed: far more accurate than Whistle (it gets file names and tool names right without hints), in 25 European languages, and faster at the end (0.8 s instead of 1.8 s for a 15 s recording). Whistle still writes the live text. The 633 MB model is downloaded only on request (command palette: Download Parakeet Voice Model, checksummed), loads when a recording starts and unloads after ten idle minutes. [voice] final-pass chooses. Recording on the desktop also keeps 300 ms after the stop, so the last word is not cut off.
  • The voice overlay warns about a noisy microphone. A loud background (usually too much input gain) shows a warning with the measured level while recording with Whistle. Quiet microphones are fine: the engines level the audio, and the waveform scales to each microphone. Saved recordings also report where the time went (live passes, the final pass, stop to text).
  • Voice recordings for inspection. [voice] save-recordings = true keeps each Whistle recording with its transcript, the microphone's format and the levels (~/.local/state/mpmux/voice/, newest 20). MPMUX_VOICE_INPUT=<name> picks a desktop microphone other than the default.
  • Voice in the pie menu. The root pie's lower right opens voice input; Upload moved to the command palette (Upload File to Session).
  • Android: the app's fonts are back. Since the 5 October build the APK left out mpmux's own fonts (Inter, the terminal and symbol fonts): the Makepad packager now ships only fonts the binary declares. The mpmux keyboard showed blank keys and terminal text fell back to another font. The fonts are declared again, and a test keeps the list complete.
  • A new voice overlay. A live waveform, the transcript so far, a record button that swells with your voice, and a timer. It scales with the dialog size, so the microphone is no longer cut off on small phones. Space records and inserts, Esc cancels; Enter no longer leaves the microphone running.

  • The window stays responsive while connecting to a session host. Connecting at startup, pairing, attaching, creating, and taking over a session now run in the background. A slow or unreachable host no longer freezes the window (on macOS: no more spinning beach ball and Force Quit); a failed connect shows a dialog.

  • mpmux-cli service install runs the session host as a user service: a systemd user unit on Linux, a launchd LaunchAgent on macOS, so a Mac can host sessions without systemd. --remote switches on device auth and Iroh in one step; mpmux-cli pair then works without further setup. service status and service uninstall complete it.
  • macOS: the pie menu opens with Cmd+Alt+X, like the overview with Cmd+Alt+O. Ctrl+Alt+X now reaches the program in the pane, and Cmd+Alt+X no longer copies the selection on the way.
  • macOS: mpmux-cli works in mpmux's shells without setup; mpmux adds the app's folder to their PATH.

0.1.5 — 2026-10-09#

  • macOS: copy and paste with Cmd+C and Cmd+V. Copy did nothing and paste was dropped; Ctrl+C, Ctrl+V and Ctrl+X now reach the shell as control keys, as in Terminal.app.
  • macOS: shells get a UTF-8 locale when the app starts from the Finder or the Dock, so typed umlauts and other non-ASCII text show correctly.
  • Fixed: the pie menu has its icons in the .deb, the Arch package, and the macOS app.

0.1.4 — 2026-10-09#

  • Fixed: the desktop packages show text again. The .deb, the Arch package, and the macOS app looked for their fonts in the folder they were built in, so on other machines mpmux showed only the cursor. The packages now carry their fonts and icons (/usr/share/mpmux, or mpmux.app/Contents/Resources); the .deb grows to about 54 MB.
  • macOS: tooling to sign the zips with a Developer ID and notarize them on a Mac (just macos-sign).

0.1.3 — 2026-10-08#

  • Program status (OSC 7501): agents and tools say whether they are working, waiting for you, done, or failed; the overview card shows it, and mpmux-cli list-panes reports it. mpmux answers the protocol's support query, so pi reports without setup. Also in hosted sessions.
  • Progress bars (OSC 9;4): a thin bar on top of a pane while its program reports progress, like Ghostty's.
  • Overview colours: the status pill is amber when a program waits for you, blue while it works, green when done, and red after a failure; it sits on its own line under the session name.
  • libghostty-vt updated to Ghostty 7ec9e26a (2026-10-08).

0.1.2 — 2026-10-06#

New#

  • Documentation: a reference for every key, every setting, every mpmux-cli command, and the command-line options of mpmux and mpmux-sessiond, next to the user guide. Online at https://mightypainting.dev/mpmux/docs/; the packages install it under /usr/share/doc/mpmux/.
  • Ubuntu and Debian: a signed apt repository for Ubuntu 22.04+ and Debian 12+ (x86_64).
  • Pairing from the desktop: copy an invite made with mpmux-cli pair url on the host, then choose Session Management → Pair Iroh Invite. mpmux shows the host's name before pairing.
  • Scroll marks: mpmux remembers where prompts and agent turns start (OSC 133, SetMark), also in hosted sessions. Ctrl+Shift+PageUp / PageDown jump between them. pi and Claude Code mark their turns (see the guide). The scroll map that shows them is experimental and off by default ([host-ui] scroll-map = true).
  • Overview: a command palette entry, an attention marker for agents that need you, and Shift+F10 for the card menu.
  • mpmux-cli: split-pane prints the new pane id; clearer texts and layout in mpmux-cli tui.

Fixed#

  • Clipboard paste on Linux (X11 and Wayland) reaches pairing prompts.
  • Messages stay visible above dialogs.
  • mpmux-cli capture-pane --start-line -20 and other negative numbers (scroll-viewport -10) are accepted.
  • Saving the overview layout no longer rewrites a config file that does not parse; mpmux leaves the file alone and shows a message.
  • Releasing Shift while holding a key no longer stops the key's repeat.
  • Enter that confirms the palette, the pie menu, or the overview no longer also reaches the pane.
  • Copy, paste, and Enter on bare X servers; clicks on the top rows with a hidden title bar.
  • Wheel scrolling over an overview card no longer opens its menu.
  • Scroll marks stay correct when a full scrollback drops old lines.
  • mpmux --help prints the real defaults and exits before opening a window.

0.1.1#

First public preview: desktop (Linux), Android, session host with Iroh pairing, Arch repository.