Skip to main content
Fallow provides a one-command migration path from knip. Your existing configuration is automatically translated. Beyond what knip covers, fallow also detects code duplication, complexity hotspots, maintainability scores, and architecture boundary violations.

Migration workflow

1

Preview the migration

Run fallow migrate --dry-run to see the generated config without writing anything:
fallow migrate --dry-run
Fallow searches for: knip.json, knip.jsonc, .knip.json, .knip.jsonc, knip.ts, knip.config.ts, and the knip field in package.json. TypeScript config files (knip.ts, knip.config.ts) are detected but cannot be parsed. Convert to knip.json first.
$ fallow migrate --dry-run
Detected knip config: knip.json

Migrating settings:
  entry entry: ["src/index.ts", "src/cli.ts"]
  ignore ignorePatterns: ["**/*.generated.ts"]
  ignoreDeps ignoreDependencies: ["@types/node"]

 Cannot migrate:
  ignoreBinaries not applicable in fallow

Would write: .fallowrc.json
Run without --dry-run to write the config.
2

Generate the config

Once you’re happy with the preview, run the migration:
fallow migrate            # Write .fallowrc.json
fallow migrate --toml     # Or output as fallow.toml
3

Review the config

Open the generated config and verify the translated entry points, ignore patterns, and plugin mappings. Warnings are shown for any fields that couldn’t be migrated automatically.
4

Run your first analysis

Run dead code analysis and compare results against knip. Then explore the other analyses that knip does not cover:
fallow dead-code    # Unused code + circular deps + boundaries
fallow dupes        # Code duplication
fallow health       # Complexity hotspots + maintainability scores
fallow              # All of the above in one pass

What gets migrated

knipfallow
entryentry
project— (fallow auto-discovers project files)
ignoreignorePatterns
ignoreDependenciesignoreDependencies
ignoreExportsUsedInFileignoreExportsUsedInFile (boolean and { type, interface } object form both supported)
ignoreBinaries— (not applicable)
Plugin configsClosest fallow plugin equivalent

Warnings and caveats

fallow migrate is loud about anything it cannot translate so the migration is not silently lossy. Unknown rule names. If your knip rules, exclude, or include entries reference a key that fallow does not know (typo, future knip rule, or an issue type the migrator has not yet catalogued), the migration emits a warning like:
Warning (1 skipped field):
  [knip] `rules.unsued-files`: unknown knip issue type `unsued-files`; not migrated
  (suggestion: check for a typo or report the missing mapping at https://docs.fallow.tools/migration/from-knip)
If the key is in the documented unmappable list (binaries, optionalPeerDependencies, and similar issue types knip emits but fallow does not), the warning reads issue type \X` has no fallow equivalent` and has no suggestion. Glob-engine drift. Knip and fallow use different glob engines, so entry and ignorePatterns are copied verbatim but may match a slightly different file set than they did under knip. When the migrated config carries either field, the migrate command prints:
Note: knip and fallow use different glob engines; verify migrated entry / ignorePatterns
      with `fallow dead-code` before relying on CI. See https://docs.fallow.tools/migration/from-knip
Common patterns (brace expansion {ts,tsx}, double-star **, src/**) match identically across both engines. Known drift today: fallow’s ignorePatterns does not honor leading ! as negation; entries are matched literally. Run fallow dead-code on a representative subset before relying on the migrated globs in CI.

Comparison

Fallow is a Rust-native standalone binary. No Node.js runtime, no JIT warmup, no garbage collection pauses.Cold runs (no cache) on real open-source projects (174 to 38,146 files). Fastest tool per row in bold.
ProjectFilesfallowknipFaster
zod17447ms279msfallow 5.9x
preact24474ms2.01sfallow 27.1x
fastify28664ms205msfallow 3.2x
vue/core522138mserrors*fallow only
TanStack/query901560ms1.04sfallow 1.9x
vite1,420595mserrors*fallow only
astro2,8593.76s1.21sknip 3.1x
svelte3,337611ms632msfallow 1.0x
next.js20,5582.95serrors*fallow only
TypeScript38,1462.22s736msknip 3.0x
* Current knip (v5 and v6) exits without valid output on next.js, vite, and vue/core (it fails loading those projects’ own config files); fallow analyzes them.
Metricfallowknip
Runtime dependencyNone (standalone binary)Node.js
CI setupDownload binaryInstall Node + npm dependencies
Numbers are knip v6 (knip 6.6.1). fallow is faster on the small-to-mid projects (fastify, preact, query, svelte, zod), while current knip is faster on astro and TypeScript. fallow’s edge is doing more in one tool, not always raw dead-code speed, and it analyzes the three projects knip cannot load here. Against knip v5 (knip 5.87.0) fallow’s lead widens (for example fallow 13.7x on fastify, 13.0x on zod, 10.3x on preact).

Key differences

No runtime dependency

Fallow is a standalone binary. No Node.js runtime, no dependency conflicts, faster CI setup.

See also

Custom plugins

Build plugins for frameworks fallow doesn’t cover yet.

fallow migrate

Full CLI reference for the migrate command.