← Blog

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:

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>

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.