Find out what "System Data" actually is — and get the space back.
macOS buries tens of gigabytes under a storage category it refuses to explain. Storage Control opens it up: it scans the 18 places that space actually hides, shows you what is in each one, and lets you reclaim it a file at a time.
Free, open source, no account, no telemetry, no upsell.
The built-in storage panel tells you "System Data — 84.2 GB" and stops there. The paid cleaners that fill that gap cost $40–100/year and tend to arrive with a bundle of things you did not ask for.
Storage Control does the one job: show you the bytes, then let you decide.
- It knows about AI model weights. Every model you ever pulled through Ollama, LM Studio, Hugging Face or Whisper is still on your disk, and the general-purpose cleaners have no idea what a GGUF file is. This is usually the single biggest thing they miss.
- Every item is explained. Not "Caches — 12 GB" but which app, how big, and when it was last touched.
- Prioritized, not just sorted by size. A 4 GB folder untouched for a year ranks above a 6 GB one you wrote to this morning.
- Nothing disappears without you. Deletions go to the Trash. Shell cleanups show you the exact command before running it.
brew tap natexcvi/storage-control https://github.com/natexcvi/storage-control
brew install storage-controlHomebrew compiles it on your machine and links it into /Applications.
Upgrades are brew upgrade storage-control.
Build from source instead
git clone https://github.com/natexcvi/storage-control.git
cd storage-control
make install # release build, installs to /ApplicationsOther targets: make dev (debug build), make run, make uninstall.
Requires Xcode 16+ and macOS 14 (Sonoma) or later.
Several categories live in directories macOS protects. Without this permission they scan as empty rather than failing loudly, which looks like a bug:
System Settings → Privacy & Security → Full Disk Access → add Storage Control
| Category | Location | Cleanup |
|---|---|---|
| Xcode Derived Data | ~/Library/Developer/Xcode/DerivedData |
Trash |
| Xcode Archives | ~/Library/Developer/Xcode/Archives |
Trash |
| Xcode Device Support | ~/Library/Developer/Xcode/iOS DeviceSupport |
Trash |
| Simulators | ~/Library/Developer/CoreSimulator/Devices |
xcrun simctl delete unavailable |
| Xcode Caches | ~/Library/Caches/com.apple.dt.Xcode |
Trash |
| Homebrew Cache | ~/Library/Caches/Homebrew |
brew cleanup --prune=all |
| Docker | Docker Desktop data | docker image prune -af |
| Package Manager Caches | npm, yarn, pip, cargo, go, and friends | Trash |
| Application Caches | ~/Library/Caches |
Trash |
| Time Machine Snapshots | Local APFS snapshots | Instructions only (needs sudo) |
| System Logs | /var/log |
Trash |
| User Logs | ~/Library/Logs |
Trash |
| iOS Backups | ~/Library/Application Support/MobileSync/Backup |
Trash |
| Trash | ~/.Trash |
Empty |
| Old Downloads | ~/Downloads, untouched 90+ days |
Trash |
| Unused Apps | /Applications, unopened 6+ months |
Trash |
| Duplicate Files | Content-hash matches across your home directory | Trash |
| AI Models | Ollama, Hugging Face, LM Studio, GPT4All, Jan, PyTorch Hub, TensorFlow Hub, MLX, llama.cpp, Whisper, Replicate | Trash |
Duplicate detection runs in three stages — group by size, then partial SHA-256, then full SHA-256 — so only genuine byte-for-byte matches are ever reported.
Ollama stores models as content-addressed blobs that different tags share. Storage Control parses each manifest and reference-counts every blob, so a model's listed size is what you would actually reclaim — shared bytes are called out separately and never deleted out from under another model.
This app deletes things, so it is worth being precise about how:
- File deletions use
FileManager.trashItem. Items go to the Trash and can be put back. Storage Control never callsrmon your files. - Shell cleanups are opt-in and shown verbatim. Each command is displayed
with a description and requires confirmation. They are the vendors' own
cleanup commands (
brew cleanup,docker image prune,simctl delete), not custom deletion logic. - Nothing runs with elevated privileges. Time Machine snapshots need
sudo, so the app declines to touch them and prints the command for you to run yourself. - Selection is explicit. Nothing is checked by default; there is no one-click "clean everything".
It is still a tool that removes files. Read what is selected before you clean.
swift build && swift run # fastest iteration, no install
make dev # debug build installed to /Applications
make icon # regenerate AppIcon.icns from SF SymbolsPure SwiftUI on macOS 14+, no external dependencies. Architecture notes are in
CLAUDE.md. Issues and pull requests are welcome — especially new
categories, which are a self-contained addition to Scanner.swift.
MIT — see LICENSE.
