Skip to main content

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

Installation

pip install devbroom

Requires Python 3.10 or newer.

On Linux, Tkinter may need to be installed separately before the GUI will open (see Quick Start → Linux below).

Upgrade

pip install --upgrade devbroom

Run from source

If you prefer to clone the repo instead:

git clone https://github.com/Sandhu93/devBroom.git
cd devBroom
pip install -e .

Interface Preview

DevBroom interface

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_modules and 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

After pip install devbroom, the devbroom command is available system-wide.

Windows

devbroom          # opens the GUI
devbroom --help   # show all CLI options

Tkinter is included with the standard Python installer from python.org, so the GUI works out of the box.

Linux

Some Linux distributions do not include Tkinter by default. Install it before using the GUI:

# Debian / Ubuntu
sudo apt install python3-tk

# Fedora
sudo dnf install python3-tkinter

Then:

devbroom          # opens the GUI
devbroom --help   # show all CLI options

How To Use The Application

GUI Workflow

  1. Start the app with devbroom (no flags).
  2. Choose the root directory you want to scan.
  3. Click Scan.
  4. Review the discovered cleanup candidates.
  5. Optionally filter, preview, export, or ignore folders.
  6. Select the rows you want to delete.
  7. Click Delete Selected.

CLI Workflow

Basic scan:

devbroom --cli --path /path/to/projects

Skip saved ignore paths for one run:

devbroom --cli --path /path/to/projects --no-settings-ignores

Export results to JSON:

devbroom --cli --path /path/to/projects --json-out scan-report.json

Preview what would be deleted without removing anything:

devbroom --cli --path /path/to/projects --dry-run

Delete all discovered targets (with confirmation prompt):

devbroom --cli --path /path/to/projects --delete

Delete all discovered targets without a confirmation prompt:

devbroom --cli --path /path/to/projects --delete --yes

Include targets that are not inside a git repository (e.g. when scanning an entire drive):

devbroom --cli --path /path/to/scan --include-non-project

CLI output includes:

  • matching folders sorted by size (largest first)
  • 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, and virtualenv
  • 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_modules
  • venv
  • .venv
  • virtualenv

Virtual environment candidates are only treated as real Python environments if they contain one of:

  • pyvenv.cfg
  • Scripts/activate
  • bin/activate

This prevents deleting unrelated folders that only happen to use a common virtualenv-like name.

By default, devBroom only surfaces targets that live inside a git repository. This prevents folders bundled inside installed applications (VS Code, Arduino IDE, pgAdmin, etc.) from appearing as cleanup candidates. Pass --include-non-project to disable this filter.

The scanner also skips likely nested package locations such as:

  • site-packages
  • Lib
  • lib
  • node_modules

That reduces false positives inside installed dependencies.

Preview And Export

From the GUI:

  • Preview opens a read-only view of the current visible scan results
  • Export saves the current visible scan results as .json or .txt

From the CLI:

  • --json-out scan-report.json exports 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 launcher
  • devbroom/app.py: app startup and CLI/GUI mode selection
  • devbroom/cli.py: headless CLI scan/report mode
  • devbroom/ui.py: Tkinter UI and theme handling
  • devbroom/scanner.py: target discovery and size calculation
  • devbroom/cleanup.py: delete helpers and filesystem cleanup
  • devbroom/models.py: shared constants and ScanTarget
  • devbroom/settings.py: saved preferences and ignored paths
  • tests/test_scanner.py: scanner tests
  • tests/test_cleanup.py: cleanup tests
  • tests/test_settings.py: settings tests
  • tests/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 CSV export for results that are easier to open in spreadsheets.
  • Add a GUI toggle to include or exclude non-project targets (currently CLI-only via --include-non-project).
  • Add a progress indicator showing scan depth or folders visited for large directory trees.

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

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

devbroom-0.1.3.tar.gz (26.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

devbroom-0.1.3-py3-none-any.whl (20.8 kB view details)

Uploaded Python 3

File details

Details for the file devbroom-0.1.3.tar.gz.

File metadata

  • Download URL: devbroom-0.1.3.tar.gz
  • Upload date:
  • Size: 26.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for devbroom-0.1.3.tar.gz
Algorithm Hash digest
SHA256 85d395a84fa2e3f1d2de7365f41a93014145b312e2290fb40e5e1fc0ddf14cc5
MD5 03b3cdc95d706b8a689c2ef5b13a622c
BLAKE2b-256 57d9c26ff7701873aed79ac5d2af556ca781fda175baf8e2b3995343036f1c94

See more details on using hashes here.

Provenance

The following attestation bundles were made for devbroom-0.1.3.tar.gz:

Publisher: publish.yml on Sandhu93/devBroom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file devbroom-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: devbroom-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 20.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for devbroom-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 4d6e19575818b017c5db65eab10be687ba11a1d1e54ce1f7a7e316cf6753fa03
MD5 8794ba0c9aed6893c0edc97ffcf75767
BLAKE2b-256 b2279f32b927bf138935cfbae18658250702a4e1aa6842cbce5b77c8d5697e11

See more details on using hashes here.

Provenance

The following attestation bundles were made for devbroom-0.1.3-py3-none-any.whl:

Publisher: publish.yml on Sandhu93/devBroom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page