If your Mac's storage graph shows a suspicious lump labeled "System Data" or "Developer Data," a likely culprit is a graveyard of orphaned iOS, iPadOS, and watchOS simulators left behind by Xcode updates. Each simulator bundle can be 1 to 4 GB, and a few Xcode version cycles can quietly eat 20 GB or more. This guide shows you exactly how to delete unavailable simulators in Xcode, explains why they accumulate, and gives you a repeatable maintenance habit to keep that space from creeping back.
Why Unavailable Simulators Pile Up
Every Xcode major version ships a new set of simulator runtimes. When you upgrade Xcode, the old runtimes are often left on disk but marked "unavailable" because the new Xcode version no longer manages them. The simulators themselves (the individual device records) remain in ~/Library/Developer/CoreSimulator/Devices/ pointing at runtimes that no longer exist. Xcode and simctl treat these as orphans: they show up in the Simulator app with a yellow warning or simply do not boot, and they are invisible to the Finder's normal storage accounting.
The simulator runtimes themselves live in a separate location:
- Xcode 14 and earlier:
~/Library/Developer/CoreSimulator/Profiles/Runtimes/ - Xcode 15 and later (including Xcode 16):
/Library/Developer/CoreSimulator/Cryptex/Runtimes/(system-level, requires sudo to inspect)
The device records stay in ~/Library/Developer/CoreSimulator/Devices/ regardless of Xcode version. Each UUID-named folder there can be 200 MB to 2 GB on its own, depending on what apps you installed into it during development.
Step 1: See What You Actually Have
Before deleting anything, get a count of unavailable simulators so you know what the cleanup is worth.
Open Terminal and run:
xcrun simctl list devices unavailable
This prints every simulator device that no longer has a valid runtime. A long list here is normal if you have upgraded through several Xcode versions. Each entry shows the device name, its UUID, and the label (unavailable).
To see a rough disk footprint before you commit to deleting, you can check the Devices folder size:
du -sh ~/Library/Developer/CoreSimulator/Devices/
Then compare after the cleanup to see exactly how much you recovered.
Step 2: Delete Unavailable Simulators with xcrun simctl
The fastest, safest way to remove unavailable simulators is the built-in simctl command. It removes only the orphaned device records and leaves your current, bootable simulators untouched.
xcrun simctl delete unavailable
That is the entire command. It runs silently and exits when done. Re-run xcrun simctl list devices unavailable afterward and you should see an empty list.
To confirm disk recovery:
du -sh ~/Library/Developer/CoreSimulator/Devices/
Compare the before and after numbers. A developer who has gone through three or four Xcode versions often recovers 5 to 15 GB from device records alone.
Step 3: Remove Old Simulator Runtimes (the Bigger Win)
Deleting orphaned device records is the quick fix, but the real storage savings usually come from removing old simulator runtimes. These are the disk images that power each OS version and they are the heaviest items in the whole Xcode storage picture.
Using Xcode's Platform List (Xcode 15 and 16)
In Xcode 15 and 16, runtime management moved into Xcode itself.
- Open Xcode.
- Go to Xcode > Settings (or press
Command,). - Click the Platforms tab.
- You will see all downloaded simulator runtimes with their sizes. Runtimes you no longer need show a download icon or no checkmark for the current Xcode. Select one and click the minus button or right-click and choose Delete.
Removing a single iOS runtime from here typically saves 4 to 8 GB.
Using simctl to List and Delete Runtimes via Terminal
If you prefer the command line or need to script this in CI, simctl also manages runtimes directly in Xcode 15+.
List all runtimes:
xcrun simctl runtime list
Delete a specific runtime by its identifier (copy the full identifier from the list output):
xcrun simctl runtime delete <identifier>
For example:
xcrun simctl runtime delete com.apple.CoreSimulator.SimRuntime.iOS-16-4
You will be prompted for your password because runtimes in Xcode 15+ live in a system-level location that requires elevated access.
Step 4: Clean Up the Xcode Derived Data and Archives
While you are in cleanup mode, two other Xcode folders are worth checking. They do not contain simulators but they commonly hold gigabytes of build artifacts.
- Derived Data:
~/Library/Developer/Xcode/DerivedData/: safe to delete entirely. Xcode rebuilds it on the next build. Often 5 to 30 GB. - Archives:
~/Library/Developer/Xcode/Archives/: contains every.xcarchiveyou have built for distribution. Only delete versions you no longer need for re-signing or dSYM lookups.
To remove all derived data from the Terminal:
rm -rf ~/Library/Developer/Xcode/DerivedData/
How Much Space Can You Expect to Recover?
Results vary based on how many Xcode versions you have installed and how actively you develop, but here are realistic ranges:
- Orphaned simulator devices only (
simctl delete unavailable): 2 to 15 GB - Removing two or three old simulator runtimes: 10 to 25 GB
- Clearing Derived Data: 5 to 30 GB
- Total potential recovery on a well-used dev Mac: 20 to 60 GB
The exact numbers depend on your project history. The du commands above let you measure before and after so you are not guessing.
Keeping Simulator Clutter Under Control Going Forward
A few habits prevent the graveyard from rebuilding itself.
- After every Xcode major version upgrade, run
xcrun simctl delete unavailableas part of your post-install checklist. - In the Xcode Platforms tab, remove runtimes for iOS versions you no longer need to test against. If your app targets iOS 17 and up, you do not need the iOS 15 runtime.
- On CI machines, add
xcrun simctl delete unavailableto your post-build or post-pipeline scripts so the workers stay lean. - Check
~/Library/Developer/CoreSimulator/Devices/periodically withdu -shto catch growth early.
What If You Want to See Sizes Before You Delete?
The terminal approach above requires you to cross-reference folder names with UUID strings, which is tedious. If you want to see each simulator device or runtime with its actual disk size before deciding what to remove, Crumb lists unavailable simulators alongside their sizes so you can review and remove them in a single click rather than piecing the picture together from du output and UUID lookups. Either path gets you to the same result; the right choice is whichever one you will actually use.
Whether you go the Terminal route or use a visual tool, the important thing is to make simulator cleanup a regular habit. A single xcrun simctl delete unavailable after each Xcode upgrade costs thirty seconds and can save you a trip to "Storage Almost Full" territory.