How it works
DevCleaner finds projects under your configured project roots (Settings → Folders) that have not been touched for longer than the abandoned after threshold. In the dashboard:
- Unused Projects — candidates to archive (Pro)
- Archived Projects — breadcrumbs pointing at off-disk archives (restore free)
Hibernation is its own flow — it never rides the Clean Now button and never inflates Quick Clean totals.
Light vs full archive
| Mode | What stays in the archive | Best for |
|---|---|---|
| Light | Source, .git, lockfiles; strips node_modules, Pods, .build, target, etc. | Maximum space savings; reinstall deps on restore |
| Full | Everything in the project folder | Offline restore with no reinstall step |
Choose the default in Settings → Folders → Unused Projects. You can override per archive.
Safety chain
- Build archive next to the project
- Verify integrity (
unzip -t/tar -tzf) and non-zero size - Checksum, move to destination, re-verify
- Write a
.devcleanerbreadcrumb sidecar - Only then delete the original folder
Any failure leaves the project on disk untouched.
Docker projects
For projects with docker-compose.yml or a Dockerfile, DevCleaner can capture the runtime environment:
- Compose volumes — snapshotted into the archive (requires Docker daemon at archive + restore)
- Light + Docker — images rebuilt via
docker compose buildon restore - Full + Docker — images saved with
docker savefor offline restore
Docker-only projects (compose/Dockerfile without git) are detected as archivable. Running containers must be stopped by you before archive.
Restore
Restore from the Archived Projects card, by double-clicking a .devcleaner breadcrumb, or via Preview restore (eye button) to see destination path, file count and top-level contents without downloading an iCloud-parked archive.
If the archive lives in iCloud and is only a placeholder, DevCleaner downloads it first (with a disk-space preflight), then extracts. Conflicts restore as ProjectName (restored) — never overwrites an existing folder.
Dependency reinstall (polyglot)
After a light restore, DevCleaner offers one-click reinstall for every package manager it detects from lockfiles and markers:
| Ecosystem | Detected by | Command |
|---|---|---|
| pnpm | pnpm-lock.yaml | pnpm install |
| Yarn | yarn.lock | yarn install |
| Bun | bun.lockb | bun install |
| npm | package-lock.json / package.json | npm install |
| CocoaPods | Podfile | pod install |
| Cargo | Cargo.toml | cargo fetch |
| Swift PM | Package.swift | swift package resolve |
| Go | go.mod | go mod download |
| Composer | composer.json | composer install |
| Poetry / pip / pipenv | poetry.lock, requirements.txt, Pipfile | poetry install, pip install -r …, pipenv install |
| Bundler / Maven / Gradle | Gemfile, pom.xml, build.gradle* | bundle install, mvn install, ./gradlew build |
Commands run in your login shell ($SHELL -ilc) so nvm, Homebrew and other PATH tools work from a GUI app.
Batch archive (Pro)
Archive All in Unused Projects archives every listed project sequentially — with a confirmation showing count and total GB, a progress row, and skip-on-error behaviour.