What actually eats your disk space, measured
Four commands that show where the gigabytes went, before you install anything that promises to find them.
A Mac that reports 12 gigabytes free but refuses to install an update is usually not full of mystery. It is full of a few large, identifiable things. Measuring them takes three minutes and no downloads.
Start with the summary
df -h shows each mounted volume and how much is used. On modern Macs you will
see the data volume, since the system volume is sealed and read-only. ⌘I on
the startup disk in Finder gives the same numbers with categories attached,
which are approximate but directionally correct.
Find the big folders
This walks your home directory one level deep and prints the largest entries:
du -xh -d1 ~ 2>/dev/null | sort -h | tail -20
-x keeps it on one volume, -d1 limits the depth, 2>/dev/null hides the
permission errors that would otherwise fill the screen. To go inside the worst
offender, run the same command against that folder with -d2.
For system-wide totals, point it at the data volume:
sudo du -xh -d1 /System/Volumes/Data 2>/dev/null | sort -h | tail -20
The usual suspects
~/Library/Cachesholds regenerable data. Deleting it is safe; apps rebuild what they need. Signing out of some apps afterwards is normal.~/Library/Developer/Xcode/DerivedDatacan reach tens of gigabytes on a machine that builds iOS apps. Xcode recreates it on the next build.~/Library/Application Support/MobileSync/Backupkeeps iPhone backups. Old device backups are the single most common waste on a work Mac. Finder > General > Manage Backups removes them.~/Library/Containers/com.docker.dockergrows with the disk image Docker allocates. It does not shrink on its own after you delete containers.~/Downloadsand~/Desktopare self-explanatory and still worth checking, because nobody believes the number until they see it.
Time Machine snapshots
Local snapshots let Time Machine work between backups, and they hold real space until the system needs it. List them:
tmutil listlocalsnapshots /
Each line ends with a timestamp. Remove a specific one:
sudo tmutil deletelocalsnapshots 2026-11-01-120000
The system prunes these automatically under pressure, so deleting them is optional. On a small SSD they are often the reason “free space” jumped by 40 gigabytes overnight.
Check the space purgeable, not just the space free
Finder reports purgeable space separately. That is space macOS can reclaim on demand: snapshots, caches, some iCloud data. A disk with 5 gigabytes free and 60 gigabytes purgeable is not in trouble. A disk with 5 gigabytes free and none purgeable is, and the lists above will show why.
What to do with the numbers
Delete in this order: old device backups, Xcode derived data, caches you can name, then installed apps you have not opened in a year. Empty the Trash at the end, because deleted files sit there and count.
A cleaner app does the same thing with a progress bar and a licence fee. If the numbers above already told you where the space went, you do not need one.
Keep reading
Homebrew on Apple silicon, without the usual PATH mess
The installer gets the files right and leaves your shell half-configured. Five lines fix it for good.
Run scheduled jobs with launchd, not cron
cron still works on macOS, right up until the job touches a protected folder. launchd is the supported way and the syntax is not hard.