Release Notes
Version 1.0.6-88
May 18, 2026
Terminal
- libghostty Rebased on Upstream: The bundled libghostty was rebased onto current upstream. Pulls in roughly ten escape-sequence DoS and crash fixes uncovered by AFL fuzzing (CSI W, CSI g, CSI @, SGR underline parsing, insert-blanks and insert-lines at the right margin with wide characters and hyperlinks, zero-width graphemes arriving on a pending-wrap cell, and others), most of which were reachable by hostile shell output. Also rolls in a fix for the Korean IME crash on preedit composition, so CJK IME input is stable.
- Renderer and Memory Fixes: A use-after-free during mouse interaction over hyperlinked text is gone, with the renderer mutex now held for the full traversal. The C surface-text free function was silently a no-op and any caller using it was leaking; it actually frees now. The key-state overlay no longer leaks when a chord is ignored.
- Protocol Coverage: The Kitty keyboard protocol now reports composed and IME-produced text instead of dropping it. DECBKM (mode 67) is implemented so applications that set the backarrow-key mode get the right byte. DECSTR (soft terminal reset) handling was tightened. Link detection now respects semantic prompt boundaries, and the link regex is bounded so a pathological line can’t trigger catastrophic backtracking.
Connections
- Ctrl-C Interrupts In-Flight ssh / sftp from the iOS Local Shell: Pressing Ctrl-C while
sshorsftplaunched from the local shell was still in the DNS, TCP-handshake, or key-exchange phase would return you to the prompt but leave the underlying connect running, which would surface later as a delayed error or stray output landing on top of your next command. Ctrl-C now tears the in-flight connect down, so the prompt you get back is real. - tssh Transfer Hang and Crash Fix: Transferring a tssh session to a nearby device could hang the originating app long enough for iOS to force-quit it during the background transition. The transfer’s stream reads and writes now happen off the main thread on a dedicated runloop with hard deadlines on each step, and the originator cancels cleanly if rootshell is backgrounded mid-transfer. The receiver also closes its stream in step so a close from either side can no longer race the other into a torn-down read or write.
- tssh Transfer Cancellation: Cancelling a Transfer to Nearby Device handoff after the offer was already in flight could leave the sending side waiting forever for an ack that the receiver had already declined. The cancel path now closes the stream and unblocks the originating tab so the session stays usable.
Interface
- Tab Bar Liquid Glass Transition Stabilized: The selection animation on the Liquid Glass tab bar could pop, double-animate, or briefly show the wrong tab as selected when tabs were created, closed, or reordered during the transition. The transition now coalesces selection updates and hands off cleanly when the underlying tab set changes mid-flight.
- Selection Magnifier Centers Above Your Finger: The terminal selection magnifier now sits directly above your touch point instead of drifting toward the midpoint of the selection. The old midpoint-flip behaviour, which moved the loupe to the opposite end of the selection in certain drag directions, has been removed, so the magnifier stays where you’d expect for the whole drag.
Build
- Xcode 26.5: rootshell now builds with Xcode 26.5.
Version 1.0.6-87
May 16, 2026
Keyboard
- Spacebar Trackpad for Cursor Movement: Long-pressing the spacebar on the on-screen keyboard now drives the terminal cursor. iOS’s floating-cursor drag offsets are bucketed into whole cells and emitted as arrow-key presses.
Connections
- Transfer to Nearby Device for tssh Sessions: A live tssh session can now be moved between your iCloud-paired devices via Handoff. Long-press the tab title on the originating device and choose “Transfer to Nearby Device”, then open the Handoff banner at the right end of the Dock on macOS (or in the App Switcher on iPadOS / visionOS) on the receiving device. The two devices exchange over secure Continuity continuation streams, the receiver reattaches to the existing tsshd PTY by session ID, and the originator only detaches once a confirmed ack lands. Recent scrollback travels with the offer so the new device picks up mid-context, and active TUIs replay through the alt-screen. Under the covers this uses tsshd’s attachable mode, so make sure you’re running the latest rootshell on every device involved and tsshd 0.1.8 or above on the server.
Version 1.0.6-86
May 15, 2026
Appearance
- Per-Theme UI Chrome Color Overrides: Each theme can now override the algorithmically derived sheet and tab-bar chrome colors. Long-press a theme in Settings → Appearance → Theme and pick “Customize UI Colors…” to tweak them. Overrides persist per-theme, follow custom-theme renames and deletes, and round-trip through the backup system.
- Disable Tab Switching Animations: New “Disable Tab Animations” toggle under Settings → Appearance → Window → Tab Bar. When enabled, tab selection skips the spring animation, so switching feels instant.
Reliability
- SCP Tab Completion Fixes: Four bugs surfaced by a filename containing spaces. (1) Profile suggestions no longer surface unrelated hosts via substring matches on profile tags or notes: files come first, and profile suggestions must actually prefix-match the profile name or
user@host. (2) File completions now backslash-escape spaces and close open quotes, matching howcpalready behaved, instead of being inserted raw. (3) A trailing space inside an open quote or after a\escape no longer ends the current argument, soscp "CODEandscp My\ File\complete correctly. (4)scp My\ File.txtno longer splits into three arguments at execution time; backslash escapes now follow shell POSIX rules. - Tab Close Routes to the Dying Tab: When an SSH (or any) session ended asynchronously (e.g.
reboot,exit) and you had switched tabs before the close arrived, the wrong tab would close. The close event now targets the tab that owns the dying terminal instead of whichever tab happens to be selected.
Connections
- SSH Compatibility: SSH sessions now send the cooked-mode terminal modes (ECHO, ICANON, OPOST, ONLCR) that OpenSSH always populates in its pty-req. RFC 4254 §8 explicitly tells clients to populate these. Speculative fix for MikroTik / RouterOS.
Version 1.0.6-85
May 14, 2026
Connections
- Import from OpenSSH Config: New Settings → Privacy & Data → Import from OpenSSH flow. Reads your
ssh_config, turns each concrete Host block into a saved profile, and offers to import any IdentityFile keys not already in your keychain (matched by SHA256 fingerprint). Auto-detects~/.sshon Standalone macOS and.sshinside the rootshell sandbox on iOS, with a folder-picker fallback on sandboxed builds. OpenSSH semantics are honored end-to-end: wildcard Host blocks contribute defaults, negated patterns work,IdentityFile noneandProxyJump noneproperly clear inherited values, and ProxyJump / ProxyCommand jump hosts inherit the same identity key as their target.
macOS
- Custom App Icon Persists in Finder and Dock: Standalone Mac builds now write the selected icon into the .app bundle via
NSWorkspace.setIcon(_:forFile:options:). The icon survives quitting and shows in Finder and the Dock even when rootshell isn’t running.
iOS Local Shell git
- libgit2 Upgrade: The bundled libgit2 used by our custom git CLI was rebased onto upstream. Brings in the reftable backend work, faster SHA-256 OID handling, an
oidfix that ensures SHA-1s are zero-padded, arevspec->fromuse-after-free fix, theload_known_hostsHOME-tolerance change so SSH operations don’t fail when the home directory is invalid, and the suppressedFETCH_HEADwrite when fetch updates are disabled.
iOS Local Shell WASM
- WASI File Time and Range I/O: Added
fd_pread,fd_pwrite,fd_sync,fd_filestat_set_size,fd_filestat_set_times, andpath_filestat_set_times, plus stubs forsymlink,link, and the WASIsock_*imports the Go runtime emits. These are what Go’swasip1stdlib and tools rely on, so a much wider range of WASI-compiled binaries now run unmodified. - Cooked-Mode stdin (ICANON + ECHO + ICRNL): The default (non-raw) terminal mode now buffers typed bytes per line, echoes them locally, and translates Enter to
LFbefore delivering to the running.wasm. Programs that read withbufio.ReadString('\n')(rclone’s interactive config and similar) used to hang because terminals send\ron Enter. Backspace now erases in-shell; Ctrl-D delivers VEOF on empty lines. Raw mode (rootshell_terminal_set_raw(1)) is unchanged. - Env libc Stubs and Auto-Stub for Missing Imports: Added stubs for
flock,fcntl,kill,getpid,geteuid,umask, and similar so neovim and other ports built against a POSIX shim link cleanly. Any otherenv.*import the runtime doesn’t recognize now gets a synthesized zero-return stub that logs a stderr line on first call, so missing syscalls surface as a runtime message instead of aLinkErrorat startup. - DNS via
recvfromReturns the Real Peer Address: UDP receive now attaches the resolved peer host and port to each reply, so apps that calledsendto_hostwith a hostname get the actual post-DNS address back instead of an all-zero source-address buffer. Fixes DHCP-style, mDNS, and syslog-shaped traffic. - TCP
acceptNo Longer Hangs Forever: A bookkeeping bug in the listener path caused incoming connections to queue onto a stale handle whileacceptwaited on a new one. Fixed.
Reliability
- SFTP Tab-Completion Crash Fix: Pressing Tab in an iOS local shell SFTP session could crash rootshell if you kept typing (or deleted characters) while the directory listing was still coming back from the server. The completion result now re-checks what’s on the line before applying, so a slow network reply can no longer overwrite stale text or land past the end of the line.
Version 1.0.5-84
May 12, 2026
iOS Local Shell
- WASM Shell Integration:
.wasmprograms now participate in the local shell the way any other command does. You can pipe them (wasm tool.wasm | grep foo), redirect their output (wasm tool.wasm > out.txt), etc.
Reliability
- Scroll Mode Fix on Locked Launch: Fixed a race condition that affected the touch handler’s scroll/select gesture mode for users who had never manually toggled the Scroll Mode setting. The race condition existed in earlier builds but became worse after other recent changes.
Version 1.0.5-83
May 11, 2026
iOS Local Shell
- WebAssembly (WASM) Support: The local shell can now execute
.wasmbinaries cross-compiled to WASI (wasm32-wasip1). This feature is provided for educational purposes, to help users learn about WebAssembly, the WASI interface, and systems programming on iOS. The execution environment is fully sandboxed within the app and is intended for code you have written yourself or audited as part of that learning; rootshell does not offer a catalog of pre-built binaries and does not function as a general-purpose package manager or app marketplace. Get a.wasmfile onto the device (scp or sftp from another machine into the local shell is the easy path; the Files app works too), then run it like any other command, either aswasm path/to/binary.wasm args...or directly if the first token ends in.wasm. Capabilities in this first cut: sandboxed filesystem read/write (rooted at the app’s Documents directory, with path-escape attempts refused), TCP client/listener and UDP sockets viaNetwork.framework, DNS resolution through the system resolver (respects VPN routing and happy-eyeballs), and TLS/HTTPS through standard WASI crates. Sessions run in cooked mode by default so Ctrl-C cancels the running binary; a binary can opt into raw mode for full-screen TUIs and receive every keystroke (including0x03) on stdin. Each tab gets its own runtime so two.wasminvocations in different tabs are fully independent. Background and discussion at issue #177.
Version 1.0.5-82
May 10, 2026
Connections
- tssh Client Synced to Upstream v0.1.8: The bundled tssh client is refreshed against upstream v0.1.8, picking up the latest reconnection, transport, and protocol fixes from the public release. For best reliability, also upgrade the tsshd binary on the servers you connect to so client and server are on matching protocol revisions; mismatched versions can leave you on older reconnection and transport behavior even though the client side is current.
- MikroTik RouterOS Key Exchange Workaround (Awaiting Tester Confirmation): RouterOS’s SSH server (banner
SSH-2.0-ROSSSH) can stop responding mid-handshake when the client KEXINIT offers too many key exchange algorithms. When the remote version banner identifies a RouterOS peer, rootshell now narrows its KEX proposal to just curve25519-sha256 and curve25519-sha256@libssh.org, which RouterOS is expected to handle cleanly. Other peers are unaffected. We do not have a RouterOS device in-house to verify against; if you hit RouterOS handshake hangs in prior builds, please confirm on this build at issue #161.
Terminal
- Native Scrollbar in zellij Scroll Mode: The pipeline that drives the native scrollbar for tmux copy mode now recognizes zellij scroll mode automatically. The visible position indicator drives the scrollbar for either multiplexer, and gutter touches no longer route into the scroll view while a multiplexer owns scroll input (the handle stays visible as a position indicator but is read-only, so a drag no longer produces a glitchy local move that the next observer sample snaps back).
- tssh Mode Restore on Resume (iOS Shell-Launched Sessions): A previous build fixed mode restore for tssh sessions started from the Connections / profile UI, but sessions started by typing
tssh hostname(orssh,mosh) inside an already-open local shell tab took a different code path that cleaned up its inline spinner without injecting the mode-restore trailer. On resume those shell-launched sessions lost mouse capture, alt-screen, cursor-key mode, and bracketed paste. Trailer construction now lives in one place and runs for shell-launched sessions across all four embed contexts (local, SSH, mosh, tssh), with the mode-restore bytes written inside the same gate as the saved scrollback so the byte stream stays saved-scrollback, then trailer, then buffered server output, then live, with no trailer write racing ahead of the saved scrollback.
iOS Local Shell
- Shell Parser Hardening (Surfaced by a Homebrew Install Attempt): A user tried to run the Homebrew install script in the local shell, which is not something rootshell can actually do, but the attempt walked the parser through a 1175-line stress test of bash-only constructs and surfaced several real bugs that affect ordinary scripts too. The shell used to crash outright on
bash -c "$(curl ...)"and tripped on a number of bash extensions. Fixes: the tokenizer now handles\line continuation between tokens, opaque[[ ... ]]test expressions (so regex right-hand sides do not break the surroundingif ... then), process substitution< <(cmd)and> >(cmd), bash array assignmentname=(...)and appendname+=(...), brace-group function bodies after(), and trailing redirects on compound commands (done < <(cmd),fi > out,} 2>&1).
Reliability
- WiFi-Poll Recursion Stack Overflow: When the foreground activation gate cleared while rootshell’s resume quiet window was still active, the deferred WiFi-info poll synchronously re-armed itself, recursing until the main-thread stack overflowed.
- Restoration Flag Flushed Synchronously: A force-quit very shortly after a successful state restoration could leave a stale “restoration in progress” flag on disk, which the next launch would misread as a failure.
- Higher Quarantine Threshold for Saved State: Five consecutive failed restorations now go straight to quarantine, collapsing the prior two-stage skip-then-quarantine policy. Less likely that one bad launch quietly disables saved-state restore.
Version 1.0.5-81
May 7, 2026
Terminal
- Native Scrollbar for tmux Copy Mode: When tmux mouse capture is active rootshell now maps tmux’s copy-mode position into the existing scrollbar model, and drives UIScrollView’s native indicator through the standard scroll-view plumbing, making scrollback position more obvious.
Reliability
- Lifecycle Wedges on iOS Activation: Subscribing complex views to SwiftUI’s
@Environment(\.scenePhase)forces the subtree to re-evaluate on every scene transition, and those re-evaluations could feed back into the lifecycle path and wedge the foreground transition outright. rootshell’s lifecycle plumbing now reads UIKit notifications instead:UIApplication.didBecomeActiveat the App level, andwillResignActive/didEnterBackground/didBecomeActiveinMainViewfeeding a locally-held phase. SwiftUI no longer re-evaluates the root scene graph on every transition. - Renderer Drained Before Background: Each terminal surface now drains its renderer to idle, marks its session not-visible, and clears any cursor registration synchronously during the background transition rather than letting the renderer keep producing frames into the suspend window. Stops a class of resume issues where the GPU side and the lifecycle side disagreed about whether the surface was still active.
- Display Links Fully Invalidated on Background: Shader and cursor CADisplayLinks are now torn down (not just left allocated with
isPaused=true) when a tab goes off-screen or the app backgrounds, and the same cleanup also stops the momentum-scroll animator and pointer-tracking observers. With paused-but-allocated display links left in place, iOS would occasionally try to renegotiate their preferred frame rate while the app was already backgrounded and deadlock the app on the next foreground. Suspected iOS bug; tearing the links down before background sidesteps it. - iOS Local Shell chdir Hangs (Rust, Vim, recursive substitution): The local shell could land in a state where any program that called plain
chdir()blocked forever, including Rust binaries viastd::env::set_current_dir, Vim’s:cd, and shell command substitution that recursed through itself. Root cause was an internal mutex being unlocked from a different thread than the one that took it, which on Darwin is undefined behavior and progressively corrupted the lock; the pseudo-fork lifecycle and the chdir override are now on separate locks with strict same-thread lock/unlock, and the pid allocator briefly takes the chdir lock aroundgetwdso a concurrent chdir during pseudo-fork setup cannot cause a later cleanup to restore the wrong working directory.
Connections
- tssh Call Serialization: All Swift-to-Go calls into the bundled tssh bridge now route through one gate that runs blocking gomobile calls on a
.userInteractiveconcurrent worker queue, with per-transport ordering enforced inside Go. This also protects against priority inversion deadlocks where a low-priority background call could otherwise hold off a high-priority interactive call on the same transport. - SSH Connection Debug Logger: A new debug-mode SSH Connection toggle that, when enabled, captures
ssh -vvclass detail (key exchange, host key fingerprints, auth method negotiation, server banners, channel state, other internals) to a log file for diagnosing connection failures. Off by default. Passwords, private keys, signatures, and shared secrets are never written.
AI Agent
- GPT-5.5 OpenAI Model: OpenAI’s flagship reasoning model with a 1M token context window added to the model list.
Version 1.0.5-80
May 5, 2026
Terminal
- iPad Scrollbar Drag Boost: Dragging the iPadOS native scrollbar thumb or gutter applied the same 2x boost used for finger panning on the terminal body, making thumb drags feel jumpy and overshoot. Scrollbar drags are now detected via the indicator’s hit frame and excluded from the boost, while finger panning still gets the 2x acceleration.
- Output Coalescer Disable Ordering: When the output coalescer was disabled (for example on entering passthrough or at session shutdown) the fast path was opened to direct writes immediately, while bytes still pending in the coalescer’s queue had not yet flushed. In rate conditions new direct writes could land on screen ahead of the older queued bytes, producing visibly reordered output. New writes now keep going through the queue until the disable flush completes.
Customization
- Import from Ghostty Config: Settings → Privacy & Data now has an “Import from Ghostty Config” entry that reads a desktop Ghostty config file (
configorconfig.ghostty) and applies the settings rootshell supports: fonts, theme, cursor, palette, selection, transparency, copy-on-select, and keybindings. Resolvesconfig-file = ...includes up to depth 3, layers per-key color overrides on top of the named theme as a derived custom theme, and flattens keybind entries from all included files. On macOS Standalone the importer also surfaces existing configs at~/Library/Application Support/com.mitchellh.ghosttyand~/.config/ghosttyas one-tap rows above the file picker. - Window Padding Customization: Settings → Appearance → Window now has a Window Padding section with steppers for horizontal and vertical inset, a current-value readout, and a Reset to Defaults button that restores the platform-tuned values (macOS 10/6, iPhone 6/3, iPad/visionOS 8/4). Overrides persist across launches and apply live through the existing config-reload path.
Reliability
- NetworkReachability Publish Storms Quieted: NWPathMonitor delivers bursts of path updates during cellular/Wi-Fi handoff, VPN setup, and captive-portal probing where most metadata is unchanged. The monitor’s six published values were all firing
willChangeon every path event regardless of whether anything actually changed. - Renderer Wedge on Resume (further fixes): Build 79 fixed the display-link mutation race; build 80 closes the remaining edges. CADisplayLink is now invalidated synchronously before the renderer thread’s mach wakeup port is destroyed (prior path could send through a recycled port and trip an EXC_GUARD).
- tssh ClientID Race on Reattach: Closed a race where the local ClientID could fall behind the server’s view if the app was killed between the server recording an incremented ID and the client persisting it. The ID is now written to the Keychain on every change, and only sent to the server once that persist succeeds.
- Session Recovery Loss on Quick Launch-Then-Quit: Routine save/load/quit paths were incorrectly clearing state.
- Network Path Monitors Paused While Backgrounded: NWPathMonitor instances and the local network discovery monitor are now suspended on background and rearmed on foreground.
Connections
- SSH Bootstrap Retry With Backoff: SSH connections (interactive sessions, tssh spawn, and the VPN bootstrap) used to attempt once and surface any transient failure to the user. They now retry connection-establishment failures with bounded backoff and a per-attempt login timeout that ramps from short to long, capped at roughly 5 minutes total. Auth failures, host-key rejections, and tsshd-not-found bail immediately. The VPN path stays cancellable mid-retry, and closing a tab during retry cancels the in-flight bootstrap so no zombie PTYs are left behind.
macOS
- Rapid Resize White Tearing: During fast window resizes the IOSurfaceLayer could commit new bounds while the renderer was still producing old-size frames. The sublayer-frame update and surface size change now run inside a CATransaction with actions disabled so layer bounds and size update atomically.
- Native Scrollbar Flicker: The macOS scrollback view now keeps its native scrollbar visible and interactive without flickering during scroll. Scroll-wheel and trackpad events route back to UIScrollView so its native momentum is preserved, scrollbar gutter drags are detected separately from wheel scrolls, and the indicator style is observed against the active theme so contrast updates with theme changes.
Under the Hood
- tssh synced to latest upstream.
Version 1.0.4-78
May 3, 2026
iOS Local Shell
- Vim Backspace in INSERT Mode: The bundled Vim’s xterm builtin termcap had no entry for the Backspace key, so on iOS where Backspace sends DEL (0x7F, the xterm convention) the byte was matched as forward-delete instead of Backspace. INSERT mode behaved like NORMAL-mode ‘x’ and beeped at end-of-line. Fixed at the termcap level so Backspace, forward-Delete, and the rest of the key bindings all match the keys the keyboard actually sends. Specific to the local on-device vim only.
Connections
- SSH Server Compatability (Settings → SSH → Authentication): A new opt-in toggle switches public-key authentication from a single signed request to OpenSSH/libssh2’s probe-first flow (offer the public key, wait for the server’s accept, then sign). Some routers and embedded SSH servers reject pre-signed offers; with the toggle on, those servers accept the same key. Costs one extra round trip per key. Off by default, enable for maximum compatability.
- Roam Banner Timestamp Stability: On reconnect with a large server-side backlog, the roam banner could flicker through several different “last seen” timestamps before settling. The internal activity cache is now monotonic and only stamped on remote-confirmed events (poll completions and successful attaches), not on local-only activity like typing or resizing.
- Connection Info Sheet on iPhone: Opening Connection Info while the keyboard was up left the keyboard behind the sheet, covering most of it. The terminal now resigns first responder when the sheet appears, matching the other sheets, and the keyboard does not pop back when another sheet on top is dismissed.
Reliability
- Resume Metal Wedge Eliminated: After backgrounding the app and bringing it back, the UI could land in a state where animations advanced one frame per touch (scrolling without inertia, sheet dismissals stepping, occasionally a scene-update watchdog kill). The display-link plumbing was being mutated from the wrong thread, leaving CADisplayLink and the run loop in disagreement. This primarily impacted iPhone users and due to different API use did not impact macOS at all.
Live Activity
- Info Only Filter: A new Live Activity filter mode keeps the activity alive on WiFi or Network info alone, without requiring an open terminal or active VPN. Session and VPN content still appears when present. Eligibility requires at least one of WiFi Info or Network Info to be enabled, and Settings shows an inline hint when both are off.
- Multi-Window Session Counts: With the filter set to All, lock-screen totals could fail to start or show the wrong counts when only tssh sessions were active across multiple windows; closing one window also miscounted the other windows’ roam and local-task content. Per-type counts now aggregate across windows so the activity reflects the full app state.
Version 1.0.4-76
April 29, 2026
Appearance
- Radical of the Unknown Icons Redesigned: Every variant in the Radical collection has a new composition replacing the prior radical-plus-tilde glyph.
- App Icon Preview Artifacts: The icon picker tiles were rendering at default interpolation, which left visible aliasing on the previews. They now use high-quality interpolation, so the in-app previews match more closely what’s actually drawn on the home screen.
- Fireflies Color Mode Picker Label: Changing the Fireflies effect’s color mode now updates the picker row label immediately, instead of staying on the previous selection until you backed out and re-entered the settings screen.
Connections
- Profile Editor Validation Messages: Save would correctly disable for an empty name, blank host, out-of-range port, or jump host without a port, but the messages explaining why never rendered. They now appear inline under the offending field.
- SSH
-AAfor Auto-Approved Agent Forwarding: The local-shellsshcommand now accepts-AAas a shortcut for agent forwarding with auto-approval (no per-session prompt), alongside the existing-Awhich keeps the per-session approval mode. - Shell-Launched SSH Agent Approvals: SSH connections opened from the local shell (e.g.
ssh -A user@host) weren’t wired up to the agent-approval prompt, so a remote command requesting an identity from the forwarded agent would silently stall. The approval handler is now installed on every terminal, including ones spawned from a shell command rather than the connection picker. - tssh Attach Keeps Retrying: A tssh resume used to give up after one 30 s attempt and spawn a fresh SSH session, dropping in-flight server-side state. The client now retries with exponential backoff until you close the tab or 24 h elapses since the last confirmed connection. Particularly useful when you’re temporarily on a network that can’t reach the server (VPN dropped, off-network); the session is waiting when you get back inside the firewall.
Terminal
- Touch Selection Handle Recovery: Backgrounding the app, or dismissing Settings or another sheet on top of a live selection, used to leave the handles invisible even though the selection was still active. They now reappear on the selection when the terminal becomes visible again.
- Per-Font Cell Width and Height: Font settings now exposes adjust-cell-width and adjust-cell-height sliders (±25%), scoped per font family so a tweak made for one font is remembered when you switch back to it. Useful for fonts that feel too tight or too airy at the default metrics.
AI Agent
- Toolbar Menu Pulsing During Streaming: The kebab/overflow menu in the AI Agent overlay was visibly pulsing during streaming responses. The toolbar now only re-renders when something it actually displays changes.
Live Activity
- Recover Orphaned Activities on Launch: Any app termination (force-quit, OS kill, crash) would leave the prior launch’s Live Activity stranded on the lock screen, and relaunching couldn’t replace it until the session count changed. The app now adopts the orphan in place at launch so the widget catches back up to your live sessions immediately.
Version 1.0.4-75
April 26, 2026
Terminal
- Bracketed Paste Hang: Pasting a large block of text into the terminal could leave it silently buffering forever, waiting on a paste end marker that never arrived. A common giveaway was switching to another tab and back: the buffered paste would appear all at once when the tab regained focus, instead of as it arrived. This has been present since early builds of rootshell. The non-blocking response pipe could fill mid-paste and drop the closing
ESC[201~; the writer now waits for the kernel to drain the buffer, so the full paste always reaches the app.
Appearance
- Radical of the Unknown App Icon Collection: Twelve new icon variants themed after popular terminal color schemes (Solarized Dark and Light, Dracula, Nord, Gruvbox Dark, Tokyo Night, Catppuccin, Bases, Mono Light and Dark, Monokai, and Rose Pine) are now available in Settings → Appearance → App Icon, alongside the existing icon set. Picking a Radical of the Unknown variant updates the home-screen icon, the animated About icon, and the Live Activity widget at the same time. Thanks to @arne for designing and contributing this collection, and to @realhackcraft for the previous round of custom icons that shipped in 1.0.4-73.
- Classic App Icon Re-mastered: The formerly default “Classic” app icon has been re-mastered and migrated to an Icon Composer source.
- Change App Icon From Shortcuts: A new “Change App Icon” Shortcuts action lets you switch the rootshell icon from a shortcut, automation, or Focus mode trigger, taking any bundled variant as a parameter.
Connections
- Hide Long-Offline Tailscale Devices: Tailscale’s API returns every authorized device regardless of online state, so machines that had been offline for weeks were cluttering the resource list and Quick Connect suggestions. Synced devices are now filtered to those whose
lastSeenis within the last 30 minutes. - Custom tsshd Binary Path: TSSH connections can now point at a specific tsshd binary on the remote host instead of relying on
tsshdbeing on the user’s PATH. Set the full path under TSSH → Advanced → tsshd Binary in the connection editor; when populated, the path is invoked directly over both regular SSH and the VPN tunnel. Useful for testing alternate builds or for hosts where you can’t drop tsshd into a system path.
iOS Local Shell
- Plain
$VARand${VAR}Now Expand: The previous build only routed$(…),$((…)), and backticks through the shell interpreter, sosetenv TIMESTAMP "$(date)"followed byecho "$TIMESTAMP"at the prompt sent the literal$TIMESTAMPto the command runner. Plain parameter expansion ($NAME,${NAME},$0–$9,$@ $* $# $? $$ $! $-) now takes the same pre-expansion path that scripts already used. Quoted forms like'$VAR'and\$VARstill pass through literal.
macOS
- Window Position Restored Across Launches: macOS now persists the window’s last on-screen origin alongside its size and reapplies the saved frame when the app relaunches, instead of falling back to the system default position. Additional windows still cascade as before, and the saved origin is ignored if it would land mostly off-screen (for example, after a display change).
- Trackpad Scroll Forwarding For tmux: Trackpad two-finger scroll inside tmux on macOS could end up stuck “off” until the next app restart, because the cached mouse-capture state was missing the moment tmux’s mouse-on escape arrived. The trackpad scroll gesture now queries the live capture state on each touch and self-heals the cache when it disagrees, so wheel forwarding tracks tmux’s mouse mode immediately.
Version 1.0.4-74
April 25, 2026
Appearance
- Refreshed App Icon Art: The bundled app icon variants have been redrawn with cleaner layered hash artwork and more of a glass look.
- Apple Watch Live Activity Icon: The watchOS Smart Stack mirror of the Live Activity widget no longer shows a gray placeholder box where the app icon should be. The widget now opts into the watchOS
.smallactivity family so the system renders the bundled preview imageset instead of trying (and failing) to resolve the main app’s Icon Composer stack from watchOS.
AI Agent
- AWS Bedrock Provider: The AI Agent can now route Claude requests through Amazon Bedrock in your own AWS account instead of going to Anthropic directly. Authentication reuses the existing Cloud account flow (Access Keys or SSO/STS, with auto-refresh per request), the same four Claude models are exposed, and the endpoint is region-scoped and SigV4-signed. This also fixed a latent double-encoding bug in the shared SigV4 signer that EC2 and EKS never tripped because their paths don’t contain reserved characters; Bedrock’s colon-bearing model IDs surfaced it on the first call.
Local Shell
- Command Substitution and Arithmetic Expansion: Commands like
setenv TIMESTAMP "$(date)"now expand$(…),$((…)), and backtick command substitutions before dispatch instead of being passed through literally.
Connections
- SSH Transport Settings Subpage: Connection health monitoring, the probe interval, and the post-quantum key-exchange warning toggle have moved out of the Connections list and into a dedicated SSH Transport settings page under Connections. The post-quantum warning, which previously could only be toggled via
defaults, now has a proper UI control. - SSH Remote Exec PATH Prepend Is Now Opt-In: Local-shell-launched SSH sessions (e.g.
ssh user@host some-command) used to silently prepend a Homebrew/Linuxbrew/Go-friendlyPATH=…to your remote command so non-interactive exec could find common tools without shell startup files. That broke commands that wanted their own environment intact. The prepend is now opt-in via a new--pathflag on the local-shellsshcommand; without it, your remote command goes over the wire verbatim.
Terminal
- Scroll Gesture Conflicts (Speculative Fix for #152): Tightened the gesture recognizers around vertical scroll vs. the horizontal swipe that switches splits, in an attempt to address issue #152. This is a speculative fix; if you can still reproduce the issue, please follow up on the issue with steps.
Version 1.0.4-73
April 22, 2026
Appearance
- Customizable App Icon: The app now ships with eight icons you can switch between from Settings → Appearance → App Icon. Picking a variant updates the home-screen icon, the animated About icon, and the Live Activity widget at the same time.
Connections
- OpenSSH-Style Escape Sequences (
~.and friends): SSH, mosh, and tssh sessions now implement OpenSSH’s~escape state machine. At the start of a line you can press~.to disconnect,~?for the help screen,~#to list active forwards with live status,~Ifor connection info, and~~to send a literal tilde. Escape detection is suspended inside bracketed-paste markers so pasted content with a leading~.can’t drop your session, and~.on a session launched from the local shell returns you to the shell prompt promptly without waiting on async PTY teardown. - Non-Post-Quantum Key Exchange Warning: When an SSH connection negotiates a key exchange that isn’t a post-quantum KEM, the session now prints a yellow OpenSSH 9.9-style banner after the welcome line warning that the session could be recorded today and decrypted later by an attacker who eventually acquires a sufficiently capable quantum computer. The Connection Info “Post-Quantum Secure” badge was also split into separate key-exchange and host-key signals so its readout matches the new warning.
AI Agent
- Agent Re-anchors When Shell Context Changes: Opening the AI Agent on a tab where you’d SSHed from the local shell, then exited back to the shell, used to keep executing tool calls against the previous context (still over SSH on the remote host, or still on the local shell) because the per-tab session was cached for the lifetime of the tab. The session is now invalidated and re-created when the connection type underneath it changes, and is pinned to the split that spawned it so a sibling split’s SSH enter/exit can’t tear it down.
Version 1.0.3-72
April 20, 2026
AI Agent
- Claude Opus 4.7 in the Model Picker: Anthropic’s Opus 4.7 is now selectable from the AI Agent model picker.
- Stable Toolbar Menus During Streaming: The AI Agent model picker and overflow (“…”) menu no longer flicker while a reply is streaming. The toolbar is now split into small equatable subviews that SwiftUI skips re-evaluating on every ~100 ms streaming tick, so the menus stay steady even through long responses.
Connections
- Active Directory Usernames (user@domain) Across the Board: SSH usernames containing an
@, most commonly Active-Directory-style logins likeuser@domainconnecting to hosts such assomehost.local, now work everywhere. Previouslyuser@hostwas being split on the first@instead of the last, which silently truncated the username and mangled the host. Fixed sites include ssh / mosh / tssh / scp / sftp / ssh-copy-id command parsing, SSH and Mosh URL fallbacks, HSS ProxyCommand jump hosts, the AI agent’sssh_executeMCP tool, SCP tab completion, Quick Connect (including itsviajump-host syntax), and git SSH/SCP-style transport URLs. The git transport additionally isolates the authority from the path so a stray@inside a repo path (e.g./org/repo@mirror.git) can’t be mistaken for the user/host boundary.
Keyboard
- Cmd/Opt+Arrow Text-Editing Defaults: On any attached hardware keyboard (iPad, macOS, or otherwise), Cmd+Left/Right now sends Ctrl-A / Ctrl-E (line start/end) and plain Opt+Left/Right sends ESC+b / ESC+f (word jump), matching the Darwin defaults in upstream Ghostty. Previously Cmd+Left/Right sent the word-jump escapes and Opt+Left/Right had no dedicated path, so muscle memory carried over from desktop Ghostty didn’t translate.
Bug Fixes
- Background-Autosave Crash: The periodic save of window/tab state no longer stalls or crashes when the app is sent to the background. Persistence now runs off the main thread inside a background task, so the OS can’t kill the app for taking too long to suspend.
- Quieter Ping on Flaky Networks: Ping no longer prints a “network path changed” line every time it resets its ICMP socket in response to an
NWPathMonitorupdate. iOS emits those updates frequently (DNS churn,isExpensiveflips, probe state) even on an otherwise-stable network, so the user-visible line was firing repeatedly during long pings.
Version 1.0.2-71
April 19, 2026
Terminal
- iTerm2 Inline Images (imgcat): The terminal core now implements the iTerm2 OSC 1337 File protocol, so
imgcatactually draws images instead of printing escape-sequence noise. Both the default chunked mode and the legacy-lsingle-sequence mode are supported. PNGs pass straight through to the existing Kitty graphics decoder; JPEGs are decoded to RGBA and submitted as a raw image, so the renderer, storage, placement, and cursor-movement logic are all reused unchanged.widthandheightarguments in cells, pixels, or percent are translated to Kitty column/row sizes, andpreserveAspectRatio=1picks the constraining axis from the image’s real pixel dimensions. Non-image OSC 1337 sequences (Custom, SetBadgeFormat, etc.) still use the small fixed buffer, and image transfers are capped at 400 MB so a malformed stream can’t run the process out of memory.inline=0download-mode transfers are dropped without buffering.
Fullscreen
- iPadOS 26 Window Control Auto-Hide in In-App Fullscreen: When rootshell’s in-app fullscreen mode is enabled and the tab bar is hidden, the iPadOS 26 traffic-light window controls now auto-hide along with the status bar, even though the underlying app window isn’t in OS-level window fullscreen. Previously iPadOS 26’s new persistent window controls stayed pinned on top of the terminal in this mode, leaving a visible chrome strip that the app’s fullscreen toggle couldn’t clear.
AI Agent
- Agent Availability from Shell-Launched Sessions: Opening the AI Agent on an SSH/mosh/tssh session that was launched from the local shell (for example, via
ssh user@hostat the iOS shell prompt) showed “SSH Connection Required” and refused to attach, and the voice agent lost its SSH context in the same path. The toggles now unwrap the underlying connection so these shell-launched sessions reuse the existing SSH/mosh/tssh branches and get the full agent experience.
Bug Fixes
- Voice Agent Crash When Echo Cancellation Unavailable: Starting the voice agent on an audio session or route that couldn’t support echo cancellation crashed the app. The voice agent now catches that failure cleanly and shows a readable error instead of crashing.
Version 1.0.2-70
April 18, 2026
Background Effects
- Theme Tint for Photo and Video Backgrounds: A new GPU-accelerated tint option recolors background media toward the active theme’s palette, so photo and video backgrounds blend with whichever theme you’re using instead of clashing with it. Each source color is pulled toward the nearest theme colors using a Gaussian-weighted blend across the theme’s background, foreground, and 16 ANSI colors, where closer matches get more pull and distant matches fade out. The whole mapping is baked into a 32³ color lookup table once per theme and applied on the GPU in real time. An adjustable strength slider controls how far colors are pulled, so you can go from a subtle wash all the way to a fully themed reinterpretation of the image. The tint is off by default and videos only pay the extra cost when it’s turned on.
AI Agent
- Context Window Usage Indicator: The AI Agent input now shows how much of the active model’s usable input budget the last turn consumed, so you can see when you’re getting close to truncation. The reading clears when you switch models, cancel, or a turn fails, so you never see a previous model’s usage attributed to the new one.
- Live Credential Updates: Edits to API keys or custom provider settings now apply to any AI Agent session you already have open. Previously you had to quit and relaunch the app before the new credentials or endpoint were picked up. In-flight responses keep using the credentials they started with, so an ongoing reply is never interrupted by a save.
- Context Window for Custom Models: You can now set a context window size on individual models added to custom providers (OpenAI Responses, OpenAI Chat Completions, and Anthropic Messages formats, including self-hosted backends like Ollama, LM Studio, and vLLM), which lights up the token usage indicator for those models. Tap a model row in the provider settings to edit it.
Connections
- Faster SSH Connect for Nearby Profiles: While you browse the profiles sheet, DNS for the profile under the cursor and the ones around it is pre-resolved in the background, so when you actually pick one the connection isn’t held up waiting on name resolution.
- Snappier SSH Echo and Throughput: Standard TCP-based SSH connections (not Mosh or tssh, which have their own transports) now stream output off the main thread, so heavy UI work (scrolling, animations, sheet dismissals) no longer briefly stalls terminal echo or delivery of output from the remote end. Those connections also use an adaptive receive buffer that grows on bursty output and shrinks when idle, so large pastes, log tails, and scrollback replays finish in fewer syscalls without adding cost to a quiet session.
Keyboard Shortcuts
- Multi-Key Sequence Bindings: Two-key shortcuts recorded in the shortcut editor (for example Ctrl+A→N) now actually fire. Previously they saved but did nothing. The capture view also lays out cleanly when recording the second key, and sequence prefixes no longer get shadowed by unrelated single-key bindings.
Bug Fixes
- Crash When Recording Shortcuts Back-to-Back: Recording a second shortcut immediately after dismissing the editor could crash the app. The editor now defers its changes until the sheet has fully closed, and a duplicate-press guard keeps a single keypress from being counted twice when recording a sequence.
- Copy Pasting HTML Markup as Plain Text: Copying certain selections (especially whitespace-only or selections that collapsed to nothing after codepoint mapping) could store HTML like
<div>…</div>under the plain-text clipboard slot, so a later paste echoed the markup literally. Plain text and HTML are now published as separate representations on the clipboard so they can’t cross-contaminate. - Gemini API Keys With New Prefix: Google AI Studio recently started issuing keys with an “AQ.” prefix, which the key validator rejected outright because it only recognized the old “AIza” prefix. Both known prefixes are now accepted, and any other format shows a non-blocking warning rather than blocking the save, so you can still try keys from future issuance formats.
Version 1.0.2-69
April 16, 2026
Background Effects
- Local Video Backgrounds: A new “My Videos” section in Background Effect settings lets you import movies from your library and use them as terminal backgrounds. Imported files are copied into the app sandbox, probed for duration, thumbnailed, and fed into the same playback pipeline as the bundled remote catalog. Imports work from both the Files picker and the Photos library.
iOS Local Shell
- Cooked-Mode Stdin for Filters: The local shell gives every command a raw pipe for stdin instead of a TTY, so running
batwith no file argument blocked invisibly — keystrokes vanished into a silent type-ahead buffer and Ctrl-D closed the pipe before any bytes were delivered. Known stdin-consuming filters (bat, cat, grep, awk, sed, tr, sort, uniq, wc, head, tail, tee, and friends) now run through a software cooked-mode loop when invoked without a file positional or shell pipe/redirect: typed bytes are echoed locally, buffered per line, and committed on Enter; Ctrl-D flushes and closes for EOF; Backspace pops whole UTF-8 scalars so multibyte input like é or emoji can’t be corrupted.
Bug Fixes
- Bracketed Paste Corruption on Remote Shells: The terminal core writes a paste to the response pipe as up to three separate writes (start marker, content, end marker). When the reader drained the pipe between writes, each chunk dispatched as its own SSH packet, letting the start marker race the content and leak as literal
^[[200~text at a bash prompt. Chunks are now coalesced so one paste maps to one send. - macOS Paste Losing Full Path for Finder Files: Copying a file in Finder (Cmd+C) and pasting into the terminal inserted only the short filename instead of the full escaped path. Finder puts both a plain-text filename and a
public.file-urlon the pasteboard, and the recent HTML/RTF fix was checking plain text first so the filename always won. URL branches are now checked ahead of plain text, with the strict plain-text branch kept as the fallback. - macOS Paste Surfacing HTML Markup:
UIPasteboard.general.stringbridges to NSPasteboard on macOS, which can return HTML/RTF bytes when the source app registers only rich types (Notes, Mail, some browsers), causing the terminal to faithfully type<div>…</div>markup into the shell. Plain text is now read by explicit UTI (utf8-plain-text, utf16 variants, public.plain-text), and the paste menu only lights up when plain text is actually available. - Ping UI Deadlock After Network Transition: PingCommand ran on the main actor with a blocking ICMP socket, so a
sendto()on a dead route after a network change parked the main thread and froze the whole app — Ctrl-C included. The socket is now non-blocking, recreated on POLLHUP/POLLERR and fatal sendto errors, and proactively reset on path-change events from NetworkReachabilityMonitor. - Swipe-to-Delete for Custom Provider Models:
listRowBackgroundapplied beforeswipeActionswas clipping the gesture, and duplicate ids from manual models that shadowed discovered ones broke ForEach row identity. Manual models now dedup over discovered entries andswipeActionsis applied beforethemedRowso the delete gesture works again.
Version 1.0.2-68
April 13, 2026
Security
- Vim Modeline RCE (GHSA-2gmj-rpqf-pxvh): Backported upstream Vim patch 9.2.0272, which fixes a two-stage exploit where a crafted modeline could escape the sandbox and execute arbitrary shell commands. The
tabpaneloption was missing the P_MLE flag, allowing modeline injection of%{...}expressions even withmodelineexprdisabled; those expressions could then callautocmd_add()(which lacked acheck_secure()guard) to register autocommands that fire outside the sandbox. Opening a malicious file was enough to trigger code execution. Both gaps are now closed. Impact on rootshell was muted vs other platforms as we don’t fully support launching shell commands from vim but the exploit was reaching parts of the iOS local shell code path. - SSH Encrypted Packet Length Overflow: Fixed an integer overflow in encrypted packet length parsing that allowed a remote peer to crash the connection before MAC verification.
Background Execution
- Tunnels in Location Diary: Port forwards and SSH tunnels now participate in the Location Diary system, so auto-mode users keep tunnels alive when the app is suspended.
- Background Awareness Prompts: A one-time alert appears when adding a port forward on iOS, explaining app suspension behavior and offering to enable Auto Location. Contextual footer warnings appear in port forward configuration views when Location Diary is not configured.
iOS Local Shell
- Welcome Banner: The plain welcome text is replaced with a width-adaptive TUI banner that picks an accent bar or stacked minimal layout based on terminal width, and uses the current prompt theme’s signature color for truecolor accents.
Bug Fixes
- setenv/getenv Race (Crash Fix): Fixed a crash where a background thread faulted inside getenv.
- Pipeline Hang After Semicolons: Commands combining semicolons with pipelines (e.g.
ls; cat file | grep foo) could hang.
Version 1.0.2-66
April 10, 2026
Gestures
- Customizable Terminal Swipes: Left/right horizontal swipes on the terminal can now be bound from Settings → Terminal → Gestures to presets (next/prev tab, tmux next/prev window and session, zellij next/prev tab) or to inline custom key sequences using the same SequenceStep model as the keyboard toolbar. On macOS the existing trackpad horizontal pan is routed through the same binding manager. Reminder: the keyboard toolbar already supports custom buttons that can be configured for tmux/zellij navigation if you'd rather tap than swipe.
- Auto-Discovered Multiplexer Bindings: For remote connections with session discovery enabled, the tmux and zellij swipe presets follow each host's actual keymap instead of assuming the built-in defaults — discovery now reads the multiplexer's bindings during the same SSH exec channel and uses them when sending the navigation keys.
- Swipes Inside Mouse-Captured Terminals (Bug Fix): Swipes were dead inside a mouse-captured terminal because the runtime guards and gesture-delegate filters blocked them whenever capture was active. Removed those filters so tmux/vim users in scroll mode can drive the new swipe presets even with mouse reporting on.
Multiplexer Session Discovery
- Local Discovery on macOS: Tmux and zellij session discovery now runs through the standalone helper for local shells, so the session picker (and the new swipe presets) works on macOS without needing an SSH connection.
Keybind Config Workflow
- Editable Config: The keybind config can now be edited and reloaded directly from Settings and the iOS local shell (via the new
reloadconfigcommand). Symlink-based dotfile setups are preserved across edits, and reloads are applied safely to live terminal surfaces.
iOS Local Shell
- reset Command: The terminal reset action is now available as a
resetcommand in the iOS local shell, with help text and tab completion, so it can be triggered without the context menu. - croc Zip Filters:
croc sendfrom the local shell now honors--excludefilters when zipping a directory, matching the behavior of non-zip sends.
VPN
- Control Center Start After Takeover (Bug Fix): Starting the rootshell VPN from Control Center failed after another provider had held the system VPN slot, with the extension throwing configNotFound until the app was opened to re-bless the manager.
Bug Fixes
- Reconnect Sidebar Interaction Race (macOS): When an auth failure reopened the connection sidebar before the previous dismiss animation finished, the reopened panel could appear visually but reject interaction. The dismiss completion now skips disabling interaction if the sidebar has already been re-presented.
- Unreadable SSH Key Type Badges: Key type badges in Known Hosts, SSH Keys, and Default Keys Order now use a tinted style (colored text on a faint same-color background) so they read cleanly in both light and dark mode instead of white-on-color. Also fixed a Known Hosts matching bug where ed25519 hosts fell through to the default badge color because keys are stored in raw OpenSSH format (
ssh-ed25519). - Session Attach Shell Escaping: Both the inner session argument and the outer
sh -cpayload used to attach to tmux and zellij sessions are now properly escaped, so crafted session names cannot trigger shell expansion or break parsing during attach.
Version 1.0.2-65
April 6, 2026
Keyboard
- Stuck Command Modifier (Regression Fix): Build 64 introduced a hardware-modifier fallback to recover the Command bit on iPad system-reserved shortcuts like Cmd+. On macOS that fallback could latch after system shortcuts such as Cmd+H, causing the next keystroke to be incorrectly Cmd-modified, and the same class of issue could surface on iPad after app-switching shortcuts swallowed modifier key-up events.
Version 1.0.2-64
April 6, 2026
Helix Editor
- Upstream Update: Updated to latest upstream helix. Improved syntax highlighting for Go, Rust, C/C++, Common Lisp, Erlang, Kotlin, Python, and many other languages. New language support: ebnf, embedded-perl, proverif, ptx, styx, tql. New themes: hazyland, vesper-transparent.
- Workspace Trust: Upstream helix added a prompt before loading workspace-specific configuration from untrusted directories. If you open a project and helix shows a trust prompt, this is new upstream behavior — approve it to allow the workspace config to take effect. Trusted workspaces are remembered.
Keyboard
- Persistent Toolbar: New setting (off by default, iOS only) keeps the customizable toolbar with arrow keys and modifiers visible at the bottom of the screen after dismissing the on-screen keyboard. The dismiss button becomes a chevron-up to toggle the keyboard back, and tapping the terminal also restores it.
- Config Import Durability: Imported ghostty keybind configs are now copied locally to prevent iOS from revoking access to external locations (e.g., Downloads) over time. Existing imports are migrated automatically.
- Reserved Modifier Fallback: iOS strips the Command modifier from some keystrokes it reserves system-wide (notably Cmd+. as the iPad cancel shortcut), which caused imported
text:/esc:/csi:keybinds likecmd+shift+period=text:\x1B>to silently miss.
Multiplexer (tmux/zellij) Session Discovery
- Sort Order: Session list sort order is now configurable in Multiplexer preferences. Default changed from detached-first to attached-first. Sorting logic consolidated from individual tmux/zellij parsers into the shared merge step.
tssh
- Upstream Update: Update from upstream with fixes for potential reconnection stalls and updated KCP library.
croc File Transfer
- Reliability: Improved reliability of key exchange, encryption, file integrity checks, and path handling. Transfers are now parallelized across data ports for better throughput.
- Relay Startup Output:
croc relaynow prints timestamped status lines and a ready indicator on startup. Clean shutdown on Ctrl-C. - Exclude Option: Fixed
--excludeoption not working for send (single files skipped pattern check, broken relative paths in directory walks, multiple flags overwriting instead of appending). - Local Relay Cleanup: Fixed local relay not being cleaned up after transfer completes.
- iOS Send Path: Fixed send directory path resolution on iOS.
libgit2
- Upstream Update: Updated to latest upstream libgit2. Includes a fix for undefined behavior in fsync and support for
@as shorthand forHEADin rev parsing.
Bug Fixes
- ESC Mod-Tap Overlay Dismiss: Fixed ESC not dismissing the session discovery overlay when ESC is configured as a mod-tap key (e.g., Caps Lock → Escape on tap, Control on hold).
Version 1.0.2-63
April 4, 2026
croc File Transfer
- croc: Native Swift port of croc (github.com/schollz/croc), the simple secure file transfer tool. Send and receive files between any devices on the same network or across the internet using relay servers. Interoperable with the original Go croc client — transfer files to/from your Mac, Linux box, or any other device running croc. This also makes it possible to send files between rootshell instances — for example, iPhone to iPad — even when not on the same network. Implements the complete wire protocol including PAKE (SPAKE2) key exchange, AES-256-GCM encryption, DEFLATE compression, multiplexed transfer channels, and chunk-level resume for interrupted transfers.
- Local Relay: Run a local relay server with
croc relayfor LAN transfers without hitting the public relay. Note: UDP multicast peer discovery is not available due to App Store restrictions, so local relay addresses must be specified explicitly. This is the main difference from croc on other platforms. - rf Integration: Select files in the rf file browser and press
Cto send them via croc. Shows a confirmation prompt, runs the transfer with full progress display, and returns to rf when done. - Truecolor Output: Transfer progress, code display, and status messages use truecolor terminal styling, sharing the same TerminalStyle engine as git output.
Multiplexer Session Discovery
- Zellij Support: Session discovery after SSH connection now detects zellij sessions alongside tmux. Both are discovered with a single SSH exec channel. The picker overlay shows type badges and adjusts its title based on what’s found — “tmux Sessions”, “zellij Sessions”, or “Terminal Sessions” when both are present.
- Zellij Screen Dumps: Session previews use the
--ansiflag for inline capture on zellij ≥ 0.44.0. Session listing works on any zellij version.
Keyboard
- Keybinding Status: External config bindings now correctly show “Config File” instead of “Custom” in the keyboard shortcuts settings.
- Unbind Fix: Unbinding one action no longer clobbers previous unbinds. Unbound actions show a red “Unbound” badge distinct from the gray “Displaced” badge, with “Restore Default” available in the editor.
- Config keybind=clear: The
keybind=cleardirective in external config files now correctly suppresses all default bindings.
visionOS
- Tab Close Button: Fixed the close button overlapping the tab title on visionOS by switching from ZStack to HStack layout. Minimum tab width increased to 180pt for visionOS metrics.
- Toolbar Joystick: Replaced the arrow joystick button (which used raw touch handling incompatible with gaze input) with a standard tappable button on visionOS that toggles the arrow drawer via gaze+pinch.
Bug Fixes
- ESC Overlay Dismiss: Fixed ESC not dismissing the session picker overlay on iPad. The ESC UIKeyCommand was intercepting the key before it reached the overlay dismiss handler.
Version 1.0.2-62
April 2, 2026
Keyboard
- Desktop Ghostty Config Compatibility: Keybind configs from desktop Ghostty that use
text:,esc:, andcsi:actions now work. You can load configs that remap Cmd as Meta (e.g.,keybind = cmd+a=text:\x1Ba). Supports\x##hex,\eESC, and standard C escape sequences. - Custom Binding Priority: Custom keybindings now take priority over the hardcoded Cmd+Arrow and Cmd+Backspace handlers, so imported desktop configs override built-in shortcuts as expected.
- Unbind Shortcut: Added an “Unbind Shortcut” button in the keybind editor to clear a binding without deleting it.
- Displaced Actions Visible: Actions whose default shortcut was taken by an external config binding (e.g., Browse Hosts when Cmd+B sends
text:\x1Bb) now appear in Settings with “No Shortcut” instead of vanishing. You can record a new shortcut for any displaced action. - Config Bookmark Persistence: External keybind config files now persist across relaunches on iOS. Previously bookmarks were only saved on macOS, so the config was lost after relaunch on iPad/iPhone.
AI Agent
- Custom Provider URL Fix: Fixed custom AI provider base URLs with path components (e.g.,
https://host.azure.com/openai) having their path stripped, causing requests to go to the wrong endpoint. - Custom Provider Theming: Custom provider settings sheets now follow the app theme.
Settings
- Acknowledgements: Fixed the search bar chrome showing on the acknowledgements screen.
Terminal
- Narrow Screen Spinners: Spinner and progress animations no longer cause scroll jitter on iPhone-width terminals. Each content line now disables auto-wrap (DECAWM) so cursor repositioning stays correct when text would exceed the screen width.
tssh
- Foreground Keepalive Removed: Removed the immediate keepalive sent when the app returns to the foreground. The normal keepalive cycle handles session resumption.
VPN Tunnel
- Auto MTU: The TUN device MTU is now auto-calculated from the TSSH transport’s maximum datagram size instead of being hardcoded to 1500. This prevents UDP datagram fragmentation when the transport can only carry smaller payloads (e.g., KCP, QUIC). The VPN stats grid now shows both TSSH MTU and TUN MTU.
Version 1.0.2-61
March 30, 2026
Terminal Engine
- IPv6 Word Selection: Double-clicking an IPv6 address now selects the entire address. Handles full, compressed (::), loopback (::1), and IPv4-mapped forms.
iOS Local Shell
- AI Commit Messages: Running
git commitcan now auto-generate a commit message from the staged diff using your configured AI provider. The LLM can use read_file and list_files tools to explore the repo for context. Shows a preview with Commit/Edit/Abort prompt before finalizing. Off by default — enable in AI Agent settings under Git Integration. - imgtext: New command for OCR text extraction from images using Apple Vision framework. Supports piping, redirection, multiple files, and glob expansion.
- mtr: Fixed a race condition where exiting mtr (q or Ctrl-C) could swallow the shell prompt.
visionOS
- Keyboard Toolbar: Added the on-screen keyboard toolbar (Tab, arrows, Ctrl, Esc, modifiers, symbols) to visionOS as a native window ornament attached to the bottom of the terminal window. A floating toggle button shows/hides the toolbar. Buttons support visionOS gaze hover feedback. The toolbar is visible by default on launch.
- Tab Bar: Increased tab and bar height for easier eye-tracking selection. Tabs now have visible backgrounds and hover highlight effects so they can be targeted by gaze, not just the close button.
- Clipboard: Fixed paste from external apps and OSC 52 clipboard writes being silently ignored on visionOS.
- Sidebar Panels: Connection and settings sidebars now use native visionOS sheet presentation instead of custom overlays. Gray corner artifacts on rounded panels are also fixed.
- Profiles Search: Fixed keyboard input not reaching the profiles search box on visionOS.
Voice AI Agent
- Settings: Voice agent settings are now accessible from the AI Assistant section in Settings.
- Paste Handling: Paste commands now route through paste action instead of writing raw text, fixing encoding and large-paste issues.
- Tool Output Review: Approval cards and tool results are now inspectable in full from the expanded voice view. Oversized tool output (e.g. long SSH results) spills to disk so the transcript stays reviewable without growing memory unbounded.
- End Session Button: Fixed the end session button appearing washed out on visionOS.
- Voice Selection: Expanded voice picker to the full 30-voice Gemini catalog with descriptions.
- Alternate Screen: The get_scrollback tool now auto-detects TUI apps (vim, htop, less) and returns the alternate screen viewport instead of stale primary screen data.
- Scrollback Escaping: Control characters in terminal dumps are now escaped so they don’t cause the Gemini Live API to reject tool responses and reset the session.
- TUI Interaction: Fixed Ctrl-C, Escape, and other control characters not working when sent by the voice agent. Keystrokes now route through raw bytes matching how the real keyboard sends input. Added support for page up/down, F1-F12, Alt+letter, Shift+Tab, and Ctrl+[ keys.
Tab Bar
- Auto-Scroll: Fixed the scrolling tab bar on iPhone and narrow layouts not keeping the active tab visible.
Themes
- Theme Picker: The theme picker overlay now defaults to Global scope instead of Tab.
Session Recovery
- Window Title: Fixed window titles not restoring in the Dock after session recovery.
Keyboard
- Ctrl+Backtick: Added missing Ctrl+` mapping, which sends NUL (0x00) matching xterm/VT tradition.
trzsz-tssh
- Reconnect Fix: Pulled in upstream fix for a race condition where an async timeout flag could trigger an unnecessary reconnection loop right after a new transport path was established.
VPN Tunnel
- Debug Logging: The VPN tunnel extension now captures full tssh and tsshd debug output, matching how regular SSH sessions log diagnostics.
Version 1.0.2-60
March 28, 2026
Voice AI Agent
- Voice Agent: Talk to your terminal using Google’s new Gemini Flash 3.1 Live model, released March 26. Bring your own Google API key — enter it in Settings > AI Agent to get started. The AI Studio free tier currently has generous limits for Flash 3.1 Live, though that may change. The agent connects to the Gemini Multimodal Live API over WebSocket for real-time bidirectional voice conversation with sub-second latency. It can read your terminal scrollback, type keystrokes, paste text, and execute commands over a background SSH connection — all hands-free. A consult_expert tool delegates complex questions to Gemini 3.1 Pro for deeper reasoning when Flash needs help. Optional web search and web fetch tools let the agent look things up on your behalf. A floating bubble overlay shows live status during the conversation — tap it to expand into a full-screen voice mode with the complete transcript and tool approval cards.
- Tool Approval System: Three approval modes control what the agent can do without asking — ask for all commands, auto-approve reads only, or full auto-approve. Every tool call is classified by risk level (low/medium/high/critical) with color-coded approval cards showing the command for review. Destructive operations like rm and sudo are always flagged unless you explicitly opt into auto-approve mode.
- Menus: Voice Agent is available from the macOS Shell menu, the right-click context menu, the iPadOS/macOS 26+ Commands menu via Cmd+Shift+V, and as a new button in the customizable on-screen keyboard toolbar.
Helix Editor
- Git Diff Gutter: The iOS local shell built-in helix editor now shows added/modified/deleted line markers in the gutter when editing files inside a git repository.
Keyboard
- Alt/Option: Alt+key, Alt+Shift+key, and Alt+Arrow now produce correct escape sequences. Previously Alt+Shift+letter dropped the Shift, and Alt+Arrow produced broken double-escape sequences.
- Ctrl+Shift Encoding: Ctrl+Shift+key now correctly encodes as a distinct modifier in CSI u mode. Previously Ctrl+A and Ctrl+Shift+A produced identical output because the Shift was ignored.
- macOS Keyboard Layouts: Option+key on macOS now uses UCKeyTranslate to produce layout-correct characters on non-US keyboards. Previously all Option combos assumed US layout.
- macOS Modifier Repeat: Fixed modifier key chords (Option-as-Alt, Ctrl+Shift) dropping held or released input on macOS.
trzsz-tssh
- Debug Log Labels: Each trzsz session now includes a monotonic label (e.g. “S1 user@host”) in debug logs, making it easy to distinguish interleaved output from multiple tabs or splits.
Bug Fixes
- Theme Hex Colors: Fixed an off-by-one error when saving custom theme hex color values.
- Background Opacity: Fixed terminal theme background opacity not applying correctly on iPhone and iPad.
Version 1.0.2-59
March 27, 2026
Terminal Engine
- Modified Return Key Handling: Shift+Return, Ctrl+Return, Ctrl+Shift+Return, and all other modifier+Return combinations now correctly route through the terminal engine’s key encoding pipeline. Works with both hardware keyboards and the virtual keyboard toolbar modifier keys.
- Cursor Blink Mode Fix: Fixed animated cursor blink mode (breathing, heartbeat, etc.) persisting in the config even after disabling cursor blinking. The blink mode setting is now only written when blinking is enabled.
- Forward Delete Key Fix: Fixed the forward delete key on iPad hardware keyboards being misidentified as backspace. Now correctly sends the Delete escape sequence.
iPad
- App Switcher & Dock Titles: Each iPad window now shows the active tab’s session name (e.g. user@host) in the App Switcher and Dock, instead of a generic app name. Previously this only worked on macOS.
iOS Local Shell
- Ctrl-Y Yank: The local shell line editor now supports Ctrl-Y to yank back text killed with Ctrl-K or Ctrl-U, matching standard readline/Emacs behavior.
IP Geolocation
- whatismyip IP Lookup: The whatismyip, whatismyip4, and whatismyip6 commands now accept an optional IP address argument to look up ASN and geo info for any address, skipping STUN discovery. Validates the argument as IPv4 or IPv6 before lookup.
SSH
- sntrup761x25519-sha512 Key Exchange: Added the sntrup761 post-quantum hybrid key exchange algorithm alongside the existing ML-KEM 768 support. sntrup761 is the algorithm OpenSSH has used by default since version 9.0, so this brings post-quantum negotiation to a much wider set of servers. Unlike ML-KEM which requires iOS/macOS 26, sntrup761 works on all supported OS versions, extending post-quantum protection to older devices.
trzsz-tssh
- Upstream Rebase: Rebased against latest upstream trzsz-ssh and tsshd, picking up improved rekey crypto, better keepalive diagnostics, and per-session input discard. The upstream rekey fix eliminated the need for the SuppressRekey/ResumeRekey workaround that paused the rekey timer during iOS app backgrounding.
Version 1.0.2-57
March 25, 2026
Terminal Engine
- Cross-Row URL Detection: URLs that span multiple terminal rows are now correctly detected, highlighted, and clickable even when rows are not soft-wrapped. Especially useful for long login/auth URLs such as those generated by Claude Code and Codex authentication flows. A new cross-row extension pass detects logical pane boundaries (e.g. box-drawing vertical separators in tmux split panes) and concatenates text only within the correct column range before re-running URL matching. Works both in tmux panes and the regular terminal.
- Cursor Blink Styles: New Blink Style picker in Settings > Cursor > Animation with 7 animated modes: normal, breathing, heartbeat, neon flicker, pulse, candle, and rootshell. Persists across sessions.
- Harmonious Palette Generation: New toggles in Settings > Appearance > Colors to enable palette-generate and palette-harmonious modes. Includes a live inline preview using CIELAB trilinear interpolation algorithm, showing the 216-color cube and 24-step grayscale ramp updating in real time as settings change.
- Mouse Click Selection: Fixed mouse/trackpad single-click incorrectly triggering word selection on iPad. Single-click now positions the cursor, double-click selects a word, and triple-click selects a line, matching macOS Ghostty click counting. Touch input is unchanged — double-tap still opens the context menu.
- Copy on Select: Text selections are now automatically copied to the clipboard on all platforms (iOS, iPadOS, macOS, visionOS). Configurable via a toggle in Settings > Window > Text Selection, defaults to on.
- Window Titles: On macOS, each window now shows its session name (e.g. user@host) in the dock menu and Mission Control instead of a generic title.
IP Geolocation
- Local MMDB Databases: Import MaxMind DB files (.mmdb) for fully offline IP geolocation. A new “Local MMDB” provider option performs all lookups on-device with no network requests. Import multiple ASN and country databases and the resolver merges fields across them. Manage databases in Settings with drag-to-reorder priority, swipe-to-delete, and a file importer that validates MMDB structure on import.
iOS Local Shell
- Dynamic bat Syntax Theme: bat syntax highlighting in the local shell and rf file previews now uses the terminal’s actual RGB palette colors instead of generic ANSI indices. Colors are pushed at session startup and on theme change, producing truecolor output that matches any theme including custom ones.
rf File Browser
- SFTP Responsiveness: Remote SFTP operations (directory listing, file preview, transfers) no longer block the rf UI. Navigation, filtering, and local tab interaction remain responsive while SFTP work runs in the background.
- Status Bar Rendering: Fixed status messages like “Loading directory…” and chord prompts like “copy: (c)path…” rendering with spurious trailing colons. The status bar now uses separate rendering paths for text input (with cursor), chord prompts (with block cursor), and status messages (no cursor). Waiting states (SFTP connecting, directory loading) show an animated Braille spinner.
SSH
- Remote Exec PATH Hardening: SSH exec requests now prepend a comprehensive PATH covering Homebrew, Linuxbrew, Go, snap, and standard system directories. Fixes tssh, mosh, AI agent, and remote commands failing on macOS hosts with zsh configuration, where non-interactive exec channels have a minimal PATH that excludes common tool locations. Also benefits other hosts with restrictive non-interactive PATHs.
Version 1.0.2-56
March 24, 2026
Themes
- 256-Color Extended Palette: Importing theme files with palette entries beyond index 15 (colors 16–255) now preserves the extended colors. Previously these were silently discarded. Existing saved themes decode without issues and the new extendedPalette field defaults to empty. The theme editor shows an informational row when extended colors are present.
rf File Browser
- SFTP Remote Browsing: Press ‘o’ in rf to open a saved SSH profile and browse the remote filesystem in a new tab. Local and SFTP tabs coexist in the same rf instance with independent connections. Navigate, preview, create, rename, and delete files over SFTP. Remote preview uses a three-phase pipeline: instant plain text, then bat syntax highlighting via temp file download (preserving the filename for language detection), then kitty image preview for images.
- Cross-Source Yank/Paste: Yank files locally and paste into an SFTP tab to upload, or yank remote files and paste locally to download. The shared clipboard works across all rf tabs. Recursive directory transfers with cancellation support.
- Remote Edit: Press ‘e’ or return on a remote file to download, edit locally, and auto-upload on save. Change detection skips upload if unmodified. If the upload fails, the edited file is copied to Documents/.rf-recovery/ and an interactive prompt offers retry, copy-path, and dismiss — preventing data loss from temp file cleanup on exit.
- Profile Picker: Scrollable list with j/k navigation, live filtering by name/host/username, and Tab completion.
- Dramatically faster bat preview for large files. Rewrote the ANSI parser, files that previously took seconds to render now preview instantly.
Debug
- VPN Connection Debug Logger: New opt-in diagnostic logger that records timestamped phases (DNS, SSH, tsshd spawn, Go netstack) with millisecond durations during VPN connection setup. Off by default.
Binary Size
- Release Build Size Optimizations: Enabled symbol stripping, dead code stripping, and thin LTO in the Xcode release configuration for a smaller binary.
- Rust Dependency Size Optimizations: bat, gitoxide, and helix builds now smaller.
Version 1.0.2-55
March 22, 2026
iOS Local Shell
- Transient Prompt: After running a command, the full info bar prompt is replaced with a minimal ❯, reducing scrollback clutter. Customizable via
[transient_prompt]in .promptrc.toml or the new Advanced section in Settings. - Right Prompt: The clock segment can be moved from the left info bar to a right-aligned position, making the left prompt shorter. Uses ANSI cursor positioning and works with all 13 built-in themes. Configure via
right_formatin .promptrc.toml or the Settings toggle. - rf File Browser: Navigation is now restricted to ~/Documents by default, preventing browsing above the app sandbox home. Disable with
restrict_to_home: falsein rf.yaml. Yanked-cut files now render with strikethrough and dim to distinguish from yanked-copy (yellow only). Newukey clears the yank clipboard and selection. Yank operations immediately re-render the file list. Added config file support —~/.config/rf/rf.yamlpersistsshow_hidden,sort_by, andrestrict_to_homesettings across sessions.
Bug Fixes
- Fixed ghost image overlays in rf file browser when rapidly navigating through image files. Stale image render tasks could complete after the cursor moved on, leaving previous images stuck on screen.
- Fixed cursor effect preview row in Settings not matching the themed background color.
- Fixed a crash when viewing JavaScript, HTML, or any file containing
<script>blocks withbat. The previous regex engine (fancy-regex) didn't support atomic grouping and possessive quantifiers used in JS/Babel syntax definitions. Temporarily switched to Oniguruma which supports the required regex features. Added panic isolation at the FFI boundary as defense in depth.
Version 1.0.2-54
March 22, 2026
iOS Local Shell
- rf File Browser: Built-in
rfcommand — a yazi-inspired Swift-native TUI file browser with miller columns. Vim navigation, tabs, filename filter, ripgrep search, bookmarks, file ops (yank/paste/delete/rename/create), visual select, bat syntax-highlighted preview, kitty image preview, git status, 700+ Nerd Font icons, powerline statusbar, copy chords, mouse-draggable columns, and editor shell-out. Optimized for iPad. - Shell Scripts: Run POSIX shell scripts on device via
sh script.shor./script.sh. Supports if/for/while/until/case, functions, pipelines, variables ($?, ${VAR:-default}), quoting, here-documents, redirections, and 25 builtins (test, printf, read, sleep, trap, eval, source, etc.). The ~/.rootshellrc dotfile is now sourced through the interpreter. - Multi-Line Input: Incomplete compound commands show a
>continuation prompt until complete. Lines ending with \, |, &&, ||, then, else, do, or { also continue. Ctrl-C cancels. - Brace Expansion: {1..10}, {a..z}, {1..10..2}, {10..1}, and {a,b,c} work in for-loops and commands.
- Builtin Tab Completion: Shell builtins now appear in command-position tab completion.
- Width-Aware Prompt: Prompt adapts to terminal width — progressively truncates paths, then git branch, then hides git status as the terminal narrows.
SSH
- Ctrl-C to Cancel Connections: Ctrl-C during SSH/SFTP/Mosh/Trzsz connection now cancels and returns to local shell.
- Remote Command Execution:
ssh host commandsends a remote exec request instead of opening an interactive shell, matching OpenSSH.
Connections
- Connection Sheet Redesign: Glass-effect capsule tabs replace the previous menu, with collapsible sections for jump host, agent forwarding, port forwarding, and terminal options.
- Profile Color Tags: Custom color now tints the profile icon directly instead of a separate indicator.
- Active Session Counts: Profiles show the number of active terminal sessions.
Terminal
- Aurora Cursor Effect: Theme-aware cursor shader that picks the two most vibrant colors from your palette. Adapts when you switch themes.
Settings
- Cursor Style Previews: Visual terminal-cell previews for block, bar, underline, and hollow block styles.
- Cursor Shader Effect Preview: Live preview with an animated terminal surface showing shader trail effects in real time.
Bug Fixes
- Fixed a crash when locking the device while the app is running.
Version 1.0.2-53
March 20, 2026
iOS Local Shell
- Pipe Command Latency Fix: Piped commands (ls | grep, cat file | head, etc.) no longer have a ~1 second delay before command completion. The pipe monitoring system was rewritten from polling with Task.detached sleep loops to event-driven kqueue-backed DispatchSource read sources.
- libarchive 3.9.0 Upgrade: The bundled tar has been upgraded from libarchive 2.8.3 to 3.9.0 (newer than the version shipped with macOS Tahoe), and now ships four tools instead of one: bsdtar, bsdcat, cpio, and unzip. The upgrade brings Zip64, RAR/RAR5, 7-Zip, CAB, and LHA archive reading; Zstandard, lz4, lzip, and lzop compression; bsdunzip as a standalone unzip replacement; bsdcat for streaming decompression to stdout; and cpio for cpio/pax archives. Broader metadata fidelity (xattrs, NFSv4 ACLs) and years of OSS-Fuzz hardening are also included.
- Custom Prompt Configuration: Create a .promptrc.toml file to fully customize the shell prompt beyond the 13 built-in themes. Uses a Starship-compatible format string syntax with 11 configurable modules: username, directory, git_branch, git_status, time, battery, character, wifi, network, connection_type, and line_break. Supports true color hex, ANSI named colors, and named color palettes (13 bundled including Catppuccin, Tokyo Night, Gruvbox, Dracula, Nord, and others). Powerline arrows and rounded caps are auto-inserted between segments. Modules with unavailable data collapse automatically. Edit with the
editpromptcommand, reload from Settings, or just save the file — changes are picked up on next prompt. A bundled example file documents all options.
SSH (trzsz-ssh / tssh)
- Session Reattach TUI Redraw: After reattaching to a server-side session, full-screen TUI apps (Helix, Vim, etc.) now receive a forced SIGWINCH to trigger a full repaint, even when the terminal dimensions haven’t changed since the previous connection.
- Terminal Modes Persisted Across App Kill: Mouse tracking, cursor key mode, and bracketed paste state are now saved and restored when reattaching after app termination. Previously, Helix/Vim mouse clicks, arrow keys, and paste behavior would break after reattach because the server wouldn’t re-send enable sequences for modes it believed were still active.
AI Agent
- OpenAI GPT-5.4 Models: Updated the OpenAI model list to GPT-5.4 Mini and GPT-5.4 Nano (released March 17, 2026), replacing the older GPT-5 Mini and GPT-5 Nano model IDs. GPT-5.4 Mini is the new recommended default.
Bug Fixes
- Fixed SCP tab completion to suggest both local file paths and saved hostnames (previously only offered hostname suggestions), and fixed non-standard port connections inserting invalid syntax like user@host:2222: instead of the correct -P 2222 user@host: format.
Version 1.0.2-52
March 18, 2026
SSH
- Paste Image Upload: Pasting non-text clipboard content (images, screenshots, etc) into an SSH session via Cmd+V or the touch paste menu uploads the file to the remote server and inserts the remote path at the cursor using bracketed paste. A confirmation sheet with thumbnail preview appears before uploading. Useful for AI CLI tools (Claude Code, Codex, Gemini CLI) that can read images from a filesystem path.
iOS Local Shell
- xz Compression: The xz, unxz, and xzcat commands are now available in the local shell. Compress and decompress files using the XZ/LZMA2 format directly on device. Based on xz 5.8.2.
- Type-Ahead Buffer: Keystrokes typed while a non-interactive command is running (git pull, curl, ls, etc.) are now buffered and replayed through the line editor when the prompt returns, matching real terminal behavior. Full-screen programs (vim, hx) still receive input directly.
- Shell Startup Dotfile: A ~/.rootshellrc file is sourced when a new shell tab opens. Supports export/setenv, alias, and arbitrary commands. Edit with
editrc, re-source withsource. A built-in health tracker detects when the rc file causes hangs or crashes and skips it on subsequent launches until you fix it.
Terminal
- Trackpad Long-Press Fix: Long-pressing (click-and-hold) on a Magic Keyboard trackpad no longer triggers the context menu. This was interfering with click-and-drag text selection. Right-click context menu still works as expected.
Keyboard
- Tab as Mod-Tap Source Key: Tab can now be used as a mod-tap source key. Tap sends Tab, hold activates the assigned modifier or action. Configure in Settings > Terminal > Keyboard > Mod-Tap Keys.
Bug Fixes
- Fixed a watchdog crash when backgrounding the app on slow or degraded networks. Heavy I/O work (state serialization, encryption, scrollback buffer dumps) is now performed off the main thread during background transitions.
- Fixed keyboard focus not returning to the terminal after dismissing host key, agent approval, or other alert dialogs.
- Fixed SCP upload overwriting the destination path instead of placing the file inside it when the destination is an existing directory (e.g., “scp foo.txt host:/tmp” now correctly uploads to /tmp/foo.txt).
- Fixed Esc key not navigating back out of Profile folders in the connection sidebar (regression in build 51). Esc now walks back through folder levels before closing the sidebar.
Version 1.0.2-51
March 16, 2026
SSH
- Session Resume via --attachable: Migrated from the reconnect branch to upstream tsshd’s official
--attachableflag for session persistence. When the app terminates, the server-side session stays alive and the client reattaches withAttach(). Saved sessions are persisted in the Keychain so resume works across full app restarts. Users on the unofficial reconnect branch will need to migrate to the official upstream version of tsshd for sessions to survive app termination. New connections and roaming prior to app termination will continue to work prior to upgrading. See tsshd. - Agent Forwarding for tssh Sessions: SSH agent forwarding now works through the KCP/QUIC transport layer. All approval modes (auto, per-session, per-request) and key filtering work the same as direct SSH sessions. Agent forwarding is active for both new and resumed/attached sessions.
WiFi
- AP Radio Scanning: SSH into Ubiquiti access points to discover per-radio interfaces (ESSID, frequency, BSSID, band) via iwconfig. Only wireless APs are scanned — switches and gateways are filtered out using the UniFi Network API. Band badges (2.4/5/6 GHz) appear on AP rows, in the bssid shell command, and in the Live Activity lock screen widget. Configure SSH credentials per account in WiFi AP settings. This also resolves AP name matching failures where the base MAC address from the UniFi API did not match the per-radio BSSID reported by iOS.
Connections
- Sidebar on iPad and macOS: The connection sheet is now a right-edge sidebar overlay that slides in, replacing the fullScreenCover presentation. iPhone still uses a standard sheet.
iOS Local Shell
- Seamless Session Restore: Restored sessions no longer flash a new prompt on top of existing scrollback. If the shell was idle at a prompt when backgrounded, both the banner and prompt are suppressed for a seamless resume. If a command was running, a new prompt is shown so you can continue.
Bug Fixes
- Fixed Helix crashing when using the bookmarked locations feature. Helix’s Rust threads call
chdir(), where the per-session pointer is NULL. The chdir/fchdir paths now guard all session dereferences with NULL checks. - Fixed CTRL-C during iOS local shell SSH password prompt breaking all subsequent terminal input. The interrupt handler now recognizes all 9 prompt modes (password, host key, save password, etc.), clears their buffers, resets to the local shell, and redisplays the prompt.
- Fixed local shell CWD not restoring across iOS container UUID changes. Paths with /private/var vs /var prefixes are now normalized, and the working directory is kept in sync after cd commands.
- Fixed git SSH operations occasionally crashing on teardown due to a double-close race on the drain task’s pipe file descriptor.
- Fixed duplicate “About” section appearing in WiFi AP provider settings.
Version 1.0.2-48
March 14, 2026
Backup & Restore
- Encrypted Backups: Export all app data — SSH keys, passwords, connection profiles, known hosts, custom themes, custom fonts, keyboard shortcuts, HSS configs, cloud accounts, AI settings, and preferences — into a single password-protected .rootshellbackup file. Encryption uses AES-256-GCM with a key derived via PBKDF2-HMAC-SHA256 (600,000 iterations). Restore performs intelligent merging (deduplicates SSH keys by fingerprint, passwords by connection, etc.) rather than overwriting existing data. Found in Settings > Privacy & Data > Backup & Restore.
AI
- Local Shell Agent: The AI agent can now run commands in the iOS local shell. It has access to file tools (read_file, write_file, edit_file) that are sandboxed to the app’s Documents directory and respect the approval flow. The agent receives an iOS-specific system prompt documenting available and unavailable commands, and uses the terminal’s current working directory as context.
WiFi
- Manual AP Names: Associate BSSIDs with vendor names, domains (for favicon), and friendly AP names without needing a Ubiquiti or other provider integration. Entering a BSSID auto-detects the vendor from the OUI database (~20K vendors, prefix-ranked search). A “Use Current BSSID” button grabs the connected AP. Manual entries appear in the bssid command, Live Activity, and WiFi info displays. Included in backup/restore.
iOS Local Shell Prompt
- Git Branch Segment: Starship-style prompts now show the current git branch name (or short hash on detached HEAD) and staged file count between the directory and time segments. Each of the 13 prompt themes has a matching green-toned color for the segment. Toggle in Settings > Terminal > Prompt & Username > Show Git Status.
Git
- Pipe and Redirect Support: Git commands now run through the full pipeline, enabling piping (
git log | grep foo) and redirection (git status > file.txt). Auth flags and editor commits still use the interactive path. - Color Output: New --color=auto|always|never flag. Auto-injects --color=always when output goes to the terminal and strips ANSI codes when piped or redirected.
- Auto-Pager: Paged subcommands (diff, log, blame, reflog) pipe through bat via real pipelines instead of a temp file.
Helix
- Directory Argument: Running
hx .orhx ~/projectnow opens the file picker for that directory instead of silently opening an empty buffer.
Settings
- Double-Space for Period: Optional shortcut that converts two rapid space taps on the on-screen keyboard into “. ” (period + space), matching iOS system behavior. Off by default. Found in Settings > Terminal > Keyboard.
Bug Fixes
- Fixed local shell losing its working directory after app relaunch when iOS assigns a new container UUID. Saved paths are now rewritten relative to the current container.
- Fixed git fetch progress bar getting stuck at ~99% and never reaching 100%. Each phase (receiving, resolving deltas, indexing) now properly completes.
- Fixed tab morph animation regression in last build.
- Fixed duplicate section titles appearing in Settings.
- Fixed missing vertical padding in the Settings sidebar on iPad and Mac.
- Fixed piped commands losing session context (tty, window size), which broke keyboard input for pagers in pipelines.
- Fixed “/” search in the bat pager not accepting keyboard input.
- Fixed day/night theme not applying the correct theme on cold launch.
Version 1.0.2-47
March 12, 2026
tmux
- Session Discovery: After connecting via SSH, Mosh, or tssh, the app checks for active tmux sessions on the remote host. A floating overlay lists them with window count and last-activity timestamp. The selected session shows a live terminal preview of the active pane with ANSI colors. Tap or press a digit key to attach, arrow keys to navigate, Escape to dismiss. Skipped when tmux auto-connect is enabled. Toggle in Settings > Connections > tmux.
Settings
- Redesigned Navigation: iPhone settings changed from a single long flat list to a two-level category layout. iPad and macOS settings changed from a centered modal card with a two-column split view to a narrow sidebar.
- Search: A floating search bar at the bottom of settings lets you find any setting by name or keyword. Tap the pill or start typing to expand it into a filtered results panel that navigates directly to the matching setting.
- Toggle with Cmd-Comma: Pressing Cmd+comma while settings is already open now closes it instead of doing nothing.
Themes
- Chromatic Background Support: Themes with colorful dark backgrounds (dark teal, dark purple, etc.) now get tab backgrounds that retain their color character instead of looking washed out, and accent colors that harmonize with the background instead of clashing.
- Adaptive Tab Contrast: Medium-dark themed backgrounds now have stronger tab differentiation so selected and unselected tabs are easier to distinguish.
- Sheet and row backgrounds in dark themes preserve the theme’s color character instead of shifting toward neutral gray.
AI
- Toolbar Button: Sparkles icon in the virtual keyboard toolbar toggles the AI agent panel.
- Added Gemini 3.1 Flash Lite preview model.
Git
- 7 New Commands: cherry-pick, rebase, reflog, worktree, clean, apply, and switch are now available natively. Cherry-pick and rebase support --continue, --abort, and --skip for conflict resolution. Worktree supports list, add, remove, lock, and unlock. Clean requires -f or --force (with -n for dry run).
- Enhanced Existing Commands: log gained --all, --graph, --grep, --since, --stat, -p, and path filtering. diff gained commit ranges, --name-only, --name-status, and --diff-filter. merge gained --no-ff, --ff-only, --squash, and -X ours/theirs. stash gained show, -u, -k, and branch. branch gained --show-current, --set-upstream-to, and --merged. blame gained -L line range, -w, and --date format. checkout gained -B, --track, --ours, and --theirs. revert gained --continue, --abort, and -m mainline.
- Auth Override Flags: New --ssh-key, --password, and --profile global flags let you override automatic SSH credential resolution for remote operations. --ssh-key forces a specific saved key by name, --password prompts interactively, and --profile uses a saved connection profile’s auth method and optional jump host.
Bug Fixes
- Fixed Helix file picker (Space+f) showing files from the initial working directory instead of the current directory after using cd.
- Fixed git checkout -b and switch -c corrupting the working tree if branch creation fails. Operations now pre-validate and rollback safely.
- Fixed git rebase --skip silently continuing with a stale index. The index is now properly reset to HEAD before updating the working tree.
- Fixed SSH key iCloud sync failing with Keychain error −50 when biometric auth was set. The Keychain API does not support combining iCloud sync with per-operation access control.
- Fixed renaming a custom theme losing the active theme selection, favorites, day/night assignments, and per-tab/window overrides. All name-based references now track the new name.
Version 1.0.2-46
March 11, 2026
Git
- Pull Fast-Forward: Fixed git pull fast-forward leaving the working tree dirty after a successful pull. Also added rollback recovery so the working tree is restored if the ref update fails after checkout.
- Help & Tab Completion: The git command is now listed in the local shell help output and available in tab completion.
- Progress Bars: Git clone, fetch, and push progress bars now size dynamically to fit the terminal width, preventing line wrapping on iPhone screens.
- SSH Auth Resolution: Git SSH transport now supports auth-none and saved-password connections in addition to key-based auth. The credential resolver checks saved connection profiles, then SSH history for matching hosts, before falling back to default keys.
- Known Hosts Validation: Git SSH connections now validate host keys against your known hosts store instead of blindly accepting all keys. Unknown or changed keys are rejected.
- Repo-Optional Commands: git general and git config now work outside a git repository, showing global config and system info instead of erroring. Real errors (corrupt .git, permission denied) are still surfaced.
Live Activity
- WiFi Info: The lock screen Live Activity can now display your current WiFi SSID and access point name (if a WiFi AP provider is configured). Enable in Settings > Live Activity > WiFi Info.
- Network / ISP Info: Public IP address, ISP name, and country are shown on the lock screen via STUN + geo lookup. Enable in Settings > Live Activity > Network Info.
- Favicons: WiFi vendor and ISP favicons are displayed inline on the lock screen widget next to their respective rows.
- WiFi and network data update in the background when iOS grants execution time, but the app is not always running — information may be stale until you return to the app.
iOS Local Shell
- ripgrep (rg): Fast regex-based file search is now available as a local shell command. Pairs naturally with the new git support — clone a repo and immediately search it with rg. Supports all standard rg flags including file type filters, context lines, and glob patterns.
Bug Fixes
- Fixed third-party keyboard input (notably WeChat keyboard in English mode) producing garbled or missing terminal output. These keyboards send autocompleted words as multi-character replacements rather than individual keystrokes; the terminal now diffs the incoming text against the document buffer and emits the correct backspace + insert sequence.
- Fixed the I-beam cursor leaking into the Settings view on iPad when presented as a modal over the terminal.
- Fixed toolbar key presses (virtual keyboard) always going to the terminal even when the Compose overlay was open. Plain character keys and tab now route to the compose text view while modified keys (Ctrl/Alt/Cmd) and escape still reach the terminal.
Version 1.0.2-45
March 10, 2026
iOS Local Shell Git
- Native Git CLI: A Swift-native git implementation powered by libgit2, with truecolor output styling and Nerd Font icons. Supported subcommands: init, clone, status, add, commit, diff, log, blame, branch, reset, pull, push, fetch, rm, mv, show, and revert.
- SSH Transport: Clone, push, and pull over SSH using the built-in SSH client. SCP-style URLs (git@host:path) are supported.
- Helix Editor Integration: Running git commit without -m opens the Helix editor for composing commit messages interactively.
- Syntax-Highlighted Pager: git diff, log, and blame output is piped through bat for syntax highlighting and paged scrolling.
- Note: Git support is new and has not yet been thoroughly tested. Take caution when using it with production data.
UI
- Double-Tap to Paste: The double-tap gesture on a terminal tab has been replaced with a context menu that includes Paste, making it easier for touch users to paste without a hardware keyboard.
- Settings Navigation: Reworked the settings split view navigation for smoother transitions and more reliable detail-column push behavior.
- Theme Tinting: Improved contrast tuning for themed sheet tints so text and controls remain legible across light and dark themes.
- Adapted Live Activity colors for tinted Liquid Glass mode.
- Increased terminal dimming behind sheets.
- Selection handles now only appear for touch-initiated selections.
Bug Fixes
- Fixed pbcopy and other commands crashing when interrupted. The shell engine now uses cooperative cancellation instead of pthread_cancel, which could corrupt internal state mid-operation.
- Fixed theme search results appearing empty until scroll or jiggle.
- Fixed virtual keyboard toolbar Ctrl-C not interrupting local shell.
- Fixed iOS text selection handle alignment.
- Fixed selection handles not restoring after returning from background.
- Fixed intermittent SSH password auth failures caused by 10-second login timeout.
- Fixed traceroute failing with dlsym symbol not found error.
- Fixed enterprise AP vendor lookup with improved BSSID handling.
- Fixed OpenAI stream errors with optional error messages.
- Suppressed duplicate welcome banner on local shell session restore.
Reliability
- Protected Data Guard: Background launches (VPN reconnect, Live Activities, CloudKit push) can start the app before the device is unlocked, causing UserDefaults to return empty values. All UserDefaults-dependent initialization is now deferred until protected data is available, and didSet observers that write back to UserDefaults are guarded against running while the device is locked.
AI
- Updated OpenAI model to GPT-5.4.
Version 1.0.2-44
March 8, 2026
Terminal
- Magnifier Loupe: A magnifier loupe now appears when dragging selection handles, panning a text selection, or dragging in capture mode. The loupe tracks your finger or cursor for precise positioning. Works inside tmux panes and split views.
- Selection Handles: Touch-based text selection now shows draggable handles at the start and end of the selection. Drag either handle to adjust the selection range. The edit menu appears automatically when you finish dragging. Handles stay in sync with the active surface and hide when overlays or other views appear on top.
- Mouse Capture Toggle: Press Cmd+Shift+M or tap the mouse button in the keyboard toolbar to force-disable mouse reporting. When active, native text selection and scrolling work even inside programs that capture the mouse like tmux, vim, or htop. Toggle again to restore mouse reporting.
WiFi & Networking
- WiFi AP Providers: New provider system for identifying the access point you’re connected to. The first integration is Ubiquiti UniFi — add your API key in Settings > WiFi AP Providers to see the AP name, model, and location for your current BSSID. macOS is fully supported.
- OUI Vendor Lookup: The bssid command now performs IEEE OUI lookups, showing the hardware vendor for any BSSID. Randomized MACs are detected and labeled.
- Favicons: The bssid and whatismyip commands render favicons inline next to domain names for ISPs and vendors using the Kitty image protocol. Icons are fetched and cached automatically.
iOS Local Shell
- Help Command: Expanded to include all available commands with localized descriptions.
- Localization: Added missing translation keys across all 25 supported languages.
Bug Fixes
- Fixed bssid showing the wrong error message on the first run when location permission has not yet been granted.
- Fixed whatismyip and the Geo Provider settings view hanging on IPv4-only networks while waiting for IPv6 STUN queries that could never succeed.
Version 1.0.2-43
March 7, 2026
Themes
- Theme-Aware UI: Your terminal theme’s colors now extend beyond the terminal. Settings views, connection sheets, toolbars, toggles, and sub-sheets are all tinted with your theme’s accent and background colors. This is on by default; turn it off in Settings > Appearance Mode to fall back to standard Light/Dark mode styling.
- Custom Themes: Create your own themes with a full color picker GUI, duplicate any built-in theme as a starting point, or import Ghostty theme files. Custom themes can be exported and shared, and work everywhere built-in themes do — favorites, day/night switching, and per-tab overrides.
IP Geolocation
- Geo Provider: IP geolocation lookups now support multiple providers. Choose between IPInfo Lite (new default), Team Cymru DNS, or disabled. Results are cached locally (500 entries, 7-day TTL). Configure in Settings > IP Geolocation.
- Network Info in Settings: The IP Geolocation settings view now shows your live public IPv4/IPv6 addresses with per-IP network info (ASN, org, country). Automatically refreshes on network changes and provider switching.
- Richer Geo Data: Connection Info, whatismyip, and mtr now show AS name, domain, and continent when available (via IPInfo). mtr adds two new display modes for AS name and continent.
Settings
- Sidebar Layout: Settings now uses a two-column sidebar layout on iPad, macOS, and visionOS. Sections are listed in a persistent sidebar with the detail view alongside. Sub-navigation (e.g. SSH Keys > Key Detail) pushes within the detail column.
- SF Symbol Icons: All Settings rows now display icons for easier scanning.
- Font Size: Lowered the minimum font size from 8 to 4.
Terminal
- Scroll Keybinds: Terminal scrolling moved from Page Up/Down to Cmd+Up/Down, matching standard macOS conventions.
Bug Fixes
- Fixed CapsLock-as-Shift (mod-tap hold) being ignored by the case fixup logic, and fixed Shift capitalization breaking when CapsLock mod-tap compensation was active.
- Fixed function keys (F1-F12) sending wrong keycodes on macOS.
- Fixed mtr column misalignment on unknown hops when country flags are displayed.
- Fixed bssid command failing on devices without a VPN configured. Note: Apple requires Precise Location permission to access BSSID unless rootshell is your active VPN provider.
Version 1.0.2-42
March 6, 2026
SSH and Networking
- Connection Info: Right-click or long-press a terminal tab and choose “Connection Info” to see a live sheet with connection duration, negotiated SSH cryptographic algorithms (key exchange, host key, cipher, MAC), post-quantum security status, ASN, country, and CIDR. Mosh and tssh sessions show the crypto negotiated during the bootstrap SSH handshake plus the transport mode (QUIC vs KCP for tssh).
iOS Local Shell
- whatismyip: Discover your public IPv4 and IPv6 addresses via STUN. Shows ASN, CIDR, and country for each address and copies bare IPs to the clipboard. Use
whatismyip4orwhatismyip6for a single address family, or-gto skip the ASN/geo lookup. - bssid: New command to display the SSID and BSSID of the connected WiFi network.
VPN
- Control Center Widget: New VPN toggle for Control Center, the Lock Screen, and the Action Button. Supports profile selection.
- Background Connect/Disconnect: The VPN widget and Shortcuts intent no longer need to launch the main app to start or stop a connection.
- Note: A device reboot may be required after this update for widgets to appear and function correctly.
Terminal
- Function Keys: F1-F19, Insert, PrintScreen, ScrollLock, and Pause are now routed through Ghostty’s key encoding pipeline instead of being silently dropped. All encoding modes (legacy VT220, CSI u, kitty protocol) are handled correctly.
- Cursor Settings: New options for cursor color, cursor text color, opacity, thickness, and height.
- Fixed lock screen live activity title centering.
Version 1.0.2-41
March 4, 2026
iOS Local Shell
- mtr / traceroute: Custom Swift implementation built for rootshell. mtr shows an interactive TUI with per-hop loss, RTT statistics, jitter, and AS number lookups. Three display modes (statistics, stripchart, strip+numbers) and report formats (text, CSV, JSON, XML). traceroute/traceroute6 are aliased to one-shot mtr reports. The interactive display uses truecolor gradients derived from your terminal theme. Loss and latency values smoothly interpolate between green, yellow, and red using your theme’s palette colors. Press ‘t’ to toggle between truecolor and classic 16-color mode. Works on IPv6-only carrier networks with NAT64 translation.
- imgcat Wildcards: The imgcat command now accepts glob patterns (e.g.
imgcat *.png) to display multiple images at once. - Fixed imgcat hanging on large images.
- Fixed imgcat blocking the UI while encoding large images.
- SFTP Wildcards: Interactive SFTP commands (ls, get, put, rm) now accept glob patterns for batch operations on multiple files.
- Fixed SFTP glob matching for mid-path wildcards, rm on directories, and destination path validation.
SSH and Networking
- Pipelined SFTP/SCP: File transfers over high-latency links are up to ~15x faster. Multiple SFTP requests are now sent in a pipeline without waiting for each individual acknowledgment, dramatically reducing round-trip overhead.
- Tmux Settings: New options to customize the tmux session name and specify a custom tmux command. The settings view now shows the resolved command for easy copying and includes a clear button to reset to defaults.
CJK Input
- IME Preedit Display: Composing CJK characters now shows a live preedit overlay near the cursor, so you can see what you’re typing before committing. Input is NFC-normalized for correct rendering of precomposed Hangul and other Unicode sequences.
Bug Fixes
- Fixed the “Change Title…” dialog pre-filling with “ghostty” instead of the tab’s current title.
- Rewrote session save/restore. Scrollback and the active viewport are now captured in two separate phases, fixing blank line injection from soft-wrap boundary splits and ensuring the active area replays correctly regardless of terminal size on restore. Also fixed CTRL-L (clear screen) not triggering a save. Detection now uses a content hash instead of row count so any layout change is captured.
- Minor Live Activity polish: fixed timer overlap on Always-On Display, adjusted background tint and opacity to blend with the lock screen while keeping a slight visual differentiation from system notifications.
Version 1.0.2-40
March 3, 2026
Terminal
- Photo Background: New terminal background effect that displays a photo from your library behind the terminal. Choose from named opacity presets (Subtle through Vivid), apply one of 9 image filters (Noir, Chrome, Sepia, and more), and optionally enable a Ken Burns cinematic pan/zoom animation with adjustable speed. Photos persist across launches. Configure in Settings > Background Effect.
- Sound Presets: Configurable sounds for the terminal bell and notifications. Bell sounds include 6 presets (Classic Bell, Soft Chime, Glass Tap, Typewriter Ding, Digital Beep, Muted Thud) plus haptic-only and silent options, with a volume slider and live preview. Notification sounds offer 5 presets plus the system default. Configure in Settings.
iOS Local Shell
- imgcat Command: New command to display images inline in the terminal using the Kitty graphics protocol. Supports PNG, JPEG, HEIC, and other image formats. Use -w and -r flags to control display sizing.
- Ping Accuracy: The ping command now uses kernel-level receive timestamps (SO_TIMESTAMP) instead of userspace timing, and batch-drains queued ICMP replies to prevent one-cycle RTT inflation. Round-trip times are more accurate, especially under load.
SSH and Networking
- tssh connection failures now show the actual server error (exec format error, Go panics, version mismatches) instead of the opaque “No valid JSON found in tsshd output” message.
VPN
- Fixed the VPN widget connect button sometimes failing to actually connect or failing to reflect the current VPN state after a cold launch.
Visual Polish
- Added effects across the app for smoother state transitions: bounce and replace animations on copy buttons, breathing and pulsing on reconnection overlays, rotation on VPN connecting indicators, and wiggle effects on key availability badges.
Version 1.0.2-39
March 2, 2026
Keyboard and Input
- Option Key Fix: Fixed the Option key tap triggering a word-delete in the terminal, a regression in build 38. Pressing and releasing Option alone no longer emits any character. Standalone modifier key events (Alt, Shift, Control) are no longer forwarded to the terminal engine; only Command is forwarded for Cmd+hover link detection.
- Force ASCII Keyboard: New toggle in Settings > Locale switches the software keyboard to ASCII-only mode, preventing CJK input methods from substituting pipe | and others with IME characters. Default is off.
Context Menus
- Copy Link: Right-click and edit menu context menus now include a “Copy Link” action alongside “Open Link” when the cursor is over a URL.
- Fixed right-click on a URL not showing the “Open Link” action. Link detection was being silently deduplicated when the cursor was already over the URL from normal hover tracking.
Terminal
- Fixed the shell prompt appearing glued to the previous command after restoring a tssh session that was backgrounded while a TUI app was on the alternate screen. The primary screen dump now includes the cursor position so the trailing blank line is preserved on restore.
Localization
- Norwegian Bokmål: Added Norwegian Bokmål (nb) as the 25th supported language.
VPN
- Fixed VPN disconnect not sending the exit signal to the server. The tsshd client is now closed before the network stack tears down, ensuring the server receives clean shutdown notification instead of holding stale sessions until timeout.
- Moved the “Disconnect VPN” button to immediately below the status section in VPN settings for easier access.
- VPN event history now shows most recent events first.
Version 1.0.2-38
March 1, 2026
Terminal
- Cursor Effect: New “Neon” cursor effect shader adds a glowing outline around the cursor. Enable it in Settings > Cursor.
- Scrollback Preservation: Scrollback history is now preserved when a TUI app (vim, helix, tmux) is running on the alternate screen and iOS evicts the app in the background. Previously reconnecting would corrupt the primary scrollback because TUI output arrived before the alternate screen switch.
- Upstream Rebase: Merged upstream Ghostty commits. Includes the new URL regex rewrite, unsafe byte stripping in paste, new shader uniforms, and key tables restructuring.
SSH and Networking
- tmux via Exec Request: tmux auto-start on tssh sessions now uses a proper SSH exec request instead of typing the command into the login shell. This eliminates the brief login shell flash.
Keyboard and Input
- Action Buttons: The keyboard toolbar drawer now includes four action buttons: Full Screen, Tab Bar Toggle, New Connection, and App Settings. Existing users get the buttons automatically via layout migration.
Live Activity
- Polished the Live Activity lock screen layout: centered title, improved timer alignment, and fixed the activity reposting when the user dismisses it.
- Fixed duplicate Live Activities appearing on the lock screen after an app relaunch. Orphaned activities from previous launches (app kill, crash, system eviction) are now cleaned up on startup.
iOS Local Shell
- Fixed Ctrl-C not interrupting non-interactive iOS shell commands (tail -f).
- Fixed SSH password prompts appearing on the same line as the previous command output instead of on a new line.
Bug Fixes
- Fixed URL detection regex greedily swallowing URLs that follow file paths. For example, “root/shell https://rootshell.com” previously treated the entire string as a single file path instead of detecting the URL separately.
- Fixed Cmd+hover link highlighting requiring mouse movement on iPad and macOS. Links now highlight immediately when Cmd is pressed while the pointer is already over a URL.
- Fixed Cmd+hover link detection not working inside mouse-tracking apps like tmux. Since the xterm mouse protocol doesn’t encode Cmd, link detection now bypasses the mouse-capture gate when Cmd is held.
- Fixed kitty icat pixel size detection on macOS local shell. The terminal window size ioctl now preserves pixel dimensions so kitty graphics protocol images render at the correct size.
- Fixed orphan scrollback history files never being cleaned up when their associated terminal session was deleted.
Version 1.0.2-37
February 27, 2026
Terminal
- Clickable Hyperlinks: URLs in terminal output are now interactive. Cmd+click opens links in Safari (iPad with trackpad / macOS), right-click or two-finger tap shows “Open Link” in the context menu, and the iOS edit menu adds an “Open Link” option when over a link.
- Text Selection Appearance: New setting in Settings > Window to choose how selected text looks: the default rootshell style, your theme’s native selection colors, inverted colors, or fully custom foreground/background colors.
Security
- Scrollback Encryption: Persisted scrollback history is now encrypted at rest with AES-256-GCM using a device-only Keychain key. Existing plaintext scrollback files are migrated transparently on restore.
SSH and Networking
- Locale Override: New setting in Settings > Terminal to control the locale sent to remote servers. Choose Automatic (system locale), Don’t Send (suppress locale entirely), or Custom. Fixes repeated setlocale warnings for users whose OS region produces unavailable locale combinations like en_IL.UTF-8.
- Fixed a crash in local SSH port forwards when many connections arrive simultaneously (e.g. a browser opening multiple sockets).
- Fixed KCP rekey failures after backgrounding the app by suppressing the rekey timer during iOS process suspension.
- Fixed the cursor permanently flipping to underline after resuming a tssh session running Helix, or other focus-reporting apps.
VPN
- Home Screen Widget: New small and medium Home Screen widgets to connect and disconnect your VPN without opening the app. Long-press to choose a VPN profile. Shows profile name, host, status with gradient background and status orb, and a connect/disconnect button.
- Live Activity: Lock Screen and Dynamic Island now show active sessions and real-time VPN stats (bytes in/out, uptime, connection count). A session filter in Settings lets you choose All Sessions, Diary Sessions, or VPN Only.
Keyboard and Input
- Restore Custom Keys: Custom keys removed from the toolbar layout now appear in a “Hidden Keys” section in toolbar settings with a restore button, instead of being permanently deleted.
Bug Fixes
- Fixed blank screen when the last session exits on iOS. The connection sheet is now shown instead of destroying the only window.
Version 1.0.2-36
February 24, 2026
SSH
- Post-Quantum Host Keys: Added ML-DSA-65 and ML-DSA-87 post-quantum host key signature algorithms built on Apple CryptoKit (macOS 26+, iPadOS 26+, visionOS 26+). Combined with the ML-KEM hybrid key exchange added in build 34, Rootshell now has end-to-end post-quantum protection: ML-KEM secures the key exchange against harvest-now-decrypt-later attacks, while ML-DSA authenticates the server’s identity against forgery by a future quantum computer. Currently works with servers running OQS OpenSSH; Rootshell will be ready out of the box when upstream OpenSSH adds ML-DSA support.
Keyboard and Input
- Paste Button: The toolbar’s extra keys drawer now includes a clipboard paste button, so you can paste without a keyboard shortcut or gesture based context menu. Existing users get the button automatically via layout migration.
- Toolbar Shift Modifier: When Shift is active on the virtual keyboard toolbar, characters typed on the regular iOS keyboard are now shifted (a→A, 1→!, ;→:, etc.). Previously only the toolbar’s own keys respected the Shift state.
iOS Local Shell
- Windows ping Hint: Typing “ping -n <count>” (Windows syntax) now suggests the correct flag “-c” instead of “too many arguments” error.
Themes
- System Appearance Tracking: Day/night automatic theme switching now follows the system light/dark mode instead of using sunrise/sunset calculations and device location. This is more reliable and lets you control the switch from Control Center, Settings, or Shortcuts automations.
Fonts
- Smaller App Size: Replaced Nerd Font Mono patched fonts with unpatched originals, reducing bundled font size from 41 MB to 1.6 MB. Nerd Font symbols are already provided automatically by Ghostty’s built-in fallback font. Unused weight variants were also removed. Existing users are automatically migrated to the new font family names.
- Configurable Font Features: Font features (stylistic sets, slashed zero, etc.) are now user-configurable in Settings > Font Features, replacing the previously hardcoded ss01–ss08 and zero features. Enable or disable individual OpenType features per font.
- Font Preview: The font list preview text now reflects your enabled font features so you can see the effect.
Localization
- Hungarian: Added Hungarian (hu) as the 24th supported language.
- Extended translation coverage across all 24 languages with newly localized strings for font features, toolbar key names, iCloud sync status, and other UI elements.
Bug Fixes
- Fixed scrollback restore showing corrupted colors by resolving palette-indexed colors to RGB in the scrollback dump.
- Fixed toolbar modifier keys (Ctrl, Alt, etc.) not applying to custom drawer keys.
- Fixed cursor joystick icon in the toolbar keys editor not matching the actual toolbar button icon.
Version 1.0.2-35
February 23, 2026
Localization
- 23 Languages: The app is now localized into Arabic, Brazilian Portuguese, Catalan, Czech, Danish, Dutch, Portuguese, Finnish, French, German, Hebrew, Italian, Japanese, Korean, Polish, Romanian, Simplified Chinese, Slovenian, Spanish, Swedish, Traditional Chinese, Ukrainian, and Vietnamese.
Keyboard and Input
- Drawer Toggle Hiding: The drawer toggle button in the keyboard toolbar can now actually be hidden via Settings > Toolbar Keys.
macOS/iPad Menu
- Menu Reorganization: View-related items (font size, tab bar, background effect, theme picker, transparency) moved from the Terminal menu to the View menu per macOS Human Interface Guidelines. The Terminal menu now contains splits, Focus Split, scroll, and compose actions.
Bug Fixes
- Local Shell CWD Persistence (iOS): The local shell now restores your working directory when a session reconnects or the app relaunches instead of always resetting to the Documents folder.
- Background Notifications: Terminal notifications (OSC 9/777) now fire when the app is in the background. Previously they were suppressed whenever the terminal was focused, even if you had switched to another app, so long-running commands could not alert you. When the app is in the foreground, notifications only appear for non-focused tabs. On iPhone/iPad, Location Diary must be active for background notifications to fire.
Version 1.0.2-34
February 22, 2026
SSH
- Post-Quantum Key Exchange: SSH connections now negotiate mlkem768x25519-sha256 (ML-KEM + Curve25519 hybrid) as the highest-priority key exchange algorithm. This protects session traffic against future quantum attacks while maintaining classical security. Requires iOS/iPadOS 26+, macOS 26+, or visionOS 26+ because Apple CryptoKit only exposes ML-KEM on those versions; older OS versions fall back to curve25519-sha256 and diffie-hellman-group14. Requires OpenSSH 9.9+ or equivalent on the server.
Keyboard and Input
- Ctrl+Key via Toolbar Now (Hopefully) Uses Proper Key Encoding: The virtual keyboard toolbar’s Ctrl+key combinations now route through Ghostty’s full key encoding pipeline instead of manually encoding legacy control characters. This fixes keys like Ctrl+; and Ctrl+Shift+- that have no legacy mapping, and enables proper CSI u / kitty protocol encoding for all modified keys.
- Custom Key Editor UX: Sequence mode steps are now tappable to edit in-place instead of requiring delete-and-recreate. Quick-add buttons for Return, Tab, Escape, and Space let you build sequences without opening the full Key Combo picker.
- Custom Toolbar Key ESC Fix: Fixed custom toolbar keys whose sequences end with ESC (0x1B) being misinterpreted as Alt+key combinations in editors like Helix. Steps are now sent individually with a short delay after any ESC byte.
- Keyboard Dismiss in Settings: Scrolling now interactively dismisses the keyboard in all settings views with text fields. Number pad fields in Roam settings also gain a Done button.
Terminal
- Bundled Commands — bat and gix: Two new iOS local shell command-line tools are bundled with the app. bat provides syntax-highlighted file viewing with automatic paging (try
bat foo.swift). gix is a fast Git implementation written in Rust for repository operations. - Vim 9.2 Upgrade: Upgraded the bundled Vim from 9.1 to 9.2.0038 (471 upstream patches). Now built with the “huge” feature set, enabling termguicolors (24-bit color in themes like catppuccin), langmap, vartabs, and profiling. Includes updated syntax highlighting, indent rules, filetype detection, netrw/matchit plugins, and new documentation.
- curl Upgrade with HTTP/2: Upgraded bundled curl to 8.19.0 with HTTP/2 support via nghttp2 and OpenSSL. HTTP/2 enables multiplexed transfers and header compression for faster downloads.
- Scrollback Restore Timing: Fixed scrollback restore on remote sessions (SSH, Kubernetes, Console, Mosh, TSSH) sometimes capturing connection spinner animation artifacts. The restore now waits until the session reaches the running state.
Split Panes
- Split Focus Border Customization: New settings under Window > Split Panes to choose the focus border style (none/subtle/standard/bold) and color (accent/gray/custom).
macOS
- Split Pane Focus Border: Maybe fixed the blue pane-focus border incorrectly appearing on single-pane layouts due to a race condition between window key status changes and layout computation. Also suppresses the system UITextInput focus ring on macOS. Could never reproduce this myself, so fingers crossed.
Bug Fixes
- Roam Port Range Defaults: Clearing the port range fields in Settings > Roam now correctly restores the defaults (61000–61999) instead of silently retaining the last entered value.