bun prune deletes everything in node_modules that the current bun.lock would not install: packages left behind after switching branches, removing a dependency, or installing with another package manager. With the isolated linker, this includes stale entries in node_modules/.bun.
bun prune never contacts the registry, never runs lifecycle scripts, and never modifies bun.lock or package.json.
terminal
node_modules folder show the folder in parentheses, e.g. - typescript@5.4.0 (packages/app/node_modules).
--production
Also remove everything bun install --production would not install (i.e. devDependencies). This lets you build with dev dependencies and ship without them:
--omit=dev, --omit=optional, and --omit=peer work the same way they do for bun install.
--dry-run
List what would be removed without deleting anything:
terminal
--filter
Prune only the selected workspaces’ node_modules folders (same patterns as bun install --filter). Bun also cleans shared locations: the root node_modules, or node_modules/.bun with the isolated linker. In those locations, Bun keeps anything an unselected workspace still needs.
terminal
Notes
- Always runs from the workspace root and covers every workspace’s
node_modules, even when invoked inside a workspace package. - Requires
bun.lockto matchpackage.json. If you edited dependencies since the last install, runbun installfirst. - Uses the same linker as
bun installwould. Ifnode_moduleswas created with the other linker,bun prunerefuses to run. Pass the matching--linker, or runbun install. - Matches packages by name. If a package is at the wrong version, Bun leaves it for
bun installto replace. Bun only removes a nested copy (node_modules/a/node_modules/b) once the correct version is installed above it; otherwise Bun keeps it and prints a warning. - Never removes workspace folders,
.binentries still in use, dot-directories like.cache, plain files, or anything outsidenode_modules. - Removes packages disabled for the current
os/cpu. Pass--os/--cputo prune for another platform. - Works on a pruned monorepo checkout (e.g.
turbo pruneoutput) the same waybun install --frozen-lockfiledoes. - If any entry fails to delete, the command still removes the rest and exits
1. --globalis not supported.- To clean the global cache instead, use
bun pm cache rm.