Keep what matters. Remove what doesn't.
An open-source system utility for macOS and Windows.
Download Β· GitHub Β· Architecture Β· Contributing
π§Ή Clean Β π Uninstall Β π Analyze Β π» Developer Β π Monitor Β β‘ Startup
100% Local Β No Account Β No Telemetry Β Open Source
Prune helps you understand and manage your own computer. Like pruning a tree, it finds the dead branches β stale caches, temporary files, build leftovers, unused installers β shows you exactly what they are, and lets you decide what to cut. Nothing is ever removed without a preview and a confirmation.
Prune is not a "one-click cleaner". It is a developer-first system utility that treats safety as the primary feature.
- Extensible without a rebuild. Point Prune at a cache it does not know by adding it to
providers.json; it joins the built-in list with the same safety rules. See CONTRIBUTING.md. - Developer cleanup as a first-class feature. Thirty-odd tool caches β npm, pnpm, Yarn, Bun,
node-gyp, Deno, Playwright, Puppeteer, Cypress, Electron, Gradle, Maven, Cargo, Go, NuGet,
CocoaPods, Swift Package Manager, pub, RubyGems, Composer, JetBrains, Homebrew, Xcode
DerivedData and Archives, Simulator caches β plus project artifacts found per project:
node_modules, Rusttarget/,build/,dist/, Python caches and virtualenvs. Point it at the folders where your code actually lives. - Safe by default. A whitelist of removable roots, a list of protected paths, a mandatory dry run, Trash before permanent deletion, and a local operation log. See SECURITY.md for the guarantees.
- Local and private. No server, no account, no cloud, no telemetry, no network code at all.
- Native. Tauri 2 + Rust. Small binary, low memory, fast parallel scans with progress and cancellation.
- Cross-platform. One UI for macOS and Windows; OS differences live in a small platform layer.
| Area | Status | What it does |
|---|---|---|
| Dashboard | β | Storage, memory, CPU at a glance; reclaimable space by category; recent activity |
| Cleaner | β | Application caches, logs, temporary files, Trash, old installers, browser caches |
| Developer | β | Global tool caches + project artifact finder with per-item risk levels |
| Monitor | β | Live CPU per core, memory, swap, disks, top processes |
| Command palette | β | βK / Ctrl+K to jump anywhere or start a scan |
| Disk analyzer | β | Directory tree with drill-down, largest files, file type statistics, cancellable |
| Uninstaller | β | Apps with their caches, preferences and containers, matched by bundle identifier |
| Startup manager | β | Login items and launch agents, enable / disable without deleting anything |
| Docker | β | What Docker is holding, and two conservative prune commands. Volumes are never touched |
| CLI | β | prune scan, clean, disk, apps, startup, docker, processes, log, --json |
Every removable item carries a risk level:
Safe regenerated automatically, no user state browser cache, npm cache, logs
Low Risk cheap to rebuild node_modules, build directories
Medium Risk may hold state you care about Xcode archives, virtualenvs
High Risk removal is likely to break something
Protected never removable through Prune
Only Safe items are ever ticked for you, and only when you ask β by pressing Select safe
items, or prune clean without --include-low. Everything else you choose yourself.
There is one exception in the other direction. A few things cannot be moved to the Trash at all β what is already in the Trash, for one β so they are deleted outright whatever mode is chosen. Those are left unticked while the mode is "Move to Trash", because a recommendation that reads as reversible should not contain the one item that is not.
Captured from pnpm dev, which runs the interface against built-in sample data so the
screenshots do not expose a real machine. The numbers shown are made up; everything else is the
real interface.
| Platform | Architectures | Minimum |
|---|---|---|
| macOS | Apple Silicon, Intel | macOS 12 |
| Windows | x64 | Windows 10 (WebView2) |
Pick the one for your machine. Every file is built by GitHub Actions from the tagged commit β nothing is uploaded from anyone's laptop.
| Platform | File |
|---|---|
| macOS (Apple Silicon) | Prune_0.1.3_aarch64.dmg |
| macOS (Intel) | Prune_0.1.3_x64.dmg |
| Windows (x64) | Prune_0.1.3_x64-setup.exe Β· .msi |
The prune command line ships from the same release, as
prune-v0.1.3-<target>.tar.gz (.zip on
Windows). Unpack it and put prune on your PATH.
On macOS, Homebrew can install the same disk image for you:
brew tap bonjin-app/tap
brew trust bonjin-app/tap
brew install --cask pruneHomebrew 7 refuses to load a cask from a tap it has not been told to trust, and says so rather
than failing quietly; brew trust is what tells it. On Homebrew 6 that command does not exist,
and the tap and install lines are all you need.
brew uninstall --cask prune removes the app and keeps your settings and the operation log β
the record of what Prune removed. brew uninstall --zap --cask prune removes those too.
On Windows the WinGet manifests are in the repository but not yet in the community package
repository, so there is no winget install Prune to run. From a clone you can install from
them directly:
# once, in an administrator prompt: installing from a file on disk is off by default
winget settings --enable LocalManifestFiles
winget install --manifest packaging\wingetAll releases: GitHub Releases. Scoop is planned.
macOS will say the app "cannot be opened because the developer cannot be verified", and Windows SmartScreen will warn about an unrecognised app. Neither is a claim about what the app does β both mean nobody has paid for a certificate that vouches for it.
- macOS β right-click
Prune.appand choose Open, then Open again. - Windows β click More info, then Run anyway.
If you would rather not, build it from source. That is the same code.
Signing is prepared and off only because there is no certificate; see RELEASING.md.
Prune asks for nothing on start-up and sends nothing anywhere. Two things are worth knowing before the first scan.
macOS hides some places until you say otherwise. The Trash, Safari's data, Mail and Messages are invisible to any application without Full Disk Access, so a scan without it reports less than is really there. Prune says so rather than quietly showing a smaller number, and the banner links straight to the setting. Add Prune under System Settings β Privacy & Security β Full Disk Access, then reopen it.
Nothing is removed without you. A scan only reads. Selecting items builds a plan, the plan is shown in full before anything happens, and removal moves things to the Trash unless you explicitly choose otherwise. Every item carries a risk level, and items Prune refuses to touch are shown as Protected rather than hidden.
Everything is local, in one directory:
| macOS | ~/Library/Application Support/app.bonjin.prune/ |
| Windows | %APPDATA%\app.bonjin.prune\ |
It holds settings.json (the folders searched for project artifacts), operations.jsonl (what
was removed and when), providers.json if you added your own cache locations, and the window
position. Removing that directory resets Prune completely; removing the application and that
directory leaves nothing behind.
Prerequisites: Rust stable, Node 20+, pnpm, and the Tauri 2 prerequisites for your OS.
pnpm install
pnpm tauri dev # desktop app with hot reload
pnpm dev # UI only, in the browser, against a mock backend
# add ?scale=real for a real machine's worth of results
cargo run -p prune-cli -- scan # the command line, same engineChecks:
pnpm typecheck && pnpm lint && pnpm test
cargo fmt --all --check && cargo clippy --workspace --all-targets -- -D warnings && cargo test --workspaceThe same engine, the same safety rules, in a terminal:
cargo install --path crates/prune-cli # installs `prune`
prune status # what Prune can see on this machine
prune scan # find removable data (read-only)
prune scan --only npm_cache --json | jq '.totalBytes'
prune clean # show what would go β a dry run
prune clean --yes # move safe items to the trash
prune clean --include-low --yes # also node_modules, build directories, β¦
prune disk ~/Projects --large 500
prune docker
prune docker --prune-cache --yes
prune processes --limit 20
prune processes --stop 1234
prune apps --detail "Visual Studio Code"
prune startup
prune logTwo rules keep it safe to type quickly:
cleanis a dry run unless you pass--yes. The default prints the plan and stops.cleanonly ever selectsSafeitems on its own, orLowas well with--include-low. Anything riskier is listed byscanbut can only be chosen item by item in the desktop app, where the path and the risk are in front of you.
Exit codes: 0 success, 1 something failed, 2 nothing matched.
ββββββββββββββββββββββββββββββββββββββββββββββ
β Prune UI React Β· TypeScript Β· Tailwind β
ββββββββββββββββββββββββ¬ββββββββββββββββββββββ
β Tauri commands + events (ids only, never paths for deletion)
ββββββββββββββββββββββββΌββββββββββββββββββββββ
β src-tauri thin IPC adapter β
ββββββββββββββββββββββββββββββββββββββββββββββ€
β prune-core (pure Rust, no Tauri, no net) β
β providers β scan β safety β fs β ops β
β platform/{macos,windows} system β
ββββββββββββββββββββββββ¬ββββββββββββββββββββββ
macOS β Windows
Cleanup pipeline:
Discovery β Path Validation β Risk Classification β User Confirmation β Dry Run β Delete β Operation Log
Details, module map, IPC naming and the provider interface: docs/ARCHITECTURE.md.
Tagging v* builds the desktop bundles and the CLI for macOS and Windows and opens a draft
release. The steps are in RELEASING.md.
Prune deletes files, so every bug that could remove the wrong thing is treated as a security issue. The guarantees and the private reporting process are in SECURITY.md.
Issues and pull requests are welcome β especially new cleanup providers, which are usually a single declaration. Start with CONTRIBUTING.md.
Prune was inspired by Mole and the idea that a cleaner should be a tool you understand, not a button you trust.




