
Turn a messy folder into a browsable archive: files are sorted into prefixed category folders, exact duplicates are quarantined instead of archived twice, questionable files are set aside for review, and the whole run can be undone in one step.
Pick a folder (Downloads, Desktop, a memory-card dump…) and review the full plan before anything moves.
Where files go
ft_Images/2026-07/ photos, by capture month
ft_Images/Screenshots/2026-07/ recognised by filename
ft_Documents/Ebooks/2026/ documents, by year
ft_Archives/Installers/ installers, not dated at all
ft_Duplicates/ byte-identical copies, with a manifest
ft_Review/empty|corrupt|junk/ set aside, never deleted
ft_ prefix keeps the extension's output visually apart from folders you made yourself. If an un-prefixed archive already exists in the destination, it is reused rather than split into two parallel trees.What it detects
.DS_Store.Near-duplicates and similar images are heuristics, not proof, so they are never moved anywhere special — they are flagged and then archived normally, and you decide what to delete. Because they end up in their ordinary folders, the grouping would otherwise vanish the moment the plan closes, so each run that flags anything writes .tidy/similar.md in the destination listing every group and where its files landed. Broken files and junk are moved to a review folder and never deleted.
Options
Nothing is moved until you confirm the plan.
Moves every file from the most recent run back where it came from and removes the folders that run created — folders that already existed are left alone. Each run writes a manifest under .tidy/runs in the destination, so undo is exact. For an in-place run, pick the source folder itself.
Categories, subcategory rules, the folder prefix, date depth and the detection toggles all live in a shared config file, created with sensible defaults on first run:
~/.config/tidy/config.json%APPDATA%\tidy\config.jsoncategories and subCategories replace the defaults outright, so you can remove rules you don't want. Set folderPrefix to "" for un-prefixed folder names, or detect to false to turn every extra check off.
Preview and archive a folder into prefixed category buckets, quarantining exact duplicates and flagging near-duplicates and similar images
Move the files from the last tidy run back to where they came from
.tidy folder inside it) just for looking at a plan. The cache is now written only after a run completes, keyed by where each image actually landed..tidy/similar.md in the destination, listing each group and where its files ended up, so you can work through them later instead of having to act while the plan is open. The success toast offers to open it. (n) suffix used for a name collision is now produced in a single place, so the name shown in the plan and the name written to disk cannot drift apart as the code changes.ft_Category/[Subcategory]/[date]. The ft_ prefix keeps tidy's output apart from folders you made yourself; an existing un-prefixed archive is reused rather than split in two. Subcategories (Screenshots, Ebooks, Invoices, Installers, …) come from configurable name and extension rules. (n) suffix added for a collision.Type/Year-Month buckets (EXIF capture date for photos and videos when available), with byte-level duplicate detection (size → head/tail hash → full SHA-256) that quarantines identical files instead of archiving them twice. Always shows the full plan for confirmation before moving anything.