Skip to content

v0.21.0

Released 2026-08-25. This release adds terminal tabs to the tab bar: right-click, pick a shell, and a terminal tab sits next to your file tabs — it splits, drags, and is kept across a restart (Windows only, a paid feature). The sidebar's folder rows gained a disclosure triangle and expand into a tree in place, following the folder you are looking at. On the key side, three additions: shortcuts and Vim keys can be unbound, the pages point out when the two clash, and the sidebar's and command palette's Vim tables became editable. Text rendering switched engines on Windows and macOS to align with the browser. Also a round of fixes, one of them about data safety: source files you chose to skip during a cut-and-merge are no longer deleted permanently.

The kind marked on each entry (New / Improved / Fixed) is explained in the changelog.

New

#KindChange
1NewTerminal tabs: right-click empty space in the file area → Open terminal tab here ▸, or empty space on the tab bar → New terminal tab ▸, and the flyout lists this machine's shells — PowerShell 7, Windows PowerShell, cmd, Git Bash and each WSL distribution, with the first entry as the default. What opens is an ordinary tab: it drags, splits, and is kept across a restart of tessoa. It supports IME input, mouse selection, copy and paste, and a scrollback bar, along with context menus of its own and a fixed key table. Windows only; a paid feature requiring an active license. See Terminal tab
2NewOpen in Terminal became the same shell flyout (Windows only): the background-menu entry went from opening one fixed terminal to the same flyout as above, opening whichever shell you pick — only its result is an external terminal window; the word "tab" is what tells the two apart
3NewSidebar folder rows expand into a tree in place: rows that point at a real folder on disk (the Recents, Bookmarks, Places and Storage sections) gained a disclosure triangle. Clicking the triangle only expands — clicking the row still navigates, as before. Subfolders open level by level; a folder lists at most 100 children, with a +N badge at the end of the row for the rest. On slow media (network drives, WSL) a spinning waiting arc shows at the end of the row after the triangle turns, so there is no stretch where a click appears to do nothing. See Interface tour
4NewThe tree follows the folder you are in: sitting in D:\A\B, the sidebar opens D: and A and highlights B, scrolled into view — as Explorer does. It follows the focused pane only, and does nothing when the current folder is not under any sidebar entry
5NewThe sidebar gained vertical and horizontal scrollbars: the whole sidebar scrolls as one. Scrolling sideways moves only the row text — section headings and the search box stay put, and the column of row-end buttons (×, , the lock) stays pinned to the visible right edge. Shift+wheel scrolls sideways
6NewSidebar folder rows and breadcrumb segments can be bookmarked from their context menu: a new Add bookmark entry (Edit bookmark once saved) opens the same bookmark form as the star, anchored next to the row you right-clicked. See Bookmarks
7NewKeyboard navigation in context menus covers all four directions now: move within the current panel, (or Enter on a parent entry) enters the submenu and lands on its first item, steps back to the parent and folds that level. With text in the search box, still move the text cursor
8NewSubmenus gained a safe triangle: crossing sibling entries diagonally on the way to an open submenu no longer lets a sibling take it over. The test is the direction of movement, not a timer — to select an entry along the way, stop on it and it switches immediately, without the fixed delay system menus impose
9NewThird-party menu entries carry an identity mark: entries installed by other software (7-Zip, cloud drives, antivirus) draw a thin bar along the left edge of their top-level rows, marking them as coming from the system rather than from tessoa. Hovering no longer raises a "from the system context menu" card: third-party entries often fill half the menu, a card per row got in the way of reading it, and the bar states the origin on its own
10NewThe Vim Keys page became three tables: a switcher at the top splits File area / Sidebar / Command palette, and the sidebar's keys and the palette's Normal-mode keys can now be rebound one by one (Ctrl+1/2/3 switches tables). Reset All only resets the table on screen. See Vim mode: Changing the Vim keys
11NewShortcuts and Vim keys can be unbound: select a row and an Unbind button appears at its end, turning the row into Unbound; Backspace while recording does the same, and both prompts now read … (Esc to cancel · Backspace to unbind). Primary Select (Pointer) and Context Menu cannot be unbound, and the page gives the reason: Selection / context menu cannot be unbound (nothing would be clickable). The cost is that bare Backspace can no longer be bound to an action; modified combinations are unaffected
12NewWhen a Vim key and a shortcut clash, both key pages point it out: with the same key bound to different functions on each side, the shortcut never fires while Vim mode is on, and there used to be no sign of that on screen. Now a bar under each page's header counts the clashes, and on a clashing row the button reads Yield in a warning color: click it to give that key up to the other table. Whichever page you click Yield on is the side whose binding is removed
13NewThe two key pages show each other's side: rows on the shortcuts page gained a cell like "Vim ⌈g⌋⌈n⌋", and the Vim Keys page one like "Shortcut ⌈Ctrl+T⌋" — what the same function is bound to in the other table, at a glance. Clicking the cell jumps to the other page and highlights the row; the jump itself changes nothing
14NewThe Vim Keys page lists the "Chord entries (Ctrl allow-list)" at the bottom: Ctrl+D/U/W are second entrances to existing commands and cannot be rebound, but each row shows who owns the chord right now — when a shortcut holds it, the row reads Shortcut "××" wins and offers an Unbind shortcut button to hand it back to Vim
15NewSettings search reaches every row of the shortcuts page: type an action name in the outer search box and the result goes straight to that row; the current binding matches too, so searching Ctrl+K answers what it is bound to, and follows a rebind on the spot. The Vim Keys page stays out for now — its three tables share action names, and the results could not be told apart
16NewReset All on six settings pages now gives feedback: Keyboard Shortcuts, Vim Keys, Context Menu Order, Appearance, the view step tables and the details-list columns raise Defaults restored: 〈page〉 with an Undo button that restores the whole table, and leave an entry in Activity. Pressing Reset All on a table already at its defaults shows nothing — where no change happened, none is recorded
17NewThe Appearance page gained a Glyph Hinting switch (Windows / Linux): on, stroke stems snap to whole pixel boundaries and text comes out sharper; off returns the more faithful glyph shapes. On by default, matching what previous versions hard-coded, so leaving it alone changes not a pixel. On a high-DPI screen (200% scaling, 4K) turning it off is worth a try. See Settings overview

Improved

#KindChange
18ImprovedCJK text rendering improved markedly: body text is now rasterized by the system's DirectWrite on Windows and by CoreText on macOS, aiming for pixel parity with the browser — Chinese glyphs no longer come out sharp across and soft down. A companion ink correction makes text weight match the browser under both light and dark themes; dark themes used to run visibly pale. These changes have no switch and take effect on upgrade
19ImprovedThe macOS Appearance page dropped two rows: on a Mac, LCD Subpixel Antialiasing did not produce its stated effect (the system removed subpixel antialiasing long ago) and thinned the font weight as a side effect, while Glyph Hinting changed nothing at all (CoreText has it built in). Both rows are removed. Anything you set on Windows stays saved and is not changed by the Mac side
20ImprovedA submenu with genuinely nothing in it shows an "(Empty)" row, matching the system's empty popup menus, instead of showing nothing
21ImprovedWhen Space belongs to Quick Look, Vim's check key steps aside: on macOS (and on Windows once Space opens Quick Look is on), Vim's "check and advance" factory sequence becomes \ Space instead of Space. Only bindings still on the old default move; anything you changed yourself stays put
22ImprovedThe Terms & Privacy Policy moved to v3: the terms were rewritten at full length, and a few things that had gone unsaid are now disclosed — first activation sends the computer name and an irreversible device fingerprint, auto-update is on by default on all three platforms rather than "Windows only, and only when clicked", and the local logs include exit.log. Because the terms changed, existing users are asked to accept once more

Fixed

#KindChange
23FixedSource files "skipped" during a cut-and-merge are no longer deleted permanently. Cutting a folder, pasting it where a folder of that name exists, choosing Merge, then Skip for clashing files inside used to end with the whole source tree deleted — the very files you had just decided to keep, with no recycle bin and no undo entry. Now only items that actually moved delete their own source; when anything was skipped, the source folder stays in place and the skipped files exist on both sides, as in Explorer
24FixedOne unreachable network share (typically an SMB server whose password changed) froze the whole window, recoverable only by ending the process — and every folder change accessed the dead share again, freezing for tens of seconds each time. All judgements about network locations now run in the background and the window no longer freezes. The cost is that a network folder held by a background tab is not declared "gone" until you switch to it
25FixedThe capacity figures in the sidebar's Storage section sometimes never appeared, and a restart did not restore them. The cause was a startup race; two smaller problems from the same feedback batch were fixed along with it
26FixedFolder statistics were scanned again after entering a folder and coming back, and subfolders revealed by expanding were scanned even with Calculate Folder Sizes Automatically off. Also, when sorting by size, a row now moves to its correct position the moment its statistic settles in the background — the number used to update while the row stayed in its old place
27FixedWith grouping on, the group header pinned below the table header was translucent, and rows scrolling under it showed through as two layers of overlapping text. Fixed in the details list, the icon grid and columns view alike
28FixedDragging files out of the window, pressing Alt+Tab to reach the target program, and letting go used to cancel the drag on the spot — a path that works in Explorer could not be completed in tessoa. The window losing focus now upgrades the drag to a system drop, so switching over and releasing drops normally, and Esc still cancels
29FixedEmoji in file names were not drawn at all — the width was reserved, leaving a hole in the middle of the name. The details list and the icon grid now draw them in color, including composed ones (families, flags, skin tones). On macOS ❤️ is no longer drawn as a dark monochrome heart. What an emoji looks like is still up to the system's emoji font, and the three systems each draw their own
30FixedAt fractional scaling — 125% / 150% / 175% — letter spacing jittered left and right; the subpixel compensation only held at 100%. Quantizing in physical pixel space steadied the spacing at every scale
31FixedIcons are no longer blurry, and no longer undersized: icons snap to the physical pixel grid, so 125% / 150% / 175% scaling no longer blurs every one of them; the fetch size follows the screen the window is on, so two screens at different DPIs each get a crisp set. File types without a large icon resource (mp3, srt, certificates) no longer shrink into the top-left corner of their cell, and audio files without cover art show a crisp system icon in the grid instead of a 16 px icon scaled up many times over
32FixedThe Send to submenu came and went, with its entry count changing between opens. The ready part now opens first and the rest is only ever appended at the tail — rows already on screen are neither reshuffled nor renamed
33FixedThe placeholder rows that wait for third-party menu entries flashed grey when loading happened to be fast, and the number of separators differed between the first open and later ones. Both fixed: placeholders stay normal-colored, turning grey only past a waiting threshold and together with the spinner
34FixedWith a context menu open, moving the mouse over it lit up the row underneath the menu and raised that row's tooltip; right-clicking again opened a menu for a covered row. The area a menu covers now responds to nothing, and a right-click outside it closes this menu and opens the appropriate one at the new position
35FixedThe nav bar's two dropdowns (the recent-visits panel and the breadcrumb's browse-subfolder list) shared one set of problems: hovering passed through the panel and lit up the header cells underneath, clicking into the sidebar or another pane did not close them, and they stayed in place after Alt+Tab. The area a panel covers no longer responds, clicking anywhere closes it, and it also closes when the window loses focus
36FixedOn the first-launch terms page, the scrollbar could sit at the bottom while Agree and continue stayed grey — with unequal line heights the scroll ceiling came up a few lines short, and nothing on screen said so. The thumb at the bottom now really is the bottom
37FixedThe buttons on confirmation boxes such as Delete Permanently had a hard-coded width, and at larger interface font sizes the English labels spilled outside the buttons. The panel now widens to fit the text. The Chinese default font size happened to fit, which is why it went unnoticed

User docs for tessoa