How it fits together
- 01getattrlistbulk
- 02Shared work stack
- 03FileTree
- 04One reverse pass
- 05Rings · Tiles
A scanner built for speed
Scanning ~/projects, 2.06 million files and folders, takes 6.5 seconds; du -sk needs 30.7 for the same folder and arrives at the same total.
getattrlistbulk(2)returns a whole directory's attributes in a few syscalls instead of onestatper file.- Worker threads share a depth-first work stack and open each directory with
openatrelative to its parent. - A directory's children are committed in one batch, so they sit together and always after their parent: rolling sizes up is a single reverse pass.
- Hard links count once, mount points are skipped, so
/never wanders into external drives.
Two million nodes, cheaply
The tree is a structure of arrays, about 35 bytes a node plus names: 117 MB for two million. The last scan is saved to disk and loads in 10 ms, so the app opens instantly and refreshes in the background.
What it finds
- Disk Map: rings and tiles from precomputed geometry; click a segment to fly into a folder.
- Smart Clean: Xcode caches, stale
node_modules, unused Docker images, old simulators, app caches and logs, in one pass. - Duplicates: size, then a partial hash, then full SHA-256. APFS clones are recognised, so the number is what deleting really frees.
- Apps: every app with its hidden data in
~/Library, to remove completely or just reset.
Safe by default
Everything goes to the Trash first, and History puts files back where they were for 30 days. Cleanup never follows a symlink out of its target, never crosses a mount point and refuses anything less than two levels inside your home folder.
Stack
Swift 6 and SwiftUI with Liquid Glass, a UI-free engine package covered by tests, WidgetKit for two desktop widgets, a menu bar extra. English and Russian.