Skip to content
All work

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
Mac Cleaner screenshot

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.
Mac Cleaner dev junk scan listing 289 items totaling 86.68 GB across categories
Dev Junk scan: 289 items, 86.68 GB reclaimable across 18 categories
Per-path selection view with Docker data and node_modules folders staged for Trash
Per-path selection: Docker data and node_modules go to Trash, never hard-deleted

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.

me@nayeemurrahman.com

Prefer to talk? Grab 15 minutes in my calendar.

© 2026 Nayeemur Rahman. All rights reserved.