- Written in
- Swift 6, SwiftUI and AppKit
- Runs on
- Macs with Apple silicon, macOS 26 or later
- Space map
- Folders are read on 2 to 8 threads at a time with
getattrlistbulk, then drawn as a squarified treemap up to three levels deep. Sizes are what’s allocated on disk, counted the way du counts them, and available space matches Finder, purgeable space included.
- Cleanup sizes
- What each finding takes up on disk, measured with
fts. Hard links count once, and the count never crosses onto another disk.
- Finding an app’s files
- Bundle identifiers, code signatures read with the Security framework, launch agents and installer receipts from
pkgutil, each weighed as evidence
- Moving to the Trash
FileManager.trashItem. Right before moving, Shoo checks that each item is still the file it scanned. If macOS won’t let it move something, Finder moves it and asks for your password.
- AI tools
- Their chat databases are opened read-only. A cleanup never moves the one a tool is using, only older copies and those of folders that are gone. Duplicate models are found by size, then by digest or a SHA-256 of their first and last megabyte.
- Never touched
- System folders, keychains, iCloud Drive, the Mail, Messages and Photos libraries and
~/.ssh, however the path is spelled. AI cleanups never tick a tool’s own settings, sign-ins or current chats, but uninstalling an app offers its data folder too, and a folder you pick on the Space page goes whole.
- Permissions
- Full Disk Access is optional. Automation lets Shoo ask Finder to move what macOS won’t let it move itself, and macOS asks about Removable Volumes the first time you map a disk you plugged in.
- Security
- Hardened Runtime. It runs outside the App Sandbox, since it needs to see the whole disk.
- Network
- None. No analytics and no crash reporting.
- Third-party code
- None