macOS · Docker · menu bar

Docker ate your disk. Reclaim gives it back — to macOS, not just the VM.

docker prune only frees blocks inside the Linux VM Docker runs in. The sparse disk image on your Mac never shrinks until an fstrim actually runs — a step almost nobody triggers by hand. Reclaim runs both, then reports the real number: a host free-space delta measured with statfs(), not Docker's own estimate.

Notarized Mac download coming soon.

Critical — 6.5 GB free
6.5 GB free on this Mac
Critical Healthy
docker image prune -af
docker builder prune -af (the real monster)
colima ssh -- sudo fstrim -av
≈ 50.65 GB returned to macOS

The actual problem

Prune frees space in the VM. Only a TRIM gives it back.

Docker on macOS runs inside a Linux VM backed by a sparse disk image. Pruning frees blocks inside that VM's filesystem — the sparse image file on your Mac doesn't shrink on its own. The fix is a second step almost nobody runs by hand.

1

Prune

docker image & build cache prune free blocks inside the VM.

2

Freed in the VM

Space is free — but only in the Linux filesystem. Your Mac gets nothing back yet.

3

TRIM

fstrim tells the host to actually deallocate those blocks in the sparse image.

4

Mac reclaims

The disk image shrinks and macOS free space finally goes up.

Diagram: docker prune frees space inside the VM, but only fstrim (TRIM) returns it to macOS — host free went 6.5 GB to 57 GB on the author's Mac
The full diagram, straight from the README.
0 GB
Build cache freed — the real monster
0 GiB
Trimmed by fstrim on /dev/vdb1
0 GB
Total returned to macOS, measured

The number Docker gets wrong

22.42 GB “reclaimable.” 2.68 GB actually freed.

Docker's own RECLAIMABLE column is frequently wrong: images share layers on disk, so the space Docker attributes to each image individually isn't summable. Reclaim always shows the number your Mac's Finder would agree with — never Docker's own estimate.

Docker's estimate
22.42 GB
Actually freed
2.68 GB
reclaim-cli status
# the number Finder would agree with Host free 6.5 GB57.0 GB (+50.65 GB) Docker reports 22.42 GB reclaimable ← don't trust this Actually freed 2.68 GB (images)
Safety, sold hard

Volumes are read-only. Always.

This tool touches a Docker daemon and shells out to a VM. The rules below aren't style preferences — they're the difference between freeing disk space and deleting someone's database.

docker volume prune isn't just disabled — it's unrepresentable in the code. The only Docker API calls Reclaim's client can make are a fixed, public set (image prune, build cache prune, container prune, and read-only listings). The request layer that sends them independently rejects any mutating call whose path touches a volume, or any system-wide prune, as a second, redundant check.

A live Postgres volume with no running container attached looks identical to garbage from Docker's perspective. Reclaim's answer is to not let the question come up.
Preview mode — dry run The default everywhere, starts ON. Zero mutating requests until you say run.
Volumes No code path can delete or prune one. Not a checkbox — unrepresentable.
Protected — never touched
Images used by running containers docker image prune -a's own behavior.
Protected
Dangling & unused images Not referenced by any container, running or not.
Safe to clear
Build cache Usually the bigger win — 34 GB vs 2.7 GB in our own numbers.
Safe to clear
Stopped containers Opt-in, off by default.
Safe to clear
.github/workflows/ci.yml
# every build greps the source AND the compiled binary $ grep -R "volume prune" Sources/ .build/release/Reclaim ✓ no matches — build passes
Everything it does

Small surface. No surprises.

One menu bar app, one CLI, the same core underneath.

One-click clean

Prune, then trim, in a single action. No terminal required — the menu bar app runs the whole two-step dance for you.

The real number

A statfs() delta measured before and after — never Docker's own reclaimable estimate.

Menu bar awareness

The icon shows live free space, and ambers, then reds, as your disk fills — so you notice before it's an emergency.

Plain-language panel

No jargon dump. Reclaim explains what it's about to do, and why, in a sentence a human wrote.

Live progress log

fstrim can take a while on a large volume. Reclaim streams what's happening instead of leaving you at a spinner.

Weekly schedule

Turn on a weekly run via SMAppService and forget about it — Reclaim keeps the VM's disk image lean in the background.

Full CLI

status · clean · trim · volumes · history — everything the app can do is also a scriptable command.

Supported backends

Detected automatically, handled correctly.

Reclaim checks each backend's socket in order and confirms it's live with a Docker Engine API ping before using it.

Colima

~/.colima/default/docker.sock

Trims via colima ssh -- sudo fstrim -av.

fstrim via ssh

Rancher Desktop

~/.rd/docker.sock

Trims via rdctl shell -- sudo fstrim -av.

fstrim via shell

Docker Desktop

~/Library/Containers/com.docker.docker/…/docker-cli.sock

Recent versions auto-TRIM on idle — Reclaim detects this and tells you instead of doing extra work.

auto-TRIM (recent) --force-trim (older, CLI-only)

OrbStack

~/.orbstack/run/docker.sock

Reclaims disk space natively. Reclaim detects this and reports it, rather than pretending to add value.

Native — no TRIM needed
Get it

Get your disk back.

Free, open source, and honest about what it can't do.

Notarized Mac download coming soon.

macOS 13+ MIT license Not on the App Store

Not on the App Store, and can't be — the App Sandbox forbids both shelling out via Process and arbitrary Unix domain socket access, and both are load-bearing for this app to work at all. Build from source using the instructions above — a notarized download is coming soon.