A Folders view in the explorer, next to grid and list, for browsing what was found the way a file manager does, plus recovering whole folders or parts of them.
One level at a time. Subfolders come first, each with its file count and size (recursive), then the files, under a clickable breadcrumb. Double-click or Enter opens a folder, Backspace or Alt+↑ goes up, and the sidebar folder tree navigates. Carved files sit in "By signature". Filters still apply.
Tri-state selection that persists while navigating. A ticked folder takes everything inside it, at any depth. Unticking a subfolder or file inside it leaves the folder half-ticked and keeps that item out. The bottom bar shows the exact total, which comes from the core (selection_count).
Recovery relative to the ticked folder.Documents/Clients/Project becomes Project/.... Files ticked on their own go to the root of the destination, and duplicate names get (2). The hash manifest is written as always.
Core. New RPCs browse and selection_count; recover_start accepts selection { folders, ids, exclude, exclude_folders }; recover_resumable_with takes the folder roots. Existing call sites keep their behavior.
Release. Version 1.4.0, with CHANGELOG and docs/interface.md in EN and PT-BR.
Verified
Unit tests:
browse: aggregation, filters, a prefix that is not a parent, pagination;
## What
A **Folders** view in the explorer, next to grid and list, for browsing what was found the way a file manager does, plus recovering whole folders or parts of them.
- **One level at a time.** Subfolders come first, each with its file count and size (recursive), then the files, under a clickable breadcrumb. Double-click or Enter opens a folder, Backspace or Alt+↑ goes up, and the sidebar folder tree navigates. Carved files sit in "By signature". Filters still apply.
- **Tri-state selection that persists while navigating.** A ticked folder takes everything inside it, at any depth. Unticking a subfolder or file inside it leaves the folder half-ticked and keeps that item out. The bottom bar shows the exact total, which comes from the core (`selection_count`).
- **Recovery relative to the ticked folder.** `Documents/Clients/Project` becomes `Project/...`. Files ticked on their own go to the root of the destination, and duplicate names get ` (2)`. The hash manifest is written as always.
- **Core.** New RPCs `browse` and `selection_count`; `recover_start` accepts `selection { folders, ids, exclude, exclude_folders }`; `recover_resumable_with` takes the folder roots. Existing call sites keep their behavior.
- **Release.** Version 1.4.0, with CHANGELOG and `docs/interface.md` in EN and PT-BR.
## Verified
- Unit tests:
- `browse`: aggregation, filters, a prefix that is not a parent, pagination;
- selection resolution: subfolder exclusion, carved files;
- destination paths: relative, nested, duplicate name, loose file, sanitization.
- Service test on `fat32.img` (real scan + recovery): checks paths and hashes, the unticked file left out, and the error for an empty selection.
- `scripts/check.sh` passes, and so does the full core suite.
- Chrome headless on the synthetic photo image:
- navigation and breadcrumb;
- tick `DCIM`, untick one file → 23 of 24, half-ticked state on the parents;
- add `Viagens/Recife` and recover: the destination has `DCIM/100CANON` (11), `DCIM/Camera` (12) and `Recife` (12), and the manifest has 35 entries;
- a half-ticked folder becomes fully ticked on click;
- the dialog warns when a filter is active;
- grid and list unchanged.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
A marked folder a/b/Projeto is recreated as Projeto/... with everything
inside it; single marked files go to the destination root and unmarked
files inside a marked folder are left out. recover_start accepts
{selection: {folders, ids, exclude}}.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Folders mode next to grid and list shows one level at a time: subfolders
first with their file count and size, then the files, under a clickable
breadcrumb. Folders and files are marked with tri-state boxes that persist
while navigating; the bar shows the exact total from the core, and the
selection is recovered relative to each marked folder. The sidebar folder
tree navigates in this mode.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Retakes the explorer screenshots on 1.4.0 (they still showed 0.4.0) and adds
the Folders view in English and Portuguese. The folder rows' file count sat
inside .xp-lnm, which the DOM translator skips, so it stayed in Portuguese
in the English UI; it is now translated explicitly.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What
A Folders view in the explorer, next to grid and list, for browsing what was found the way a file manager does, plus recovering whole folders or parts of them.
selection_count).Documents/Clients/ProjectbecomesProject/.... Files ticked on their own go to the root of the destination, and duplicate names get(2). The hash manifest is written as always.browseandselection_count;recover_startacceptsselection { folders, ids, exclude, exclude_folders };recover_resumable_withtakes the folder roots. Existing call sites keep their behavior.docs/interface.mdin EN and PT-BR.Verified
browse: aggregation, filters, a prefix that is not a parent, pagination;fat32.img(real scan + recovery): checks paths and hashes, the unticked file left out, and the error for an empty selection.scripts/check.shpasses, and so does the full core suite.DCIM, untick one file → 23 of 24, half-ticked state on the parents;Viagens/Recifeand recover: the destination hasDCIM/100CANON(11),DCIM/Camera(12) andRecife(12), and the manifest has 35 entries;🤖 Generated with Claude Code
A marked folder a/b/Projeto is recreated as Projeto/... with everything inside it; single marked files go to the destination root and unmarked files inside a marked folder are left out. recover_start accepts {selection: {folders, ids, exclude}}. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>