You searched "how to clean System Data on Mac without CleanMyMac" and probably for one of three reasons. Either CleanMyMac kept nagging you about a subscription renewal, or you saw the Claude Code 472 GB issue and realised no consumer cleaner touches that folder, or you do not want another background daemon on a dev Mac. System Data cleanup without CleanMyMac is possible, safe, and free. This post walks the manual playbook, the exact commands, and the honest comparison against buying an app.
Why do people search for a cleanup path that skips CleanMyMac?
CleanMyMac is a $40 per year consumer cleaner. It is fine at what it targets: language packs, old mail attachments, browser caches, a curated list of common app caches. Three things drive developers away from it.
It is a subscription with a loud renewal notification. Many people prefer a one-time purchase or a free path. It does not know your tools: DerivedData, Docker.raw, ~/.claude/debug, ~/.codex, ~/.ollama/models, XCTestDevices, Cursor .pack files never show up in its default scan, because its audience is not developers. And it runs a helper daemon plus a menu bar app, which locked-down machines cannot install and skeptical devs do not want.
The rest of this post assumes one of those reasons applies and walks the free path.
What actually lives inside System Data on a dev Mac?
Before cleaning, name what is there. macOS Storage computes System Data as a residual, so no df flag reports it directly. The decoding System Data categories post breaks the residual into seven buckets. On a developer Mac, three buckets dominate:
- Xcode and iOS dev caches (
~/Library/Developer/) - AI coding tool state (
~/.claude,~/.codex,~/Library/Application Support/Cursor) - Docker and container VMs (
~/Library/Containers/com.docker.docker/.../Docker.raw)
Plus two hidden accelerators that inflate the bar even when you delete files:
- APFS local Time Machine snapshots (pinning up to 24 hours of deletions)
- Orphaned simulator runtimes under
/System/Library/AssetsV2/
That is what CleanMyMac does not see. That is what you are going after.
What is the read-only Terminal audit for the free path?
Every safe cleanup starts read-only. Never type a delete command until you have seen the size of what you are about to remove. Paste the block below into Terminal. It writes a dated report to your Desktop and touches nothing else.
# System Data audit for the free cleanup path.
# Read-only. Nothing gets deleted, moved, or opened.
{
printf "\n=== Disk baseline ===\n"
df -h /
printf "\n=== Xcode + iOS dev ===\n"
du -sh ~/Library/Developer/Xcode/DerivedData 2>/dev/null
du -sh ~/Library/Developer/Xcode/Archives 2>/dev/null
du -sh ~/Library/Developer/Xcode/"iOS DeviceSupport" 2>/dev/null
du -sh ~/Library/Developer/CoreSimulator/Devices 2>/dev/null
du -sh ~/Library/Developer/CoreSimulator/Caches 2>/dev/null
du -sh ~/Library/Developer/XCTestDevices 2>/dev/null
printf "\n=== AI coding tools ===\n"
du -sh ~/.claude 2>/dev/null
du -sh ~/Library/Caches/claude-cli-nodejs 2>/dev/null
du -sh ~/.codex 2>/dev/null
du -sh ~/Library/Application\ Support/Cursor 2>/dev/null
printf "\n=== Local LLMs ===\n"
du -sh ~/.ollama/models 2>/dev/null
du -sh ~/.cache/huggingface 2>/dev/null
du -sh ~/.lmstudio/models 2>/dev/null
printf "\n=== Docker and JS ===\n"
du -sh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw 2>/dev/null
du -sh ~/.npm/_cacache 2>/dev/null
printf "\n=== APFS snapshots ===\n"
tmutil listlocalsnapshots / 2>/dev/null
} | tee ~/Desktop/systemdata-noclean-audit-$(date +%Y%m%d).txt
The output tells you the ranking. Attack the biggest three lines first. The check System Data size Mac Terminal post explains each column of that report in more depth if you want the theory before the cleanup.
How do I clean each category safely without CleanMyMac?
The rule is always the same. Move to ~/.Trash/ with a timestamp, do not rm -rf. Trash is APFS-native, reversible for seven days, and costs no extra disk while the files sit there.
Xcode DerivedData
Xcode rebuilds it automatically on next open. Safe to reclaim whenever no build is running.
mv ~/Library/Developer/Xcode/DerivedData \
~/.Trash/DerivedData-$(date +%Y%m%d-%H%M%S)
Xcode Archives
Only reclaim after you have shipped or exported the archives you care about. Check the Xcode Organizer first.
mv ~/Library/Developer/Xcode/Archives \
~/.Trash/XcodeArchives-$(date +%Y%m%d-%H%M%S)
Old iOS simulator runtimes
Use the official command first because it hooks into Xcode metadata cleanly.
xcrun simctl delete unavailable
For runtimes simctl cannot reach, the reclaim disk from Xcode simulators playbook lists the paths.
Claude Code debug and MCP logs
The 472 GB bug lived here. Cap it and move the accumulated debug tree.
mv ~/.claude/debug ~/.Trash/claude-debug-$(date +%Y%m%d)
mv ~/Library/Caches/claude-cli-nodejs \
~/.Trash/claude-cache-$(date +%Y%m%d)
Then add the cap so it does not come back. Edit ~/.claude/settings.json:
{
"cleanupPeriodDays": 4
}
Codex CLI rollouts and sessions
mv ~/.codex/sessions ~/.Trash/codex-sessions-$(date +%Y%m%d) 2>/dev/null
mv ~/.codex/log ~/.Trash/codex-log-$(date +%Y%m%d) 2>/dev/null
Keep ~/.codex/auth.json and ~/.codex/config.toml where they are. Do not move the whole ~/.codex/ directory.
Ollama models you no longer use
Do not delete the whole models folder. Delete individually.
ollama list
ollama rm <model-name>
Only after you have listed and named what you keep. Model weights are expensive to redownload.
Docker.raw
Docker Desktop reclaims disk when you prune, not when you delete files. Never rm Docker.raw directly.
docker system prune -a --volumes
Read the docker system prune explained post before running with --volumes because it removes stopped-container volumes, which sometimes hold real data.
APFS local snapshots
If a 40 GB delete did not shrink the Storage bar, snapshots are the reason.
tmutil listlocalsnapshots /
sudo tmutil deletelocalsnapshots 2026-07-02-091502
Replace the date with an entry from the listing. Snapshots expire naturally within 24 hours, but you can force it earlier.
The reduce System Data macOS safely post walks the same nine folders with more per-folder context if you want the long form.
How does the free path compare against CleanMyMac and CleanMyDev?
Real head-to-head, no marketing spin. Values below reflect a typical iOS + AI developer Mac in mid-2026.
| Capability | Manual Terminal | CleanMyMac | CleanMyDev |
|---|---|---|---|
| Cost | Free | $40 per year subscription | $9.99 lifetime |
| Xcode DerivedData audit | Yes (du -sh) |
Partial (single line) | Yes (per-project rows) |
| Claude Code debug audit | Yes (manual path) | No | Yes (auto path) |
| Codex CLI rollout audit | Yes (manual path) | No | Yes (auto path) |
Cursor .pack audit |
Yes (manual path) | No | Yes (auto path) |
| Ollama model audit | Yes (ollama list) |
No | Yes (per-model rows) |
| Docker.raw reclaim | Yes (docker system prune) |
No | Yes (integrated) |
| APFS snapshot handling | Yes (tmutil) |
Partial | Yes (integrated) |
| Move to Trash by default | Yes if you type mv |
Yes | Yes |
| Per-row receipts (size, mtime, tool, risk) | No (script output only) | Partial | Yes |
| Background daemon | No | Yes | No |
| Time cost per full sweep | 30 to 60 minutes | 5 to 10 minutes | 30 to 90 seconds |
CleanMyMac loses on developer coverage. Manual Terminal loses on time and readability. CleanMyDev is what you get when a dev writes the same script they were already running, plus receipts and a UI, and sells it once instead of renting it. The CleanMyMac alternatives 2026 comparison round-up covers the full landscape if you want more options.
What does a real free-path cleanup session look like end to end?
Based on the brtkwr.com writeup on freeing 200 GB from a full disk, a typical single-user session went from 98.5 percent full (487 GB used) to 55 percent used (274 GB), a 213 GB reclaim, using nothing but Terminal. The verbatim breakdown:
"Docker was the biggest culprit... The volumes were almost entirely unused, probably from old postgres/redis containers I'd stopped months ago."
"After the initial Docker/cache cleanup freed 150GB, going back and asking 'what else?' found another 75GB."
That is the "run audit, act, rerun audit" loop the free path relies on. No cleaner app was installed. No subscription was charged. Every deletion was a mv to Trash or an official prune command. The reclaim came from knowing where to look, which is exactly what the audit block above prints in one shot.
What are the sharp edges of the free path?
Three things bite people who skip a cleaner entirely. You will miss folders you did not think to audit (per-app ~/Library/Application Support/* bloat, orphaned Homebrew casks, ~/Library/Group Containers/* snapshots). You will not have receipts, so you cannot see when a folder was last written to or which tool owns it. And you will get bored and stop, run it once, save 100 GB, feel good, then find the disk full again in six months.
When does buying CleanMyDev pay for itself over the free path?
On a 256 GB or 512 GB MacBook with daily AI coding tool use, the disk fills faster than you can audit manually. At $9.99 lifetime, CleanMyDev pays for itself the first time it saves you from a "low disk space, cannot install OS update" moment. On a 1 TB drive with light Xcode use, the free path is plenty.
CleanMyDev does not replace the free path. It automates it, adds per-row receipts, and schedules the sweep so you do not have to remember. Audit mode is free at /#pricing, so you can compare numbers before paying.