* Expand simulator management and disk tooling * Add the SimSlim macOS app * Document and verify the macOS workflow
6.8 KiB
Disk cleanup safety model
Service slimming and disk cleanup have different guarantees. Service slimming
is reversible with simslim off. Disk cleanup permanently removes files.
Boundary
simslim only considers data below one exact simulator's device-data directory:
~/Library/Developer/CoreSimulator/Devices/<UDID>/data
It never changes an iOS runtime. Apple describes a Simulator runtime as an OS package used by multiple simulator devices, and modern runtime disk images are kept in system-managed protected storage. Built-in apps and core OS language resources therefore are not per-device savings and are outside simslim's cleanup boundary.
- Apple: Adding additional simulators
- Xcode 14 release notes: system-managed Simulator runtime disk images
Current categories
| Category | Action | Main downside | Recovery |
|---|---|---|---|
| System & App Caches | Clears contents of directories named Caches |
Slower first launch; cached/offline content disappears | Old contents are not restored by erase; new caches usually regenerate |
| Logs & Diagnostics | Clears logs, unified-log traces, and UUID text | Existing debugging and crash history disappears | Old history is not restored by erase; new logs are generated |
| Temporary Files | Clears contents of tmp directories |
Misbehaving apps may lose in-progress work | Old contents are not restored by erase; directories remain and are reused |
| Downloaded Language Data | Opt-in; clears the exact per-device LinguisticData catalog | Search, Siri, and text analysis may be limited until needed assets return | iOS downloads the package again when a feature requests it |
| Required Siri Assets | Measured only | Manual deletion is unsupported and iOS downloads required assets again | Required assets return automatically after boot |
Apple Developer Forum reports document CoreSimulator's
Library/Caches/com.apple.containermanagerd/Dead cache growing unexpectedly;
it is covered by the cache category.
Recovery
There are two distinct recovery models:
- Cleanup data such as caches, logs, diagnostics, and temporary files is
disposable but its old contents are permanent history.
xcrun simctl erase <UDID>does not bring those contents back. iOS and apps can generate new caches, logs, and temporary files on future boots. - Downloaded system-managed assets such as Siri models and language data are split by observed behavior. The exact LinguisticData catalog is opt-in and on-demand. Required Siri, speech, and voice catalogs remain informational because iOS automatically restores them after boot.
Read-only storage breakdown
disk-plan and the app report durable storage separately from cleanup choices:
- Installed Apps measures app and test-runner bundles installed into that simulator. Built-in apps are not counted because they live in the shared runtime.
- Documents measures app and app-group
Documentsdirectories. - App Data measures preferences, databases, and support files while excluding Documents and the cleanable cache, log, and temporary directories.
- User Media measures the simulator media library.
These rows can explain where disk space is going, but they are never selectable for bulk deletion. Apple likewise distinguishes an app's bundle, documents, and other data when discussing app disk usage.
Xcode 26.6 validation
The three cleanable rows were exercised on disposable simulator clones. A
combined pass reclaimed about 1.38 GB on one clone and 1.68 GB on another. In
an individual-category pass, caches reclaimed about 408 MB and logs about
177 MB. A seeded 8 MB temporary file was discovered and removed while its
tmp directory remained intact. Cleanup also restored the prior boot state
when requested.
The MobileAsset path was tested destructively on disposable iOS 26.5 clones, never on source simulators. Clearing the original broad Siri and language allowlist reclaimed about 1.43 GB. In a boot-only control with no apps opened, the required footprint started growing about 20 seconds after boot and reached about 1.17 GB within a minute.
The roughly 235 MiB difference was then identified at the asset-bundle level:
about 141 MiB was an English LinguisticData package and about 88 MiB was an
additional neural voice bundle. Removing only those two bundles survived
repeated boots, idle time, keyboard input, a normal developer-app launch,
opening Siri settings, opening the voice list, and a Siri request. Only the
LinguisticData catalog is exposed for cleanup: it has an exact stable directory
boundary and iOS can fetch it on demand. The extra voice bundle remains
protected because selecting individual voice assets would depend on private
MobileAsset catalog metadata and could leave a stale catalog.
An erased test clone also completed data migration, booted successfully, and opened Settings normally. Erase is therefore a recovery path to a usable fresh device, not a way to preserve or permanently remove system-managed assets.
Erase can return a damaged per-device data tree to a usable fresh state sourced from the unchanged runtime, but it is not an undo operation. The simulator's prior apps, settings, credentials, user data, logs, and cache contents are not restored.
If a shared runtime were modified, erasing a device would not repair it; the runtime would need to be reinstalled. simslim prevents that situation by never allowing runtime paths into a cleanup plan.
Implementation safeguards
- Exact UDIDs are resolved through
simctl; aliases such asallare rejected. - Every cleanup path is generated from a fixed category, checked to remain
below the device's
datadirectory, and rejected if the target or an intermediate path component resolves outside it. - Name-based discovery skips Documents, media, and MobileAsset trees so a
user-created folder named
Caches,Logs, ortmpis never enough to make durable content eligible for cleanup. - Downloaded language cleanup uses one exact MobileAsset catalog path; required Siri, speech, and voice catalogs are rejected by selection validation.
- Only directory contents are removed; required container directories remain.
- Child symlinks are unlinked without following them.
- Booted devices are shut down before cleanup.
- The CLI requires
--confirm; the app requires the user to typeCLEAN. - Analysis and estimated sizes are always read-only.