If you're a developer on macOS, you know the drill. You brew install something to try it out. You npm install -g a CLI tool for a side project. You download a Mac app to test an integration. A few weeks later, the project is done (or abandoned), and you move on. But the files don't.
macOS is notoriously bad at cleaning up after itself. When you drag an app to the Trash, the binary goes away, but its support files, cached data, preferences, and login items stay right where they are. Homebrew is a little better — brew uninstall removes the formula — but orphaned dependencies pile up quietly. And npm global packages? Those just sit in /usr/local/lib/node_modules forever unless you remember to remove them manually.
Over months and years, this stuff accumulates. We're not talking about a few kilobytes. Leftover Homebrew dependencies, stale npm binaries, and app remnants scattered across ~/Library can easily add up to gigabytes of wasted disk space. If you've ever wondered where your storage went, this is a big part of the answer.
Where the Junk Hides
Let's get specific. When you uninstall a regular Mac app by dragging it to the Trash, it typically leaves behind files in several locations:
~/Library/Application Support/— app data, databases, configuration~/Library/Caches/— cached assets that can be surprisingly large~/Library/Preferences/— plist files with your old settings~/Library/Containers/— sandboxed app data~/Library/LaunchAgents/— background processes that may still be running
Homebrew has its own flavor of cruft. When you uninstall a formula, its direct dependencies don't automatically get removed. Run brew autoremove and you'll catch some of them, but old versions linger in the Cellar, and config files in /usr/local/etc tend to stick around indefinitely. If you've been using Homebrew for a few years, there's a good chance you have dozens of orphaned packages you don't even know about.
Then there's npm. Globally installed packages live in /usr/local/lib/node_modules (or wherever your prefix points), and their binaries get symlinked into /usr/local/bin. Install a CLI tool once for a quick task, forget about it, and it stays there forever. There's no built-in way to see which global packages you actually use versus which ones are just taking up space.
The Options
So what can you actually do about this? There are a few approaches, each with trade-offs.
Manual cleanup. You can absolutely do this yourself. Poke around ~/Library, grep through directories, check what's in your Homebrew Cellar, list your npm globals. It works, technically. But it's tedious, easy to mess up, and you'll almost certainly miss things. Deleting the wrong plist or removing a Homebrew dependency that something else needs is the kind of mistake that eats an afternoon. And even if you're careful, you'd need to do this regularly to keep things clean. It's not sustainable for most people.
AppCleaner (free). AppCleaner is a solid tool for what it does. When you drag a Mac app to the Trash (or drop it into AppCleaner), it finds the associated support files, caches, and preferences so you can delete them too. For regular Mac apps, it's great. The problem is that it only knows about Mac apps. It has no concept of Homebrew formulae or npm global packages. If you're a developer, AppCleaner solves about a third of the problem and leaves the rest untouched.
StrayFiles. StrayFiles is the only Mac uninstaller built specifically for developers. It scans all three categories in a single pass: macOS app leftovers, npm global packages, and Homebrew formulae. It shows you exactly what's orphaned, how much disk space each item is using, and lets you clean everything safely. For Mac apps, it moves associated files to the Trash so you can recover them if needed. For npm and Homebrew, it runs the proper uninstall commands (npm uninstall -g and brew uninstall) so nothing breaks. It's $9.99 one-time — no subscription, no recurring charges.
Why Developers Need a Different Tool
Regular Mac cleaners were built for regular Mac users. They understand .app bundles and ~/Library paths, but they don't know anything about developer tooling. They can't tell the difference between an active Homebrew dependency and an orphaned one. They don't know that /usr/local/bin/prettier is a symlink to a globally installed npm package you haven't touched in two years. They weren't designed to clean npm packages on Mac, and they can't help you remove Homebrew leftovers.
That's exactly why StrayFiles exists. It was built by developers who got tired of manually hunting down stray files across three different ecosystems. If you use a Mac for development — whether you're writing JavaScript, Swift, Python, Rust, or anything else — your machine accumulates developer-specific junk that generic cleaners simply can't see. Finding the best mac uninstaller for developers means finding one that actually understands what developers install.
Ready to reclaim your disk space?
StrayFiles finds leftover files from Mac apps, npm packages, and Homebrew formulae — all in one scan.
Learn More About StrayFiles