Fallow and knip both detect unused code in TypeScript and JavaScript projects. Knip is a mature tool with broad plugin coverage. Fallow is a Rust-native alternative that goes beyond unused code: it also covers code duplication, complexity hotspots, maintainability scoring, and architecture boundary enforcement in a single binary. Use this comparison to decide which tool fits your project.Documentation Index
Fetch the complete documentation index at: https://docs.fallow.tools/llms.txt
Use this file to discover all available pages before exploring further.
Performance
Fallow is a compiled Rust binary with rayon-based parallelism. Knip runs on Node.js. Version 6 adopted the Oxc parser via NAPI bindings, which significantly narrowed the gap with v5, but knip remains single-threaded.- Real-world projects
- Synthetic benchmarks
Benchmarked on 8 real-world open-source projects from 174 to 20,416 files against fallow 2.46.0, knip 5.87.0, and knip 6.6.1 on Apple M5, 32 GB RAM, Node 22. Median of 5 runs with 2 warmups. On small-to-medium projects, fallow is 5-34x faster than knip v5 and 2-13x faster than knip v6. On the current vite, next.js, and vue/core fixtures, knip errors out without producing valid JSON results; fallow is the only tool that completes. * knip errors on next.js, vite, and vue/core (exits without valid results).
Why fallow is faster
| Factor | fallow | knip |
|---|---|---|
| Language | Compiled Rust binary | Node.js runtime |
| Parser | Oxc (native Rust) | Oxc via NAPI bindings |
| Parallelism | rayon work-stealing across all cores | Single-threaded |
| Startup | Instant (no JIT warmup) | Node.js bootstrap + module loading |
| Memory | Flat contiguous data structures | GC-managed heap |
Memory and large codebases
Fallow uses flat edge storage and lock-free parallel resolution, so it handles large monorepos well. Memory usage scales linearly with file count rather than with the Node.js GC heap.Detection capabilities
- Comparison table
- Details
| Capability | fallow | knip |
|---|---|---|
| Unused files | Yes | Yes |
| Unused exports | Yes | Yes |
| Unused types | Yes | Yes |
| Unused dependencies | Yes | Yes |
| Unused devDependencies | Yes | Yes |
| Unused enum members | Yes | Yes |
| Unused class members | Yes | No (dropped in v6) |
| Unresolved imports | Yes | Yes |
| Unlisted dependencies | Yes | Yes |
| Duplicate exports | Yes | No |
| Code duplication | Yes (fallow dupes) | No |
| Circular dependencies | Yes | Yes |
| Complexity hotspots | Yes (fallow health) | No |
| Architecture boundary violations | Yes | No |
| Feature flag detection | Yes (fallow flags) | No |
CRAP score thresholds (--max-crap) | Yes | No |
| Runtime coverage (paid) | Yes (--runtime-coverage) | No |
| TS namespace declaration members | No | Yes (new in v6) |
Plugin coverage
| Metric | fallow | knip |
|---|---|---|
| Total plugins | 94 | 147 |
| Plugins with config parsing | 33 | — |
| Custom plugin support | Yes (JSONC, JSON, TOML, or inline) | Yes (JS functions) |
If your project uses a framework that fallow doesn’t have a plugin for, you can create a custom plugin in JSONC, JSON, or TOML. No code required.
Features fallow has that knip doesn’t
SARIF output
Upload results directly to GitHub Code Scanning with
--format sarif. Integrated into your PR review workflow.Baseline comparison
--save-baseline and --baseline for incremental CI adoption. Only fail on new issues, not pre-existing ones.Inline suppression
// fallow-ignore-next-line and // fallow-ignore-file comments for granular, per-line suppression without config changes.Code duplication
Built-in
fallow dupes with four detection modes, clone family grouping, cross-language matching, and refactoring suggestions.Complexity and health score
fallow health reports cyclomatic / cognitive complexity, CRAP score, risk profiles, and a composite health score. --max-crap, --max-cyclomatic, and --max-cognitive gate CI on per-function thresholds.Architecture boundaries
Enforce cross-package or cross-layer import rules. Boundary violations fail the build without needing ESLint plugins.
Feature flag detection
fallow flags detects feature flag patterns across the codebase, cross-references them with dead code, and exports to SARIF, markdown, and MCP.Combined audit
fallow audit runs dead code, health, and duplication with a single verdict. Per-analysis baselines (--dead-code-baseline, --health-baseline, --dupes-baseline) let each slice use its own reference.Standalone rule explainer
fallow explain <issue-type> prints rule rationale, a worked example, fix guidance, and the docs URL without running analysis. Knip has no equivalent. Closest analogs are Credo (mix credo explain) for Elixir and Biome’s build-time diagnostic explainer; only fallow ships a standalone CLI subcommand plus an MCP tool (fallow_explain) that agents can call before fixing a finding.Git-aware analysis
--changed-since <ref> for file-level scoping and --changed-workspaces <ref> for monorepo-level scoping. Perfect for PR-only CI checks.Workspace filtering
--workspace accepts comma-separated values, globs, and ! negations (-w 'apps/*' -w '!apps/legacy'). Works across every command.Output grouping
--group-by owner|directory|package|section partitions findings. owner and section read GitHub / GitLab CODEOWNERS so unused code is routed to the right reviewer.Auto-fix dry run
Preview all fixes with
fallow fix --dry-run before applying. JSON output for programmatic review.Trace and debug tooling
--trace FILE:EXPORT to trace export usage chains, --trace-file PATH for file edges, --trace-dependency PACKAGE for dependency usage, --performance for pipeline timing.CSS Modules tracking
.module.css and .module.scss class names are extracted as named exports and tracked through styles.className member accesses.MCP server
Built-in
fallow-mcp exposes analyze, find_dupes, check_health, audit, check_runtime_coverage, and more as typed tools for AI agents.Claude Code hooks
fallow hooks install --target agent installs a PreToolUse gate that blocks git commit / git push when fallow audit fails, with a structured envelope agents can act on.- Class member detection: Knip dropped this in v6; fallow retains it with decorator-aware skip logic for NestJS, Angular, TypeORM, etc.
- Production mode:
--productionexcludes test/dev files and detects type-only dependencies that should be devDependencies. - Duplicate export detection: Finds the same symbol exported from multiple modules.
- TOML configuration: In addition to JSONC/JSON, fallow supports
fallow.tomlfor teams that prefer TOML. - Cross-reference analysis:
check --include-dupesfinds dead code that is also duplicated, showing high-priority cleanup targets. - Runtime coverage intelligence (paid): V8 runtime evidence merged with static analysis via a signed sidecar. Adds hot/cold paths, runtime-weighted health scoring, and stale-flag evidence.
Features knip has that fallow doesn’t
More plugins
147 plugins vs 94. Knip covers more niche, legacy, and ecosystem-specific tooling.
Custom reporters
Write custom reporter functions in JavaScript for fully custom output formatting.
Tags filtering
--tags flag filters results based on JSDoc @public/@internal annotations.- TS namespace declaration member detection: New in v6, detects unused members in TypeScript
namespacedeclarations (notimport * as ns, fallow already handles that via namespace import narrowing).
When to choose fallow
Speed matters
Large codebases where sub-second analysis enables watch mode and tight CI feedback loops.
CI pipelines
SARIF for GitHub Code Scanning, baselines for incremental adoption,
--changed-since for PR-scoped checks.Dead code + duplication
Replace both knip and jscpd with a single tool. Cross-reference dead code with duplication for prioritized cleanup.
Gradual adoption
Per-issue severity rules (
error/warn/off) and inline suppression comments let teams adopt incrementally.AI-assisted development
Your team uses AI coding agents. Fallow provides
--format json for CLI, an MCP server for typed tool calling, and --changed-since for PR-scoped checks.When to choose knip
Niche plugins
Your project depends on a specific tool that only knip has a plugin for, and a custom plugin isn’t worth the effort.
Already working well
Knip is already integrated and performance isn’t a pain point. No reason to migrate for the sake of it.
Custom reporters
You need fully custom output formatting via JavaScript reporter functions.
Summary table
| fallow | knip | |
|---|---|---|
| Language | Rust | Node.js (TypeScript) |
| Parser | Oxc (native) | Oxc (NAPI bindings) |
| Speed vs knip v6 | 2-13x faster on common cases | Baseline |
| Parallelism | Multi-core (rayon) | Single-threaded |
| Dead code issue types | 12 | 10 |
| Code duplication | Built-in | Not included |
| Complexity and health score | Built-in (fallow health) | No |
| Architecture boundaries | Yes | No |
| Feature flag detection | Yes (fallow flags) | No |
| Combined audit verdict | Yes (fallow audit) | No |
| Plugins | 94 | 147 |
| Custom plugins | JSONC/JSON/TOML | JavaScript |
| SARIF output | Yes | No |
| Baseline comparison | Yes (per-analysis) | No |
| Inline suppression | Yes | No |
Git-aware (--changed-since, --changed-workspaces) | Yes | Partial |
| CODEOWNERS grouping | Yes (--group-by owner, section) | Yes (reporter) |
| Workspace filtering (globs, negation) | Yes | Yes |
| Circular dependencies | Yes | Yes |
| Auto-fix | Yes | Yes |
| Config formats | JSONC, JSON, TOML | JSON, TS |
| Runtime dependency | None (standalone binary) | Node.js |
| MCP server | Built-in (fallow-mcp) | No |
Migrating from knip?
If you’re coming from knip, fallow has a one-command migration path that automatically translates your configuration.Migrate from knip
Automatic config migration with
fallow migrate.Quick Start
Get started with fallow in 2 minutes.