Open the Storage panel on macOS and hover the Available number. On many Macs a smaller line appears underneath: X GB purgeable. Open Disk Utility and the same volume shows a Purgeable segment. Run df -h in Terminal and the free-space number is larger than either of those. Three tools, three answers. Purgeable space is the reason.
Purgeable space is real free space that macOS is choosing to hold onto because it can recover it later without losing anything you would notice. The tension is that different Apple tools disagree about whether to count it as free or used, which is why the numbers do not line up.
What actually goes into purgeable
Purgeable is a bucket, not a single kind of file. The usual contents:
- APFS local snapshots, mostly taken by Time Machine roughly every hour. Snapshots share blocks with the live filesystem until those blocks change, so they cost nothing at first and grow as you write.
- iCloud files optimised off disk, if you have Store in iCloud enabled. macOS keeps a placeholder locally and marks the space the file would have occupied as recoverable.
- Cached App Store and Music downloads that the OS considers safe to fetch again.
- Language dictionaries, voices, and other optional assets that were downloaded on demand.
- Time Machine snapshot deltas that have not yet been transferred to the backup drive.
You do not usually delete purgeable space by hand. macOS reclaims it when the filesystem starts to run out of room, or when you plug in the Time Machine drive and a real backup completes.
Why the numbers do not agree
Finder and About This Mac hide purgeable space inside Available. The pie chart shows it as part of Used because, right now, those bytes are being held by snapshots or optimised files. Disk Utility exposes it as its own segment, which is the most honest presentation.
df -h is stricter. It reports the actual free bytes reported by the filesystem, which does not include purgeable. On the same volume you will often see something like this:
Filesystem Size Used Avail Use% Mounted on
/dev/disk3s1s1 460G 380G 72G 85% /
While the Storage panel might tell you 130 GB is available. The 58 GB difference is purgeable. Neither number is wrong; they are answering different questions.
The df output on APFS specifically
APFS has a concept called a container that groups volumes together and lets them share free space. On modern Macs there is usually one container per physical disk with several volumes: the system volume, the data volume, VM swap, preboot, and recovery. df -h shows each volume separately, but the free space belongs to the container.
If you want the container-level view, diskutil apfs list is more informative. It shows the actual container capacity and the sum of all volume sizes, and it flags snapshots.
When purgeable is holding you back
macOS says purgeable is recoverable, and it is — eventually. There are three cases where the delay hurts you:
Installers. The macOS installer sometimes refuses to run when free space (not purgeable) is below the installer's stated requirement. Apple has improved this over time, but on a 250 GB drive with 20 GB free and 40 GB purgeable, an installer that wants 45 GB may still complain.
Xcode and large builds. Xcode allocates working space in bursts. If your snapshot inventory is large, a .xcarchive write can fail with no space left on device even though the Storage panel claims plenty of headroom.
Video exports. Final Cut Pro and DaVinci Resolve request contiguous ranges of free bytes for renders. Purgeable does not qualify.
In all three cases the fix is the same: force macOS to reclaim some purgeable space now.
How to reclaim it deliberately
The blunt way is to fill the disk on purpose:
mkfile 20g ~/Downloads/burn.tmp
rm ~/Downloads/burn.tmp
Creating a 20 GB temporary file forces macOS to free purgeable space to make room, then removing the file returns real free space. This is a legitimate technique documented in Apple's man pages and is the way installers effectively behave.
The precise way is to remove snapshots directly:
tmutil listlocalsnapshots /
sudo tmutil deletelocalsnapshots 2026-08-07-093000
If iCloud optimisation is holding files, disable Optimise Mac Storage temporarily; the placeholders download and then, when re-enabled, macOS re-optimises based on more recent usage.
What purgeable is not
Purgeable is not caches you can clear with a third-party tool. Application caches — Chrome, Slack, Xcode — count as regular used space, not purgeable. Deleting ~/Library/Caches/Google/Chrome frees ordinary bytes, not purgeable bytes.
Purgeable is also not the Trash. Trash is regular used space until you empty it.
And purgeable is not System Data. System Data is a categorical label that groups anything without a clear owner; purgeable is a specific technical state that says "these bytes can be reclaimed on demand". A file can be both — a snapshot is System Data and purgeable — or neither.
The design trade-off
Apple's choice to hold onto purgeable space is defensible. On a laptop with plenty of headroom, keeping local snapshots means you can restore a file you deleted an hour ago without a backup drive. Keeping iCloud files as placeholders means opening a document you have not touched in a year is a two-second download rather than a "file not found". The cost is confusion when the drive fills up and the numbers refuse to add.
If you want a single, uncomplicated number, df -h is the closest thing to it, and it is the number to use when you are diagnosing a "no space left" error.
Where a storage map fits
A visual storage map cannot show you purgeable space directly — it is not a set of files. What it can do is show you the largest actual on-disk items so you know what to touch when purgeable is not enough. On most drives the biggest wins are in the same places month to month: DerivedData, Docker.raw, iPhone backups, unused simulators, downloaded video.
We built VolumeLens to answer what is actually on my disk, honestly, with hard links counted once and the tricky APFS features labelled correctly. It will not lie about the total; it will tell you when macOS refused to let it read a folder. Try the free version to walk your drive, and see pricing if you want Insights to name the caches automatically.