If you develop on macOS, you’ve probably seen the dreaded "Disk Full" warning while macOS Storage Settings claims you have 80GB to 120GB of mysterious "System Data".
Commercial utilities often charge steep $40/year recurring subscriptions and mostly scan superficial browser caches, completely ignoring where developer storage actually vanishes.
Here is an architectural breakdown of where that hidden bloat actually lives on modern macOS (Sonoma & Sequoia), the native Terminal commands to inspect them, and how to safely clean them.
1. Orphaned node_modules Trees (30GB – 60GB)
Every JavaScript, TypeScript, or frontend project clones its own independent tree of dependencies. If you work on multiple client projects or clone repositories to test, dozens of forgotten node_modules folders sit on your SSD indefinitely.
Terminal Inspection Command:
find ~ -name "node_modules" -type d -prune -exec du -sh {} + 2>/dev/null | sort -hr | head -n 20
Notice: Deleting active project dependencies will break your build until you run npm install again. Only remove node_modules from archived or inactive repositories.
2. WhatsApp Desktop Media Bloat (10GB – 30GB)
WhatsApp Desktop downloads every voice note, video clip, and PDF attachment locally. Even if you delete the chat inside your phone, macOS retains cached local media files inside application containers:
~/Library/Containers/net.whatsapp.WhatsApp/Data/Library/Application Support/WhatsApp/
Crucial Safety Rule: Never touch ChatStorage.sqlite. Only delete cached audio/video attachments.
3. Stale Xcode DerivedData & Simulator Caches (20GB – 50GB)
If you build Swift, Flutter, or React Native apps, Xcode generates gigabytes of intermediate build artifacts, index files, and device logs that are never automatically purged:
~/Library/Developer/Xcode/DerivedData
You can safely remove everything inside DerivedData; Xcode will rebuild it automatically on your next compile.
4. Docker Virtual Disk Overlays (20GB – 40GB)
Docker Desktop creates a raw virtual disk (Docker.raw) that expands dynamically as you pull images, but does not automatically shrink when containers are removed:
docker system prune -a --volumes
The Problem with Blind Automation
Running manual shell commands works, but running rm -rf on obscure ~/Library directories carries real risk of breaking system state or losing important project files.
To solve this, I built Dusty:
- AI-Explained Decisions: Uses Google Gemini AI to analyze file metadata and provide a plain-English explanation of what each folder is, what app created it, and whether it is safe or rebuildable.
-
Developer Bloat Focus: Automatically locates stale
node_modules, Xcode caches, Docker overlays, and WhatsApp media. - 100% Trash-First: Nothing is permanently erased; files move safely to macOS Trash first.
- No Subscriptions: Built with a pay-once, own-forever model ($7.99 lifetime license with a 24-hour full-access free trial).
You can install Dusty directly via Homebrew:
brew install theappcenter/tap/dusty
Or explore the open web version and direct DMG at dustystorage.com.
What’s the largest hidden directory you’ve ever found eating your Mac’s storage? Let me know in the comments below!
Top comments (0)