---
title: "What's filling your Mac's disk space as a developer"
description: "Xcode DerivedData, iOS device support files, node_modules, package caches and Docker VMs account for most developer disk bloat. TidyBug finds all of them safely."
date: "2026-10-17"
app: tidybug
readingTime: "5 min read"
image: "/img/build/tidybug/overview.jpg"
imageAlt: "TidyBug overview showing free, reclaimable and safe-to-clean space with a storage bar"
---

If you open storage settings and find your disk close to full, there is a predictable list behind it: Xcode's build cache, iOS device support files, npm and pip caches, old installer archives, and Docker or OrbStack VM images. These accumulate quietly while you work and rarely appear in Finder's obvious places.

## Xcode

Xcode keeps a build cache in `~/Library/Developer/Xcode/DerivedData/`. Every project you build gets its own directory there, and Xcode retains old build products for incremental compilation. Open enough projects over enough months and DerivedData claims a significant slice of your disk without ever showing up in Finder.

Alongside it, `~/Library/Developer/Xcode/iOS DeviceSupport/` stores debug symbols for every iOS device you have connected. Each firmware version has its own entry. A file for a device running an iOS version from several years ago remains on disk even after that device is long replaced and you are targeting a current release.

## Package manager caches

npm writes its download cache to `~/.npm/_cacache/`. pip, uv, Gradle, Yarn and Maven each have their own equivalents. These caches speed up installs, but they grow without limit. A fresh install can always pull from the registry if the cache is gone, so the cache is optional disk space — sometimes a lot of it.

## Downloads

Xcode releases ship as `.xip` archives. Once you extract and install Xcode, the archive usually stays in `~/Downloads/` unless you actively move it. Old `.dmg` and `.pkg` installers from apps you set up months ago accumulate the same way.

## Docker and OrbStack VMs

The Docker Desktop or OrbStack virtual machine image is a single large file that grows as you pull images and run containers. It does not shrink automatically when you remove containers, even after running `docker system prune`. The space only comes back if you reset the VM.

## Project dependencies

`node_modules` directories multiply across projects. Each JavaScript project keeps its own full copy of its dependencies. Python `.venv` environments, CocoaPods `Pods` directories, and Gradle build trees follow the same pattern.

These are not pure waste. Removing `node_modules` means the next `npm install` needs a network connection and time. The safe version of the cleanup is to delete only the ones where the project's lockfile is intact — because the lockfile is what makes reinstallation a deterministic, one-command restore.

---

## TidyBug finds all of it

[TidyBug](https://tidybug.xeve.io) is a free, open-source disk cleaner for macOS built specifically for developer junk. It scans nineteen locations where caches and build artifacts accumulate, and pre-selects only what is regenerable.

![TidyBug overview showing free, reclaimable and safe-to-clean space with a storage bar](/img/build/tidybug/overview.jpg)
*The overview: reclaimable space grouped by category, with the largest items on disk.*

The Clean tab groups everything TidyBug finds by risk. Pre-selected safe items — DerivedData, npm cache, iOS DeviceSupport — appear at the top. Items that need more consideration appear below. Nothing moves to the Trash until you approve it.

The Projects tool finds `node_modules`, `.venv`, `Pods`, Xcode build directories, and similar project dependency trees across your repos. It only surfaces folders where a lockfile exists — `package-lock.json`, `requirements.txt`, `Podfile.lock` — so you are only ever looking at folders that can be restored with a single install command. Signed archives are never touched.

![Space tab showing an interactive sunburst of the home folder with a contents list](/img/build/tidybug/space-sunburst.jpg)
*The Space tab: a sunburst of the home folder, with a contents list of the selected folder.*

The Space tab is an interactive sunburst of any folder. You can drill into `~/Library/Developer/` directly, see which Xcode project DerivedData directories are the largest, and drag any slice into the Collector without leaving the chart. Sizes are hardlink-aware, so a pnpm store that is shared across projects is not counted multiple times.

The Collector is the staging area — a strip that runs along the bottom of every tab. You browse across Clean, Projects, Space and Large Files, adding items as you go. When you are done, you review the staged list and move everything to the Trash in one batch. Protected paths — `~/.ssh`, iCloud Drive, `.git`, Photos — are never suggested.

![Large Files tab showing files over the size threshold grouped by kind](/img/build/tidybug/large-files.jpg)
*Large Files: files above the size threshold, grouped by kind.*

The Large Files tab is where old `.xip` Xcode archives and forgotten disk images tend to surface. Sorting by last opened makes it straightforward to separate a disk image you used last week from a release archive that has been sitting untouched since you upgraded.

## Scanning is read-only

TidyBug reads the filesystem during a scan and writes nothing. The only write operation is moving the items you have staged in the Collector to the Trash — or permanently deleting them if you enable that toggle. Every deletion is logged, and the app has no telemetry.

TidyBug runs on macOS 26, on Apple silicon and Intel, and it is free. Download it or read the source at [tidybug.xeve.io](https://tidybug.xeve.io).
