Repository navigation
Releases: Bokjan/ZShell
Releases · Bokjan/ZShell
Release list
ZShell v3.16.1
Urgent Bug Fixes
- A tab in the background with new output is marked again by a ring around its status dot, rather than a block of color over its title. Introduced in 3.15.0.
- The menus side by side in the settings (the cursor style, the log format and how long logs are kept) are drawn like the other menus, rather than as gray buttons. Introduced in 3.10.0.
v3.16.0
Features
- The file panel goes back and forward through the folders it showed, including those it went to while following the terminal: with its new back and forward buttons, the mouse's side buttons, Cmd+[ / Cmd+] on macOS or Alt+Left / Alt+Right elsewhere. A folder that turns out to be gone is left out of the history, and listing a folder that doesn't exist says so. Its toolbar is rearranged: back, forward, up, refresh and the path on the first row; upload, new folder, the filter, hidden files and the terminal's folder on the second.
- Letter and punctuation shortcuts are on the keys labeled so on every keyboard layout (AZERTY, QWERTZ, Dvorak, Japanese), as in other apps; where a layout types no Latin letters (Russian), they stay where they are on a US keyboard. The macOS menu bar no longer moves its shortcuts to other keys on some layouts. Outside macOS, panes are also split with Ctrl+Shift+S (right) and Ctrl+Shift+D (down); Alt+Shift+= and Alt+Shift+- still work.
Bug Fixes
- Splitting a pane or duplicating a tab on a connection whose file panel had been opened no longer freezes the app. Introduced in 3.14.0.
- On Windows and Linux, dragging files out of the window while a terminal on the same connection prints a lot no longer freezes every window for up to two minutes and fails the drop.
- A server that keeps the connection up but never answers opening an SFTP channel no longer leaves the file panel and transfers on that connection waiting for good: after 30 seconds of waiting for the server, the operation fails and the next one tries again. Channels given up on are closed rather than left open at the server.
- On Windows, while the title bar's window menu (a right click or Alt+Space) is open, typing, resizing and busy terminals in every window no longer wait for it to close.
- A session log no longer silently stops being written after two reconnections while the previous connection was still finishing writing it, to a slow or network drive for example; such a log also couldn't be cleaned up or deleted until a restart, and quitting waited for it. Introduced in 2.5.4.
Internal
- Starting a session no longer runs its backend's first step while holding the lock that every keystroke and resize takes, so a fault there can no longer freeze every window.
ZShell v3.15.0
Features
- While the terminal is scrolled back, output that arrives below no longer goes unnoticed: a button at the bottom of the pane counts the new lines and scrolls back to the end, and screen readers are told once. Lines a program draws over (a progress bar, a prompt being redrawn) aren't counted until it writes a new one. Once the scrollback is full and new output starts removing the lines being read, a notice at the top of the pane says so and where to keep more lines.
- When an internal error ends the app, a line about it (the time, the version and system, the thread, where and the message) is added to
crash.login the configuration folder, so there is a record of why it closed, also on Windows. The file starts again past 64 KiB, and the privacy policy says so.
Bug Fixes
- A password, passphrase or verification code prompt, or a wait for a Duo push, no longer keeps a CPU core busy until it is answered. The update of russh this comes with also fixes its handling of unbounded EXT_INFO messages and of a peer declaring a zero maximum packet size.
- A click outside a dialog no longer answers a confirmation (overwriting or deleting files, deleting sessions, closing a window) with Cancel or throws away what was typed in a form; as in native dialogs, it closes only the command palette, the settings, the known hosts and the licenses. While a dialog saves or applies something, it can't be closed or cancelled, so its outcome or error is never lost.
- The terminal's scroll bar no longer stays shown while the pointer is anywhere over the terminal: it shows while the view scrolls, while the pointer is on its strip or while its slider is dragged, and fades out half a second after scrolling stops. Output arriving below the lines being read back doesn't show it either.
- Cancelling a transfer takes effect at once even while it waits behind a large download on the same connection, lists folders or creates an upload's folders. A cancelled download no longer leaves folders open at the server for as long as the connection lasts.
- A large file always leaves one of the connection's transfer slots to small files, also with several large files waiting, so a drag or a file opened in an editor no longer waits for large downloads to end.
- A folder of files dragged out of the window shows as fully done once its files have arrived, instead of sometimes staying at "0 of 300 files".
- On Windows 10, making a local terminal narrower no longer shows lines twice or garbled: the terminal is told which Windows build its ConPTY comes with.
- With a long scrollback, a terminal's columns follow a resize once it pauses also while a full-screen program such as vim, tmux or less runs.
- A window opened after installing a font that was missing from the font list forms that font's ligatures, rather than those of the next font in the list, without restarting the app.
- Splitters for panes, the side panel and the sidebar stop following the pointer when the mouse button is released outside the window, instead of going on until the next click while the terminals ignored the mouse.
- Holding a number field's arrow and then switching apps from the keyboard no longer keeps stepping to the end of its range.
- A forwarding rule's auto-start tag sits under its kind, cut short with an ellipsis and explained in its tooltip, so the mappings stay lined up and every rule has the same height in every language.
Performance
- Downloading many items is much faster: those dragged out of the window are downloaded together rather than one by one (500 small files from a distant server took minutes), and the items chosen are looked up at the server all at once rather than twice each, one after another, which made 500 files wait over a minute before the first byte. Deleting what an upload created removes a level of folders at a time.
- Resizing the window or a splitter no longer rewraps a long scrollback on every frame: the rows follow at once, and the columns of a terminal with more than 200 lines once the resizing pauses, as in VS Code.
- Moving a tab to another window no longer freezes both windows for a moment with a long scrollback: its screen is handed over through the backend instead of in an event.
- Pasting a few MiB into a local shell or serial line no longer copies gigabytes of memory, and Telnet passes on up to 64 KiB of output at once, like the other connections.
- Long lists render less: the file panel and session list no longer render every row on each progress update, keystroke in the search field or move of the sidebar's edge, rows no longer each listen for the language, and a terminal no longer renders again whenever its title or progress changes.
- Work that a network drive could hold up no longer stalls other sessions or tabs: finding where a downloaded file goes and a free name for it, looking at session log files, and clearing the folders of earlier drops when a drag out of the window starts. Importing sessions no longer holds up saving or unlocking in other windows.
- The app does less while idle: the traffic lights' text is worked out every 10 seconds while nothing moves, the app lock checks the idle time once a minute while it can't lock, a session log's writer sleeps while there is nothing to write, a closed tab's session no longer sends output to the window, and windows opened later reuse the font's ligature rules.
Internal
- Large modules are split into parts that stand on their own: SFTP uploads and downloads, how a transfer ends and what its undo deletes, the SSH module's tests, and how a pane follows its session. The terminal view's main effect is split into parts that each set up and clean up their own, and components and hooks no longer depend on the app's flows, which a test checks.
ZShell v3.14.0
Features
- Activity lights in the file and forwarding panels. The file panel shows lights for its browsing channel beside the upload buttons, and lights with the transfer rate in the transfer list's header; the forwarding panel shows the rate of all running rules in its header, and of each rule under its status. Their tooltips, like the status bar's, name the SSH connection and the channels the traffic goes through. Rates follow traffic within a second of it starting, keep their place as the numbers change, and lights in a hidden panel stop working until it is shown again.
- Uploads and downloads can be undone: once a transfer ends, done, failed or cancelled, a trash button in its row permanently deletes the files and folders it created, after a confirmation. Files it wrote over, and files changed since it created them, are kept and counted, so nothing that was there before is lost; what an upload created is deleted only on the server it went to. A cancelled or failed download can also be shown in Finder / File Explorer.
- ZShell's own messages in the terminal (connecting, how a session ended, a lost connection, reconnecting, forwarding and ZMODEM) start each line with the local time they were printed. The login prompts, echoed input and a proxy command's errors are printed as before, and a session log that already starts its lines with the time doesn't get it twice.
- Settings › Session Logs has a time format for log lines and the terminal's messages: date and time, or the time alone, with or without milliseconds, or a format of your own with %Y, %y, %m, %d, %H, %M, %S, %3f and %%. The field shows an example of the current time, or why a format can't be used. A log line's time is now when the line started rather than when it ended.
Bug Fixes
- On Windows, pressing F11 in a maximized window no longer leaves a black strip where the taskbar was.
- The web view no longer shows its own tooltip beside the app's for the element around the one under the pointer, such as a forwarding rule's explanation over its lights.
- Field titles in dialogs and settings are set apart from the hints below them, in the text's color and semibold, and the hint that belongs to a field is read with it by screen readers.
- The settings put the title and the close button in a row of their own, with the same margins on both sides as the other dialogs.
- With the session list hidden, the hint in an empty window names the shortcut that shows the list instead of pointing to the left.
- A cancelled transfer tells how many files it finished, and the progress line keeps the file name and amounts still as the numbers grow.
- The transfer list's title is shortened in a narrow panel instead of running under "Clear Finished", and a transfer of several items is named in the current language after the language changes.
- A forwarding rule's connection count moves to the next line as a whole in a narrow panel instead of breaking mid-word.
- Buttons that read as links look the same everywhere, without an underline on hover.
- The third-party notices list only what the app is built from, leaving out about 100 crates used only while compiling.
ZShell v3.13.1
3.13.1 - 2026-10-23
Bug Fixes
- Updated the ctutils library used by the SSH cryptography, which could take a different time depending on secret values in some operations (RUSTSEC-2026-0385).
3.13.0 - 2026-10-23
Features
- The session list can be hidden, keeping the tabs and panels: with the button beside the app menu's button (beside the traffic lights on macOS), which stays in place and moves to the start of the tab bar while the list is hidden, with View › Hide / Show Session List in the app menu and the macOS menu bar, or with ⌃⌘S on macOS and Ctrl+Shift+B elsewhere. Searching or creating a session shows the list again, scrolled to the selected row, and whether it is hidden is kept per machine, like its width.
- The terminal uses the whole width for text: the scroll bar, which fades out when unused, is drawn over the last column rather than keeping a strip free beside it, and is narrower.
Bug Fixes
- Ctrl+, (⌘, on macOS) closes the settings as well as opening them, unless another dialog is open over them.
Internal
- The bundled license notices store each paragraph once, which makes them less than half the size; every package shows the same text as before.
ZShell v3.12.1
3.12.1 - 2026-10-23
Bug Fixes
- A port forwarding rule stopped as a shell exits, a tab closes or a connection is lost could, rarely, be taken for one that had failed: the forwarding panels went on showing it active, and it wasn't moved to another tab of the session, started again on reconnecting or started again with another shell.
- A tab reconnecting at the very moment its connection was lost could start without the forwarding rules that had been running.
3.12.0 - 2026-10-23
Features
- The computer can be kept from sleeping while sessions are connected, chosen in Settings › Power › Prevent sleep while connected: never (the default), when plugged in, or always. While an SSH, Telnet or serial session is connected, connecting or waiting to reconnect, inactivity no longer puts the computer to sleep, so the sessions stay connected; the display still turns off and the screen still locks, and closing the lid or choosing Sleep still puts it to sleep. On Windows computers with Modern Standby, Windows still sleeps on battery 5 minutes after its sleep time, as the settings say.
- When the shell of a connection's last tab exits, connections already made through its port forwarding are no longer cut. As in OpenSSH, the tab stays open, says which forwarding it waits for and shows how many connections are left, and closes once they have ended; Enter starts a new shell on the same connection, Ctrl+C disconnects them at once and Ctrl+D closes the tab. The forwarding stops listening, and moves to another connected tab of the same session if there is one. Closing a tab whose forwarding carries connections asks first, saying how many it disconnects.
- Deleting a session stops the port forwarding running in its connected tabs, which before kept their ports open with no way left to see or stop them. When any runs, the confirmation names the tabs using it, in other windows too.
- New host keys are recorded hashed in known_hosts when ssh_config's
HashKnownHostsis on for the host, as OpenSSH does (the system ssh_config of Debian and Ubuntu turns it on), rather than always with the host name in clear.
Bug Fixes
- A connection that died while the computer slept or the network changed is noticed within seconds of typing, browsing or transferring with SFTP, a forward's client sending data or opening a connection, or the system waking, and reconnects as usual. Before, the tab looked connected while nothing worked for minutes, until keepalives gave up, or for good when the system couldn't send what was written. A busy connection or one on a slow link is not taken for a dead one, and sessions with keepalives turned off are not checked.
- Automatic reconnection after a lost connection starts the forwarding rules that were running again, as reconnecting by hand did.
- A forwarding rule's connection gives up after 30 seconds when the server hasn't connected to the target, and the rule's state says that the server took too long; before it could wait minutes, showing nothing wrong. Connecting through a jump host that can't reach the next hop gives up after 30 seconds too.
- A forwarding rule on
*listens on IPv6 as well as IPv4, as in OpenSSH, and*in ssh_config stays*when imported rather than becoming0.0.0.0. - A known_hosts file that can't be read (one left to root by sudo, for example) is reported as such, rather than as a failed handshake retried again and again by automatic reconnection.
- SFTP:
- New files and folders get the permissions of those copied, as
sftp putandgetdo, so an uploaded private key stays private and a script keeps its execute bit. Files written over keep their own. - Transfers on a connection share the limit of files copied at once, so several large downloads at once no longer time out on a slow link.
- A downloaded file is written to the disk before it replaces the one it overwrites, so a power cut can't leave a partial file in its place.
- File and folder names are sorted in the interface language rather than the system's.
- New files and folders get the permissions of those copied, as
- Resetting the vault after a forgotten master password keeps the old sessions file (renamed
vault.json.reset-<time>) and its key, so it can be opened again if the password comes back to mind; the confirmation is now typed as RESET. Unencrypted vault and export files are checked after writing too, and encrypting leaves no stray copies of the sessions and passwords in memory. - Importing from ssh_config checks the sessions and proxies as saving does, names the proxy already here that an imported session will use, and shows IPv6 hosts in brackets. Sessions files over 16 MB are refused, and scanning one whose sessions jump through each other is no longer slow.
- Quick commands and groups without an id in the vault keep the same one across restarts, so sessions' quick command groups keep finding them.
- Settings and quick commands saved by another window while this one was starting are no longer undone by its next change.
- A tab moved to another window and reconnected meanwhile no longer gets the old screen drawn over it, and a session offered to a new window that couldn't be created goes back to its tab.
- A font whose ligature tables describe more than can be read no longer ends the app when ligatures are taken from the font; it gets the common sequences instead.
- Telnet logs in with
?for characters the session's encoding can't write, rather than HTML character references. - A ZMODEM peer sending only
*is given up on once past the limit of bytes skipped. - Lists of names in messages are written as the interface language writes them ("a、b和c" in Chinese).
- On macOS, ⌘↩ toggles terminal full screen also while the terminal or the compose bar has the focus.
- On Windows, text fields show the focus in contrast themes.
- On Linux, terminals no longer start with another font for a moment when another window changed the settings during startup.
Performance
- Opening local terminals and serial ports, setting the window's theme, creating downloads and looking up a local terminal's foreground program no longer hold up other work; on Windows the last froze the window while it ran.
Internal
- App's flows (opening sessions, the session editor, logging, dialogs, update notices and quick commands) moved into hooks of their own, which read the settings they need themselves; the window's actions, with their shortcuts and app menu items, are declared in one table.
- Local and dynamic forwarding share their listening loop, and what changing or deleting a session does to its forwarding is decided in one place.
- The vault's debug output leaves out saved passwords and the master password.
ZShell v3.11.0
Features
- The close tab shortcut (⌘W, Ctrl+Shift+W on Windows and Linux) closes the top dialog, as a click on its backdrop does: settings, the session editor and the other dialogs close, asking first where there are unsaved changes, and a dialog that must be answered stays open. Before, the shortcut did nothing while a dialog was open.
Bug Fixes
- On Windows, F5, Ctrl+R and the web view's other browser shortcuts (Alt+Left to go back, Ctrl+P to print, Ctrl+F to find) no longer act on the window. F5 or Ctrl+R pressed outside the terminal, in the session list or the tab bar for example, reloaded the window and closed every session in it. Programs in the terminal still get these keys.
- On macOS with an input method on, shifted punctuation (the full-width ? of Shift+/ in Chinese Pinyin, for example) is typed in the terminal on the first press rather than the second.
ZShell v3.10.0
Features
- Password and passphrase fields have a button at their right end that shows or hides what is typed, the same on every platform (WebView2's own reveal button, which the other web views lack, is hidden). It works from the keyboard, and a disabled field always shows dots.
Bug Fixes
- Drop-down lists are drawn in the app's own style and colors on every platform, rather than each platform's. The terminal type, serial device and baud rate fields have a button that lists every suggestion, where before a field showing
xterm-256coloroffered nothing else. A list placed for a few suggestions moves and widens when it shows more, and a click on the label of an open drop-down closes it rather than opening it again. Typing the same letter again in a menu or a drop-down goes through the items that start with it. - Checkboxes and radio buttons are drawn in the theme's colors, rather than in Chromium's blue on Windows, the system accent color on macOS or GTK's on Linux; Windows contrast themes keep the system's colors.
- The multi-line fields of dialogs (login commands, environment variables, quick commands, proxy commands and notes) grow with their text up to twelve lines, then scroll, instead of having a handle to drag, and fit their text again when the window or the text size changes.
- Empty fields in the port forwarding dialog are reported in the app's own words and language, rather than with the web view's bubble in the system's language.
- Screen readers no longer read the buttons inside text fields as part of the fields' names ("Password Show password", "Baud rate Increase Decrease").
- On Windows, the web view's own tooltip no longer shows alongside the app's when the pointer moves within an element, from its icon onto its text for example.
- On Windows, a window starting up shows the theme's background color rather than white until the page has painted.
- The session list no longer says there are no sessions while they are still being read at startup.
ZShell v3.9.0
Features
- Programs in the terminal can do more, as in other modern terminals:
- Copy to the clipboard (OSC 52), for example from tmux or Neovim on a server, up to a size set in Settings › Mouse and Clipboard (1024 KB by default). Programs can never read the clipboard, and copying can be turned off there.
- Report their progress (OSC 9;4), shown as a ring on their tab and on the window's taskbar button, or on the Dock icon and the Linux launcher, combined across windows. It goes away when the session ends or after 30 seconds without news.
- Send notifications (OSC 9, 777 and 99, as iTerm2, urxvt and kitty do), for example when a long command finishes. A tab in the background is marked, and while ZShell is in the background the system shows the notification, at most one every 3 seconds for each pane (the last of a burst rather than the first), cut to 4096 characters. While the app is locked the notification only says that a program sent one, without its text or the pane's title. Notifications can be turned off in Settings › Terminal.
- Set the pointer's shape over the terminal (OSC 22), by its CSS or X11 name, kept separately for the main and the alternate screen as kitty does.
Bug Fixes
- The Option key is capitalized in the Japanese interface.
Internal
- The setting for notifications from programs is laid out with the same component as every other setting.
ZShell v3.8.0
Features
- Terminals can draw programming ligatures, chosen in Settings › Terminal › Ligatures (off by default). Common sequences joins a fixed list of the usual operators (
->,!=,===and the rest of Iosevka's set, as VS Code does), which a font with programming ligatures, such as Fira Code, JetBrains Mono or Cascadia Code, draws as one symbol. From the font joins exactly what the terminal's font joins, by the rules read from the installed font, and falls back to the common sequences where the font can't be read. While ligatures are off, terminals drawn without WebGL no longer show them either.
Bug Fixes
- The custom background color is chosen with a color field of the app's own on every platform: a swatch that opens a popup with a saturation and brightness area, a hue bar, the color in hex and an eyedropper that picks a color from anywhere on the screen (on Windows also from the keyboard, with the arrow keys and Enter). The eyedropper of WebView2's color popup did nothing, GTK's had none, and the three popups looked different.
Performance
- With more terminals visible than the web view has WebGL contexts for (about 16), terminals no longer take them from each other and fall back to slower drawing in turn: at most 12 draw with WebGL, and the least recently used of the rest draw without it until focused or until there is room again.
- Saving a file opened from the file panel in a local editor uploads it about 0.3 seconds after the editor writes it, rather than 0.5 to 1 second, and an idle edit no longer wakes the app. Starting or stopping an edit no longer holds up other sessions.
- Local shells and serial lines on macOS and Linux no longer use threads of their own, one of which woke five times a second even while idle, and a serial device is let go of as soon as its session ends.
- Folder listings are sorted once, by the file panel, instead of also in the backend.
Internal
- The largest components are split, moving out the parts that stand on their own: the sidebar's rows, the terminal's ZMODEM handling and menu items, and the file panel's file operations and Upload button. Local shells and serial lines on Unix share their non-blocking reads and writes, and the SFTP transfer tests are in a file of their own.
ZShell v3.7.0
Features
- Panes can move to another tab or window. The terminal's menu moves a pane to a tab of its own, next to the focused pane of another tab (right of it or below, wherever there is room), or to another window. A pane can also be dragged by its grip, which shows near its top edge: within its tab, onto the tab bar as a new tab, onto the panes of another tab, or out of the window. A tab dragged from the tab bar onto the panes of the tab shown joins them. A pane moving between tabs keeps its terminal, its screen, its side panels and their file transfers as they were.
- A tab or pane dragged to rest on another tab shows that tab after a moment, with a bar filling along the tab's bottom meanwhile, so that it can be dropped on that tab's panes. Unless it joins them or leaves the window, the tab shown before comes back.
- Tabs are dragged along the tab bar as in browsers: the dragged tab follows the pointer, the others slide over to make room, and once dropped it slides into its new place, or back into its old one after Escape.
- Menus taller than the window scroll, and typing the start of an item highlights it.
Bug Fixes
- Commands, paths and keys in the interface (a session's login commands and environment, the compose bar, the command palette, paste previews, path lists, host keys, forwarding rules) are drawn in the terminal font set in Settings, falling back to one monospace font stack; on Linux, Latin letters stay fixed-width beside Han characters. The placeholders of command fields and of the compose bar, which are sentences, are in the interface font.
- An app font setting with a stray quote no longer replaces the whole interface font with the browser's default.
Internal
- Terminals and side panels are drawn into elements that move with their pane rather than by the tab's page, so that a pane changes tabs without its terminal being mounted again. Dragging tabs and dragging panes share their mouse handling.