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. Cold runs (no cache) so both tools work from scratch. Fastest tool per row in bold.| Project | Files | fallow | knip v5 | knip v6 |
|---|---|---|---|---|
| zod | 174 | 47ms | 279ms | 279ms |
| preact | 244 | 74ms | 2.01s | 2.01s |
| fastify | 286 | 64ms | 205ms | 205ms |
| vue/core | 522 | 138ms | errors¹ | errors¹ |
| TanStack/query | 901 | 560ms | 1.04s | 1.04s |
| vite | 1,420 | 595ms | errors¹ | errors¹ |
| astro | 2,859 | 3.76s | 1.21s | 1.21s |
| svelte | 3,337 | 611ms | 632ms | 632ms |
| next.js | 20,558 | 2.95s | errors¹ | errors¹ |
| TypeScript | 38,146 | 2.22s | 736ms | 736ms |
Benchmarked on real-world open-source projects from 174 to 38,146 files against fallow 2.100.0, knip 5.87.0, and knip 6.6.1 on Apple M5 (10 cores), 32 GB RAM, macOS 26.4, Node v22.22.1. Median of 5 cold runs (no cache) with 2 warmups. The knip v6 column is the primary comparison; current knip v5 and v6 produce equivalent timings on the projects they can load, and fallow’s lead over knip v5 is wider on the small-to-mid projects (for example fallow 13.7x on fastify, 13.0x on zod, 10.3x on preact). fallow is fastest on small-to-mid projects (fastify, preact, query, svelte, zod). On large projects, knip v6’s Oxc parser is faster on astro and TypeScript; fallow’s advantage there is doing more in one tool. fallow’s persistent cache makes repeat (warm) runs faster again, the table uses the conservative cold numbers.¹ Current knip (both v5 and v6) exits without valid output on next.js, vite, and vue/core. It loads and executes a project’s own config and JSON files to read plugin settings, which works well on apps but trips on a few framework monorepos where fallow (purely syntactic, no config execution) completes with no setup. vite: a workspace
package.json carries a UTF-8 BOM that knip’s JSON.parse rejects (a robustness gap, reportable upstream; fallow strips BOMs). vue/core: a private sfc-playground/vite.config.ts fails to load. next.js: the framework’s own monorepo needs a build for its jest config and per-workspace entry config for its dist-published packages, this is the framework source, not a Next.js app (which is what knip’s Next.js plugin targets). All are fixable with knip config; fallow needs none.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 | 122 | 155 |
| Plugins with config parsing | 47 | — |
| 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
155 plugins vs 122. 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 | Faster on small-to-mid projects (up to 27.1x on preact); knip v6 faster on astro and TypeScript; knip errors on next.js, vite, vue/core | 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 | 121 | 155 |
| 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.