Why System Data Is So Large on a Developer Mac
On a developer Mac, the grey “System Data” bar in Storage settings is mostly files your tools wrote, not macOS itself. Here is how to find what is in it, what each part is, and what is safe to remove.
Updated:
What System Data actually is
Open System Settings > General > Storage and macOS sorts your disk into Applications, Documents, Photos and so on. Anything it cannot put in one of those rows lands in System Data. That includes real system files (swap, sleep image, update snapshots, logs), but also every cache and support folder under ~/Library and /Library that does not belong to a named category.
Developer tools write almost everything there. Xcode build products, simulator devices, simulator runtimes, npm and CocoaPods caches, Docker's disk image and Android emulators all live in Library folders or hidden folders in your home directory. The Storage window does not open them for you, so the bar just keeps growing with no explanation.
Find the big folders yourself
You do not need a tool to see where the space went. du measures folders, and sorting the output puts the largest last. Start with your home folder, then go one level deeper into whatever is big.
# largest folders directly under your home folder
du -h -d 1 ~ 2>/dev/null | sort -h | tail -15
# inside Library, where most of System Data lives
du -h -d 1 ~/Library 2>/dev/null | sort -h | tail -15
# developer folders specifically
du -sh ~/Library/Developer/* 2>/dev/null
du -sh ~/Library/Developer/Xcode/* 2>/dev/null
du -sh ~/Library/Caches/* 2>/dev/null | sort -h | tail -15Some folders are protected and print "Operation not permitted" unless Terminal has Full Disk Access (System Settings > Privacy & Security). The 2>/dev/null hides those messages; the totals for the folders you can read are still correct.
Xcode and the iOS simulators
On most Apple-platform developers' Macs this is the largest group. All of it is under ~/Library/Developer and /Library/Developer.
~/Library/Developer/Xcode/DerivedData: build products and indexes for every project you opened. Safe to delete when Xcode is not building; the next build is a full rebuild. See how to clear DerivedData.~/Library/Developer/Xcode/Archives: every build you archived for the App Store or TestFlight, with its dSYMs. Deleting is permanent; keep the archives of versions people still use, or you lose the symbols for their crash reports.~/Library/Developer/Xcode/iOS DeviceSupport: debug symbols copied from each iPhone OS version you connected. Old versions can go; Xcode copies them again the next time that device connects. See the DeviceSupport guide.~/Library/Developer/CoreSimulator/Devices: one folder per simulator, holding its installed apps and data./Library/Developer/CoreSimulator: simulator runtimes (the iOS system images) and their caches. On one developer's Mac, two iOS runtimes took 15.3 GB. Runtimes and simulators are covered in freeing space from iOS simulators.
Package caches
Package managers keep a copy of everything they download so the next install is fast. None of these caches hold your code, and each tool downloads again what it needs. The cost of clearing one is only time and bandwidth on the next install.
du -sh ~/.npm ~/.pub-cache ~/.gradle/caches 2>/dev/null
du -sh ~/Library/Caches/CocoaPods ~/Library/Caches/Homebrew ~/Library/Caches/pip 2>/dev/null
# each tool has its own cleaning command, for example
npm cache clean --force
pod cache clean --all
brew cleanup
pip cache purge~/.pub-cache is different: Flutter and Dart projects resolve packages straight from it, so deleting it means every project runs flutter pub get again. Use dart pub cache clean only if you are fine with that. Per-project folders such as node_modules, .dart_tool and build/ are not in System Data but count against the same disk; see deleting node_modules and freeing space from Flutter.
Docker and Android
Docker Desktop keeps all images, containers and volumes inside one disk image file, ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw. Deleting that file deletes every container and volume, including databases you may still need. Clean from inside Docker instead:
# what Docker itself is using
docker system df
# remove stopped containers, unused networks, dangling images and build cache
docker system pruneAdd --volumes only if no volume holds data you care about. docker system prune asks for confirmation and lists what it will remove.
Android Studio stores emulator system images in ~/Library/Android/sdk/system-images, each emulator's data in ~/.android/avd, and Gradle's download and build cache in ~/.gradle/caches. Remove emulators from Android Studio's Device Manager and system images from the SDK Manager rather than by hand, so the SDK stays consistent. Gradle's cache can be deleted when no build is running; the next build downloads dependencies again.
Local Time Machine snapshots
If Time Machine is on, macOS keeps local snapshots of your disk for a short time so you can restore files even when the backup drive is not connected. Snapshots also hold on to space from files you already deleted, which is why deleting a big folder sometimes frees less than expected at first.
# list local snapshots on the startup disk
tmutil listlocalsnapshots /Snapshots named com.apple.TimeMachine.<date>.local belong to Time Machine; macOS removes them on its own as they age or when the disk runs low. Snapshots named com.apple.os.update-… belong to macOS updates; leave those alone. If you need the space now, you can remove one Time Machine snapshot with sudo tmutil deletelocalsnapshots <date>, using the date from the list. You lose the ability to restore from that point.
What is not from your developer tools
Not all of System Data is yours to clean. Swap files and the sleep image in /System/Volumes/VM, the Spotlight index, system logs and update snapshots are managed by macOS and grow or shrink with use. Mail, Messages attachments and iPhone backups in ~/Library/Application Support/MobileSync/Backup also live in Library and can be large. Before deleting anything you do not recognise, find out which app owns it. If a folder belongs to an app you still use, removing it can sign you out, lose settings, or break the app.
Doing it with CleanDev
CleanDev does the developer part of this for you and tells you, for each item, what happens if it is removed. CleanDev Lite is free on the Mac App Store and clears Flutter, Node and Unity project folders you choose. The full CleanDev (direct download, launching soon) adds:
- Xcode DerivedData, old archives (moved to the Trash) and old DeviceSupport, keeping the newest and anything in use up for review
- Simulator content reset with
simctl erase; the simulators themselves stay, and a booted one is never touched - npm, npx, CocoaPods, pip, Homebrew, uv and pub caches
It does not yet handle simulator runtimes, Docker, Android emulators or Gradle, or Time Machine snapshots. For those, use the commands above.
Questions
Is it safe to delete System Data on a Mac?
Not as a whole, and macOS does not offer a button for it. What you can safely clear are specific folders inside it that you have identified, such as Xcode DerivedData or package caches, which tools rebuild or download again.
Why did System Data not shrink after I deleted files?
Storage settings recalculate slowly, and local Time Machine snapshots can still reference the deleted data. Check free space with df -h / and list snapshots with tmutil listlocalsnapshots /.
Does Xcode count as System Data?
The Xcode app itself counts under Applications. What it creates, such as DerivedData, archives, DeviceSupport, simulators and runtimes under the Library folders, usually ends up in System Data.
Will deleting caches break my projects?
Package and build caches only make the next install or build faster. Your source code is not in them, so the cost is a slower next build and a fresh download. Archives and Docker volumes are not caches; deleting them loses data for good.
How do I see what is inside System Data?
Run du -h -d 1 ~/Library 2>/dev/null | sort -h | tail -15 in Terminal and work down into the largest folders. Giving Terminal Full Disk Access lets it measure protected folders too.