Deleting old iOS simulators and runtimes
Simulators are the quietest 40 GB on a developer's Mac. Here is how to see what you have, and remove only what you will not miss.
Updated 2026-08-13
Two things, not one
There are two separate sinkholes and they are easy to confuse. Devices are the individual simulated iPhones and iPads, each with its own disk image full of installed apps and data. Runtimes are the operating system images those devices boot — one per iOS version, several gigabytes each.
Deleting a device frees whatever that device accumulated. Deleting a runtime frees several gigabytes at once, but breaks every device that depends on it. Do devices first.
$ du -sh ~/Library/Developer/CoreSimulator/DevicesTotal taken by simulated device disks.
$ du -sh ~/Library/Developer/CoreSimulator/*Devices, caches and images side by side.
The one command most people need
$ xcrun simctl delete unavailableDeletes every simulated device whose runtime is no longer installed. These are pure waste — they cannot be booted. Safe, fast, and usually the biggest single win.
Going further, carefully
See what you have before removing anything:
$ xcrun simctl list devicesEvery simulated device, grouped by runtime, with its UDID and state.
$ xcrun simctl list runtimesThe installed iOS, watchOS, tvOS and visionOS images.
$ xcrun simctl list devices | grep -c ''A quick count. Over a hundred lines is common and is a sign to prune.
Then remove precisely:
$ xcrun simctl delete 1A2B3C4D-0000-1111-2222-333344445555Deletes one device by UDID, as printed by `simctl list devices`.
$ xcrun simctl erase allKeeps every device but wipes their contents — installed apps, databases, photos. Frees space without changing your device list.
$ xcrun simctl runtime delete 'iOS 17.5'Removes an entire runtime image. Several gigabytes, but every device on that runtime becomes unavailable.
Which runtimes to keep
The honest rule is your deployment target plus the current release. If your app supports iOS 17 and up, and iOS 19 is current, you need 17 and 19 — the versions in between rarely surface bugs the endpoints do not.
| Runtime | Keep? | Why |
|---|---|---|
| Current iOS | Always | What your users are on. |
| Your minimum deployment target | Always | The version most likely to break. |
| One or two in between | Optional | Useful if you support a wide range. |
| Anything older than your target | No | You are not shipping to it. |
| watchOS / tvOS you do not ship | No | Installed by default, frequently unused. Several GB each. |
Keeping it from coming back
- Run
xcrun simctl delete unavailableafter every Xcode major update. It takes a second and prevents the whole problem. - In Xcode → Settings → Platforms you can see and remove installed runtimes with a UI rather than commands.
- ~/Library/Developer/CoreSimulator/Caches holds downloaded runtime images after installation. It is safe to clear and is often several gigabytes on its own.
Will I have to re-download runtimes I delete?
Yes, if you need them again. They come from Apple through Xcode, at several gigabytes each. Delete the ones you do not ship against, not the ones you use weekly.
Does deleting simulators affect real devices?
No. Simulators are entirely separate from physical devices and from the symbols under iOS DeviceSupport.
What is the difference between erase and delete?
Erase wipes a simulator's contents and keeps it in your list. Delete removes the simulator entirely. Erase is the reversible one.
I deleted simulators and df shows no change. Why?
An APFS snapshot is still holding those blocks. See the guide on free space versus a full disk.
The automated version
Everything above works, costs nothing, and will keep working. Loupe does the same across every project on your disk at once, and shows what each deletion will cost to rebuild before you agree to it.
Related guides