@tank/macos-cleanup
1.0.1Description
macOS disk space recovery and cleanup for developers. Scans and cleans caches, Xcode DerivedData, Docker, stale node_modules, Homebrew, npm/pip/cargo caches, logs, iOS backups. Risk-aware with dry-run analysis.
Triggered by
tank install -g @tank/macos-cleanupVerified clean
No security issues detected in the latest scan.
macOS Disk Cleanup
Recover disk space on macOS by cleaning caches, dev tool artifacts, stale dependencies, logs, and other reclaimable storage. Developer-focused — knows where the real space hogs hide on a dev machine.
Core Philosophy
- Analyze before deleting. Always scan first. Show the user what's consuming space and how much can be reclaimed before touching anything.
- Risk-aware cleanup. Categorize targets by risk (safe → low → moderate → high). Clean safe items freely, require confirmation for everything else.
- Use built-in cleanup commands. Prefer
brew cleanup,npm cache clean,xcrun simctl delete unavailableover rawrm -rf. Tools know their own cleanup semantics better than we do. - Never touch user data. Documents, Desktop, Pictures, credentials, SSH keys, keychains, git repos — hands off. Always.
- Report results. After cleanup, show before/after disk space comparison.
Quick-Start
"My disk is full, help me clean up"
| Step | Action |
|---|---|
| 1 | Run scripts/analyze-disk.sh to scan all targets |
| 2 | Review report — prioritize by size and risk |
| 3 | Clean safe targets first (caches, logs, DerivedData) |
| 4 | Present moderate targets for user confirmation |
| 5 | Only mention high-risk targets if user asks |
| 6 | Show before/after disk space comparison |
"Clean everything safe"
Execute safe-tier cleanup in order:
- User caches (
rm -rf ~/Library/Caches/*) - User logs (
rm -rf ~/Library/Logs/*) - Xcode DerivedData (
rm -rf ~/Library/Developer/Xcode/DerivedData/*) - Simulator caches (
rm -rf ~/Library/Developer/CoreSimulator/Caches/*) - Homebrew (
brew cleanup --prune=all && brew autoremove) - npm/yarn/pip caches (
npm cache clean --force, etc.) - Diagnostic reports
- Saved Application State
"What's using all my space?"
Run analysis only — no cleanup:
bash scripts/analyze-disk.sh
Or for machine-readable output:
bash scripts/analyze-disk.sh --json
Cleanup Priority Order
Targets ordered by typical space savings (highest ROI first):
| Priority | Target | Typical Savings | Risk |
|---|---|---|---|
| 1 | Xcode DerivedData + simulators | 10-80 GB | Safe |
| 2 | Docker images + build cache | 10-80 GB | Moderate |
| 3 | Stale node_modules | 5-50 GB | Moderate |
| 4 | Rust target/ directories | 5-50 GB | Moderate |
| 5 | User caches (all apps) | 2-20 GB | Safe |
| 6 | Homebrew cleanup | 1-8 GB | Safe |
| 7 | Package manager caches | 3-15 GB | Safe |
| 8 | Gradle/Maven caches | 3-13 GB | Safe |
| 9 | iOS Device Support (old) | 2-30 GB | Low |
| 10 | Trash | 0-50 GB | Moderate |
| 11 | Logs & diagnostic reports | 0.5-5 GB | Safe |
| 12 | iOS device backups | 5-100 GB | High |
Decision Trees
What to Clean Based on User Request
| User Says | Action |
|---|---|
| "Clean up my Mac" | Full scan → report → clean safe → confirm moderate |
| "Clean caches" | User + system caches, browser caches, dev tool caches |
| "Clean dev tools" | npm/pip/cargo/brew/xcode/docker/gradle caches only |
| "What's using space?" | Analysis only, no cleanup |
| "Clean Docker" | docker system prune -a (confirm first) |
| "Clean Xcode" | DerivedData + simulators + old device support |
| "Free up X GB" | Prioritized cleanup until target is reached |
| "Clean everything" | Full cleanup including moderate-risk targets |
Docker Cleanup Levels
| Level | Command | Cleans | Risk |
|---|---|---|---|
| Light | docker container prune && docker image prune | Stopped containers + dangling images | Low |
| Medium | docker system prune -a | All unused images + containers + networks | Moderate |
| Heavy | docker system prune -a --volumes | Everything + volumes (data loss!) | High |
Note: Docker Desktop's VM disk (Docker.raw) doesn't shrink after cleanup.
To reclaim host disk space: Docker Desktop → Settings → Resources → reduce
disk limit, or Troubleshoot → Clean/Purge Data.
Time Machine Local Snapshots
If disk space wasn't freed after deletion, local TM snapshots may be holding references:
SUDO="${SUDO:-$(command -v sudo)}" # override: SUDO="" or SUDO=doas
tmutil listlocalsnapshots /
$SUDO tmutil deletelocalsnapshots <date>
Safety Rules
Never touch these paths:
~/Documents,~/Desktop,~/Pictures,~/Music,~/Movies~/Library/Keychains/,~/Library/Accounts/~/.ssh/,~/.gnupg/,~/.aws/,~/.kube/,~/.config/gcloud//System/,/usr/,/bin/,/sbin/~/.cargo/bin/(installed Rust binaries, not cache)- Any
.git/directory ~/Library/Mail/(use Mail.app for mail cleanup)- iCloud files (use
brctl evictor Finder, neverrm)
See references/safety-protocols.md for detailed safety rules and
confirmation flow patterns.
After Cleanup
Always verify space was freed:
df -h /
diskutil info / | grep -E "(Free|Available|Purgeable)"
If space wasn't freed, check Time Machine local snapshots (see above).
Reference Files
| File | Contents |
|---|---|
references/cleanup-targets.md | Exhaustive list of cleanup targets with exact paths, commands, risk levels, and typical space savings for each category |
references/safety-protocols.md | Golden rules, confirmation flow patterns per risk level, paths to never touch, pre-cleanup checklist, recovery procedures |
references/space-analysis.md | Disk usage analysis techniques, scan/report/clean workflow, finding large files, stale node_modules/Rust targets, Docker analysis, recommended CLI tools |
Scripts
| Script | Usage |
|---|---|
scripts/analyze-disk.sh | Scans all known cleanup targets, reports sizes and risk levels. Flags: --json (JSON output), --dev-only (dev caches only), --quick (skip slow scans) |