v0.20.1
Released 2026-08-21. This release hands you the question of which button does what: the mouse's left, right and middle buttons, both side buttons and three wheel gestures all moved into the Keyboard Shortcuts page and rebind like any key, and Vim's keys are no longer fixed either — Settings gained a whole Vim Keys page. After you drag a batch of files into another folder, the items that landed are ticked, scrolled into view and marked on the scrollbar, so you no longer have to go looking for them. The Open With flyout now exists on macOS and Linux as well, which makes all three systems. Also fixed: a startup that hung for tens of seconds, a refresh that threw your selection away, and a text preview that ignored the file being saved over.
The kind marked on each entry (New / Improved / Fixed) is explained in the changelog.
New
| # | Kind | Change |
|---|---|---|
| 1 | New | Mouse buttons rebind now: the Keyboard Shortcuts page gained five mouse actions — Primary Select (Pointer), Context Menu, Middle-Click Smart Open, Back (Mouse) and Forward (Mouse) — bound out of the box to the left button, the right button, the middle button, side button 1 and side button 2. To record one, press the button itself; the prompt now reads Press new shortcut or mouse button… (Esc to cancel). See Keyboard shortcuts: Mouse buttons and the wheel |
| 2 | New | Three wheel gestures rebind too: Zoom UI (Wheel), Cycle View Level (Wheel) and Scroll Horizontally (Wheel), bound out of the box to Ctrl+Shift+wheel, Ctrl+wheel and Shift+wheel (on macOS the Ctrl in the first two is ⌘). A gesture has no direction — which way you turn the wheel decides whether it adds or subtracts, and is not part of the binding |
| 3 | New | The shortcuts page gained a filter row: the box under the header reads Filter by action or shortcut…, and it matches both the action name and the key currently bound to it — so "what is Ctrl+K bound to, anyway" is a question you can now type. The table is nearly sixty rows and used to be scroll-only |
| 4 | New | A "Default" button at the end of every row puts that one binding back without touching Reset All. It only appears on rows you have changed, which makes it a marker of which rows those are |
| 5 | New | Vim keys rebind now: Settings › Input › Vim Keys is a page of its own, listing every file-area command in seven groups — Move, Navigate, Select, File actions, View & sort, Panes & tabs, Other. The key column draws one or two key caps, because gg is two presses rather than one chord. The ? cheat sheet and the prefix-key popup follow whatever you set. See Vim mode: Changing the Vim keys |
| 6 | New | After a move, tessoa points at where things landed: drag a batch of files into another folder and the items that arrived are ticked, the cursor scrolls to whichever of them sits last in display order, each of their rows pulses once, and the scrollbar gets a mark at each position. When sorting scatters them across the list, those marks are the only thing that shows all of them at once. See File operations: Where things landed |
| 7 | New | When the destination is not in front of you, there is still a way in: drop into a background tab and that tab gets a dot, redeemed when you switch to it; drop into a folder that is not open at all and the toast in the bottom right gains a Go to button that opens that folder with the items selected. tessoa never opens a tab for you unasked |
| 8 | New | macOS and Linux have the Open With flyout now — it used to be Windows only. On macOS the candidates come from the system's launch services, on Linux from the freedesktop MIME database and the .desktop entries. See Open With |
| 9 | New | The visibility page and the custom commands page each gained a filter row too: the one on the visibility page reads Filter rules or storage items… and filters the rules and the storage items below them together; the one on the custom commands page reads Filter commands…. Neither the rule table nor the command table has a size limit, and a long one used to be scroll-only |
| 10 | New | Settings search reaches into pages of their own: Animations lives on the Appearance page and Show Hidden Items on the Visibility page, and neither could be found from the outer search box at all. Entries like these now each get a result of their own, with the page they live on written under the title, and Enter goes straight there |
Improved
| # | Kind | Change |
|---|---|---|
| 11 | Improved | Four filter rows look alike now: the search box under the header on the shortcuts, context menu order, visibility and custom commands pages was written four times over, with two different heights, three alignments, and one of them missing the rounded well behind it. It is one control now |
| 12 | Improved | Vim's prefix popup follows the binding table: the little popup after g, w, , or \ used to be titled with a hard-coded family name (g · Go & tabs) and is now <key> · next key — once the keys can move, a family name may no longer be true of what is on that key. Each row already names its own command, so the title does not have to. The key column of the cheat sheet is computed the same way |
| 13 | Improved | A few Vim strings stopped naming keys: the cheat sheet's visual mode row now reads move = extend; Esc cancels / press again commits, delete reads undoable, and jump-to-top reads count = go to row. These sentences used to spell out v, u and gg — keys you can now change |
Fixed
| # | Kind | Change |
|---|---|---|
| 14 | Fixed | The window took tens of seconds to appear at startup and then put up a box saying it was stuck at stage ⑦. Two of the system calls that ask a volume for its free space have no timeout, and building the interface made them on the main thread — one disconnected mapped network drive (pointing at a NAS that is switched off, say) is enough to wait out the network protocol's own timeout. The sidebar now draws its storage rows first and fills the capacities in from the background. The diagnostics also gained a line saying what it is waiting on — the drive letter or the folder path, by name |
| 15 | Fixed | After a refresh (F5, right-click Refresh, or tessoa noticing the folder changed by itself) everything you had selected and ticked was gone. It always happened with deep items under a recursive expand, on network locations, and in macOS cloud folders — places where the folder's contents come back from the background, while the judgement being made was "if it is not in the list this instant, it is gone". Items that have not come back yet now wait to be claimed; items that really were deleted are still dropped |
| 16 | Fixed | Saving a text file from another editor left tessoa's preview untouched, while the Size and Date modified columns on the same screen had already updated. F5 did not help either; only a restart did. Text, PDF and spreadsheet previews were not checking whether the copy on disk was still the one they had drawn — all four kinds of preview go through one gate now |
| 17 | Fixed | The fix above was still a link short on macOS and Linux: neither has the cheap "you can see the size and time change anyway" path that Windows has, so a file being written over in place went unnoticed. tessoa now takes one extra look every two seconds at the one file you are previewing, and refreshes the whole list when it changes |
| 18 | Fixed | On the Settings › Open With page the scrollbar dragged but the content never moved, and nothing on the page reacted to the pointer — + Add Program, the ↑ ↓ × at the end of each row, and the candidate rows were all dead to hover. Both were the same thing: this page was never registered in the two tables that collect that behaviour |
| 19 | Fixed | Selecting a row in the settings list with the keyboard left that row's switch or link neither drawn nor clickable. Rows in the settings list are not all the same height — the ones with a description are taller — and the scroll needed to bring a row into view was computed from the screenful before scrolling, which left the row outside the window afterwards |
| 20 | Fixed | On macOS, clicking a program pinned on the Open With settings page did nothing at all. A macOS program is a .app folder rather than an executable, so launching it directly was bound to fail — and failures at that layer are silent |