Skip to content

Node Modules Cleaner v1.4.0

Choose a tag to compare

@github-actions github-actions released this 13 Sep 08:30

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 crawls node_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 .deb now declares its libayatana-appindicator3 runtime dependency

Merged worktree detection, reworked (1.3.0)

  • Compare against every base branch a repository has — origin/HEAD plus
    origin/main, origin/master, origin/development and origin/develop —
    instead of origin/HEAD alone, 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_modules folders 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: .msi or .exe installer
  • macOS: .dmg (Intel & Apple Silicon)
  • Linux: .deb or .AppImage