2026-06-09
The everyday disk-space question is the wrong one. "What's big?" gets you ncdu. The actually useful question is "where is data that's big and I haven't touched in years?" — and that's the one Simon Tatham (yes, the PuTTY guy, also halibut, spigot, and a stack of tools sharper than they have any right to be) wrote agedu for.
agedu walks a tree once, stores an index of size + atime, and then lets you query it interactively without re-walking the filesystem. Two phases: scan, then browse.
# Build the index (slow — does the full walk)
agedu --scan ~ --file ~/agedu.dat
# Browse via local web UI (random port, 127.0.0.1 only)
agedu --file ~/agedu.dat --web
# Or generate a one-shot HTML report
agedu --file ~/agedu.dat --html / > report.html
# Text mode for a subtree
agedu --file ~/agedu.dat --text /home/you/projects
The web UI is the killer feature. Each directory renders as a stacked bar coloured by age band: red = touched recently, fading through yellow/green to deep blue = years untouched. You click into the blue-heavy directories and find:
node_modules from a project you abandoned in 2022tinkering-with-elasticsearch/~/Downloads/old-laptop-backup/ you copied "temporarily"~/.cache/ from a half-dozen tools you no longer runCompared to du piped through find -atime +365:
find re-walks the FS every time you change your mind about the cutoff. agedu's index answers any age query instantly.find output and mentally roll up sizes by directory.--scan on the box with the data, scp the .dat off, browse it on your laptop later.lstat, not read, so the act of inspection doesn't reset the very metric you're inspecting.Less obvious tricks:
# Scan / but stay on the root filesystem
agedu --scan / --no-cross-fs --file /var/tmp/root.dat
# Restrict reporting to one subtree without re-scanning anything
agedu --file /var/tmp/root.dat --text /var/log
# Custom age bands for the colour scale
agedu --file ~/agedu.dat --web \
--age-bands "7d,30d,180d,1y,2y"
# Headless server: bind locally, tunnel over SSH
agedu --file root.dat --web --address 127.0.0.1:8042
# then on your laptop:
ssh -L 8042:127.0.0.1:8042 server
# open http://localhost:8042
Caveats worth knowing before you start rm-ing:
noatime mounts, atimes are frozen at mtime — agedu still works, but the signal collapses to "when was this written?" The modern relatime default is fine.For the cost of one overnight scan, you get a heatmap of digital sediment across years of work. The 50 GB Docker prune is obvious without any tool. The 200 GB of forgotten caches, abandoned checkouts, and "I'll sort this later" downloads is the win agedu hands you.
du tells you what's big; agedu tells you what's big and abandoned — which is the directory you can actually delete without regret.
