Deterministic macOS Developer Ecosystem & Package Top
etop is a blazing-fast, deterministic CLI and interactive TUI monitor for macOS developers who work with multiple programming languages, package managers, runtimes, build caches, and container layers.
Inspired by classic Unix monitors (htop, btop, ctop), etop audits your entire developer workstation to discover installed software, resolve dependency topologies (unreferenced orphans vs explicit top-level tools), inspect associated filesystem artifacts (configs, data directories, logs, caches, and environment variables), and generate reversible, zero-accident cleanup scripts.
┌─ ⚡ etop | Items: 879 | Orphans: 219 (778 MB) | Marked: 0 | Sort: Disk Size ─────────────────────┐
│ Mark Source Name Category Size Status Last Used│
│ [✓] 🧹 cache:build UV Python Wheels Build Artifacts 1.47 GB Cache Today │
│ [✓] 🧹 cache:build Homebrew Bottles Build Artifacts 1.75 GB Cache Today │
│ [ ] 🍺 brew:formula postgresql@16 Databases & Storage 68.7 MB Dep (7 refs) Today │
│ [ ] ⚡ mise:runtime ruby@4.0.6 Languages & Runtimes 482.1 MB Active Runtime 4d ago │
│ [ ] 🦀 cargo:bin tokio-console CLI Developer Tools 18.4 MB Top-Level 12d ago │
│ [ ] 🍎 macos:app Ghostty GUI Apps & Media 42.1 MB Top-Level 1d ago │
└────────────────────────────────────────────────────────────────────────────────────────────────────┘
brew info --json=v2)mise ls --json / active configs)~/.cargo/.crates2.json)$GOPATH/bin + go version -m)/Applications + mdls access timestamps)~/.config/..., .toml, .conf, .plist, .rc) and active environment variables are preserved and never deleted..log files, crash dumps, and caches — including logs nested inside config directories (e.g. ~/.config/<name>/*.log or logs/) — without touching configuration state.~/.local/share/etop/tombstones/ and an append-only history.jsonl Write-Ahead Log upon cleanup generation.~/.ssh), GPG signing identities, cloud credentials (~/.aws, ~/.kube, ~/.docker, GCP), package manager tokens (~/.npmrc, ~/.gem/credentials, ~/.cargo/credentials.toml, ~/.netrc), project .env files, and exported shell environment variables. Identifies insecure POSIX file permissions (0644 vs 0600) and masks secrets by default.[2] 🔐 Security & Env and CLI command etop security with safe in-memory unmasking ([r] or --reveal <key>) and deterministic security_fix_*.sh remediation script generation.etop.conf):
Personalize default sorting, entrypoint mode, UI theme presets, and split percentages via ~/.config/etop/etop.conf (or etop.toml). Prioritized through a deterministic precedence ladder (CLI Flag > ENV > etop.conf > Defaults) with anti-bloat domain partitioning and frame-0 UI state hydration.etop doctor):
Audits developer toolchains, tombstone storage permissions, custom security policies, and user configuration syntax with actionable health checks.--dry-run and generate human-auditable bash scripts with inverse rollback/reinstall scripts.brew tap vikks/tap
brew install etop
curl -fsSL https://raw.githubusercontent.com/vikks/etop/main/install.sh | sh
cargo install --git https://github.com/vikks/etop.git
git clone https://github.com/vikks/etop.git
cd etop
cargo build --release
cargo install --path .
brew uninstall etop
curl -fsSL https://raw.githubusercontent.com/vikks/etop/main/uninstall.sh | sh
(To also purge tombstone history data from ~/.local/share/etop/, pass --purge: curl -fsSL .../uninstall.sh | sh -s -- --purge)
Launch the fullscreen immediate-mode TUI:
etop
# or
etop tui
etop info)Inspect multiple versions, install paths, configurations, data directories, log paths, caches, active environment variables, and reinstall commands:
# Inspect specific package or runtime
etop info postgresql
etop info ruby
etop info ripgrep
# Output structured JSON for automation pipelines
etop info postgresql --json
etop scan)# View complete table sorted by disk footprint
etop scan
# View top 15 largest items
etop scan --top 15
# Sort by inactivity (longest unused first)
etop scan --sort inactivity
# Output raw JSON
etop scan --json
etop filter)# Filter by ecosystem / toolchain
etop filter --ecosystem ruby
etop filter --ecosystem rust
etop filter --ecosystem brew
# Show only unreferenced orphan dependencies
etop filter --orphans
# Show only build artifact caches and dangling Docker layers
etop filter --caches
# Filter packages inactive for more than 90 days
etop filter --older-than 90
# Combine multi-criteria filters
etop filter -e python --orphans --older-than 60
etop summary & etop categories)# High-level toolchain, orphan, and cache breakdown
etop summary
# Disk usage grouped by categorized domains
etop categories
etop history)# List all past uninstalled packages and preserved configs
etop history
# Inspect full forensic snapshot of an uninstalled package
etop history --inspect postgresql
etop security / etop env)# Audit all credentials, SSH keys, package manager tokens, and shell ENV
etop security
# Show only items with permission issues or warnings (e.g. non-0600 modes)
etop security --check-perms
# Filter by security domain (ssh, cloud, pkg, env, cert, dotenv)
etop security --domain ssh
etop security --domain cloud
etop security --domain env
# Safely unmask/reveal a specific key in CLI (requires explicit key specification)
etop security --reveal "id_ed25519.pub"
# Generate deterministic chmod permission remediation script (with rollback)
etop security --fix
# Output structured JSON audit report
etop security --json
etop prune)# Generate cleanup plan for orphan dependencies
etop prune --orphans
# Generate cleanup plan for build caches
etop prune --caches
# Output scripts to a specific directory
etop prune --orphans --caches --out ./cleanup_plans
etop doctor)Run an instant diagnostic checklist across installed language runtimes, storage permissions, and custom policy configurations:
etop doctor
Example diagnostic output:
[✓] Pass 1/3 Toolchains & Runtimes (Found: brew, mise, cargo, git, uv, node, docker)
[✓] Pass 2/3 Storage & Tombstone Permissions (Writable: ~/.local/share/etop)
[✓] Pass 3/3 Custom Policy Configurations (Audited custom policies in ~/.config/etop)
• Valid user configuration: etop.conf
etop.conf / etop.toml)etop can be personalized through ~/.config/etop/etop.conf (or ~/.config/etop/etop.toml).
A complete reference template is available in config/etop.conf.example:
[general]
# Default sort order: "size", "name", "last-used", "source", "category"
default_sort = "size"
# Default entrypoint mode: "tui" (default) or "table"
default_mode = "tui"
# Table top items limit (0 for unlimited)
top = 0
[tui]
# Active color theme preset ("catppuccin", "tokyo-night", "flexoki", "monokai", etc.)
theme = "catppuccin"
# Split percentage for the package list table (35 to 80, default 55)
table_width_percentage = 55
# Action subview height in lines (4 to 20, default 8)
action_subview_height = 8
[cleanup]
# Default dry-run mode for cleanup operations
dry_run = true
# Custom directory for run bundles (tombstones, manifests, rollback scripts)
runs_dir = "~/.local/share/etop/runs"
[security]
# Custom security policies directory
policies_dir = "~/.config/etop/policies"
# Whitelisted rules file
ignore_store = "~/.config/etop/policies/ignore.toml"
Configuration options resolve in strict, predictable priority order:
-C, --config <PATH>, --sort <CRITERIA>, -n, --top <N>)$ETOP_CONFIG, $ETOP_SORT)~/.config/etop/etop.conf or etop.toml)[general], [tui], [cleanup], [security]). No unorganized flat namespace.--json, --verbose, --force) are strictly CLI flags.Option<u16> to preserve dynamic resizing when omitted.etop treats user configuration as strictly read-only; it will never overwrite or mutate your dotfiles.When etop generates a cleanup plan (e.g. cleanup_20260819_160920.sh), it enforces a strict dual-tier safety structure:
brew uninstall, cargo uninstall, gem uninstall, etc.)..log files, crash dumps, and caches — specifically including logs nested inside config directories (~/.config/<name>/*.log or logs/) — while keeping all .conf, .toml, .plist, and .rc user configuration files completely intact.cleanup_manifest_*.json) is saved alongside the scripts, and every removed package's paths, configs, logs, and environment variables are permanently archived to ~/.local/share/etop/tombstones/ and history.jsonl.rollback_reinstall_*.sh script is generated with inverse install commands and documentation of all preserved configuration paths and environment settings.We welcome contributions from systems programmers, toolsmiths, and developers across all language ecosystems!
git clone https://github.com/your-username/etop.git
cd etop
cargo check
cargo test
cargo clippy -- -D warnings
~/.config files or user environment configurations without explicit, isolated safeguards.8 commits
Rust
99.5%
Deterministic macOS Developer Ecosystem & Package Top
etop is a blazing-fast, deterministic CLI and interactive TUI monitor for macOS developers who work with multiple programming languages, package managers, runtimes, build caches, and container layers.
Inspired by classic Unix monitors (htop, btop, ctop), etop audits your entire developer workstation to discover installed software, resolve dependency topologies (unreferenced orphans vs explicit top-level tools), inspect associated filesystem artifacts (configs, data directories, logs, caches, and environment variables), and generate reversible, zero-accident cleanup scripts.
┌─ ⚡ etop | Items: 879 | Orphans: 219 (778 MB) | Marked: 0 | Sort: Disk Size ─────────────────────┐
│ Mark Source Name Category Size Status Last Used│
│ [✓] 🧹 cache:build UV Python Wheels Build Artifacts 1.47 GB Cache Today │
│ [✓] 🧹 cache:build Homebrew Bottles Build Artifacts 1.75 GB Cache Today │
│ [ ] 🍺 brew:formula postgresql@16 Databases & Storage 68.7 MB Dep (7 refs) Today │
│ [ ] ⚡ mise:runtime ruby@4.0.6 Languages & Runtimes 482.1 MB Active Runtime 4d ago │
│ [ ] 🦀 cargo:bin tokio-console CLI Developer Tools 18.4 MB Top-Level 12d ago │
│ [ ] 🍎 macos:app Ghostty GUI Apps & Media 42.1 MB Top-Level 1d ago │
└────────────────────────────────────────────────────────────────────────────────────────────────────┘
brew info --json=v2)mise ls --json / active configs)~/.cargo/.crates2.json)$GOPATH/bin + go version -m)/Applications + mdls access timestamps)~/.config/..., .toml, .conf, .plist, .rc) and active environment variables are preserved and never deleted..log files, crash dumps, and caches — including logs nested inside config directories (e.g. ~/.config/<name>/*.log or logs/) — without touching configuration state.~/.local/share/etop/tombstones/ and an append-only history.jsonl Write-Ahead Log upon cleanup generation.~/.ssh), GPG signing identities, cloud credentials (~/.aws, ~/.kube, ~/.docker, GCP), package manager tokens (~/.npmrc, ~/.gem/credentials, ~/.cargo/credentials.toml, ~/.netrc), project .env files, and exported shell environment variables. Identifies insecure POSIX file permissions (0644 vs 0600) and masks secrets by default.[2] 🔐 Security & Env and CLI command etop security with safe in-memory unmasking ([r] or --reveal <key>) and deterministic security_fix_*.sh remediation script generation.etop.conf):
Personalize default sorting, entrypoint mode, UI theme presets, and split percentages via ~/.config/etop/etop.conf (or etop.toml). Prioritized through a deterministic precedence ladder (CLI Flag > ENV > etop.conf > Defaults) with anti-bloat domain partitioning and frame-0 UI state hydration.etop doctor):
Audits developer toolchains, tombstone storage permissions, custom security policies, and user configuration syntax with actionable health checks.--dry-run and generate human-auditable bash scripts with inverse rollback/reinstall scripts.brew tap vikks/tap
brew install etop
curl -fsSL https://raw.githubusercontent.com/vikks/etop/main/install.sh | sh
cargo install --git https://github.com/vikks/etop.git
git clone https://github.com/vikks/etop.git
cd etop
cargo build --release
cargo install --path .
brew uninstall etop
curl -fsSL https://raw.githubusercontent.com/vikks/etop/main/uninstall.sh | sh
(To also purge tombstone history data from ~/.local/share/etop/, pass --purge: curl -fsSL .../uninstall.sh | sh -s -- --purge)
Launch the fullscreen immediate-mode TUI:
etop
# or
etop tui
etop info)Inspect multiple versions, install paths, configurations, data directories, log paths, caches, active environment variables, and reinstall commands:
# Inspect specific package or runtime
etop info postgresql
etop info ruby
etop info ripgrep
# Output structured JSON for automation pipelines
etop info postgresql --json
etop scan)# View complete table sorted by disk footprint
etop scan
# View top 15 largest items
etop scan --top 15
# Sort by inactivity (longest unused first)
etop scan --sort inactivity
# Output raw JSON
etop scan --json
etop filter)# Filter by ecosystem / toolchain
etop filter --ecosystem ruby
etop filter --ecosystem rust
etop filter --ecosystem brew
# Show only unreferenced orphan dependencies
etop filter --orphans
# Show only build artifact caches and dangling Docker layers
etop filter --caches
# Filter packages inactive for more than 90 days
etop filter --older-than 90
# Combine multi-criteria filters
etop filter -e python --orphans --older-than 60
etop summary & etop categories)# High-level toolchain, orphan, and cache breakdown
etop summary
# Disk usage grouped by categorized domains
etop categories
etop history)# List all past uninstalled packages and preserved configs
etop history
# Inspect full forensic snapshot of an uninstalled package
etop history --inspect postgresql
etop security / etop env)# Audit all credentials, SSH keys, package manager tokens, and shell ENV
etop security
# Show only items with permission issues or warnings (e.g. non-0600 modes)
etop security --check-perms
# Filter by security domain (ssh, cloud, pkg, env, cert, dotenv)
etop security --domain ssh
etop security --domain cloud
etop security --domain env
# Safely unmask/reveal a specific key in CLI (requires explicit key specification)
etop security --reveal "id_ed25519.pub"
# Generate deterministic chmod permission remediation script (with rollback)
etop security --fix
# Output structured JSON audit report
etop security --json
etop prune)# Generate cleanup plan for orphan dependencies
etop prune --orphans
# Generate cleanup plan for build caches
etop prune --caches
# Output scripts to a specific directory
etop prune --orphans --caches --out ./cleanup_plans
etop doctor)Run an instant diagnostic checklist across installed language runtimes, storage permissions, and custom policy configurations:
etop doctor
Example diagnostic output:
[✓] Pass 1/3 Toolchains & Runtimes (Found: brew, mise, cargo, git, uv, node, docker)
[✓] Pass 2/3 Storage & Tombstone Permissions (Writable: ~/.local/share/etop)
[✓] Pass 3/3 Custom Policy Configurations (Audited custom policies in ~/.config/etop)
• Valid user configuration: etop.conf
etop.conf / etop.toml)etop can be personalized through ~/.config/etop/etop.conf (or ~/.config/etop/etop.toml).
A complete reference template is available in config/etop.conf.example:
[general]
# Default sort order: "size", "name", "last-used", "source", "category"
default_sort = "size"
# Default entrypoint mode: "tui" (default) or "table"
default_mode = "tui"
# Table top items limit (0 for unlimited)
top = 0
[tui]
# Active color theme preset ("catppuccin", "tokyo-night", "flexoki", "monokai", etc.)
theme = "catppuccin"
# Split percentage for the package list table (35 to 80, default 55)
table_width_percentage = 55
# Action subview height in lines (4 to 20, default 8)
action_subview_height = 8
[cleanup]
# Default dry-run mode for cleanup operations
dry_run = true
# Custom directory for run bundles (tombstones, manifests, rollback scripts)
runs_dir = "~/.local/share/etop/runs"
[security]
# Custom security policies directory
policies_dir = "~/.config/etop/policies"
# Whitelisted rules file
ignore_store = "~/.config/etop/policies/ignore.toml"
Configuration options resolve in strict, predictable priority order:
-C, --config <PATH>, --sort <CRITERIA>, -n, --top <N>)$ETOP_CONFIG, $ETOP_SORT)~/.config/etop/etop.conf or etop.toml)[general], [tui], [cleanup], [security]). No unorganized flat namespace.--json, --verbose, --force) are strictly CLI flags.Option<u16> to preserve dynamic resizing when omitted.etop treats user configuration as strictly read-only; it will never overwrite or mutate your dotfiles.When etop generates a cleanup plan (e.g. cleanup_20260819_160920.sh), it enforces a strict dual-tier safety structure:
brew uninstall, cargo uninstall, gem uninstall, etc.)..log files, crash dumps, and caches — specifically including logs nested inside config directories (~/.config/<name>/*.log or logs/) — while keeping all .conf, .toml, .plist, and .rc user configuration files completely intact.cleanup_manifest_*.json) is saved alongside the scripts, and every removed package's paths, configs, logs, and environment variables are permanently archived to ~/.local/share/etop/tombstones/ and history.jsonl.rollback_reinstall_*.sh script is generated with inverse install commands and documentation of all preserved configuration paths and environment settings.We welcome contributions from systems programmers, toolsmiths, and developers across all language ecosystems!
git clone https://github.com/your-username/etop.git
cd etop
cargo check
cargo test
cargo clippy -- -D warnings
~/.config files or user environment configurations without explicit, isolated safeguards.8 commits
Rust
99.5%