Dusty

June 1, 2026 ยท View on GitHub

Dusty

A macOS menu bar app that frees up disk space, without deleting anything it shouldn't.

CI Release macOS 13+ License: MIT

Dusty scanning and revealing reclaimable disk space across Safe, Developer, and Deep levels

One scan, and the gigabytes hiding in caches and developer junk are laid out by size.

Dusty lives in your menu bar and shows how much disk you have free. When you are running low, open it, scan, and reclaim the gigabytes that pile up in caches, logs, Xcode DerivedData, simulators, and package manager folders. It shows you every path and its size first, and it only ever deletes from a fixed allowlist. No "clean everything" button, no surprises.

It is free, open source, and a calmer alternative to the paid cleaners.

Install

The easy way, signed and notarized by Apple:

brew install --cask yagcioglutoprak/tap/dusty

Or download the latest Dusty.dmg from the releases page, drag it to Applications, and open it.

Dusty appears in your menu bar as a disk icon with your free space next to it. Prefer to build it yourself instead of downloading? See Build from source at the bottom.

What it cleans

Three levels, from "do this anytime" to "look before you leap."

LevelWhat it clearsWhy it is safe
SafeUser caches, app logs, Trash, browser cachesRegenerates on its own, zero functional impact
DeveloperXcode DerivedData, old DeviceSupport, unavailable simulators, package manager caches (npm, yarn, pnpm, pip, Cargo, Go, Homebrew, Composer, Gradle, CocoaPods, SwiftPM), JetBrains and Unity caches, optional docker system pruneRebuilds or re-downloads next time you need it
DeepOld .dmg / .pkg installers in Downloads, Xcode archives, unused simulators, aged diagnostic logsPer-file checklist, nothing goes without a tick

Every scan is concurrent, shows live progress, and reports the exact bytes per target before you commit to anything.

How it compares

The honest version, set against the paid cleaners (CleanMyMac and the like):

DustyCleanMyMac and similar
PriceFree, MIT licensedPaid license or subscription
Source codeOpen, every deletion rule is readableClosed
What it can deleteA fixed allowlist, nothing outside itBroad categories, not all of them visible
Sizes shown before deletingAlways, per pathVaries
Undo and a written deletion logYesVaries
Account or telemetryNoneOften

Why you can trust it

Most of the reason Dusty exists is that "Mac cleaner" usually means "app that deletes things you cannot see." Dusty is built the other way around. The deletion logic is a separate, fully tested Swift package (CleanerEngine) with no UI, and a single component, SafetyValidator, is the only thing that can authorize a delete. It enforces:

  • Allowlist only. A path is deletable only if it descends from an explicit target in CleanupTargetRegistry. There is no "delete everything except" logic anywhere in the codebase.
  • Protected folders are off limits. Documents, Desktop, Pictures, Photos library, Music, Movies, Mail, iCloud Drive, Keychains, and Application Support (except one named browser cache path) are rejected even as prefixes.
  • No symlink escapes. Symlinks are never followed, including a symlinked parent directory: the path is resolved and re-checked against the allowlist, so a delete cannot walk out of an allowed directory.
  • Boot volume only. Operations are confined to the volume your home folder lives on, and Dusty never runs as root or uses sudo. The only paths outside your home folder are the Deep level's system diagnostic logs under /Library/Logs, which need Full Disk Access. Nothing SIP-protected is touched.
  • Dry run. Flip one toggle to scan and report without removing a thing.
  • Move to Trash and undo. Safe cleans move to the Trash with a brief undo window right after, then the space is reclaimed. Developer and Deep cleans can also be sent to the Trash so you can recover them there yourself.
  • A written record. Every action (timestamp, path, bytes) is appended to ~/Library/Application Support/Dusty/deletion-log.jsonl.

If a permission error hits one file, that file is skipped and the run continues.

Full Disk Access

Dusty is not sandboxed, because a sandboxed app cannot reach the caches and logs it is meant to clean. User level paths under ~/Library work out of the box. For a couple of system diagnostic paths in the Deep level, macOS may ask for Full Disk Access:

  1. System Settings > Privacy & Security > Full Disk Access
  2. Add Dusty
  3. Reopen the app

Without it, those few paths are skipped, the rest works fine.

Settings

  • Menu bar refresh interval (default 30s)
  • Dry run by default
  • Move to Trash by default for Developer and Deep
  • Age threshold for Deep level logs (default 30 days)

How it is put together

CleanerEngine/    Swift package: scan, size, delete, safety. No SwiftUI. Unit tested.
Dusty/            SwiftUI menu bar app (MenuBarExtra) that renders the engine.

Keeping the engine UI free means the rules that matter are testable in isolation and the app stays a thin layer on top. Run the tests with:

cd CleanerEngine && swift test

Add a cleanup target

Targets are data, not code. One entry in CleanupTargetRegistry.swift and the scanner, the UI, and the safety checks all pick it up:

CleanupTarget(
    id: "dart-pub-cache",
    displayName: "Dart and Flutter pub cache",
    level: .developer,
    pathTemplates: ["~/.pub-cache"],
    category: "Package Manager",
    deletesContentsNotDirectory: true,
    regenerates: true
)

Pull requests for new targets are welcome. See CONTRIBUTING.md.

Build from source

If you would rather build it yourself, this one line clones the repo, builds it locally, and installs it to /Applications. Because the build happens on your machine, macOS trusts it with no Gatekeeper prompts:

curl -fsSL https://raw.githubusercontent.com/yagcioglutoprak/dusty/main/scripts/install.sh | bash

It needs Xcode 16 or later (not just the Command Line Tools). To do it by hand:

git clone https://github.com/yagcioglutoprak/dusty.git
cd dusty/Dusty
open Dusty.xcodeproj   # then run the Dusty scheme, or:
xcodebuild -scheme Dusty -configuration Release build

Maintainers: cutting a notarized release is documented in docs/SIGNING.md.

FAQ

Is it actually free? Yes, MIT licensed. No trial, no upsell.

Will it delete my projects or documents? It cannot. Those folders are rejected by the validator before anything is touched, and only allowlisted cache and artifact paths are ever in scope.

Why not the Mac App Store? The App Store requires sandboxing, and a sandboxed app cannot reach the caches Dusty cleans. The trade off would defeat the point.

How is this different from rm -rf ~/Library/Caches? It sizes everything first, skips paths that are in use, can move to Trash with undo, logs what it did, and refuses anything outside the allowlist.

License

MIT. See LICENSE.


made by toprak.sh