2026·In development
Mac Cleaner
Native macOS cleanup utility
- Role
- Builder
- Timeline
- 2026, in development
- Stack
- Swift · SwiftUI · macOS 15 · MVVM + Observables
- Links
- Coming at release

Context
The problem
Mac cleanup utilities are a category of dark patterns: paid apps that invent problems, nag screens, and background daemons that cost more than the disk space they recover. The actual job (finding stale dev caches, duplicate files, orphaned app leftovers) is well-defined and doesn't need a subscription. It needs trustworthy classification: knowing what's safe to remove and saying so honestly.
Ownership
My role
Solo build, and a deliberate excuse to go deep on native Swift development after years of web platforms.
Solution
Approach
The safety model is the product
Every finding is classified into three tiers: green for things that regenerate themselves (node_modules, build caches, DerivedData), orange for slow-to-rebuild or mixed data (simulator runtimes, Docker), red for anything touching user data. Orphaned app leftovers get a confidence score before they're even shown. And nothing is ever hard-deleted: everything goes to the Trash, recoverable.
Seven scanners, one engine
Dev junk across 18 categories of build artifacts and package caches; two-pass duplicate detection (group by size, then hash, so no false positives from same-sized files); large-file hunting; app cache analysis; a full app uninstaller that maps installed apps to their preference and support files; orphan detection for apps already gone; and an interactive disk treemap. Twelve services behind the scanners, all async/await with cancellation throughout.
Honest about file age
Cleaners that sort by 'last modified' lie on dev machines, because npm pins mtimes. The 'last used' signal here is the max of four filesystem dates (added, accessed, modified, created), so a node_modules folder from yesterday never shows up as a year old.
System
Architecture
Native SwiftUI with MVVM and Observable macros, structured concurrency end to end, and a scan-then-approve flow: every scanner produces categorized, explainable findings, and every removal is explicit, user-selected, and reversible via Trash.
- 12 scanner/services: dev junk, duplicates, large files, caches, uninstaller, orphans, treemap
- Three-tier safety classification with per-finding explanations
- Trash-only removal via FileManager.trashItem, zero hard deletes
- Async/await scanning with progress reporting and cancellation
Results
Outcomes
3 tiers
of safety classification on every finding
18
dev-junk categories recognized
12
scanner services behind the UI
0
hard deletes, everything goes to Trash
- In development, shipping to GitHub as open source.
- This page will get the repository link and benchmarks at release.


Contact
Get in touch.
If you're building something and want a hand, write to me. Same if you just want a second opinion on an architecture decision.
Prefer to talk? Grab 15 minutes in my calendar.