Changelog
Release: v3.0.0
Features
- review: add full file view and font size scaling (ef7d71a2)
- ci: add compose-app release builds and module change detection (37aef5e9)
- compose-app: update foreground session service and notification handling (925180ef)
- extrakeys: port shift support and macro improvements to app (b9199a45)
- keyboard: add unconditional soft keyboard toggle on tap (0261e68e)
- terminal: Add IME composition delta tracking and remove resize debounce (e362764b)
- local: add startup command support for local terminal (355906bc)
- local-terminal: add local shell support with auto-navigate on session exit (280169d4)
- nav: migrate to Navigation 3 and add settings screen (162bb231)
- compose-app: forward touch as mouse events to terminal TUI, fix selection handles (84344377)
- terminal: port terminal rendering to dual-layer compose architecture (0e736fb5)
- keyboard: support Kitty keyboard protocol for Ctrl+Shift+Letter (60851c6e)
- ui: add option to use custom font in whole UI (aaf68ee7)
- build: upgrade project to AGP 9.3.0, Gradle 9.5.0, and compileSdk 37 (1cdec226)
- sftp: integrate compose-highlight syntax highlighting and upgrade Kotlin to 2.4.10 (d461d7d1)
- sftp: add git status indicators and in-app file viewer with syntax highlighting (f6f2e673)
- sftp: sort files alphabetically A-Z (277c6dbf)
- refresh workspace CWD dynamically on tab tap (aa8ec818)
- ssh: add native SFTP client, command execution and thread-safety fixes (c16b1373)
- workspace: add Review tab for workspace git status and diffs (41bad69e)
- browser: Add in-app browser tab and settings toggle (35d4c8da)
- service: add disconnect action button to SSH notification (7996cf79)
- service: open app on notification tap for SSH session (0432f7f4)
- compose-app: implement copy, paste, and context menu support (eea367d1)
- compose-app: add clickable link support to terminal view (d44219be)
- compose-app: Add custom fonts support (089e0d74)
- remove jvm ssh library and sftp explorer (ad1bdb63)
- terminal: add native SPSC ring buffer and SSH wakeup drain (c870b2d4)
- terminal: Sync terminal palette with Material You theme colors (add24a1e)
- theme: Add theme chooser and Material You dynamic color support (4a0b79b7)
- keyboard: support extra keys with settings UI and live preview (f30c86c2)
- dashboard: save and prepopulate last successful connection (bec6bb74)
- settings: prompt restart on custom option changes (ccbf2168)
- settings: add ui to edit custom ghostty fork features (8e6df277)
- right aligned tab bar (25329fcf)
- keyboard: store and pre-apply keyboard height to prevent layout flash on reopen (d7726895)
- tabs: Add configurable session tab bar position (b8d2ebd0)
- session tabs (e45d731e)
Fixes
- ci: include ci commits in changelog and build triggers (cfc6a18b)
- terminal: retain IME composition state across finish commands (363499c0)
- emulator: notify client on session finished for custom IO (b31174e4)
- terminal: prevent back key from sending ESC to terminal (39b31a11)
- ui: suppress deprecation warnings, fix Compose API deprecations, tune detekt threshold (27bcb75c)
- workspace: blank SFTP and Review tabs due to stale HorizontalPager composition (b2d4fa3c)
- theme: suppress RestrictedApi warnings for Hct color utilities (7f54bc7e)
- terminal: encode ESC as CSI 27u under kitty keyboard protocol (30a08f00)
- terminal: route scroll events at touch position for correct tmux pane targeting (1bf64975)
- terminal: restore Gboard spacebar swipe cursor tracking (33d7d0d3)
- compose: remove dead 'More' button from selection toolbar (0463473b)
- compose: dynamically position selection toolbar above or below text (7ed42461)
- compose: text selection handle drag and toolbar reappear after drag (71b4d87b)
- compose: resolve NullPointerException on scroll and enter key map in Compose interaction (d2cceda7)
- terminal: implement pinch-to-zoom scaling behavior in Compose canvas (464f31c8)
- terminal: wire extra keys controller to TerminalViewClient to fix modifier state reads (f796c2ee)
- terminal: resolve terminal flashing under high-throughput update sequences (2cccf1de)
- workspace: fix HorizontalPager NoSuchMethodError runtime crash (8144b218)
- workspace: prevent erratic tab jumping when refreshing workspace (77360852)
- make SFTP and Review panels follow workspace cwd (66748d5d)
- review: back button deselects file instead of refreshing (1b2ecb2e)
- review: resolve git repository root for relative path diffs (5abaacf2)
- browser: Allow cleartext HTTP traffic in WebView (b8a20f9c)
- browser: Resolve blank screen race conditions and add state persistence (6b6ca3c9)
- compose-app - ssh: Format file sizes and display timezone-aware last modified date (b16ed55a)
- compose-app - ssh: resolve active workspace and pane cwd using JSON parser (bc5fbbc0)
- compose-app - ssh: use JSON parser to resolve herdr workspace CWD and label (c37f97e4)
- compose-app - ssh: dynamically detect herdr workspace switch on tab selections (1bb1a4d8)
- compose-app - ssh: resolve herdr workspace name and pane cwd correctly (2d989703)
- compose-app - ssh: resolve pane cwd and workspace name at tab-switch time (b126eaa5)
- compose-app - ssh: default initial explorer directory to workspace cwd (0561ebb7)
- compose-app - ssh: save and restore last navigated directory per connection (c831d1b0)
- session: resolve sftp directory navigation stall by setting poll timeout (c7465192)
- compose-app - ssh: restore Material You dynamic color support (4caf9e95)
- compose-app - ssh: isolate tabstrip and terminalview using Scaffold and clipToBounds (13320e0b)
- compose-app - ssh: add support for opening remote files in external apps (8228e847)
- compose-app - ssh: resolve invisible tab labels and tabstrip layout gaps (195dc4f4)
- compose-app - ssh: resolve blank terminal tab and tabstrip color bugs (f2a5a20c)
- compose-app - ssh: resolve herdr CWD on SFTP Explorer tab click (e9878f8c)
- compose-app - ssh: fix tab bar colors invisible on dark themes (3c6d6422)
- compose-app - ssh: remove folder FAB, use tabs only for SFTP navigation (7c40089e)
- ssh: serialize libssh2 session calls with session_lock mutex (875e39b7)
- compose-app - ssh: restore one-shot modifier auto-clear on extra keys (c4cdb4b4)
- compose-app - ssh: fix extra keys lag and touch/swipe latency (694ab078)
- compose-app - ssh: fix terminal lag during rapid output animations (6c4a5aea)
- compose-app - ssh: resolve zlib cross-compilation when targeting Android (8fd7f461)
- compose-app - ssh: pass xterm-ghostty term type when herdr integration is toggled (f6cfd040)
- compose-app - ssh: implement Herdr notification integration and auto-launch (eb4e06fb)
- renderer: Draw default background when reverseVideo is false (c3679e3a)
- emulator: Proactively request full snapshot refresh when UI update is pending (511fd2b8)
- ssh: set locale env vars on remote before starting shell (848f404b)
- compose-app - ssh: add support for terminal protocol notifications (e0b14ba4)
- compose-app - ssh: Prevent stale release callback from clearing active terminal view (b1d05fbe)
- ci: push version bump to current branch instead of hardcoded master (f6bd8a3e)
- ssh: return to main screen when native ssh shell session exits (4d5ecf20)
- terminal: correct cursor y coordinate offsets using line spacing and ascent (33dd34fc)
- compose: stabilize terminal view size and prevent stale references (50227051)
- terminal: Implement PTY resizing for native libssh2 SSH piping backend (bad1b7a2)
- terminal: Resize SSH window on initial custom IO terminal backend creation (63f41bbd)
- keyboard: ensure sequential ssh writes and direct code point translation for macros (7d261b0d)
- keyboard: add proper macro support for extra keys like 'CTRL b n' (d803a730)
- terminal: fix sizing issues and connection close crashes during interactions (6e32139e)
- terminal: prevent crash-back-to-dashboard on resize and use layout listener for sizing (042d2fcf)
- terminal: resolve black screen and bind foreground service (01ad9161)
- bubble: pre-apply keyboard height in onCreate and delay keyboard restore to prevent size flicker (90a4cad7)
- keyboard: prevent IME show cancellations by not overriding IME visibility state in pre-applied insets (a14eaa6c)
- terminal: ignore session resizes when view window is invisible (01fce690)
- ci: enable split APKs for GitHub release builds (ab1ca784)
- theme: black theme preserves wallpaper-derived colors (16f46367)
- build: ensure bootstrap download runs before native build in release (79e4a32b)
Updates
- sdk: update nix android sdk path (772646f0)
- add ktlint and detekt to compose-app module (e3bb3fdf)
- flake: add Android SDK platform 37, bump android-nixpkgs (428286f8)
- browser: switch default home/search engine to DuckDuckGo (f63ef6c2)
- agents: Do not commit plans to the repository (0652f050)
- deps: update libghostty to commit 73534c4 (e390dd60)
- compose-app: upgrade Conscrypt dependency to 2.6.0 for 16kb page alignment (940186fc)
- gitignore: ignore local .android directory (ce719692)
- terminal: Disable native piping and switch back to JVM library backend (5886f20b)
- compose: persist terminal zoom level on scale gesture (97bc42e9)
- compose: use legacy default zoom calculation (7bd00946)
- build: finalize compose-app module and terminal size listener configuration (896b3e50)
- skills: add Jetpack Compose migration skill (765d206c)
- debug: add inset adjustment logs to TermuxActivityRootView and BubbleSessionActivity (355c0bd3)
- debug: add size and PTY update logs to diagnose TUI re-renders (ab0df185)
- keyboard: pre-apply remembered keyboard height in bubble views as well (4a8b1635)
- keyboard: reset pre-applied keyboard height status on visibility and configuration change (19e6dcb5)
- Material You: runtime reloading (c3c2782a)
- add release workflows, migrate to Nix, remove redundant workflows (994856c5)
UI Changes
- compose-app: Add disconnecting progress indicator and clean up workspace back handling (b7490404)
- review: add syntax highlighting to diff viewer (af975239)
- review: remove redundant header and action buttons from diff viewer (1c7f577f)
- review: scale line number column width dynamically based on digit count (e34bd444)
- review: add line numbers and horizontal scrolling to diff viewer (bda9a098)
- browser: Move control/address bar to the bottom of the screen (cac212fd)
- keyboard: Style extra keys toolbar background and buttons (679c7f96)
- extrakeys: style toolbar background and buttons according to material 3 (c57fc57d)
- compose-app: add custom launcher icon (92bf1b50)
- dashboard: Add toggle for native libssh2 piping in dashboard screen (0166802d)
- dashboard: add terminal font size settings card (fbe026fe)
- manifest: configure MainActivity softInputMode to adjustResize (0d835297)
- terminal: fill available space and add pinch-to-zoom (7e530daa)
- tabs: reverse tab order when right-aligned (5557a3f7)
- material you themeing support (aac2f2ac)
Refactoring
- MainViewModel: split into ServerCoordinator, UserPrefs, NotificationState (6120b366)
- compose-app: implement multi-server architecture (7c5d765f)
- terminal: replace BasicTextField sentinel hack with direct TextInputService (9494c3a5)
- compose: migrate view wrapper to native compose interaction layer (ce63851c)
- workspace: modularize workspace screen and lazy load browser (4ec3d4a7)
Performance
- back: one-press back to hide keyboard and navigate on API 33+ (17c9129a)
- ssh: consolidate native SSH loop into a single thread, drop session_lock (3a523208)
- terminal: direct native write for keystrokes, cleanup input handling (52aa824e)
- terminal: optimize keystroke writes and support spacebar cursor control (ac4729d6)
- terminal: replace AndroidView with Compose Canvas renderer (9b0d16a6)
- browser: Persist WebView instance to avoid page reload on tab switch (ac9671f3)
- ssh: enable zlib compression for channel data (a7fa0926)
- compose-app: reduce APK size via R8 minification and JNI optimizations (97843ceb)
- native: Offload FNV-1a content hash calculation to Zig (4d5ef22a)
- snapshot: use contiguous field layout for bulk NIO deserialization (b16e33dc)
- terminal: debounce terminal resizes to prevent intermediate SIGWINCH re-renders (16c276ef)