aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAge
...
* hotfix: fix flaky ci testsAram Drevekenin2026-06-16
|
* chore: new test infra (#5269)Aram Drevekenin2026-06-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * initial implementation * refactoring and cleanups * port basic e2e tests * fix tab rotation * migrate client and mouse tests * migrate the rest of the tests * remove old e2e tests * rustfmt * add e2e note * fix stale test * fix: cross platform locking/cleanup * fix: change mode race discovered by tests * rustfmt * fix: attach/detach race in tests * fix plugin test assertion * add pr
* Mobile layout (#5241)Aram Drevekenin2026-06-10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * phase 2+3 * initial mobile plugin (phases 4 + 5 + 6) * some bugfixes * implement stage 7 * mobile interface improvements * improve mobile pane/tab picker * more ui improvements and fixes * various mobile fixes * some mobile fixes * mobile keyboard triggering fix * some cleanups * initial plugin keyboard implementation * improve keyboard hit zones * improve keyboard * pinch resize * pinching fixes * implement scrolling + panning * initial keyboard resizing * fix: mobile first render issues * keyboard responsiveness * fix some issues with the keyboard * implement fit * fix mobile scrolling * add tilde cell to compact * improve mobile keyboard * fix starting mobile terminal font to natural keyboard size * fix mobile resize blank screen flash * shadow focus for mobile * more keyboard fixes * improve mobile status bar * fix: render plugins to mobile clients * allow opening new panes/tabs from the mobile plugin * allow configuring * fix dot slash * improve mobile native soft keyboard interaction * switch to native keyboard - initial implementation * dirty hacks, but phone keyboard works now * adjust keyboard help strip * fix cursor in mobile * fix keyboard and help line * rename keyboard to modifier bar * allow starting new session * make clicking session name bring us to new session menu * allow switching to desktop from the mobile ui * mobile welcome screen initial implementation * mobile welcome screen fixes * various welcome screen fixes * more mobile fixes * moar mobile fixes * mobile ui redesign * fix: swallowed backspace bug * switch session screen improvement * touch up some interfaces * refactor: move mobile state to own struct * refactor: move fit resizing to the server * remove dead flash code * some cleanups * refactor: clear fit on close * refactor: improve fit api * refactor: pane sync functions * refactor: mouse * refactor: break into modules * some cleanups for the sessions screen * fix scrolling and other stuff * refactor: sessions screen * refactor: panes screen * refactor: new session screen * refactor: menu screen * refactor: render * cleanups * refactor: plugin structure * remove unused welcome screen path * Rename api * refactor input.js * cleanup useless comments * fit/mobile refactoring * take out the garbage * remove more comments * remove mobile flash on startup/attach * fix: various mobile startup issues * fix space bugs * cleanup * rustfmt * fix windows build * adjust modifier bar ui * add pr
* feat: PWA support for the web client (#5184)Robert Jin2026-06-01
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * feat: PWA support for the web client Adds Progressive Web App support so the Zellij web client can be installed as a standalone app via Chromium/Firefox/Safari/iOS. - New static asset `zellij-client/assets/manifest.webmanifest` with required W3C members (name, start_url, scope, display, icons). All path-bearing fields are relative to the manifest URL so a single static file works under any reverse-proxy base_url prefix without runtime templating. - New icon set under `zellij-client/assets/`: icon.svg (vector), icon-192.png and icon-512.png (purpose "any"), and icon-maskable-512.png (purpose "maskable") rendered at 70% of canvas height on a #080317 backdrop so Android adaptive masks honour the W3C 80%-diameter safe zone. - `scripts/render-pwa-icons.sh` pins the rendering toolchain (librsvg + ImageMagick) and the maskable safe-zone geometry so re-renders are reproducible. - `.webmanifest` -> `application/manifest+json` mapping added to `get_mime_type` in `zellij-client/src/web_client/utils.rs`. - `index.html` gains <link rel="manifest">, apple-touch-icon, and apple-mobile-web-app-* meta tags. Placed immediately after the existing favicon link and before any <script> tag so the manifest is in the browser's preload scanner early. - 5 new tests cover Content-Type, required JSON members, the relative-URL contract, index.html references, icon reachability, and base_url invariance. Closes #5094. * update changelog with pull url * feat(web): trim PWA icon set to PNGs only Drops the duplicate `zellij-client/assets/icon.svg` (verbatim copy of `assets/logo.svg`) and the maskable PNG variant from the manifest. Net result is the minimal icon set most production PWAs ship: icon-192.png and icon-512.png. - `icon.svg` was redundant with the canonical `assets/logo.svg` at the repo root and offered no install-criterion benefit on top of the 192/512 PNGs. - `icon-maskable-512.png` only benefits Android Chrome installs (desktop browsers and iOS ignore the maskable purpose). The Android win was small for the hexagonal Zellij glyph; a hand-tuned maskable can be added in a follow-up if Android installs need polish. `scripts/render-pwa-icons.sh` now reads from `assets/logo.svg` directly instead of the duplicate copy. * feat(web): use existing assets/logo.png as the PWA icon Removes the pre-rasterized 192/512 PNG variants and the render script in favour of serving the canonical `assets/logo.png` via a small dedicated handler. The repo's existing logo becomes the single source of truth; the PWA picks up logo changes automatically with no re-render step. - `LOGO_PNG` static is loaded via `include_bytes!` from the repo root, mirroring how `WEB_CLIENT_PAGE` reaches `assets/index.html`. - New `serve_logo_png` handler is registered at `/assets/logo.png` before the `get_static_asset` wildcard. axum's matchit router gives literal paths precedence, so the explicit route always wins. - Manifest declares a single icon entry at the actual file dimensions (2269x2620). Browsers letterbox onto square launcher surfaces, the same way they do for the existing favicon. - `apple-touch-icon` retargets to `assets/logo.png`. - `test_pwa_icon_assets_reachable` collapses to a single case. - `scripts/render-pwa-icons.sh` and the rendering toolchain (librsvg + ImageMagick) are no longer needed. * feat(web): drop redundant apple-mobile-web-app meta tags The three `apple-mobile-web-app-*` meta tags are backward-compat scaffolding for iOS < 16.4: - `apple-mobile-web-app-capable: yes` — iOS 16.4+ reads `display: standalone` from the manifest. - `apple-mobile-web-app-title: Zellij` — iOS 16.4+ reads `short_name` from the manifest. - `apple-mobile-web-app-status-bar-style: default` — explicitly sets iOS's default status-bar behaviour, i.e. a no-op. iOS 16.4 shipped in March 2023; the cohort still on iOS 15 is essentially devices stuck on the iPhone 6s / 7 / SE 1st gen line (2015-16 hardware), which is not the zellij audience. `<link rel="apple-touch-icon">` is kept because iOS still ignores manifest `icons` entries and reads only that tag for the home-screen icon on every iOS version. * feat(web): restore square pre-rasterized PNG icon for installability The earlier swap to serving `assets/logo.png` directly fails Chromium's PWA installability gate: the logo is 2269x2620 (not square), and Chromium specifically requires "an icon at least 144 pixels square" -- a non-square icon is rejected even though the declared `sizes` covers the dimension threshold. DevTools' Application -> Manifest panel was misleading: it parsed and displayed the icon, but installability is a separate stricter check. This walks the swap back to a single committed 192x192 square PNG (`icon-192.png`) rendered from `assets/logo.svg` with the logo composited onto a transparent square canvas. The PNG is served by the existing `get_static_asset` route via `include_dir!`. The `LOGO_PNG` static, `serve_logo_png` handler, and dedicated `/assets/logo.png` route are dropped. apple-touch-icon retargets to icon-192.png (closer to iOS's preferred 180px home-screen size). Net effect on the diff: ~13KB committed PNG + a single icon entry in the manifest, in exchange for actually meeting the installability criterion. * style: rustfmt --------- Co-authored-by: Robert Jin <robert.jin@gresearch.co.uk> Co-authored-by: Aram Drevekenin <aram@poor.dev>
* docs(changelog): update releaseAram Drevekenin2026-05-13
|
* fix: stale grid after forwarding host reply (#5163)Aram Drevekenin2026-05-12
| | | | | * fix: stale grid after forwarding host reply * add pr
* fix: clear bell when focusing with mouse (#5161)Aram Drevekenin2026-05-12
| | | | | * fix: clear bell when focusing with mouse * add pr
* Welcome screen del fix (#5160)Aram Drevekenin2026-05-12
| | | | | | | * fix: session-manager delete * rustfmt * add pr
* docs(changelog): update permissions prAram Drevekenin2026-05-12
|
* fix(plugin): require specific permissions for new tab panes (#5143)mookim.eth2026-05-12
|
* docs(changelog): session manager close prAram Drevekenin2026-05-11
|
* Fix session-manager Esc/Ctrl-c to close plugin instead of hiding (#5055)cossio2026-05-11
|
* Fix esc mouse (#5157)Aram Drevekenin2026-05-11
| | | | | | | * fix: alt esc regression * rustfmt * add pr
* fix(webclient): handle host query responses for pixel dimensions and colors ↵Aram Drevekenin2026-05-11
| | | | | | | | | (#5156) * fix(webclient): handle host query responses for pixel dimensions and colors * rustfmt * add pr
* fix: deadlock with blocking panes (#5152)Aram Drevekenin2026-05-08
| | | | | | | * fix: deadlock with blocking panes * rustfmt * add pr
* fix: occasional stall when querying host terminal (introduced in 0.44.1) (#5149)Aram Drevekenin2026-05-08
| | | | | | | * fix(client): unwedge termwiz on unrecognized CSI sequences * rustfmt * add pr
* fix(windows): bump windows-sys to 0.59 (#5139)divens2026-05-06
| | | | | | | | | | | | | | | | | The workspace `windows-sys` constraint was pinned to 0.52 while the Windows source uses APIs and namespaces from 0.59 (e.g. WriteFile in Win32::Storage::FileSystem). CI built fine because Cargo.lock pinned 0.59, but downstream `cargo install`/`cargo binstall` did fresh resolution and selected 0.52, breaking the build for users on Windows. Align the manifest with the code: - Bump workspace dep `windows-sys` from 0.52 to 0.59. - HANDLE is now `*mut c_void` instead of `isize`: replace `handle == 0` / `!= 0` with `is_null()`, initialise HANDLE locals with `std::ptr::null_mut()`, and pass `null_mut()` as the hTemplateFile argument to CreateFileW. - Pass the process HANDLE through the exit-monitor thread as `usize` (raw pointers are not Send; OS handles are safe to use cross-thread). - Note: HPCON is still `isize` in 0.59, so its zero-init is unchanged.
* Independent tab sizes (#5133)Aram Drevekenin2026-05-05
| | | | | | | * feat: allow independent tab resizing * rustfmt * add pr
* bump changelog after releaseAram Drevekenin2026-05-05
|
* fix: when publishing, publish current branch rather than hardcoded main (#5127)Aram Drevekenin2026-05-04
| | | | | * fix: when publishing, publish current branch rather than hardcoded main * add pr
* Fullscreen resize fixes (#5117)Aram Drevekenin2026-05-01
| | | | | | | * fix: properly handle resize while pane is in fullscreen * fix: re-update fullscreen after closing editor pane * rustfmt
* fix: buffer pty processing while waiting for host query reply (#5113)Aram Drevekenin2026-04-30
| | | | | | | * fix: block pty byte processing while waiting for host terminal reply * rustfmt * add pr
* fix(windows): stop reusing terminal pane ids (#5082)Simoyd2026-04-29
| | | Prevent late ClosePane events from closing newly spawned panes by making Windows terminal IDs monotonic. This matches the Unix backend and avoids stale pane-id collisions after a pane is closed and reopened.
* Update CHANGELOG.mdAram Drevekenin2026-04-29
|
* fix: incorrect interpretation of unicode keys (#5110)Ivan Smoliakov2026-04-29
|
* Implement DECQRM for CSI2031 (#5111)Aram Drevekenin2026-04-29
| | | | | * implement DECQRM for CSI2031 * add pr
* Support CSI2031 (dark/light theme switching) + remove STDIN cache to avoid ↵Aram Drevekenin2026-04-28
| | | | | | | | | | | | | | | | | | | | | | | | | | | stale color queries (#5105) * initial phase 1 implementation * various fies * some fixes * fix fragmented stdin cases * some fixes * renaming * guard against old clients * implement csi 2031 * allow toggling theme with actions * rustfmt * fix: finalize trailing characters in ansi parser as well * add pr
* upgrade rustls-webpki (#5106)Aram Drevekenin2026-04-28
|
* docs(changelog): duplicate char fixAram Drevekenin2026-04-22
|
* fix(web-client): prevent IME input text repetition (#4975)TMY2026-04-22
| | | | | | | | | | | | | | | | | | | | | | | * fix(web-client): prevent IME input text repetition Fix bug where composing multi-character strings via IME (e.g. Chinese input method) would write the entire string N times for N characters. Previously, parse_stdin sent the entire input buffer as raw_bytes for each KeyEvent parsed from that buffer. When IME composes "你好" (2 chars), InputParser creates 2 KeyEvents, but both carried the full "你好" bytes, causing it to be written twice. Now, when multiple events are parsed from one buffer, each Char KeyEvent carries only its own UTF-8 bytes. Single-event buffers (most ASCII input) remain unchanged. Fixes #4974 * fix: guard per-char raw_bytes with modifiers check Only use per-character UTF-8 encoding for unmodified Char events in multi-event buffers. Modified keys (e.g. Ctrl+C) retain the original buffer to preserve correct VT bytes. Also clarify the comment. * test(web-client): cover IME raw byte handling * rustfmt --------- Co-authored-by: Aram Drevekenin <aram@poor.dev>
* fix: lost web characters (#5080)Aram Drevekenin2026-04-21
| | | | | * fix: lost web characters * add pr
* fix: kitty keyboard restore on error path + 2026 DECRPM state 3 handling (#5058)Thomas Linford2026-04-20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * fix: kitty keyboard cleanup on error path + 2026 DECRPM state 3 handling lib.rs: handle_error now exits kitty keyboard protocol (ESC[<1u) before printing the backtrace, matching the normal exit path. Previously the kitty keyboard mode was left active on crash, corrupting subsequent terminal input. stdin_ansi_parser.rs: synchronized_output_from_bytes now treats DECRPM state 3 (permanently set) as enabled, matching states 1 and 2. State 3 is a valid "supported and on" response that was previously falling through to None (treated as unsupported). * docs: update changelog * refactor(client): unify terminal teardown/setup sequences - Extract named constants for all terminal escape sequences - Add terminal_teardown_message() helper used by all three exit paths, fixing several pre-existing inconsistencies in the process: - handle_error was missing RESET_STYLE and SHOW_CURSOR - remote client had kitty keyboard exit after EXIT_ALTERNATE_SCREEN instead of before - goodbye path had goto positioned in the alt screen before exit - RESET_STYLE/SHOW_CURSOR are now sent after EXIT_ALTERNATE_SCREEN so they take effect in the normal screen - Replace write() with write_all() throughout; drop redundant let _ = on unwrap() calls * docs: update changelog
* Some idle CPU and disk/io fixes, new CommandChanged plugin Event (#5063)Aram Drevekenin2026-04-17
| | | | | | | | | | | | | | | * initial implementation * fix mouse cpu spam * prevent excess metadata write and prune sessions on startup * consolidate CommandChanged and PaneCommandChanged * tests * rustfmt * add pr
* fix(windows): skip modifier re-encoding for Char keys in cast_crossterm_key ↵divens2026-04-15
| | | | | | | | (#5014) PR #4967 added VT modifier encoding for non-Char keys but the guard condition also matched Char keys, re-encoding Ctrl+C from [0x03] to CSI u sequence \x1b[3;5u which shells don't understand. Skip the encoding block for Char keys since they already handle modifiers.
* bump development versionAram Drevekenin2026-04-08
|
* fix(ci): pin WiX CLI to v6.0.2 to avoid v7 OSMF EULA gate (#5012)divens2026-04-07
| | | | | | WiX v7 introduced a mandatory EULA acceptance that breaks unattended CI builds. Pin the dotnet tool install to 6.0.2 to match the extension. Co-authored-by: divens <divens.dev@gmail.com>
* HOTFIX: remove riscv as it's breaking the releaseAram Drevekenin2026-04-07
|
* chore(release): v0.44.1Aram Drevekenin2026-04-07
|
* Minor fix before patch version (#5011)Aram Drevekenin2026-04-07
| | | | | | | * bump patch version * fix: preserve row background when scrolling * add pr
* docs(changelog): osc52 report prAram Drevekenin2026-04-07
|
* feat(zellij-server): report OSC 52 clipboard support over DA1 (#4545)Michael Hoang2026-04-07
| | | | | | | As Zellij always handles OSC 52 from inner programs and then forwards it appropriately (`copy_command`, `copy_clipboard`), I think it makes sense to unconditionally report OSC 52 support. Co-authored-by: Michael Hoang <enzime@users.noreply.github.com>
* Fix pty race when opening new panes (#5010)Aram Drevekenin2026-04-07
| | | | | | | * fix: race condition when starting panes * rustfmt * add pr
* docs(changelog): underline reset fixAram Drevekenin2026-04-06
|
* fix(ansi): reset bold should not entail reset underline (#4962)Kószó Attila2026-04-06
| | | Co-authored-by: kazimazi <attila.koszo.official@gmail.com>
* docs(changelog): update --name prAram Drevekenin2026-04-06
|
* fix: respect --name flag when creating new panes (#4979)divens2026-04-06
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * fix: respect --name flag when creating and renaming panes Three issues fixed: 1. Pane creation: --name was silently discarded for default shell panes because use_terminal_title was true. Now user-provided names take priority. Also pass initial_pane_title as pane_name to TerminalPane constructor (was hardcoded to empty string). 2. CLI rename without --pane-id: was routed through PaneNameInput which appends to existing name. Now uses a dedicated RenameActivePane action that fully replaces the name, working for any name length including single characters. 3. Interactive rename: entering rename mode preserves the existing name for editing (append/backspace). Esc reverts to the name before rename mode was entered. Adds 28 tests covering rename semantics, interactive editing, undo, OSC title interaction, and a wire-level IPC round-trip test. * refactor: route active-pane rename via Option<PaneId> Replace the dedicated Action::RenameActivePane variant with an Option<PaneId> on the existing Action::RenamePaneByPaneId. route.rs dispatches None to the server-internal ScreenInstruction::RenameActivePane and Some(id) to the existing RenamePaneWithPaneId path. Drops all proto/conversion boilerplate for the removed variant: plugin API additions, IPC tag 137, and both directions of the wire conversion. --------- Co-authored-by: divens <divens.dev@gmail.com>
* docs(changelog): update recent PRsAram Drevekenin2026-04-03
|
* fix: position host cursor for CJK IME even when app hides cursor (#4951)Satoru Higa2026-04-03
| | | | | | | | | | | | | | | | | | | | | * fix: position host cursor for CJK IME even when app hides cursor When apps like Claude Code (ink/React library) hide the cursor during rendering, Zellij's render_cursor() was not sending a CUP sequence to the host terminal. This caused IME composition candidates to appear at the wrong position, breaking CJK input in these apps. Change cursor_coordinates() to return the cursor position unconditionally (as long as it is within bounds) along with a bool indicating visibility. render_cursor() now positions the host cursor even when the app has hidden it, so the IME subsystem can read the correct cursor position. * add test * rustfmt --------- Co-authored-by: Aram Drevekenin <aram@poor.dev>
* fix(windows): encode modifiers in raw bytes for non-Char keys (#4967)divens2026-04-03
| | | | | | | | | | | | | | | | On the native console input path, crossterm captures modifier flags from INPUT_RECORD but the raw bytes written to the PTY don't include them. This causes inner applications to never see ALT, SHIFT, or CTRL modifiers for keys like Enter, Tab, Backspace, arrows, and function keys. Encode modifiers using standard VT conventions: - Simple keys (Enter, Tab, Backspace): ALT uses ESC prefix, other modifiers use CSI u encoding - CSI letter-final keys (arrows, Home, End): xterm modifier parameter - CSI tilde keys (PageUp, Delete, F5+): modifier before tilde - SS3 keys (F1-F4): convert to CSI with modifier Co-authored-by: divens <divens.dev@gmail.com>
* fix(web-client): use base URL when switching sessions (#4981)TMY2026-04-02
| | | | | | | | | | | | | | | | | | | | | | | | * fix(web-client): use base URL when switching sessions Session switch redirected to /{session_name} instead of {base_url}/{session_name}, breaking reverse proxy setups. Use getBaseUrl() to construct the redirect URL, consistent with how auth.js and connection.js already handle base URL. Fixes #4980 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(web-client): encode session name in redirect URL Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: update changelog --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Thomas Linford <linford.t@gmail.com>