Migration workflow
Preview the migration
Run Fallow searches for:
fallow migrate --dry-run to see the generated config without writing anything: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
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.
What gets migrated
| knip | fallow |
|---|---|
entry | entry |
project | — (fallow auto-discovers project files) |
ignore | ignorePatterns |
ignoreDependencies | ignoreDependencies |
ignoreExportsUsedInFile | ignoreExportsUsedInFile (boolean and { type, interface } object form both supported) |
ignoreBinaries | — (not applicable) |
| Plugin configs | Closest 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:
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:
{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
- Speed
- Features
- Coverage
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.
* 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.
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).
| Project | Files | fallow | knip | Faster |
|---|---|---|---|---|
| zod | 174 | 47ms | 279ms | fallow 5.9x |
| preact | 244 | 74ms | 2.01s | fallow 27.1x |
| fastify | 286 | 64ms | 205ms | fallow 3.2x |
| vue/core | 522 | 138ms | errors* | fallow only |
| TanStack/query | 901 | 560ms | 1.04s | fallow 1.9x |
| vite | 1,420 | 595ms | errors* | fallow only |
| astro | 2,859 | 3.76s | 1.21s | knip 3.1x |
| svelte | 3,337 | 611ms | 632ms | fallow 1.0x |
| next.js | 20,558 | 2.95s | errors* | fallow only |
| TypeScript | 38,146 | 2.22s | 736ms | knip 3.0x |
| Metric | fallow | knip |
|---|---|---|
| Runtime dependency | None (standalone binary) | Node.js |
| CI setup | Download binary | Install Node + npm dependencies |
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.