Why does System Data keep growing on my Mac even when I delete files?

System Data keeps growing on Mac because APFS snapshots, developer caches, and AI tool logs backfill anything you delete. Here is what actually feeds it and how to make it stop.

7 min read · Published · Updated · Saad Belfqih

You freed 40 GB from Downloads yesterday. You emptied Trash. You restarted. You open System Settings this morning and the gray System Data bar is 4 GB bigger than before you started. Not smaller. Bigger. If you searched for "system data keeps growing mac" and landed here, you are not imagining it. Apple's Storage bar is a residual, and on a developer Mac the writers that feed it never stop. This post names each one, explains why deletions do not shrink the bar immediately, and shows the exact commands to make the growth stop.

TL;DR
System Data keeps growing on Mac because three writers work in the background: APFS local snapshots that pin your deletions for up to 24 hours, developer toolchains (Xcode, DerivedData, Docker.raw, simulator runtimes) that regenerate caches on every build, and AI tools (Claude Code, Cursor, Codex, Ollama) that log every session. CleanMyDev audits all three in one read-only pass, shows receipts per folder, and Moves to Trash so you can reverse any call within a seven-day window.

Why does System Data grow at all when I did not install anything?

Apple computes System Data as a residual. macOS totals the six documented categories (macOS, Applications, Documents, Photos, Mail, Messages) and prints the leftover under System Data. That leftover is a real number of bytes, but Apple does not tell you which folder any of those bytes came from. So the "System Data" line is really "everything on this disk that Apple did not want to categorise for you."

On a developer Mac, the uncategorised bucket is where every tool you use dumps its state. Xcode files DerivedData under System Data. Docker Desktop's virtual disk lives there. Claude Code's ~/.claude/projects/ sits there. Ollama's model weights sit there. None of these tools are new files you consciously downloaded. They are the natural byproduct of using the tool at all.

Why does the bar not shrink after I delete files?

Three reasons, in order of frequency.

First, APFS local snapshots. macOS takes automatic Time Machine snapshots every hour and keeps them for up to 24 hours even without a Time Machine drive attached. A snapshot references the exact blocks that existed at snapshot time. When you delete a file, its blocks stay pinned by the snapshot until the snapshot expires. That is why a 30 GB Xcode DerivedData delete can free zero visible bytes for hours.

Second, background regeneration. You delete DerivedData at 09:00. You hit Cmd+B in Xcode at 09:05. Xcode rebuilds DerivedData and the folder is back to 12 GB before lunch. Same for ~/.cursor/, ~/.claude/projects/, ~/Library/Containers/com.docker.docker/. The tool refills what you emptied.

Third, spotlight lag. The Storage bar reads from the Spotlight index, not from a live filesystem walk. The index updates on a schedule. Terminal totals via du are always ahead of the bar by minutes to hours.

Sean Hyland's 200 GB reclaim writeup captured the pattern from the other side. He notes: Docker was the biggest culprit... The volumes were almost entirely unused, probably from old postgres and redis containers I had stopped months ago. The reason the volumes stayed is the same reason the bar does not shrink on your machine. Deletion is not the same as reclaim.

Which folders are actually growing on a dev Mac?

Here is the honest short list, ranked by how fast each one grows on a MacBook that ships iOS or uses AI tools daily.

Folder Owning tool Typical size Weekly growth Safe to delete?
~/Library/Developer/Xcode/DerivedData Xcode 15 to 90 GB 2 to 20 GB Yes, rebuilds
~/Library/Developer/CoreSimulator/Devices Simulator 20 to 120 GB 1 to 10 GB Case by case
~/Library/Developer/Xcode/iOS DeviceSupport Xcode 5 to 40 GB 1 to 4 GB Yes, recacheable
~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw Docker 5 to 108 GB 3 to 25 GB Prune first
~/.claude/projects/ and ~/.claude/debug/ Claude Code 2 to 472 GB 1 to 30 GB Yes, cap it
~/Library/Caches/claude-cli-nodejs/ Claude Code MCP 1 to 200 GB 1 to 40 GB Yes
~/.cursor/workspaceStorage/*.pack Cursor 3 to 60 GB 0.5 to 8 GB Yes
~/.codex/sessions/ and worktrees/ Codex CLI 0.5 to 30 GB 0.5 to 5 GB Yes
~/.ollama/models/ Ollama 5 to 300 GB Spiky Archive first
~/.cache/huggingface/{hub,datasets} Hugging Face 2 to 80 GB 1 to 15 GB Yes

That covers most of what makes "mac system data won't clear" a search query. The point of the table is not to tell you to delete everything. It is to show that the growth is coming from ten identifiable writers, not from macOS.

How do I see which writer is inflating the bar right now?

Run this in Terminal. It is read-only. It does not modify, move, or delete anything. It walks each path and prints a size. On a warm build machine it finishes in under a minute.

paths=(
  "$HOME/Library/Developer/Xcode/DerivedData"
  "$HOME/Library/Developer/CoreSimulator/Devices"
  "$HOME/Library/Developer/Xcode/iOS DeviceSupport"
  "$HOME/Library/Developer/Xcode/Archives"
  "$HOME/Library/Containers/com.docker.docker/Data/vms/0/data"
  "$HOME/.claude/projects"
  "$HOME/.claude/debug"
  "$HOME/Library/Caches/claude-cli-nodejs"
  "$HOME/.cursor/workspaceStorage"
  "$HOME/.codex/sessions"
  "$HOME/.codex/worktrees"
  "$HOME/.ollama/models"
  "$HOME/.cache/huggingface"
  "$HOME/Library/Caches/pip"
  "$HOME/Library/Caches/Homebrew"
)
for p in "${paths[@]}"; do
  [ -e "$p" ] && du -sh "$p" 2>/dev/null
done | sort -rh | tee ~/Desktop/system-data-audit.txt

The output prints one line per folder, sorted largest first, and dumps a copy to your Desktop so you can diff it against next week's run. If your top three add up to 60 percent of your used disk, you have found the growth. Now you need to stop the writer, not just delete the output.

How do I actually stop the growth without breaking my toolchain?

Deletion is a moment. Caps are a policy. You need caps.

For Claude Code, set a cleanup period in ~/.claude/settings.json:

{
  "cleanupPeriodDays": 4
}

That single line is documented on Anthropic's Claude Code Issue #18869, where a user found 472 GB of debug and MCP logs and asked why the CLI did not cap itself. Four days is a fair floor. Seven days is the strict maximum you should tolerate.

For Xcode, quit it, then let DerivedData clear on your next build. Set Xcode > Settings > Locations > Derived Data to a Custom path on an external SSD if your internal disk is under 512 GB. Do the same for Archives.

For Docker Desktop, open Settings > Resources > Advanced and reduce the virtual disk size cap. Then run docker system prune -a --volumes inside a maintenance window to actually shrink the file.

For Ollama, move the models folder to an external drive by exporting OLLAMA_MODELS=/Volumes/ExternalSSD/Ollama/models in your shell profile. The models stay, the internal disk breathes.

For APFS snapshots, list and drop them explicitly so a big delete lands the same day:

tmutil listlocalsnapshots /
# Copy a date string from the list, then:
sudo tmutil deletelocalsnapshots 2026-07-02-183042

None of these are destructive. All of them are reversible. All of them stop the growth without stopping the tool.

What about the Storage bar itself, why is it so slow to update?

The Storage bar reads a Spotlight-backed index that lags real filesystem state by minutes to hours. Terminal du is authoritative and always current. If the bar and Terminal disagree, believe Terminal. If you need to force a bar refresh, sudo mdutil -E / reindexes the volume, though this is heavy and you rarely need it. For a routine audit, treat the bar as a summary and Terminal as the truth.

When is it worth using a tool instead of the shell?

The shell is fine for one audit. It is annoying for ten in a row. If you are running the audit weekly, you want a tool that walks the paths, remembers what it saw last week, shows a per-folder receipt, and Moves to Trash so a mistake stays reversible.

That is why CleanMyDev exists. Every row shows the path, its size, when it last changed, which tool owns it, and a risk label. Nothing gets deleted without you clicking through. The Trash-first policy means anything you regret is recoverable for seven days. It is a $9.99 lifetime app, not a subscription. See the pricing on the CleanMyDev homepage if you want the one-click version of the audit above.

Related reading

If you want the deeper dive on any one part of System Data on a Mac:

Stop wondering what is inside System Data. Open the box. Get CleanMyDev for $9.99 lifetime and audit your Mac in under two minutes, with receipts before anything moves.

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