CoreSimulator is taking 40 GB: the devices folder, and the simctl flags that clean runtimes
· 3 min read
The first page on this site about simulators covers the runtimes, the 6 to 10 GB images Xcode downloads per iOS version. They are the obvious part. On the Mac this site is written on, they are not the biggest one.
du -sh ~/Library/Developer/CoreSimulator/Devices
xcrun simctl runtime list
xcrun simctl list devices unavailable | grep -c unavailable
| What | Where | This Mac |
|---|---|---|
| Simulator devices | ~/Library/Developer/CoreSimulator/Devices |
40 GB |
| Devices whose runtime is gone | the same folder, listed as unavailable | 33 devices |
| Runtime images | /Library/Developer/CoreSimulator/Images and Volumes |
4 runtimes, 34.3 GB |
Devices: the folder nobody opens
Every simulator you create, and every one Xcode creates for you when you pick a
new destination, gets a folder under Devices, named by a UUID. The folder is
that device's whole disk: every build you installed into it, the app's
documents, photos you dragged in, the keychain, caches.
Two things make it grow without anyone noticing:
- It is per device. Test on an iPhone 15, an iPhone 17 Pro and an iPad, and your app, its data and its caches exist three times.
- Devices outlive their runtimes. Delete the iOS 17 runtime and the iOS 17 simulators stay on disk, marked unavailable, unbootable, still full.
Clearing devices
# See which ones are orphaned.
xcrun simctl list devices unavailable
# Remove them. Devices whose runtime still exists are untouched.
xcrun simctl delete unavailable
# Reset every remaining device to a fresh install. Names and runtimes stay.
xcrun simctl erase all
erase all is the one for a folder that is big because of your own app's data.
It shuts down booted simulators first. The next build installs into a clean
device, as if created that morning.
Quit Simulator and Xcode before deleting anything under Devices by hand.
simctl keeps a list of devices; a folder removed behind its back leaves an
entry that points at nothing.
Runtimes: four flags worth knowing
Since Xcode 15, xcrun simctl runtime delete takes more than an identifier.
From its own help text:
xcrun simctl runtime delete --notUsedSinceDays 30 --dry-run
xcrun simctl runtime delete --outdated --dry-run
xcrun simctl runtime delete --unusable --dry-run
xcrun simctl runtime delete <identifier>
--notUsedSinceDays Nremoves runtimes no simulator booted in N days.--outdatedremoves a runtime when a newer version of the same one is installed: iOS 26.4 when 26.5 is there.--unusableremoves images marked unusable, usually a half-finished download or a runtime the installed Xcode can no longer run.--dry-runprints what would go and deletes nothing. Use it first, every time.
Delete runtimes before running simctl delete unavailable, so the devices of
the runtimes you just removed go in the same pass.
What to keep
The runtime for the oldest iOS version your app supports, the newest one you build against, and the devices you test on this month. Everything else comes back with one download or one "Add simulator".
Where Decruft fits
Decruft's Smart Scan lists the simulator devices folder and the simulator caches with their measured sizes, and moves what you pick to the Trash. The runtime images live outside your home folder and belong to simctl; the commands above are the right tool for them, and Decruft shows their size so you know what is waiting there. Scanning is free.
Questions
What is in ~/Library/Developer/CoreSimulator/Devices?
One folder per simulator device, named by its UUID. Each holds the device's own disk: installed apps, their data, photos, keychain, caches. It grows every time you install a build into that simulator.
Is it safe to delete CoreSimulator/Devices?
Deleting through simctl is safe: xcrun simctl delete unavailable removes devices whose runtime is gone, and xcrun simctl erase all resets the rest to a fresh install. Deleting the folder by hand while Simulator or Xcode is running can leave the device list out of step with the disk.
How do I delete old simulator runtimes from the command line?
xcrun simctl runtime delete accepts an identifier, or --notUsedSinceDays N, --unusable, or --outdated. Add --dry-run first to see what would go.
Why is the Devices folder bigger than the runtimes?
Runtimes are shared read-only images, one per iOS version. Devices are per simulator and writable, so every install, every photo and every cache lands there, once per device.