[1.0.0] - 2026-09-02
PocketTmux is now two apps built from one repo and one shared Swift package.
Added
- PocketTmux for Mac — a menu-bar app that hosts the agent: start/stop with status, port and reachable addresses; connected iPhones; live tmux sessions (open in Terminal, kill); Pair iPhone… window (QR + link + token, address picker with Tailscale first); Settings (launch at login, auto-start, keep Mac awake while attached, Bonjour, name, port, token regenerate, tmux path, log).
- PocketTmux for iPhone — Macs screen with saved profiles (many Macs, Keychain), nearby Macs via Bonjour, pairing by QR /
pockettmux://deep link / manual entry; Sessions with new / rename / kill and round-trip time; Terminal with a window strip (switch, new, rename, kill), paste (bracketed-paste aware), font size, haptic bell, keep-awake; reconnect with jittered backoff and automatic re-attach. PocketTmuxKitpackage —PocketTmuxKit(protocol v2 codec, tmux control-mode parser,-Fformat parsers, name validation, pairing payload) andPocketTmuxAgent(WebSocket server on Network.framework,tmux -CCcontrol client, screen primer, window pinning, paste, Bonjour, sleep assertion, token store, ring log). Unit tests run withswift test.- Protocol v2 (
docs/PROTOCOL.md): client/host identity, windows, rename, paste, attach size hint (the pane is resized before the first paint), typed detach reasons and error codes, ping/pong RTT. - Screen priming now also restores the cursor position and re-runs on every window/pane switch, so switching to a window running vim shows vim with the caret in place.
pockettmuxdCLI on the same library:--port --token --name --no-bonjour --no-keep-awake --tmux --regenerate-token.- CI builds the package tests, the iOS app (+ tests), the Mac app and the daemon; releases attach the
.ipa,PocketTmux.appzip andpockettmuxdtarball. scripts/check-attach-prime.pygrew into a full end-to-end check (prime, size-before-paint, windows, input, paste, ping, detach reasons, auth).- Docs:
PRODUCT.md(both apps),PROTOCOL.md, rewrittenARCHITECTURE.md,ROADMAP.md,TECH_STACK.md; new troubleshooting entries (Bonjour, port in use, unsigned builds). - README rewritten as a product page: app screenshots of both apps in
docs/assets/, mermaid architecture and attach-sequence diagrams, install/pairing/security sections.
Changed
- Repo layout:
App/iOS,App/macOS,App/Daemon,App/PocketTmuxKit(wasApp/PocketTmux,App/Agent,App/AgentCore).Project.ymldefines four targets and references the local package. - The agent stopped printing to stdout ad hoc; it logs through
AgentLog(unified log + ring buffer) and the daemon echoes it. - tmux
-Fformats are tab-separated (session and window names may contain|). session.destroy→session.kill;exit→session.detached{reason}.
Removed
- Protocol v1 (a v1
hellois rejected witherror{auth}so old builds fail loudly). docs/PRODUCT-v1.md(superseded bydocs/PRODUCT.md), the single-profile Keychain record (migrated into the profile list on first launch).
Fixed
- Sending
error{auth}on a bad token was racing the socket close; the frame is now flushed before the connection is cancelled. pockettmuxdcrashed on SIGTERM (exit()from a raw signal handler); signals are handled through dispatch sources.- Tapping a Mac on the Macs screen or a session on the Sessions screen did nothing:
.onTapGestureon aListrow never fires next toswipeActions/contextMenuon iOS 26, so both rows are plainButtons now. - CI and Release ran on
macos-15(Xcode 16.4) and could not compile the apps at all: the isolated@MainActor TerminalViewDelegateconformance failed with "unknown attribute 'MainActor'" andCIContextwas still non-Sendable. Both workflows now run onmacos-26and pin Xcode 26.2 through.github/scripts/select-xcode.sh. - The Release job looked for a
## [vX.Y.Z]changelog heading while the file uses## [X.Y.Z], so every release shipped with placeholder notes; publishing is also idempotent now (a re-run refreshes notes/assets) and no longer swallows failures.
Downloads
PocketTmux-macOS-*.zip— Mac menu-bar app (unsigned: right-click → Open on first launch)pockettmuxd-*.tar.gz— headless agent binary (unsigned)PocketTmux-iOS-*-unsigned.ipa— iPhone app, unsigned: re-sign with your own Apple ID (Sideloadly / AltStore /codesign) or build thePocketTmuxscheme from Xcode