How I freed 147 GB on my MacBook in 12 minutes with CleanMyDev

A timestamped before-after of a developer Mac cleanup: 147 GB freed in 12 minutes across Claude, Cursor, Codex, Ollama, Docker, and Xcode, with receipts.

8 min read · Published · Updated · Saad Belfqih

I started the timer when I clicked Scan. I stopped it twelve minutes later when the storage bar dropped from 891 GB used to 744 GB used on a 1 TB drive. The number on the screen said 147 GB freed. I checked it twice. The Finder Get Info window agreed. The macOS Storage settings agreed five minutes after that, once the system finished reconciling. None of this was a benchmark. It was a Tuesday morning before my second coffee.

If you have ever run a du -sh ~/.claude ~/.cursor ~/.codex line and felt the dread when the totals came back, this post is for you. Here is the timestamped version of what I deleted, where it lived, and why none of it broke my dev setup.

TL;DR
I freed 147 GB on my MacBook in 12 minutes using CleanMyDev. The biggest sources were Docker volumes at 41 GB, Ollama models at 38 GB, Claude Code logs at 22 GB, Cursor pack files at 14 GB, Xcode DerivedData at 18 GB, and Codex CLI rollouts at 9 GB plus long tail. Everything moved to Trash, not `rm -rf`, so I had a seven-day undo window. After a week of normal use, nothing broke, and I emptied Trash.

What did the MacBook look like the morning I started?

A 2023 MacBook Pro, 1 TB internal, 891 GB used, 109 GB free. macOS Storage settings showed 168 GB of System Data and would not break it down further. I had been using Claude Code daily since February 2025, Cursor as my main editor since April, Codex CLI alongside both since July, and Ollama for offline experiments since October. Docker had been running side-project databases since 2024. Xcode 16.2 was installed but only opened twice a month.

This is the exact profile brtkwr.com describes from their own cleanup. Their words apply word for word to my Tuesday: "Docker was the biggest culprit... The volumes were almost entirely unused, probably from old postgres/redis containers I'd stopped months ago."

I did not have a 472 GB Claude Code disaster like Issue #18869 describes. I had something more boring and more common: six tools that each ate slightly too much, distributed across paths that Finder hides.

Where did the 147 GB actually live?

Here is the receipts table CleanMyDev showed me after the scan finished. Numbers are pre-deletion sizes. Status is what I did with each row.

Source Path Size Action Why it was safe
Docker ~/Library/Containers/com.docker.docker/Data/vms/0/data.raw plus dangling volumes 41 GB Trash Old postgres and redis volumes from 2024 side projects
Ollama ~/.ollama/models/ 38 GB Trash subset Kept current models, removed three I had not run in 90+ days
Claude Code ~/.claude/debug plus ~/Library/Caches/claude-cli-nodejs/--mcp-logs-* 22 GB Trash Diagnostic only, not auth or session state
Xcode ~/Library/Developer/Xcode/DerivedData 18 GB Trash Rebuilt on next open of any project
Cursor ~/.cursor/extensions/ .pack files 14 GB Trash Old pack files from extensions I had since uninstalled
Codex CLI ~/.codex/sessions/ plus ~/.codex/worktrees/ 9 GB Trash Rollouts from completed jobs, abandoned worktrees
Hugging Face ~/.cache/huggingface/datasets/ 3 GB Trash One notebook dataset I had not reopened in months
Various caches npm, Playwright, pnpm 2 GB Trash Documented as safely re-downloadable
Total 147 GB

A note on the Docker line. The 41 GB was not a single bloated volume. It was 11 stopped containers each pinning a volume between 600 MB and 7 GB, plus 18 GB of build cache layers nothing referenced anymore. The data.raw sparse file looked like 60 GB to Finder but actually consumed 41 GB of physical disk. Once the volumes went, docker system df reported a recovery that lined up with the CleanMyDev preview to within 400 MB.

What did the 12 minutes actually look like?

Here is the timeline I jotted down in my notes app while the app was running.

00:00  open CleanMyDev, click Scan All
00:42  Claude Code scan done, 22 GB flagged
01:08  Cursor scan done, 14 GB in .pack files
01:31  Codex CLI scan done, 9 GB sessions + worktrees
02:14  Ollama scan done, 38 GB across 7 models with last-used dates
02:48  Hugging Face triple cache scan done, 3 GB datasets only
03:22  Xcode scan done, 18 GB DerivedData
04:05  Docker scan done, 41 GB stopped volumes + build cache
04:30  full audit table rendered
04:30  start reviewing rows
07:50  approved 19 rows, deselected 4 (active Cursor extensions, current Claude project, two Ollama models I still wanted)
07:55  click Move Selected to Trash
11:48  deletions complete, Storage settings starts reconciling
12:00  stopped the timer

Four minutes scanning. Three and a half minutes reviewing. Four and a half minutes for the actual move. I lost the most time on Ollama because models are not junk, and CleanMyDev rightly forces you to confirm each one. The last-used date column was the only reason I felt safe deleting the 70B model I had run twice in October.

How does this compare to cleaning by hand?

The first time I did a developer Mac cleanup, in November 2025, it took me four hours and I deleted a project's auth tokens by accident. Here is the honest comparison.

Approach Time to first GB freed Time to 100 GB freed Risk surface
Manual du plus rm -rf 20 minutes 4+ hours High, easy to typo a path
find plus shell aliases 30 minutes 3 hours Medium, alias drift over time
CleanMyMac scan 8 minutes not possible, no dev cache support N/A for dev paths
CleanMyDev audit 4 minutes 12 minutes total Low, every action moves to Trash

The numbers are not flattering to me. I built CleanMyDev partly so I would never have to repeat the four-hour Saturday again.

What did I do with the seven-day Trash window?

This is the part nobody talks about. Move to Trash is only safe if you actually use the undo window. For seven days after the cleanup I made a point of doing the following on my normal projects.

# Rebuild whatever Xcode wants
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp clean build

# Re-pull Docker images that any side project still uses
docker compose up -d --build

# Reopen Cursor and confirm my real extensions still load
open -a Cursor ~/code/main-project

# Restart a Claude Code session and verify auth + project memory
cd ~/code/main-project && claude

Everything worked. Xcode did spend 90 seconds rebuilding DerivedData on the first open of a project, which is exactly what safely-delete-xcode-deriveddata documents. Cursor relaunched without prompting me to re-install. Claude Code remembered my account and project history because ~/.claude itself was never deleted, only ~/.claude/debug and the MCP log cache. Ollama models I had kept were still listed.

On day seven I emptied Trash and reclaimed the disk for real.

Why did macOS not warn me before I hit 891 GB?

Because macOS does not classify any of this. Apple's Storage settings cluster Claude logs, Cursor pack files, Codex sessions, Ollama models, Hugging Face cache, Docker volumes, and most of DerivedData under one gray bar labeled System Data. If you want the full breakdown of what System Data actually contains on a developer Mac, I wrote that one too. The short version is that any folder under ~/Library, any dotfolder in your home, and Docker's virtual disk image all count.

The system that took 16 months to fill took 12 minutes to fix only because the audit was already mapped. If you want to know exactly how to clean up Claude Code disk usage safely on your own machine without an app, those posts cover the manual paths. CleanMyDev's only real contribution is that it runs the audit and the move at the same time, with receipts.

What would I do differently next time?

Three things.

I would not have waited 14 months. The first audit run on a fresh AI-tool install should happen at month three. The growth curve I documented in my 16-month AI tools disk footprint audit is exponential, not linear. Catching it at 30 GB is trivial. Catching it at 247 GB is a Tuesday morning post.

I would set cleanupPeriodDays on Claude Code immediately. Adding "cleanupPeriodDays": 4 to ~/.claude/settings.json would have capped the 22 GB Claude line at maybe 2 GB. I had never heard of the setting before reading Issue #18869. Anthropic's documented mitigation, set once, would have saved 20 GB on its own.

I would run docker system prune --volumes on a calendar reminder. The 41 GB Docker line was 100% recoverable with one command. I just did not know the volumes were there, because I had stopped the containers six months ago and assumed stopped meant gone.

So what is the actual takeaway?

A developer Mac that uses Claude, Cursor, Codex, Ollama, Docker, and Xcode is going to accumulate between 80 GB and 300 GB of safely-removable data per year. The exact mix shifts. The total does not. The only question is whether you discover this when the macOS update fails, or before.

If you want to do the audit by hand, every path in the table above is documented. If you want to do it in 12 minutes with a Trash-first safety net, that is what CleanMyDev is for. One-time $9.99, no subscription, no telemetry, no scareware, no rm -rf. Receipts before deletion.

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