If you develop on a 256 GB Mac, you already know the sinking feeling when macOS pops up the dreaded warning:
"Your disk is almost full."
You open System Settings → General → Storage, hoping for answers, only to be greeted by an ominous grey bar labeled System Data: 60+ GB. Apple gives you no breakdown, no inspection tool, and no way to clean it without guessing.
Last week, my 228 GiB APFS volume dropped to a critical 21 GiB free (89% full). As someone running complex polyglot workflows—GitLab source builds, AI agents, language servers, video editing, and Docker—I decided to run a forensic terminal audit across my entire system.
What I found was shocking: over 50 GB of pure dead waste, aborted network packfiles, duplicate binaries, and unmanaged caches that standard cleaning tools completely miss.
Here is the breakdown of what is secretly eating your Mac's storage and the exact commands to reclaim tens of gigabytes.
1. The Ghost Git Packs: When git clone Fails Silently
When an agent or terminal process runs git clone or git fetch on a huge repository (like GitLab or Chromium) and the network drops or the terminal is killed, Git does not clean up temporary packfiles.
They sit forever in .git/objects/pack/tmp_pack_* as orphaned, unindexed binary blobs:
ls -lh ~/.gemini/antigravity/scratch/gitlab-source/.git/objects/pack/tmp_pack_*
# -r--r--r-- 1 pavan staff 1.8G tmp_pack_LvLSDN
# -r--r--r-- 1 pavan staff 820M tmp_pack_2eoj8e
Space wasted: 2.69 GB of completely unreadable, orphaned junk.
The Fix:
Run a scan across your projects for aborted packfiles:
find ~ -type f -name "tmp_pack_*" -exec ls -lh {} +
# Remove them safely:
find ~ -type f -name "tmp_pack_*" -delete
2. Duplicate CLI & Extension Binaries
If you use VS Code, Cursor, or AI-powered IDEs with extensions like Claude Code or SonarLint, check your extension directories.
Whenever extensions auto-update, older versions are frequently retained side-by-side with full standalone binaries:
du -hd 1 ~/.antigravity-ide/extensions | grep claude-code
# 319M anthropic.claude-code-2.1.319-darwin-arm64 (Active)
# 317M anthropic.claude-code-2.1.318-darwin-arm64 (Dead)
# 308M anthropic.claude-code-2.1.316-darwin-arm64 (Dead)
# 275M anthropic.claude-code-2.1.312-darwin-arm64 (Dead)
Combined with global npm installs, URL handlers, and cache directories, there were five identical copies of the exact same ~260MB binary, eating over 1.5 GB.
The Fix:
Delete older, superseded extension version directories and leave only the latest active release.
3. The Forgotten Render Caches (DaVinci Resolve & Premiere)
If you edit video on your machine, your NLE quietly generates gigabytes of proxy files and timeline render cache clips behind your back.
In DaVinci Resolve:
- Path:
~/DaVinci Resolve/FileDaVInci/CacheClip(or~/Movies/CacheClip) - Size found: 1.61 GB (and often climbs to 20–50 GB on active projects).
These files are completely safe to purge because the video editor will automatically re-render timeline clips when you open the project.
4. GoogleUpdater & Stale App Installer Caches
Did you know Google Updater hoards old Chrome extension .crx update packages in your Application Support folder?
du -sh ~/Library/Application\ Support/Google/GoogleUpdater/crx_cache
# Result: 1.02 GB
Add in cached update DMGs and zips for desktop clients:
- Telegram desktop update installer cache:
~/Library/Caches/ru.keepcoder.Telegram/org.sparkle-project.Sparkle(536 MB) - Gemini app update installer DMG:
~/Library/Caches/com.google.GeminiMacOS/Updates/...(268 MB) - Ollama desktop update zip:
~/Library/Caches/ollama/updates/...(219 MB)
Once an app is updated, keeping its installer .dmg or .zip serves zero purpose.
5. Developer Scratch Workspaces & Zombie node_modules
If you use local AI coding agents or work on multi-repo microservices, scratch directories accumulate fast:
- A scratch clone of an LSP server had a 2.0 GB
node_modulesfolder sitting untouched. - A bug bounty reconnaissance folder had 1.2 GB of beautified JS dumps from a single target.
- Total across forgotten scratch projects: 12.3 GB.
The Fix:
Audit and delete abandoned scratch folders:
# Find largest node_modules across your home directory
find ~ -name "node_modules" -type d -prune -exec du -sh {} + 2>/dev/null | sort -hr | head -n 10
6. The Package Manager Cache Tax
Almost every modern developer toolchain creates its own isolated global cache:
| Tool | Cache Location | Space Found | Cleanup Command |
|---|---|---|---|
| npm | ~/.npm |
832 MB | npm cache clean --force |
| pip | ~/Library/Caches/pip |
292 MB | pip cache purge |
| Homebrew | ~/Library/Caches/Homebrew |
210 MB | brew cleanup -s |
| Bun | ~/.bun |
1.32 GB | bun pm cache rm |
| Puppeteer | ~/.cache/puppeteer |
430 MB | rm -rf ~/.cache/puppeteer |
| NuGet | ~/.nuget |
778 MB | dotnet nuget locals all --clear |
| Rustup | ~/.rustup |
2.24 GB |
rustup target list (prune unused targets) |
That's over 6 GB in package tarballs that can be re-fetched on demand anytime.
7. macOS 4K Dynamic Aerial Wallpapers & Screensavers
Starting in macOS Sonoma and Sequoia, clicking on the animated landscape wallpapers in System Settings automatically streams and caches full 4K HDR video files to your disk:
-
~/Library/Application Support/com.apple.mobileAssetDesktop(898 MB) -
~/Library/Application Support/com.apple.wallpaper(684 MB)
If you test out 5 or 6 wallpapers, you've quietly downloaded 8 to 10 GB of video files without a confirmation prompt.
8. The Secret Weapon: A Mac Reboot (/private/var/folders)
In our audit, /private/var/folders had ballooned from 4.2 GB to 8.5 GB in just 5 days.
This directory houses per-user temporary scratch storage, WebKit cache files, and compile artifacts. On macOS, a simple system restart safely and automatically flushes this directory, giving you back several gigabytes of free disk space instantly.
The Audit Scorecard: Reclaiming 50+ GB
| Category | What We Found | Space Recoverable |
|---|---|---|
| Category 1: Zero-Risk Waste | Failed git packs, update DMGs/zips, CRX caches, DaVinci render clips | ~7.9 GB |
| Category 2: Scratch Workspaces | Abandoned git clones, old JS dumps, orphan node_modules
|
~12.3 GB |
| Category 3: Redundant Archives | Sitting .zip downloads duplicated on disk |
~3.4 GB |
| Category 4: Browser & App Caches | Chrome web cache, Telegram cache, IDE caches | ~5.9 GB |
| Category 5: Stale Toolchains | Unused Rust targets, NVM duplicates, Bun/NuGet caches | ~8.0 - 13.5 GB |
| Category 6: System Temp & Reboot |
/private/var/folders flush + wallpaper trim |
~5.0 - 11.0 GB |
| Grand Total | ~42 GB to 65 GB |
Quick Shell One-Liner to Find Your Largest Files
Want to see what's eating your disk right now? Run this Python one-liner in your terminal to instantly find every file larger than 100 MB in your user directory:
python3 -c "
import os
for root, _, files in os.walk(os.path.expanduser('~')):
for f in files:
try:
fp = os.path.join(root, f)
sz = os.path.getsize(fp)
if sz > 100 * 1024 * 1024:
print(f'{sz / (1024*1024):>8.1f} MB {fp}')
except Exception:
pass
" | sort -hr | head -n 25
What's the weirdest ghost file you've discovered hiding in your Mac storage? Let me know in the comments below!
Top comments (0)