A free, local-first CLI that scores any repo 0–100 for the mess AI coding tools leave behind — then hands your coding agent a plan to remove it.
$ npx ai-slop-remover scan ./browser-use ai-slop-remover · scanned browser-use (362 files, 106.0k lines) in 2.7s Slop Score 74 / 100 (C) Comment Slop ██████░░░░ 681 finding(s) −15.2 ptsSwallowed Errors ██░░░░░░░░ 54 finding(s) −4.1 ptsUtility Duplication █░░░░░░░░░ 34 finding(s) −3.7 ptsCommented Out Code █░░░░░░░░░ 43 finding(s) −3.0 pts ▲ med browser_use/actor/element.py:117 Error swallowed silently Every exception is silently discarded; failures in this block are invisible. fix: Handle the error: rethrow it, return an error result, or justify ignoring it. 819 finding(s) · Hand them to your coding agent: ai-slop-remover fix
0–100, severity- and confidence-weighted, normalized per 1k lines. Deterministic: same code, same score. The formula is public.
Every finding has a location, the evidence line, a plain-English why, and a concrete fix instruction. No vibes, no black box.
ai-slop-remover fix emits a prioritized per-file plan with guardrails — paste it into Claude Code, Cursor, or Codex and let it clean up after itself.
--check --min-score 85 fails the build when slop creeps in. Baseline existing findings so brownfield repos only answer for new slop.
Linters check universal rules. The slop that survives review is different: code that's fine in isolation but doesn't match how your repo does things. We detect both.
todo!(), empty bodies with confident namesexcept: pass, ignored errthrow where 86% of neighboring code returns ResultfetchUser in a directory of getX# Step 1: Focus the element focused = await self._focus_element(...)
except Exception:
pass
ainvoke reimplemented near-identically across provider files — agents don't refactor, they re-generate.async def ainvoke(self, messages, ...) # same shape in chat_bedrock.py:148
To be fair to browser-use: it's an excellent, fast-moving project — that's why we picked it. This is a point-in-time snapshot of one commit, findings are heuristics (not bugs), and a C score measures style debt from velocity, not product quality. Run the scanner on the latest commit and you may get different numbers. That's the point: now you can.
Java constructor guards, @Override delegation, Rust lock().unwrap(), TYPE_CHECKING imports — established idioms are recognized as intentional, not flagged. That's why mature repos score A.
Zero config. Point it at any repo and get the score, the categories, and every finding with evidence.
$ npx ai-slop-remover scan .
A prioritized, per-file plan with guardrails: don't change behavior, run tests after each file, skip anything that looks wrong.
$ npx ai-slop-remover fix -o SLOP-FIXES.md $ claude "Apply the plan in SLOP-FIXES.md"
Gate merges on the score. Baseline old findings so only new slop fails the build.
$ npx ai-slop-remover baseline $ npx ai-slop-remover scan . --baseline \ --check --min-score 85 # exit 1 on fail
We eat our own dog food: the scanner flagged duplicated helpers in its own source, its fix plan removed them, and the repo now scans 100/100.