Repository navigation
Node Modules Cleaner v1.4.0
Node Modules Cleaner
Desktop application for reclaiming disk space from node_modules folders,
merged Git worktrees, and shared developer caches.
Menu bar mode
- Hide the Dock icon and run as a menu bar app (macOS); closing the window leaves the
app in the menu bar rather than quitting it, and Quit in the tray menu ends it - Live readout of free disk space and worktrees ready to be removed, for a list of
watched folders that now persists between runs — the app's first stored setting - Free space is reported for the volume each watched folder actually lives on, matched
by longest mount point, so a folder on an external disk reports that disk - The worktree count comes from the same merge detection the window uses, minus the
fetch and the size walk, so the background refresh never touches the network and
never crawlsnode_modules. Refreshes every 15 minutes, on demand, and after a clean - Platform notes: the Dock toggle is macOS-only, tray text is unsupported on Windows
and desktop-dependent on Linux (the menu carries the same information everywhere),
and the Linux.debnow declares itslibayatana-appindicator3runtime dependency
Merged worktree detection, reworked (1.3.0)
- Compare against every base branch a repository has —
origin/HEADplus
origin/main,origin/master,origin/developmentandorigin/develop—
instead oforigin/HEADalone, which reported work merged into a second
integration branch as still open - Detect squash merges, GitHub's default, which never make a branch an ancestor
of its base. The probe writes into a scratch object directory and leaves the
repository's object database untouched - Refresh remote-tracking refs before comparing, with no credential prompts and a
hard timeout, so a branch merged an hour ago is not reported as open - Include worktrees with a detached HEAD; never offer one that holds a base branch
- Report registrations whose directory is gone as stale and clear them with
git worktree prune, instead of mislabelling them as having uncommitted changes - Tell untracked OS and watcher noise (
.DS_Store,.watchman-cookie-*) apart
from real changes: it is what makes Git refuse, so removal retries once with a
single-f— never two, which is what bypassing a lock would need - Refuse a worktree that gained a commit after the scan, and say which of
"already removed", "changed since scan", "no longer registered" and
"no longer merged" actually happened - Collapse linked worktrees to one entry per real repository, so a directory of
twenty worktrees is inspected once rather than twenty times
Also in the app
- Scan directories for
node_modulesfolders and merged Git worktrees - Scan shared developer caches — npm, pnpm, bun, yarn, uv, Gradle, puppeteer, nvm
- Detect pnpm stores abandoned when the tool moved its default location
- Report what a delete actually frees, not the nominal folder size:
allocated blocks rather than file lengths, hardlinked files counted once,
and files still linked from outside the tree counted as zero - Delegate to a tool's own prune where one exists, so referenced entries survive
- Empty unrotated logs in place, keeping the writing service's file handle valid
- Batch delete with per-path failure reporting
- Cross-platform support
Downloads
- Windows:
.msior.exeinstaller - macOS:
.dmg(Intel & Apple Silicon) - Linux:
.debor.AppImage