Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
2424743
perf(terminal): idle-immediate PTY flush and bounded sniffers
gajendraxdev Sep 6, 2026
c266a76
perf(files): extract FileGrid sort and layout helpers
gajendraxdev Sep 6, 2026
5750e36
perf(files): virtualize File Manager list view
gajendraxdev Sep 6, 2026
ccb38e4
fix(files): stabilize list virtualization sort, scroll, and header gu…
gajendraxdev Sep 6, 2026
7fa63ae
perf(files): virtualize File Manager icon grid
gajendraxdev Sep 6, 2026
ae6b9fa
fix(files): reset Files scroll on navigate and gutter the icon grid
gajendraxdev Sep 6, 2026
ecdaefc
fix(files): rebuild icon-grid slots when cell size changes
gajendraxdev Sep 6, 2026
d62a980
build: enable thin LTO for release Rust
gajendraxdev Sep 6, 2026
e5c2254
fix(files): snappier File Manager, skip placeholder /, unclip icon grid
gajendraxdev Sep 8, 2026
40f3988
fix(files): fill icon-grid columns to the pane width
gajendraxdev Sep 8, 2026
e7334e6
fix(files): expand ~ before SFTP list instead of walking up to /
gajendraxdev Sep 8, 2026
1ed79d8
fix: CodeRabbit follow-up for sniffers, Files grid, and flush-stats
gajendraxdev Sep 8, 2026
84080c5
feat(release-notes): render images, GIFs, and video in What's New
gajendraxdev Sep 8, 2026
4d986dd
docs: note What's New media in Unreleased changelog
gajendraxdev Sep 8, 2026
d6ca46b
fix: CodeRabbit follow-up for What's New headings, UNC media, and wri…
gajendraxdev Sep 8, 2026
6212192
chore: bump version to 2.30.0
gajendraxdev Sep 8, 2026
c74342d
docs: add missing 2.30.0 changelog commit hashes
gajendraxdev Sep 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ jobs:
cargo test local_only
cargo test commands::private_key_inspection_tests
cargo test ssh::tests -- --test-threads=1
cargo test pty_output_flush
cargo test pty::tests

- name: Run ignored SSH security tests on Linux
if: matrix.platform == 'ubuntu-22.04'
Expand Down
29 changes: 27 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,15 @@ All notable changes to Zync are documented in this file. The format is based on

## [Unreleased]

## [2.30.0] - 2026-09-08

### Changed
- **Terminal output flush:** First PTY bytes after quiet go to the terminal immediately (typing echo no longer waits up to 8 ms). Busy output merges for a 12 ms burst, or sooner at 128 KiB. The live Channel frame is still generation + raw bytes. Debug: `localStorage.zyncTerminalIoDebug = '1'`. ([2424743], [d6ca46b])
- **Terminal sniffers:** Secret/cwd helpers scan at most the last 4 KiB of large PTY frames so `cat` does not regex the whole dump. The terminal still receives every byte. ([2424743], [1ed79d8])
- **File list and grid windowing:** File Manager list and icon grid only paint visible cells. Sort lives on FileManager so keyboard order matches the painted order. Grid arrows use the live column count instead of scanning the DOM. Folder loads no longer grayscale/scale the listing; recycled cells skip Radix tooltips and icon fade-in so scroll and clicks stay immediate. Icon-grid tiles use a fixed row height so the first row stays on screen and selected folders are normal-sized cards. ([c266a76], [5750e36], [ccb38e4], [7fa63ae], [ae6b9fa], [ecdaefc], [e5c2254])

### Added
- **What's New media**: Release notes show images, GIFs, and short videos inline (GitHub attachments, HTTPS `.gif`/`.png`/`.mp4` CDNs, and local files). A bare Demo URL is embedded instead of left as a link. Click an image to enlarge. GitHub alerts, `<kbd>`, and task lists render; HTML stays sanitized. ([84080c5], [d6ca46b])
- **Smooth splits**: New panes grow in (about 280ms) instead of jumping to 50/50 — keyboard split, split icons, drag-to-dock, and Open in split / Open here. A quiet accent veil marks the incoming pane. Drag-to-split preview eases between edges. Divider drag stays immediate (no laggy flex transition). `prefers-reduced-motion` skips the intro. PTY resize waits until the intro ends, same as a divider drag. ([2d3b7c8])
- **Scroll to resize a split**: Hover the seam and use the mouse wheel or trackpad to move it. Drag and arrow keys still work. PTY resize waits until scrolling settles, same as a divider drag. Ctrl/Cmd+wheel is left for zoom. ([2d3b7c8])
- **Files in split**: Open Files beside a shell in the same tab (folder button next to the split icons, or workspace **+ → Files in split**). Split icons and Ctrl+Shift+arrows still create a shell. Workspace **+ → Files** stays the full-view overlay. Closing the Files pane unsplits that leaf; the tab × still closes the whole group. Files counts toward the 4-pane cap and never replaces the last shell. ([2d3b7c8])
Expand All @@ -13,7 +21,9 @@ All notable changes to Zync are documented in this file. The format is based on
- **Open here in split**: Terminal **Open File Manager Here** is one row with **In a new tab** / **Left** / **Right** / **Bottom**. Files **Open Terminal Here** and **Follow with Terminal** use the same submenu. Split docks beside the current pane (not a stray new tab). ([2d3b7c8])

### Fixed
- **Files opening at `/`**: File Manager no longer treats `/` as home. Open File Manager Here uses the shell cwd (or a real `fs_cwd`), not the pre-connect placeholder. First open and reconnect do the same. On Windows, local home uses `%USERPROFILE%` instead of unset `HOME`. ([2d3b7c8])
- **Files opening at `/`**: File Manager no longer treats `/` as home. Open File Manager Here uses the shell cwd (or a real `fs_cwd`), not the pre-connect placeholder. First open ignores a shell cwd of `/` or `~` (SFTP cannot list a tilde) and expands to a real home instead of walking up to `/`. Reconnect keeps `/` when that listing already has files (hash button). Switching hosts clears selection and the open editor. On Windows, local home uses `%USERPROFILE%` instead of unset `HOME`. ([e5c2254], [e7334e6])
- **Icon grid right gap:** Grid columns fill the Files pane (no empty strip, no leftover 3-column layout in a wide window). Large folders re-render less while the shell cwd updates. ([40f3988])

- **Drag shell tab onto itself**: Dropping the current shell tab on its own split is a no-op again and restores Files / Dashboard / Snippets if the drag started from that overlay. ([2d3b7c8])
- **Open here after a tab switch**: Open File Manager Here / Open Terminal Here keep the tab that opened the menu, instead of applying to whichever tab is active after the await. ([2d3b7c8])
- **Files overlay vs Files pane**: The keep-alive overlay FileManager no longer steals focus or drives Follow-terminal while a Files pane is showing (and the reverse). ([2d3b7c8])
Expand Down Expand Up @@ -1369,7 +1379,22 @@ Partial draft: desktop builds, AppImage Wayland strip, and APT `2.25.4` publishe
[d3f4060]: https://github.com/zync-sh/zync/commit/d3f4060
[840afc2]: https://github.com/zync-sh/zync/commit/840afc2
[193f568]: https://github.com/zync-sh/zync/commit/193f568
[Unreleased]: https://github.com/zync-sh/zync/compare/v2.29.0...HEAD
[Unreleased]: https://github.com/zync-sh/zync/compare/v2.30.0...HEAD
[2.30.0]: https://github.com/zync-sh/zync/compare/v2.29.0...v2.30.0
[2424743]: https://github.com/zync-sh/zync/commit/2424743
[1ed79d8]: https://github.com/zync-sh/zync/commit/1ed79d8
[c266a76]: https://github.com/zync-sh/zync/commit/c266a76
[5750e36]: https://github.com/zync-sh/zync/commit/5750e36
[ccb38e4]: https://github.com/zync-sh/zync/commit/ccb38e4
[7fa63ae]: https://github.com/zync-sh/zync/commit/7fa63ae
[ae6b9fa]: https://github.com/zync-sh/zync/commit/ae6b9fa
[ecdaefc]: https://github.com/zync-sh/zync/commit/ecdaefc
[e5c2254]: https://github.com/zync-sh/zync/commit/e5c2254
[40f3988]: https://github.com/zync-sh/zync/commit/40f3988
[e7334e6]: https://github.com/zync-sh/zync/commit/e7334e6
[84080c5]: https://github.com/zync-sh/zync/commit/84080c5
[d6ca46b]: https://github.com/zync-sh/zync/commit/d6ca46b
[2d3b7c8]: https://github.com/zync-sh/zync/commit/2d3b7c8
[2.29.0]: https://github.com/zync-sh/zync/compare/v2.28.0...v2.29.0
[2.28.0]: https://github.com/zync-sh/zync/compare/v2.27.1...v2.28.0
[5181d5e]: https://github.com/zync-sh/zync/commit/5181d5e
Expand Down
1 change: 1 addition & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ Thank you for your interest in contributing to Zync. This document provides guid
npm run type-check
npm run tauri build
```
Release Rust uses thin LTO (`src-tauri/Cargo.toml` `[profile.release]`). `tauri dev` is unchanged.

4. Commit with clear, descriptive messages:
```bash
Expand Down
13 changes: 9 additions & 4 deletions docs/TERMINAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -211,11 +211,12 @@ Public surface exported from `index.ts`. Key modules:

| File | Responsibility |
|------|------|
| `src-tauri/src/pty.rs` | PtyManager: local spawn/read/write/resize/close; remote SSH reader; output batching (8ms / 4KB); explicit `child.kill()` on close |
| `src-tauri/src/commands.rs` | `terminal_create` (accepts output `Channel`), `terminal_write`, `terminal_resize`, `terminal_has_active_processes`, close variants |
| `src-tauri/src/pty.rs` | PtyManager: local spawn/read/write/resize/close; remote SSH reader; output flush via `pty_output_flush`; explicit `child.kill()` on close |
| `src-tauri/src/pty_output_flush.rs` | Idle-immediate + fixed 12 ms burst epoch + 128 KiB flush **threshold** (not max frame size). Process-wide flush-reason counters. |
| `src-tauri/src/commands.rs` | `terminal_create` (accepts output `Channel`), `terminal_write`, `terminal_resize`, `terminal_has_active_processes`, `terminal_flush_stats` (process-wide flush-reason snapshot; not on the output Channel), close variants |
| `src-tauri/src/ghost/*` | Ghost suggestion persistence, parser, ranking, Tauri commands |

**Output batching (remote & local):** `REMOTE_OUTPUT_BATCH_MS` / `OUTPUT_FLUSH_THRESHOLD` coalesce before sending to frontend channel.
**Output flush (remote & local):** `OUTPUT_BURST_EPOCH_MS` (12 ms **fixed epoch**, not a debounce) and `OUTPUT_BURST_FLUSH_THRESHOLD` (128 KiB — flush at least this soon while bursting, not a max frame size). First bytes after idle send immediately; later packets in the epoch accumulate; close/EOF/`output_rx` None always drain the tail. Frame layout is unchanged: `u32` LE generation + raw bytes.

**Resize (remote):** SSH resize channel drains to latest cols/rows (trailing coalesce).

Expand All @@ -230,6 +231,7 @@ Public surface exported from `index.ts`. Key modules:
- `terminal:resize` — cols/rows from unified resize scheduler
- `terminal:close` / `terminal:close_by_connection` — programmatic teardown (**no** `terminal-exit`)
- `terminal_has_active_processes` — local sysinfo child-tree probe
- `terminal:flush-stats` / `terminal_flush_stats` — process-wide flush-reason counters (`idleFirst` / `timer` / `threshold` / `close`). Debug only. Not on the PTY output Channel.

### Events (listen)

Expand Down Expand Up @@ -310,7 +312,9 @@ xterm.onData
[ u32 generation (LE) ][ raw PTY bytes... ]
```

Decoded in `terminalOutputStream.ts` → `term.write()` after generation check.
Decoded in `terminalOutputStream.ts` → generation check → sniffers → `term.write()` of the **full** frame.

Sniffers (secret prompt / prompt cwd) are reading aids. Frames ≤ 8 KiB are scanned in full. Larger frames scan only the last 4 KiB (`selectSnifferBytes`). A prompt is detected iff it appears in a ≤8 KiB frame or in that tail. `term.write` is never sliced (byte-exact xterm). OSC 7 cwd is parsed inside xterm, not these sniffers.

**Legacy:** `terminal-output-*` events removed. `terminalOutputPayload.ts` retains base64/array decode for older dev builds.

Expand Down Expand Up @@ -536,6 +540,7 @@ src/index.css # .terminal-container, xterm 6 viewport overrides

```
src-tauri/src/pty.rs
src-tauri/src/pty_output_flush.rs
src-tauri/src/commands.rs
src-tauri/src/ghost/
```
Expand Down
172 changes: 170 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading