Documentation

Dustpan 0.1.0. Keyboard: ⌘R rescan, ⌘, settings, Esc closes dialogs.

Install

  1. Open Dustpan_0.1.0_aarch64.dmg and drag Dustpan to Applications.
  2. Open Dustpan from Applications.

Builds that aren't signed and notarized are blocked by macOS the first time. If that happens, Control-click Dustpan in Applications, choose Open, then Open again. The current build is for Apple silicon Macs running macOS 11 or later.

First scan

On first launch Dustpan asks where you keep your code. Your home folder is included by default. Add other folders, such as an external drive with projects, with Add folder…. Global caches, Xcode data and simulators are always checked, wherever your projects are.

While searching your home folder, Dustpan skips places that never hold projects or that sync with the cloud: ~/Library (except the known cache locations), Applications, Music, Movies, Pictures, Dropbox, OneDrive, Google Drive and hidden folders.

macOS may ask to let Dustpan access Documents, Desktop, Downloads or a removable drive. Allow it if you keep projects there. If you decline, Dustpan skips those folders and shows how many couldn't be read. You can change your answer later in System Settings › Privacy & Security › Files and Folders.

Scanning reads folder names, file sizes and dates, plus a few tool metadata files (Xcode's DerivedData info.plist, Android emulator .ini files). It never changes anything. Cancelling a scan keeps your previous results.

Reading the list

Items are grouped into Projects, Caches and Simulators & emulators, and sorted largest first. Each row shows:

LevelMeaningPre-selected?
SafeYour tools download or recreate it automatically.If unused for your chosen time, or orphaned
RebuildComes back when you run install or build again. The details show the command.If unused for your chosen time
ReviewMay hold things you can't get back, or is expensive to restore: simulator and emulator data, Xcode archives, Android system images, simulator runtimes, the Maven repository, JetBrains caches, and generic folders like build that git doesn't confirm are ignored.Never

Click a row for its full path, restore instructions and notes, and to show it in Finder. Running simulators and emulators are marked In use and can't be selected.

Suggest items unused for sets the cut-off for pre-selection (default 30 days). Changing it replaces the current selection with the new suggestions.

Cleaning up

Select items and choose Clean up…. The confirm dialog breaks the selection down by safety level and lists the commands you'll need to rebuild. If you selected anything marked Review, you have to confirm you've checked it.

Right before removing each item, Dustpan checks again that it still exists, isn't a symbolic link, still sits in a scanned folder, and still matches its rule (for example, the package.json next to node_modules is still there). Items that fail the check are skipped and reported. Stop finishes the current item and leaves the rest.

Hiding items

Open an item and choose Never suggest this to hide it from future scans. Hidden items are listed in Settings, where you can show them again.

Settings

Folders to search, hidden items, optional encrypted backup and optional anonymous stats. Settings are saved as soon as you change them. The suggestion cut-off sits above the results, and the confirm dialog remembers whether you last chose the Trash or Delete permanently.

What Dustpan checks

Project folders

A folder counts only when the marker file is in the same project.

FolderNeedsWhat it is
node_modulespackage.jsonNode.js dependencies
targetCargo.toml / pom.xmlRust / Maven build output
.venv, venv, envpyvenv.cfg insidePython virtual environment
.tox, .noxtox.ini, noxfile.py, pyproject.toml or setup.pyPython test environments
.next, .nuxt, .svelte-kit, .turbo, .parcel-cache, .docusauruspackage.jsonJavaScript framework caches
.angularangular.jsonAngular build cache
PodsPodfileCocoaPods dependencies
.buildPackage.swiftSwift Package Manager build output
.gradle, build*build.gradle(.kts) / settings.gradle(.kts)Gradle cache and build output
build*, .dart_toolpubspec.yamlFlutter / Dart
bin*, obj**.csproj, *.fsproj, *.vbproj.NET build output
_build, deps*mix.exsElixir
.stack-work / dist-newstylestack.yaml / cabal.project or *.cabalHaskell
.zig-cache, zig-cache, zig-outbuild.zigZig
.terraform*.tfTerraform providers and modules
vendor*composer.jsonPHP Composer dependencies
elm-stuffelm.jsonElm
cmake-build-*CMakeLists.txtCLion CMake build folders

* Generic names. They're marked Review unless git confirms they're ignored, including in projects that aren't git repositories. Pods inside a git repository must be git-ignored too.

Caches and tool data (macOS paths)

ItemLocationLevel
Xcode DerivedData (per project)~/Library/Developer/Xcode/DerivedData/*Safe
Xcode device support (per OS version)~/Library/Developer/Xcode/iOS DeviceSupport/* (and watchOS, tvOS, visionOS)Safe
Xcode archives~/Library/Developer/Xcode/Archives/*Review
Simulator caches, test device clones~/Library/Developer/CoreSimulator/Caches, ~/Library/Developer/XCTestDevicesSafe
npm, Yarn, pnpm, Bun~/.npm/_cacache, ~/Library/Caches/Yarn, ~/.yarn/berry/cache, ~/Library/pnpm/store, ~/.bun/install/cacheSafe
pip, uv, Poetry~/Library/Caches/pip, ~/.cache/uv, ~/Library/Caches/pypoetrySafe
Cargo~/.cargo/registry/cache, …/registry/src, ~/.cargo/git/checkouts, …/git/dbSafe
Go~/Library/Caches/go-build, $GOPATH/pkg/mod (default ~/go)Safe
Gradle~/.gradle/caches, ~/.gradle/wrapper/dists/*Safe
Maven~/.m2/repositoryReview (may hold artifacts you built with mvn install)
CocoaPods, SwiftPM, Homebrew~/Library/Caches/CocoaPods, …/org.swift.swiftpm, …/HomebrewSafe
Playwright, Puppeteer, Electron~/Library/Caches/ms-playwright/*, ~/.cache/puppeteer, ~/Library/Caches/electronSafe
Composer, NuGet, pub, Deno~/Library/Caches/composer, ~/.nuget/packages, ~/.pub-cache/hosted, ~/Library/Caches/deno/{deps,npm,gen,remote} (not Deno KV / localStorage data)Safe
JetBrains IDE caches~/Library/Caches/JetBrains/*Review (also holds the IDE's Local History)
Android system images$ANDROID_HOME/system-images/* (default ~/Library/Android/sdk)Review

On Linux, ~/Library/Caches becomes ~/.cache.

Simulators and emulators

Dustpan only calls xcrun if simulators have been used on the Mac, so it never triggers the developer tools install prompt.

Command line

The dustpan CLI uses the same engine and the folders you chose in the app (or your home folder).

dustpan scan [FOLDER…] [--json] [--older-than DAYS]
dustpan clean [FOLDER…] [--older-than DAYS] [--kind KIND]… [--permanent] [--dry-run] [--yes]

Troubleshooting

"N folders couldn't be read"

macOS blocked access, usually because a folder permission request was declined. Click Show to see which folders, then allow Dustpan in System Settings › Privacy & Security › Files and Folders (or Full Disk Access) and rescan.

"Folder not found — is the drive connected?"

A scan folder is on a drive that isn't mounted. Connect it and rescan, or remove it in Settings.

An item couldn't be removed

The report says why. Common reasons: another app is using it (quit the IDE or emulator), it changed since the scan (rescan), or it's a simulator that's booted (shut it down).

My disk space didn't change

Items were moved to the Trash. Empty the Trash, or choose Delete permanently next time.

A project I use every day was suggested

Its last activity is older than your cut-off: no install, build or git activity, and nothing changed at the top of the project. Raise the cut-off, or use Never suggest this.

Uninstall & data

Dustpan stores two files: settings.json and last_scan.json (the last results, so the list appears instantly next time). On macOS they're in ~/Library/Application Support/Dustpan/; on Linux in ~/.config/Dustpan/. To uninstall, quit Dustpan, move it from Applications to the Trash, and delete that folder.

Build from source

# requires Rust 1.85+ and Node 20+
cargo test                          # core + CLI tests
cargo build --release -p dustpan    # CLI → target/release/dustpan
cd app && npm install
npx playwright test                 # UI tests (demo backend)
npx tauri build                     # app → target/release/bundle/