Next-gen disk cleanup tool for developers. Reclaim tens of GBs by intelligently detecting and cleaning unnecessary development artifacts.
Goes beyond npkill β detects node_modules, .next, .expo, .gradle, DerivedData, dist, build and more. Smart recommendations based on last-modified time. Monorepo-aware. Safe by default.
npm install -g cleandevOr run without installing:
npx cleandev# Scan your entire home directory β find and clean dev artifacts anywhere
cleandev
# Scan a specific path
cleandev --path ~/projects
# Scan only (dry run β nothing deleted)
cleandev scan
# Auto-delete safe folders (unused 30+ days)
cleandev clean --auto
# Force mode β even protected folders become selectable
cleandev --forceScans the current directory, shows results, and lets you select folders to delete.
cleandev # Interactive cleanup in current directory
cleandev --path ~/projects # Scan a different pathOnly shows what's found β never deletes anything.
cleandev scan # Scan home directory
cleandev scan --path ~/projects # Scan a specific path
cleandev scan --json # JSON output (pipe to jq, scripts, etc.)
cleandev scan --min-size 1048576 # Only show folders > 1 MB
cleandev scan --types node_modules,.next # Only scan specific types
cleandev scan --force # Show protected folders as selectablecleandev clean --auto # Auto-delete safe items (no prompt)
cleandev clean --auto --dry-run # Show what auto-delete would remove
cleandev clean --safe-days 14 # Items unused 14+ days = safe
cleandev clean --force # Even protected folders become selectable| Flag | Description | Default |
|---|---|---|
-p, --path <path> |
Root path to scan | ~/ (home dir) |
-d, --depth <number> |
Max directory depth | 10 |
-a, --auto |
Auto-delete safe folders | false |
-t, --types <types> |
Comma-separated folder types | all |
-i, --ignore <patterns> |
Comma-separated ignore patterns | β |
--min-size <bytes> |
Minimum folder size in bytes | 0 |
--safe-days <days> |
Days unused before considered safe | 30 |
--sort <field> |
Sort by: size, age, priority, type |
size |
--json |
Output as JSON | false |
--dry-run |
Show what would be deleted | false |
--force |
Allow deleting protected folders | false |
| Type | Description |
|---|---|
node_modules |
Node.js dependencies |
.next |
Next.js build cache |
.expo |
Expo development cache |
DerivedData |
Xcode derived data |
.gradle |
Gradle build cache |
android/build |
Android build output |
dist |
Distribution build output |
build |
Build output |
.turbo |
Turborepo cache |
.svelte-kit |
SvelteKit build cache |
.nuxt |
Nuxt build cache |
.cache |
Generic cache |
.parcel-cache |
Parcel bundler cache |
coverage |
Test coverage reports |
.output |
Framework output |
cleandev analyzes each folder and recommends:
- β SAFE β Not modified in 30+ days. Pre-selected for deletion.
β οΈ REVIEW β Modified recently. Shown but not pre-selected.- π« PROTECTED β Critical path (monorepo root, current project). Never deleted.
cleandev automatically detects:
- npm/yarn workspaces
- pnpm workspaces
- Turborepo projects
- Lerna monorepos
Shared root-level node_modules in monorepos are protected from deletion.
Create cleandev.config.js in your project root:
export default {
depth: 8,
safeDays: 14,
ignore: ['**/fixtures/**'],
types: ['node_modules', '.next', 'dist'],
minSize: 1048576, // 1 MB minimum
};CLI flags override config file values.
π§Ή cleandev β reclaim your disk space
ββββββββββββββββββββββββββββββββββββββββββ
Found 8 cleanable folders
Total size: 4.2 GB
β
SAFE TO DELETE (3 items)
These haven't been used recently.
β π¦ node_modules (2.3 GB) β 45 days ago β SAFE
projects/old-app/node_modules
β β² .next (800 MB) β 2 months ago β SAFE
projects/old-next/.next
β π± .expo (450 MB) β 60 days ago β SAFE
projects/expo-test/.expo
β οΈ REVIEW (2 items)
These were used recently β double-check.
β π¦ node_modules (320 MB) β 5 days ago β REVIEW
projects/active-app/node_modules
β π¨ build (180 MB) β 12 days ago β REVIEW
projects/active-app/build
π‘ You could free up 3.5 GB by deleting safe items.
import { scan, enrichResults, cleanAll } from 'cleandev';
// Scan
const results = await scan({ path: '/projects', depth: 5 });
// Analyze
const enriched = enrichResults(results, { safeDays: 30 });
// Clean
const { totalFreed } = await cleanAll(enriched.filter(r => r.analysis.recommendation === 'safe'));
console.log(`Freed ${totalFreed} bytes`);- Never deletes system directories
- Protects monorepo shared dependencies
- Protects current project's
node_modules - Always confirms before deleting (unless
--auto) - Handles permission errors gracefully
MIT