How to Delete Xcode Simulators and Old Runtimes
Delete Xcode simulators and old simulator runtimes safely with xcrun simctl: list them, check sizes, then remove unavailable, unused or all of them.
Updated · 7 min read
To delete Xcode simulators, run xcrun simctl delete unavailable to remove devices your Xcode can no longer run, then xcrun simctl delete <UDID> for specific ones, or xcrun simctl delete all for everything. Simulator runtimes are separate disk images: remove old ones with xcrun simctl runtime delete. Always list and measure first.
TL;DR
# 1. See what you have and how big it is
xcrun simctl list devices
du -sh ~/Library/Developer/CoreSimulator/Devices
xcrun simctl runtime list
# 2. Remove simulators the current Xcode cannot run
xcrun simctl delete unavailable
# 3. Remove runtimes you no longer need (preview first)
xcrun simctl runtime delete --unusable --dry-run
Where are Xcode simulators stored?
Simulators have two parts that take space in different places.
Simulator devices are the phones and tablets in your list. Each one is a folder named by its UDID:
~/Library/Developer/CoreSimulator/Devices/<UDID>
A freshly created simulator is small, but once you boot it and install apps, it holds a full user data partition. On the Mac we tested this guide on, booted simulators were 5 to 7 GB each, and 13 simulators added up to 48 GB.
Simulator runtimes are the iOS, watchOS, tvOS and visionOS system images the devices run on. On current Xcode versions each runtime is a signed disk image managed by the system, and it is mounted under /Library/Developer/CoreSimulator/Volumes. A single iOS runtime is several gigabytes; the iOS 27 runtime on our test Mac is 7.5 GB. You do not manage these files by hand; use xcrun simctl runtime or Xcode.
SwiftUI preview simulators live in a third, separate set under ~/Library/Developer/Xcode/UserData/Previews, covered in the DerivedData and Xcode junk guide.
Why do Xcode simulators take up so much space?
A simulator starts small, but the first boot writes a full set of system data into its folder, and everything you do afterwards adds to it. Every build you run from Xcode installs your app into the simulator, along with its documents, caches and databases. Photos and videos you add for testing stay in the simulator’s library.
Then the count grows. Each new Xcode release brings a new runtime and often a new set of default devices, while the old devices and runtimes stay behind. Custom devices created for App Store screenshots, one per screen size, add more. Parallel testing creates its own clones in ~/Library/Developer/XCTestDevices. None of this is ever removed automatically, so a Mac that has been through a few Xcode upgrades can easily hold dozens of gigabytes of simulators nobody uses.
How to see which simulators take the most space
List every device with its name, UDID and state:
xcrun simctl list devices
Measure the whole folder and each device:
du -sh ~/Library/Developer/CoreSimulator/Devices
du -sh ~/Library/Developer/CoreSimulator/Devices/* | sort -h
The second command prints UDIDs, not names. To find out which simulator a UDID belongs to, search the list for it:
xcrun simctl list devices | grep <UDID>
To list only devices that the current Xcode cannot run:
xcrun simctl list devices unavailable
How to delete old Xcode simulators
Delete unavailable simulators first
xcrun simctl delete unavailable
This removes devices “not supported by the current Xcode SDK”, in the words of simctl’s own help. These are usually leftovers from an older Xcode or devices whose runtime you already removed. They cannot boot, so there is nothing to lose. Run it after every Xcode upgrade.
Delete specific simulators
Pass one or more UDIDs from xcrun simctl list devices:
xcrun simctl delete A1B2C3D4-1111-2222-3333-444455556666
You can do the same in Xcode: Window > Devices and Simulators, select the Simulators tab, then right-click a simulator and choose Delete.
A booted simulator should be shut down first:
xcrun simctl shutdown <UDID>
Delete all Xcode simulators
xcrun simctl shutdown all
xcrun simctl delete all
This removes every simulator device in the default set and frees the whole CoreSimulator/Devices folder, apart from a few small files. It does not remove runtimes, so you can create new simulators straight away from Xcode or with xcrun simctl create. Xcode may also recreate a default set of simulators for your installed runtimes the next time it launches.
Before you run it, check whether any simulator holds something you need: test accounts you set up by hand, app data you are debugging, or a custom device you use for App Store screenshots.
How to clear a simulator without deleting it
If you want a clean device but want to keep it in your list (with its name and device type), erase it instead:
xcrun simctl shutdown <UDID>
xcrun simctl erase <UDID>
Or erase every simulator:
xcrun simctl shutdown all
xcrun simctl erase all
Erasing resets contents and settings, which removes installed apps and their data, so it frees most of the space while keeping the device. In the Simulator app, the same action is Device > Erase All Content and Settings.
How to delete Xcode simulator runtimes
Runtimes are where the biggest single files hide, especially if you have kept several iOS versions across Xcode upgrades.
List installed runtimes
xcrun simctl runtime list
The output shows each runtime’s version, build, identifier and state, plus a total size at the bottom. Add -v for the image path, the mount path, when it was last used and whether it is deletable:
xcrun simctl runtime list -v
Preview what would be deleted
simctl runtime delete has a --dry-run flag. Use it with any of the selectors before deleting for real:
# Runtimes marked as unusable
xcrun simctl runtime delete --unusable --dry-run
# Runtimes that have a newer version with the same identifier
xcrun simctl runtime delete --outdated --dry-run
# Runtimes not used in the last 90 days
xcrun simctl runtime delete --notUsedSinceDays 90 --dry-run
Delete them
When the dry run shows what you expect, run the same command without --dry-run, or delete one runtime by the identifier shown in xcrun simctl runtime list:
xcrun simctl runtime delete <identifier>
simctl shuts down any booted simulators that use the runtime and unmounts it before deleting. Simulators that depended on it become unavailable, so follow up with xcrun simctl delete unavailable.
Delete runtimes from Xcode
In Xcode 16 and later, open Xcode > Settings > Components, select a simulator runtime and use the minus button or the context menu to delete it. In Xcode 15 the same pane is called Platforms. You can download a runtime again from the same pane whenever you need it.
Old runtimes from older Xcode versions
Runtimes installed by much older Xcode versions were often plain .simruntime bundles under /Library/Developer/CoreSimulator/Profiles/Runtimes. If you upgraded from an old setup, check that folder:
ls /Library/Developer/CoreSimulator/Profiles/Runtimes
Use xcrun simctl runtime list to see what the current Xcode still recognizes before removing anything there by hand.
What each simulator command does
| Command | What it removes | Keeps | Undo |
|---|---|---|---|
xcrun simctl delete unavailable |
Devices the current Xcode cannot run | Working devices, runtimes | Not needed; they could not boot |
xcrun simctl delete <UDID> |
One device and its data | Everything else | Create a new device |
xcrun simctl delete all |
Every device in the default set | Runtimes | Create new devices |
xcrun simctl erase <UDID> |
Apps, data and settings on one device | The device itself | None; data is gone |
xcrun simctl runtime delete <id> |
One runtime disk image | Devices (they become unavailable) | Download it again in Xcode |
xcrun simctl --set previews delete all |
SwiftUI preview simulators | Your normal simulators | Recreated on next preview |
A cleanup routine after each Xcode upgrade
xcrun simctl runtime listto see which runtimes came with the new Xcode and which are leftovers.xcrun simctl runtime delete --outdated --dry-run, then run it for real if the list looks right.xcrun simctl delete unavailableto remove devices orphaned by the runtimes you just deleted.du -sh ~/Library/Developer/CoreSimulator/Devices/* | sort -hto find any remaining heavyweights, and erase or delete them.
Simulator data is one of the reasons macOS reports a huge System Data number, because the runtime images live outside your home folder. Why System Data is so large on a Mac covers the rest. For DerivedData, device symbols and archives, see the Xcode DerivedData guide, and for every other developer folder, the guide to freeing up space on a Mac for developers.
Do it in one click with DevCleanup
DevCleanup’s Simulators screen lists every simulator device with its name, runtime and real size, plus every installed runtime, so you do not have to map UDIDs by hand. Select what to remove and DevCleanup runs the same xcrun simctl commands shown above, so Xcode stays in sync. Every action is logged in History with how to restore it. Scanning is free; developer cleanup actions are part of Pro ($29 one-time).
Frequently asked questions
Is it safe to delete Xcode simulators?
Yes. A simulator is a disposable device: deleting it removes its installed apps, data and settings, not your projects or Xcode itself. You can create a new one at any time from Xcode or with xcrun simctl create.
What does xcrun simctl delete unavailable do?
It deletes simulator devices that the current Xcode can no longer run, usually because their runtime was removed or belongs to an older Xcode. These devices cannot boot anyway, so this is the safest cleanup command to run first.
What is the difference between erasing and deleting a simulator?
xcrun simctl erase resets a simulator to factory settings and keeps the device in your list. xcrun simctl delete removes the device and its folder entirely. Shut the simulator down before either one.
How do I delete an old iOS simulator runtime?
List runtimes with xcrun simctl runtime list, then remove one with xcrun simctl runtime delete followed by its identifier. You can also delete runtimes from the Components pane in Xcode Settings.