Declutter-inator
  • Lever. Pull it for a dry run first.
  • Viewport. Checks thirty-odd places clutter hides.
  • Self-destruct button. Not connected to anything.
  • Barrel. Fires only after you say yes.
Fig. 1. The machine, drawn in the same characters it prints in your terminal.

Declutter-inator

A free, open-source way to clean up your Mac. It finds the gigabytes hiding in caches, build folders and old downloads, shows you every one, and removes only what you pick.

curl -fsSL https://declutter.kunalbagaria.com/install | sh

Paste it into Terminal. It installs one program to ~/.local/bin and runs on macOS 11 or later, on Apple silicon or Intel. You can read the script before you run it, or use Homebrew instead: brew install kunalbagaria/tap/declutterinator.

What it looks for

Everything it finds goes into one of three groups, so you always know what you’re agreeing to. If you’d rather free up disk space by hand, the guide to cleaning up your Mac covers each of these places and the commands to clear them.

Safe to zap
Things that grow back on their own: app caches, logs, the Trash, Xcode DerivedData, and the download caches of npm, Yarn, pnpm, Bun, pip, uv, Cargo, Gradle, Go, CocoaPods and Homebrew. These start out selected.
Probably fine
Things that cost a re-download or a rebuild: node_modules, target, .venv, Pods and .next folders in projects you haven’t touched for a month, Docker images, old installers, and zip files sitting next to the folder you unzipped them into.
Your call
Your own files: old downloads, very large files, apps you haven’t opened in six months, iPhone backups and Xcode archives. Nothing here is ever selected for you, and whatever you pick goes to the Trash, not away for good.
  DISK    86%  425 GB of 494 GB used · 69 GB free
         = what the machine can reclaim without touching your own files

  SAFE TO ZAP  caches & junk that grow back on their own            25.0 GB
    Application caches ···············    9.6 GB  
      Google 3.1 GB · com.spotify.client 2.0 GB · +72 more
    Xcode DerivedData ················    7.9 GB  
      MyApp 3.5 GB · Widgets 2.9 GB · +4 more
    npm cache ························    3.6 GB  
    Bun cache ························    2.6 GB  
      +9.9 GB more is shared with your projects (APFS clones) and isn't counted
    Headless browser downloads ·······    770 MB  
      Puppeteer 478 MB · Playwright 287 MB
    Homebrew leftovers ···············   ~540 MB  
      32 old downloads & versions

  PROBABLY FINE  safe, but costs a re-download or rebuild           34.6 GB
    Project build artifacts ··········   26.5 GB  
      42 projects, 37 idle for 30+ days — web-app 1.8 GB · api 1.7 GB · +40 more
    Archives you already unzipped ····    5.2 GB  
      Photos-2025.zip 1.1 GB · assets.zip 798 MB · +79 more
    Installers & disk images ·········    2.9 GB  
      Docker.dmg 612 MB · Figma.dmg 231 MB · +15 more

  YOUR CALL  your files — never touched unless you pick them        27.3 GB
    Apps you don't use ···············   15.8 GB  
      not opened in 180+ days — Xcode 5.6 GB · GarageBand 1.1 GB · +21 more
    Large files ······················   11.5 GB  
      500 MB or bigger — screen-recording.mov 2.2 GB · ubuntu.iso 1.4 GB · +13 more

  ❝ node_modules: the heaviest objects in the known universe. — on Project build artifacts

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   POTENTIAL LOOT  86.9 GB   25.0 GB zero-regret · 34.6 GB probably fine · 27.3 GB your call
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Fig. 2. A scan report. So far nothing has been touched; next, the machine asks you to pick.

What is claimed

A machine for reclaiming disk space, wherein:

  1. nothing is removed until you confirm, and clean --dry-run lists every path first;
  2. your own files go to the Trash, and only caches and build output are deleted outright;
  3. every path is checked again right before removal: it has to be inside your home folder, and .ssh, Keychains, iCloud Drive, Mail and Messages are off limits;
  4. it never follows a symlink and never wanders onto another disk;
  5. a node_modules folder only counts if a package.json sits next to it, and a target folder only if a Cargo.toml does;
  6. sizes are what files actually occupy, so space shared through APFS clones or hard links is never promised twice;
  7. the self-destruct button is not connected to anything.

Using it

declutterinator
Scan, read the report, then choose what to remove.
declutterinator clean --dry-run
List every path that would be removed. Changes nothing.
declutterinator clean --safe --yes
Clear everything in the safe group without asking. Good for a monthly cron job.
declutterinator big ~/Library -d 2
See what’s taking up space, folder by folder.
declutterinator dupes ~/Pictures
Find duplicate files, and tell real copies from APFS clones.
declutterinator categories
List everything it knows how to find.

Run the install line again to upgrade, or brew upgrade declutterinator if you used Homebrew. To uninstall, delete ~/.local/bin/declutterinator (or run brew uninstall declutterinator).