$ fallow check
0.030sINFO fallow_analyze:run_plugins: active plugins plugins=“nextjs, vite, vitest, playwright, storybook, eslint, typescript, tailwind, drizzle, commitlint, sentry”
0.050sINFO fallow_analyze: incremental cache stats cache_hits=1008 cache_misses=0
● Unused files (16)
src/server/jobs/worker.ts
src/server/jobs/cron.ts
src/features/savings/hooks/usePotGroups.ts
src/features/tax/hooks/useKiaSuggestion.ts
src/features/forecasting/hooks/useTargetProgress.ts
… and 11 more
● Unused exports (20)
src/components/Card/index.ts
:1 CardFooter
src/providers/trpc-provider/index.tsx
:12 TRPCProvider
src/server/jobs/queue.ts
:61 enqueueJobDelayed
:206 sweepStuckProcessingJobs
● Unused type exports (314)
… across 87 files
● Unused dependencies (1)
@trpc/react-query
● Duplicate exports (50)
… across 23 files
✗ Found 401 issues in 0.16s
Why fallow?
Dead code and duplication slow builds, bloat bundles, and make codebases harder to navigate. AI-assisted development accelerates the problem. Agents generate code but don’t clean up after themselves. They can’t: static analysis requires building and traversing a module graph, which is fundamentally different from reading files in a context window. It builds the full import graph, traces re-export chains through barrel files, and reports everything that isn’t reachable. Deterministically, exhaustively, with zero configuration.Three tracks, one tool
Agents
Any agent that can run a shell command can use fallow.
fallow check --format json gives structured results. MCP server available for typed tool calling. Agents generate the code, fallow tells them what’s unused.Humans
Real-time diagnostics in VS Code. Code Lens above every export. One-click fixes. The CLI for power users. Instant feedback as you code.
CI
The safety net. GitHub Actions with SARIF upload, baseline comparison for incremental adoption, PR-scoped analysis with
--changed-since. Nothing lands in main without passing fallow.Deterministic
Every result is traceable to a concrete import graph path. No probabilistic guessing, no missed files. If fallow says it’s unused, you can verify exactly why.
Sub-second
Rust-native with Oxc parser and rayon parallelism. Analyzes 5,000+ files in under 200ms, using 3-15x less memory than knip. Fast enough for watch mode, agent loops, and tight CI.
Zero config
84 built-in plugins auto-detect Next.js, Vite, Jest, Tailwind, and more. Works out of the box. No setup, no config files, just run it.
Speed comparison
- vs knip (dead code)
- vs jscpd (duplication)
Speedup narrows on larger projects as analysis time dominates over startup: 26-36x on real-world projects vs knip v5 (10-14x vs v6), 3-9x on 1,000+ file projects. Fallow stays sub-second even at 5,000 files. † knip v6 excluded for preact due to a v6 regression on this project.
What it finds
Dead code
11 issue types: unused files, exports, types, dependencies, devDependencies, enum members, class members, unresolved imports, unlisted deps, duplicate exports, circular dependencies.
Code duplication
4 detection modes from exact matches to semantic clones with renamed variables. Clone families with refactoring suggestions.
Auto-fix
Remove unused exports and dependencies automatically. Agents can run
fallow fix --yes from CLI or call fix_apply via MCP. Humans preview with --dry-run.Structured output
JSON and SARIF output for programmatic use. Agents parse JSON directly. CI uploads SARIF to GitHub Code Scanning. Compact format for grep and scripting.
Get started
- Agents (CLI + MCP)
- Humans (CLI + VS Code)
- CI (GitHub Actions)
Agents can run fallow directly from the command line. No MCP required:For structured tool calling via MCP, add to your agent’s config:Your agent can now call
analyze, check_changed, find_dupes, fix_preview, fix_apply, and project_info as structured tools. Full agent integration guideInstallation
npm, cargo, or binary download.
Quick Start
Full walkthrough in 2 minutes.
Configuration
Customize for your project.