v0.5.0¶
Release Date: 2026-08-08
Highlights¶
- PTY Autocomplete Wrapper Detection - Warns when a session is running behind a figterm-style shim (Kiro CLI, Fig, Amazon Q) known to freeze terminal panes
- Session Error Alerts - SessionManager errors now surface in the app instead of failing silently
- Startup Hang Fix - Fixed a deadlock that could leave the app stuck on the loading screen indefinitely
- Smoother Trackpad Scrolling - Removed the double-dispatched scroll path and upgraded SwiftTerm to the tagged v1.16.0 release
- Stable Session Identity - The session picker no longer loses track of the active session across refreshes
What's New¶
PTY Autocomplete Wrapper Detection¶
Some shell-autocomplete tools (Kiro CLI, Fig, Amazon Q) re-exec your shell inside a PTY shim so they can watch keystrokes for inline completions. That shim is a well-known cause of frozen panes when it deadlocks — the agent running inside blocks on I/O and the pane hangs for every attached client.
PlexusOne Desktop now detects this automatically:
- Detection - Checks each tmux pane's process for a known wrapper marker (e.g.
zsh (kiro-cli-term)) during the normal session refresh - Warning Banner - A dismissible banner explains the risk and shows the exact command to remove the wrapper's shell integration, with a one-click copy button
- Per-Session Badge - An amber warning triangle appears next to any affected session in the pane header, status bar, and grid view; hovering shows the fix
- "Don't show again" - Suppress the banner permanently once you've addressed it
Session Error Alerts¶
SessionManager errors (e.g., tmux not found, a failed command) now surface as a "Session Error" alert in the app instead of failing silently. Dismiss it and the underlying error is cleared.
Startup Hang Fix¶
Some machines could get stuck on the "Loading..." screen forever. The root cause: the app's command executor read a process's output only after waiting for it to exit — once a command's combined output exceeded the ~64KB pipe buffer (as ps -Ao pid=,command= easily does on a machine with a browser and other apps running), the child process blocked on write() with nothing draining the pipe, so it never exited. Both pipes are now drained concurrently while the process runs, so this can no longer deadlock.
Smoother Trackpad Scrolling¶
Two changes compound here:
- Removed double-dispatch - The app previously installed an app-wide
NSEventmonitor and a custom wheel handler on top of SwiftTerm's own scroll handling, so every wheel/trackpad event was processed twice. That's gone; SwiftTerm's built-inscrollWheelnow handles mouse reporting, alternate-screen conversion, and native scrollback directly. - SwiftTerm upgraded to v1.16.0 - Previously pinned to an unreleased main-branch commit, now pinned to the tagged v1.16.0 release. Upstream added its own fractional trackpad scroll-delta accumulation in this range — accumulating sub-line deltas across events instead of dropping them, which is exactly the smoothing fix this project had been planning to write in-app. The app gets it for free with no code changes. This release also picks up several Metal renderer stability fixes ahead of the Metal-renderer rollout planned for a future release.
Stable Session Identity¶
Session IDs are now derived deterministically from the tmux session name instead of a fresh random UUID on every 5-second refresh. This fixes SwiftUI view churn and a session-picker checkmark that could lose track of which session was active.
Added¶
- Detect figterm-style PTY autocomplete wrappers (Kiro CLI, Fig, Amazon Q) in tmux panes and warn with a dismissible banner plus a per-session badge showing the fix command (
1b5c3e5) - Error alert UI surfacing SessionManager errors in the app instead of failing silently (
031432a)
Fixed¶
- Fixed a startup hang where
SessionManager.refresh()could deadlock indefinitely once a command's output exceeded the ~64KB pipe buffer, leaving the app stuck on "Loading..." (fbfa656) - Session identity is now derived deterministically from the tmux session name instead of a new random UUID every refresh, fixing SwiftUI view churn and a session-picker checkmark that could lose track of the active session (
8a06173) - Added
@MainActorthread safety toInputMonitor(587ea1d) - Fixed terminal scrollback getting stuck when the user types while scrolled up (
a5afebe)
Performance¶
- Removed the double-dispatched scroll path (an app-wide
NSEventmonitor plus a custom wheel handler) that processed every trackpad/mouse wheel event twice; SwiftTerm's built-inscrollWheelnow handles mouse reporting, alternate-screen conversion, and native scrollback directly (6ec3de2)
Changed¶
- Extracted
TmuxEnvironmentfor shared tmux path discovery (f987c68)
Build¶
- Pinned SwiftTerm to a fixed revision instead of tracking branch
main, so its performance characteristics can't shift under us between builds (e08c519) - Upgraded SwiftTerm from a pinned main-branch commit to the tagged v1.16.0 release, picking up upstream's own fractional trackpad scroll-delta accumulation and several Metal renderer stability fixes (
8b29091) - Bumped
github.com/gorilla/websocketfrom 1.5.1 to 1.5.3 inservices/tuiparser(9454e58) - Bumped
github.com/creack/ptyfrom 1.1.21 to 1.1.24 inservices/tuiparser(edab8a8) - Bumped
flutter_lintsfrom 4.0.0 to 6.0.0 inapps/flutter(328ace8)
Infrastructure¶
- Added Dependabot config for weekly dependency-update PRs across Swift (desktop, iOS), pub (Flutter), Go modules (tuiparser), and GitHub Actions (
62e55b0) - Bumped
actions/checkoutfrom 4 to 7 (eb524a9) - Bumped
actions/upload-artifactfrom 4 to 7 (1ea5b17) - Bumped
actions/download-artifactfrom 4 to 8 (482d5a1) - Bumped
swift-actions/setup-swiftfrom 2 to 3 (83efd6d) - Bumped
softprops/action-gh-releasefrom 2 to 3 (f9a18a1)
Documentation¶
- Added the desktop scroll & rendering performance roadmap (
INIT-PLEXUSONEAPP-001) tracking Phase 1-3 work (e5cacdc)
Download¶
| Platform | Download |
|---|---|
| macOS Universal | PlexusOneDesktop-0.5.0-macos-universal.dmg |
| macOS Apple Silicon | PlexusOneDesktop-0.5.0-macos-arm64.dmg |
| macOS Intel | PlexusOneDesktop-0.5.0-macos-x86_64.dmg |