A Windows uninstaller that finishes the job.
Runs a program's own uninstaller, then finds what it left behind β files, registry keys, scheduled tasks β and removes those too. By default nothing is deleted outright: it is quarantined first, so a bad match is recoverable.
Real SMART data from the drive itself β not free space dressed up as health.
This README's screenshot follows your theme, because the app does too.
Windows' own "Apps & features" runs an uninstaller and stops there. What
the uninstaller forgets β a folder in AppData, a Run key, a scheduled
task β stays on the disk forever, and nothing in Windows will ever mention
it again.
Prune replaces four tools with one: an uninstaller, a disk visualiser, a cache cleaner and a drive-health monitor. Every number it shows is measured on the machine rather than estimated, and it says so when it cannot measure something instead of printing a confident zero.
|
Every installed program from all three registry Uninstall hives, plus the Store apps and browser extensions no uninstall list mentions. Real icons, measured sizes, and a warning before removing something that is running. Batches run without a wizard per program β the vendor's own silent command where one is published, and the right flag for MSI, NSIS, Squirrel and closed Chromium browsers otherwise β and a game is removed before the launcher it uninstalls through. Store apps are removed in-app too, one at a time or in a batch. Optional, as in Revo: a restore point or a full registry backup before each uninstall, and a choice of where leftover files go. |
74 rules across 29 categories, scanned one at a time so the tree fills in as
it goes. A rule that cannot be measured says whether the software is missing
or the read needs admin β never |
|
An interactive treemap of what is actually using the disk, from a full-drive scan that reads the NTFS MFT directly. Largest files, a folder table and a breakdown by type beside the map. |
Everything Windows launches at sign-in β Run keys, Startup folders, scheduled tasks, automatic services and Store startup tasks. The switch writes the same record Task Manager does. |
|
Files are moved and registry keys exported before removal, browsable and restorable β nothing is gone for good until you say so twice. Leftover files can go to the Recycle Bin or be deleted outright instead, if you choose that in Settings; registry keys are backed up either way. |
Duplicate files under a folder you choose, found by size, then a 64 KB sample, then a full hash β so almost nothing is read completely. |
Download Prune-Setup-<version>.exe from the
latest release and run
it. The installer opens in Windows' own language β 40 are included β and on
a fresh install asks whether Prune should check for updates, unticked
unless you tick it. The -win.zip beside it is the same application
without an installer: unzip it anywhere and run Prune.exe.
From 2.5.0 on, that is the last installer you run by hand: with the update
check on, a button appears at the bottom of the side bar when a new version
is out, and one click installs it and reopens Prune. Releases before 2.5.0
cannot update themselves, and named the installer Prune.Setup.<version>.exe.
Prune is not code-signed, so the first time you run the installer Windows shows:
Windows protected your PC Microsoft Defender SmartScreen prevented an unrecognised app from starting.
Click More info, then Run anyway.
This warning is about the absence of a certificate, not about anything found in the file. SmartScreen flags every unsigned installer it has not seen before, and unlike a reputation warning it does not go away as more people download it β an unsigned binary stays unrecognised. A code-signing certificate is a paid, identity-verified purchase, and Prune does not have one.
You do not have to take that on trust. Every release lists the SHA-256 of both files, and you can check the one you downloaded matches before you run it:
Get-FileHash .\Prune-Setup-*.exe -Algorithm SHA256Compare the result with SHA256SUMS.txt on the release page.
Get-FileHash prints the digest in uppercase and the file lists it in
lowercase β same hash, compare them case-insensitively. For releases before
2.5.0 the file also names the installer Prune Setup <version>.exe, with
spaces, while the download is Prune.Setup.<version>.exe: same file,
GitHub turns spaces into dots.
Be clear about what that does and does not prove: it confirms the file reached you byte-for-byte as it was built, so a corrupted or altered download is caught. It does not prove who built it.
From 2.4.1 on, that second question has an answer too. Releases are built by GitHub Actions, and each file carries an attestation: a signed record of the repository, the commit and the workflow that produced it. With the GitHub CLI installed:
gh attestation verify .\Prune.Setup.<version>.exe --repo jimman0I/pruneA file that passes was built by this repository's own workflow from its public source; anything else fails. It is still not a code signature β Windows does not read it, so SmartScreen warns all the same β but it answers who built the file, which a checksum cannot. Releases before 2.4.1 were built locally and have no attestation.
If you would rather not run an unsigned binary, the alternative is to build it yourself from source: see Building an installer below. The result is the same application.
No telemetry, no crash reporting, no analytics, and no update check unless
you turn one on. The only HTTP in the app is the window talking to its own
backend on 127.0.0.1, behind a guard that checks the Host header before
a request body is ever parsed β because loopback is not the protection it
sounds like, and every web page you have open can reach it too.
The one exception is opt-in: Settings β Check for updates, off by
default (the installer asks on a fresh install, unticked). Turned on, Prune
asks api.github.com once a day whether a newer release exists, sending a
User-Agent and nothing else. If there is one, a button appears at the
bottom of the side bar, and only clicking it downloads the new installer
from the GitHub release and installs it. Turn on Install updates
automatically as well and it downloads in the background instead, and
installs the next time Prune closes.
That is checkable rather than a promise: the only code that opens a
connection to a host that is not loopback is
backend/src/services/updateCheck.js and the updater in
electron/updater.cjs, and neither does anything while the update check is
off. SECURITY.md says exactly what the updater trusts.
- Windows 10 or 11.
- Node.js 18+ (development only β the packaged app bundles its own runtime via Electron).
# Backend (Express, port 3101)
cd backend
npm install
npm run dev
# Frontend (Vite, port 5174) β in a second terminal
cd frontend
npm install
npm run dev
# Electron shell β in a third terminal, once both of the above are running
cd electron
npm install
npm startRun tests:
cd backend && npm test
cd frontend && npm test
cd electron && npm test1,918 tests: about half a minute each for the backend and frontend, a second for the electron suite. GitHub Actions runs all three on every push and pull request, but run them yourself before pushing β one at a time, for the reason CONTRIBUTING.md explains.
cd electron
npm run distProduces an NSIS installer (.exe), a portable .zip and a generated
SHA256SUMS.txt in electron/dist/. See
electron/README.md for how the build pipeline works
and what it does differently from a plain electron-builder call, and
RELEASING.md for the checklist around it. Published
releases are built by GitHub Actions rather than on anyone's machine, so
each file carries an attestation of where it came from.
backend/β Express (ESM), running in-process inside Electron's main process when packaged, or standalone vianode src/index.jsin development. Zero native dependencies: the registry reader and the PowerShell COM interop used for Recycle Bin sizing both shell out toreg.exeandpowershell.exeβ binaries every Windows machine already has, nothing to bundle or rebuild per platform.frontend/β React + Vite + Tailwind, the Aurora Deck design system (obsidian ground, cyan accent, glass panels), in dark and light. Both palettes are CSS custom properties insrc/index.css, and every text tier in each is measured against the surfaces it sits on.electron/β the desktop shell. Quarantine data and settings live underapp.getPath('userData'), never inside the install directory, so an upgrade never touches or deletes them.
- Windows only.
- Removing a Store app cannot be undone from Quarantine, unlike everything
else Prune removes:
Remove-AppxPackagetakes the app and its data, and the way back is reinstalling from the Store. The dialog says so before you confirm. - Store apps Windows marks as part of the system β the Security interface, the app installer β cannot be removed, and their rows open Windows' own page instead. A batch takes only the Store apps Windows explicitly marks as removable; one it has not said either way stays out.
- About one program in ten still uninstalls with its own wizard: anything whose installer Prune cannot positively identify runs exactly as registered, because a wrong silent flag is worse than a visible dialog.
- A Chromium browser that is open when its uninstall runs shows its own dialog rather than being closed for you β the silent option closes every window without asking. Microsoft Edge and the WebView2 runtime always show Microsoft's dialog: other programs, Windows Search among them, depend on WebView2.
- Leftover scanning is heuristic (name and publisher matching), not a full before/after filesystem snapshot.
- Delete permanently, if you choose it for leftover files in Settings, means exactly that: they cannot be restored from Quarantine or the Recycle Bin. It is off by default, the review says so before you confirm, and a guard refuses Windows, a drive root, Program Files itself, your profile's own folders and Prune's quarantine whatever the scan found.
- A full registry backup before uninstalling covers
HKLM\SOFTWAREandHKCU\Softwareβ about 140 MB here β and only the newest three are kept. - The installer is unsigned, so SmartScreen warns on first run and keeps warning β see Installing.
- CONTRIBUTING.md β how to run it, how code is written here, and how to work on the parts that delete things without deleting your own.
- SECURITY.md β where to report a vulnerability privately, and what is in scope.
- RELEASING.md β the release checklist.
- CHANGELOG.md β release notes.
MIT β see LICENSE. Use it, fork it, sell it; keep the copyright notice. It comes with no warranty, which is worth reading rather than skipping for a program whose job is deleting things.



