Why Simulators Take Up So Much Space
When people say "Xcode simulators," they are usually referring to two separate things that work together:
- Simulator runtimes — These are the actual iOS, watchOS, tvOS, and visionOS system images. Each runtime is a complete, compressed operating system image that the simulator boots from. They are the heavy hitters in terms of disk space.
- Simulator devices — These are the virtual iPhone and iPad instances you see in Xcode's simulator list (like "iPhone 16 Pro" or "iPad Air"). Each device stores its own file system, installed apps, preferences, and data. They are relatively lightweight until you install many apps with large data sets.
The reason simulators consume so much space is simple: each runtime is a near-complete iOS installation. Apple needs to include the full system frameworks, libraries, and assets for every supported device type. A single iOS runtime is 8-18GB.
If you have three iOS versions installed (say iOS 16, 17, and 18), a watchOS runtime, and a visionOS runtime, you are looking at 30-55GB just for the runtimes. Add in the device data and you can easily hit 60GB+.
Simulator Runtime Sizes by Platform and Version
Here are the approximate compressed sizes for simulator runtimes as of early 2026:
| Platform | Version | Runtime Size | Notes |
|---|---|---|---|
| iOS | 18.x | 8-10 GB | Current, keep this one |
| iOS | 17.x | 7-9 GB | Keep if it matches your deployment target |
| iOS | 16.x | 6-8 GB | Likely safe to remove for most projects |
| iOS | 15.x | 6-7 GB | Remove unless your app still supports iOS 15 |
| watchOS | 11.x | 3-5 GB | Only needed if you build Watch apps |
| watchOS | 10.x | 3-4 GB | Remove if you've moved to watchOS 11 |
| tvOS | 18.x | 4-6 GB | Only for tvOS app development |
| visionOS | 2.x | 10-14 GB | Very large; only for Vision Pro development |
| visionOS | 1.x | 10-12 GB | Remove if you have 2.x |
These sizes are approximate and vary between minor versions. The key takeaway is that each runtime you remove saves you approximately one feature-length movie in 4K worth of storage.
Step 1: Audit Your Installed Simulators
List All Simulator Runtimes
# List all installed simulator runtimes
xcrun simctl runtime list
This shows output like:
== Runtimes ==
iOS 16.4 (16.4 - 20E247) - com.apple.CoreSimulator.SimRuntime.iOS-16-4
iOS 17.5 (17.5 - 21F79) - com.apple.CoreSimulator.SimRuntime.iOS-17-5
iOS 18.2 (18.2 - 22C152) - com.apple.CoreSimulator.SimRuntime.iOS-18-2
watchOS 11.2 (11.2 - 22S100) - com.apple.CoreSimulator.SimRuntime.watchOS-11-2
visionOS 2.2 (2.2 - 22N840) - com.apple.CoreSimulator.SimRuntime.visionOS-2-2
Note the identifier on the right (e.g., com.apple.CoreSimulator.SimRuntime.iOS-16-4). You will need this to delete specific runtimes.
List All Simulator Devices
# List all simulator devices grouped by runtime
xcrun simctl list devices
This produces a grouped list showing every virtual device:
== Devices ==
-- iOS 16.4 --
iPhone 14 (A1B2C3D4-...) (Shutdown)
iPhone 14 Pro (E5F6G7H8-...) (Shutdown)
-- iOS 18.2 --
iPhone 16 (I9J0K1L2-...) (Shutdown)
iPhone 16 Pro (M3N4O5P6-...) (Booted)
iPad Pro 13-inch (Q7R8S9T0-...) (Shutdown)
-- Unavailable --
iPhone 13 (U1V2W3X4-...) (Shutdown) (unavailable, runtime not installed)
The "Unavailable" section at the bottom shows devices whose runtimes have been uninstalled. These are dead weight.
Check Total Simulator Storage
# Total size of all simulator device data
du -sh ~/Library/Developer/CoreSimulator/Devices/
# Size of each individual simulator device
du -sh ~/Library/Developer/CoreSimulator/Devices/* | sort -hr | head -20
# Check runtime storage locations (macOS 14+)
du -sh /Library/Developer/CoreSimulator/Cryptex/ 2>/dev/null
du -sh /Library/Developer/CoreSimulator/Profiles/Runtimes/ 2>/dev/null
Step 2: Delete Unavailable Simulators
The safest first step is to delete all simulator devices that are marked as "unavailable." These are devices whose runtime has been removed, so they cannot be booted or used at all. They are pure waste.
# Delete all unavailable simulator devices
xcrun simctl delete unavailable
This command is safe, fast, and typically frees a few hundred megabytes to a few gigabytes. Run it regularly — it should be your default cleanup starting point.
Safety: SAFE. Unavailable devices are unusable by definition. There is no reason to keep them.
Step 3: Delete Specific Simulator Runtimes
Now for the big savings. Each runtime you remove frees 6-18GB. Use the runtime identifiers from Step 1:
# Delete a specific runtime by identifier
xcrun simctl runtime delete com.apple.CoreSimulator.SimRuntime.iOS-16-4
# Delete by version shorthand (if supported by your Xcode version)
xcrun simctl runtime delete iOS 16.4
You can also delete runtimes through the Xcode GUI:
- Open Xcode > Settings (or Xcode > Preferences in older versions)
- Go to the Platforms tab (or Components in Xcode 14 and earlier)
- You will see all installed runtimes listed with their sizes
- Click the minus button (or swipe left on the entry) next to the runtime you want to remove
- Confirm the deletion
Note: Deleting a runtime also makes all simulator devices for that runtime unavailable. After deleting iOS 16.4's runtime, all "iPhone 14 (iOS 16.4)" devices become non-functional. You can clean them up with xcrun simctl delete unavailable afterward.
Step 4: Delete Individual Simulator Devices
Sometimes you want to keep a runtime but remove specific devices. For example, you might want iOS 18 but do not need separate simulators for iPhone 16, iPhone 16 Plus, iPhone 16 Pro, and iPhone 16 Pro Max.
# Delete a specific device by UUID
xcrun simctl delete I9J0K1L2-XXXX-XXXX-XXXX-XXXXXXXXXXXX
# Or delete by name (if unambiguous)
xcrun simctl delete "iPhone 16 Plus"
# Delete ALL devices (not runtimes) and start fresh
xcrun simctl delete all
After deleting devices, you can create just the ones you need:
# Create a specific device with a specific runtime
xcrun simctl create "iPhone 16 Pro" "com.apple.CoreSimulator.SimDeviceType.iPhone-16-Pro" "com.apple.CoreSimulator.SimRuntime.iOS-18-2"
Which Simulators Should You Keep?
This depends on your project, but here is a sensible default policy:
iOS Runtimes
- Always keep: The latest iOS version (currently iOS 18.x) — this is required for current development and App Store submission
- Usually keep: Your app's minimum deployment target version (e.g., iOS 17 if your app targets iOS 17+)
- Usually remove: Anything older than your minimum deployment target
- Consider: If your CI pipeline tests on specific iOS versions, keep those
watchOS / tvOS Runtimes
- Keep if: You actively develop watchOS or tvOS apps
- Remove if: You do not build for these platforms. Many iOS-only developers have these installed from previous Xcode installations and never use them.
visionOS Runtime
- Keep if: You are developing for Apple Vision Pro
- Remove if: You are not. At 10-14GB, this is one of the largest single runtimes. If you are not actively building visionOS apps, removing it is an easy win.
Simulator Devices
- Keep: 2-3 devices per runtime (e.g., one small iPhone, one large iPhone, one iPad)
- Remove: Duplicates and devices you never test on. You do not need iPhone 16, 16 Plus, 16 Pro, and 16 Pro Max — pick one or two representative sizes.
The CoreSimulator Directory Explained
If you are curious about the underlying file structure, here is what lives where:
# Simulator device data (each UUID folder is one virtual device)
~/Library/Developer/CoreSimulator/Devices/
├── A1B2C3D4-.../ # One simulator device
│ ├── device.plist # Device metadata (name, runtime, state)
│ └── data/ # The device's file system
│ ├── Applications/ # Installed apps
│ ├── Documents/
│ ├── Library/
│ └── tmp/
├── E5F6G7H8-.../
└── ...
# Runtime disk images (macOS 14+ with Cryptex-based runtimes)
/Library/Developer/CoreSimulator/Cryptex/
└── [runtime-identifier]/
# Older runtime location
/Library/Developer/CoreSimulator/Profiles/Runtimes/
└── iOS 17.5.simruntime/
The device.plist inside each device folder contains metadata you can read to identify the device:
# Identify a simulator device
plutil -p ~/Library/Developer/CoreSimulator/Devices/A1B2C3D4-.../device.plist
This shows the device name, runtime version, UDID, and whether it is available.
Cleaning Simulator Caches
Beyond the runtimes and devices, simulators also generate caches:
# Simulator caches (logs, screenshots, etc.)
~/Library/Developer/CoreSimulator/Caches/
# Check size
du -sh ~/Library/Developer/CoreSimulator/Caches/ 2>/dev/null
These caches are usually small (under 1GB) but can be safely deleted if you want to be thorough.
A Complete Cleanup Script
Here is a comprehensive script that audits and cleans your simulator setup:
#!/bin/bash
echo "=== Simulator Storage Audit ==="
echo ""
echo "Installed runtimes:"
xcrun simctl runtime list
echo ""
echo "Device data size:"
du -sh ~/Library/Developer/CoreSimulator/Devices/ 2>/dev/null
echo ""
echo "Runtime storage:"
du -sh /Library/Developer/CoreSimulator/Cryptex/ 2>/dev/null
du -sh /Library/Developer/CoreSimulator/Profiles/Runtimes/ 2>/dev/null
echo ""
echo "=== Cleaning Unavailable Devices ==="
xcrun simctl delete unavailable
echo "Done."
echo ""
echo "=== Remaining Runtimes ==="
xcrun simctl runtime list
echo ""
echo "To delete a specific runtime, run:"
echo " xcrun simctl runtime delete [identifier]"
echo ""
echo "To manage runtimes in Xcode:"
echo " Xcode > Settings > Platforms"
Save this as clean-simulators.sh, make it executable with chmod +x clean-simulators.sh, and run it whenever you want to audit your simulator storage.
Preventing Simulator Bloat
A few habits that prevent simulators from consuming excessive storage:
- Decline additional runtimes during Xcode updates. When Xcode prompts you to download additional simulator runtimes, only download the ones you actually need.
- Run
xcrun simctl delete unavailableafter every Xcode update. Major Xcode updates often change the runtime versions, leaving old devices orphaned. - Review your Platforms tab quarterly. Go to Xcode > Settings > Platforms and remove runtimes for iOS versions you no longer support.
- Resist the urge to install visionOS "just to try it." At 10-14GB, it is a significant commitment. Download it when you have a specific project that needs it.