How do I clean System Data on a Mac without installing CleanMyMac?

System Data cleanup on Mac without CleanMyMac using free Terminal commands, per-tool caps, and a Trash-first sweep. Includes a manual vs cleaner comparison table and audit script.

7 min read · Published · Updated · Saad Belfqih

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.

TL;DR
System data cleanup without CleanMyMac uses stock Terminal tools: `df -h /` for baseline, `du -sh` on 15 developer paths, `tmutil` for APFS snapshots, `docker system prune` for Docker.raw, and `mv` to `~/.Trash/` instead of `rm -rf`. It takes 30 to 60 minutes and reclaims 40 to 200 GB on a dev Mac. CleanMyDev automates the same audit at $9.99 lifetime with per-row receipts, but the manual path costs zero dollars and stays fully reversible for seven days.

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:

Plus two hidden accelerators that inflate the bar even when you delete files:

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.

Related reading

Stop wondering what System Data is.

CleanMyDev opens the box. 110+ developer-specific cleanup targets. Move-to-Trash by default. $9.99 lifetime.

Get CleanMyDev — $9.99