Clean development dependency folders (node_modules, virtual envs) to reclaim disk space.
Project description
DevBroom
DevBroom is a small cross-platform utility for reclaiming disk space from development dependencies.
It scans a directory, finds removable folders such as node_modules and Python virtual environments, shows their estimated size, and lets you clean them through either:
- a Tkinter desktop UI
- a headless CLI mode for remote or Linux server workflows
Interface Preview
Why This Project Matters
Developer machines and shared workstations tend to accumulate large dependency folders that are safe to rebuild but expensive to keep. DevBroom focuses on that narrow but common cleanup problem: identify heavyweight development artifacts quickly, show the likely reclaimable space, and let the user clean them without touching real application code. The result is a small, practical tool that demonstrates filesystem traversal, cross-platform behavior, GUI/CLI dual-mode design, and safety-oriented cleanup logic in one project.
Architecture
flowchart TD
A[main.py] --> B[devbroom.app.main]
B --> C{CLI mode?}
C -- No --> D[DevBroomApp Tkinter UI]
C -- Yes --> E[run_cli]
D --> F[Load settings]
D --> G[User actions]
G --> H[Start scan]
G --> I[Preview or export visible results]
G --> J[Delete selected results]
G --> K[Manage ignored paths and theme]
E --> F
E --> L[scan_targets]
E --> M[Console report]
E --> N[Optional JSON export]
H --> O[iter_scan_targets]
L --> O
O --> P[scanner.py]
P --> Q[Detect node_modules]
P --> R[Validate virtualenv folders]
P --> S[Apply ignored-path pruning]
P --> T[Estimate folder sizes]
D --> U[ui.py]
E --> V[cli.py]
J --> W[cleanup.py]
F --> X[settings.py]
P --> Y[models.py]
V --> Y
U --> Y
What A User Should Know First
- Problem solved: developer machines accumulate large dependency folders that are safe to rebuild but expensive to keep.
- Primary value: quickly find and remove disk-heavy dependency directories without touching application source code.
- Supported targets:
node_modulesand real Python virtual environments. - Supported environments: Windows and Linux.
- Interfaces: GUI for local desktop use, CLI for headless use.
- Safety posture: conservative detection, ignored-path support, confirmation before deletion, symlink protection, and partial-failure reporting.
Quick Start
Windows
Tkinter is usually included with the standard Python installer from python.org.
Run:
python main.py
Linux
Some Linux distributions do not include Tkinter by default.
Install Tkinter if needed:
# Debian / Ubuntu
sudo apt install python3-tk
# Fedora
sudo dnf install python3-tkinter
Run:
python3 main.py
How To Use The Application
GUI Workflow
- Start the app with
python main.pyorpython3 main.py. - Choose the root directory you want to scan.
- Click
Scan. - Review the discovered cleanup candidates.
- Optionally filter, preview, export, or ignore folders.
- Select the rows you want to delete.
- Click
Delete Selected.
CLI Workflow
Basic scan:
python3 main.py --cli --path /path/to/projects
Skip saved ignore paths for one run:
python3 main.py --cli --path /path/to/projects --no-settings-ignores
Export results to JSON:
python3 main.py --cli --path /path/to/projects --json-out scan-report.json
Preview what would be deleted without removing anything:
python3 main.py --cli --path /path/to/projects --dry-run
Delete all discovered targets (with confirmation prompt):
python3 main.py --cli --path /path/to/projects --delete
Delete all discovered targets without a confirmation prompt:
python3 main.py --cli --path /path/to/projects --delete --yes
CLI output includes:
- matching folders
- estimated sizes
- total reclaimable size
- optional JSON export
Core Features
- Scan a chosen directory recursively
- Detect
node_modules - Detect Python virtual environments such as
venv,.venv, andvirtualenv - Show estimated folder sizes before deletion
- Selectively delete only the folders you choose
- Remember last scanned path and preferred theme
- Persist ignored scan paths
- Preview current visible scan results
- Export scan results to JSON or text
- Light mode and dark mode UI
Detection Rules
DevBroom scans for these targets:
node_modulesvenv.venvvirtualenv
Virtual environment candidates are only treated as real Python environments if they contain one of:
pyvenv.cfgScripts/activatebin/activate
This prevents deleting unrelated folders that only happen to use a common virtualenv-like name.
The scanner also skips likely nested package locations such as:
site-packagesLiblibnode_modules
That reduces false positives inside installed dependencies.
Preview And Export
From the GUI:
Previewopens a read-only view of the current visible scan resultsExportsaves the current visible scan results as.jsonor.txt
From the CLI:
--json-out scan-report.jsonexports JSON- the console output itself serves as a plain-text preview/report
Safety Notes
- Deletion is permanent. Items are not moved to Trash or Recycle Bin.
- Symlinked directories are skipped during scanning.
- Symlink targets are not deleted.
- Read-only files are handled during deletion where possible.
- Permission errors and locked files are reported without aborting the entire operation.
Project Layout
main.py: thin application launcherdevbroom/app.py: app startup and CLI/GUI mode selectiondevbroom/cli.py: headless CLI scan/report modedevbroom/ui.py: Tkinter UI and theme handlingdevbroom/scanner.py: target discovery and size calculationdevbroom/cleanup.py: delete helpers and filesystem cleanupdevbroom/models.py: shared constants andScanTargetdevbroom/settings.py: saved preferences and ignored pathstests/test_scanner.py: scanner teststests/test_cleanup.py: cleanup teststests/test_settings.py: settings teststests/test_cli.py: CLI tests
Tests
The project includes a strong non-UI unit test suite.
Run the full suite:
python -m unittest discover -s tests
GitHub Actions also runs the test suite automatically on pushes to main and on pull requests targeting main.
You can also run each file directly:
python tests/test_scanner.py
python tests/test_cleanup.py
python tests/test_settings.py
python tests/test_cli.py
Covered areas:
- target detection
- virtualenv validation
- nested-folder skip behavior
- ignored path handling
- scan cancellation behavior
- safe delete behavior
- read-only file cleanup behavior
- settings persistence
- CLI scan and JSON export behavior
- text report export behavior
The suite is intentionally strongest around non-UI logic. Tkinter widget behavior is still validated manually rather than through UI automation tests.
Known Limitations
- Scans can be slow on very large directories because folder sizes are calculated recursively.
- Locked files on Windows may still prevent complete deletion.
- Tkinter styling can vary across platforms and desktop environments.
- GUI export currently exports visible rows only, which is usually the right behavior after filtering.
Good Next Modifications
- Add an option to sort by largest folders first immediately after scan completion.
- Add a confirmation detail panel that lists exactly what will be deleted before removal.
- Add CSV export if you want results to be easier to open in spreadsheets.
- Add packaging/install steps once the feature set stabilizes.
Contributing
Contributions, fixes, and small usability improvements are welcome.
If you want to contribute:
- open an issue for bugs or feature ideas
- keep pull requests focused and easy to review
- run the test suite before submitting
See CONTRIBUTING.md for details.
What I Would Not Add Yet
- a database
- background worker processes
- plugin architecture
- heavy UI automation for the current Tkinter surface
- an installer/package distribution workflow before the behavior stabilizes
Engineering Decisions
- Conservative target detection over aggressive cleanup. Virtual environment folders are validated with marker files instead of trusting names alone, which reduces dangerous false positives.
- Shared scanner and reporting logic across GUI and CLI. This keeps behavior consistent and reduces duplication between local desktop use and headless server workflows.
- Lightweight JSON settings instead of a config framework or database. The project only needs a few persisted values, so a simple file is easier to inspect and maintain.
- Focused non-UI tests over brittle GUI automation. The highest-risk logic lives in scanning, deletion, settings, and reporting, so that is where the test investment provides the most value.
- Intentional feature restraint. The project avoids plugins, background services, and packaging complexity until the core cleanup workflow is more mature.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file devbroom-0.1.1.tar.gz.
File metadata
- Download URL: devbroom-0.1.1.tar.gz
- Upload date:
- Size: 26.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
35f9195e0fc15548c7baf628055375ae02cb2eced7cab017ba4795a1b25b7635
|
|
| MD5 |
10c2cd843a399ad3613b46951a367aff
|
|
| BLAKE2b-256 |
82a5dff0662a1bb5e88b4c6da672f684c1e9bc0d1b7e20268375462773e61427
|
Provenance
The following attestation bundles were made for devbroom-0.1.1.tar.gz:
Publisher:
publish.yml on Sandhu93/devBroom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
devbroom-0.1.1.tar.gz -
Subject digest:
35f9195e0fc15548c7baf628055375ae02cb2eced7cab017ba4795a1b25b7635 - Sigstore transparency entry: 1147195326
- Sigstore integration time:
-
Permalink:
Sandhu93/devBroom@46a8a70fed2d3d9368c8d5862388aa160fda5b8b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Sandhu93
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@46a8a70fed2d3d9368c8d5862388aa160fda5b8b -
Trigger Event:
release
-
Statement type:
File details
Details for the file devbroom-0.1.1-py3-none-any.whl.
File metadata
- Download URL: devbroom-0.1.1-py3-none-any.whl
- Upload date:
- Size: 20.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
224b87a5b3f7f5d8eac22819f6a20aa6f59344a6a75cffd30bb923163c020d9b
|
|
| MD5 |
4384a60d5b33304159f874995bc0bf10
|
|
| BLAKE2b-256 |
67ed7fcf0f533814d1cc48e2eb5164e66eb33903eecc1f227843571f23ca8f20
|
Provenance
The following attestation bundles were made for devbroom-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on Sandhu93/devBroom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
devbroom-0.1.1-py3-none-any.whl -
Subject digest:
224b87a5b3f7f5d8eac22819f6a20aa6f59344a6a75cffd30bb923163c020d9b - Sigstore transparency entry: 1147195359
- Sigstore integration time:
-
Permalink:
Sandhu93/devBroom@46a8a70fed2d3d9368c8d5862388aa160fda5b8b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Sandhu93
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@46a8a70fed2d3d9368c8d5862388aa160fda5b8b -
Trigger Event:
release
-
Statement type: