knip — dead code & unused dependency finder
Knip traces the whole project (not one file at a time) to find what nothing references: unused files, exports, types, and dependencies. This is the mechanical version of "delete code you don't need."
Run
npx knip # report unused files, exports, deps, types
npx knip --production # only production code paths (ignore tests/dev)
npx knip --dependencies # just unused/unlisted dependencies
npx knip --fix # auto-remove unused exports/files (review the diff!)
Zero-config for most setups — knip reads package.json + tsconfig.json and
has built-in plugins for Vite, Vitest, Next, ESLint, etc. Add a knip.json
only if entry points are non-standard.
How to use the output
- Run
npx knip. Group findings: unused files / exports / deps / types. - Verify before deleting — knip can flag things reached only by dynamic import, config strings, or framework conventions. Confirm each is truly dead.
- Remove in small commits (files, then exports, then deps). Re-run knip after.
--fixis safe for clearly-unused exports/files, but read the diff — never blind-apply on auth, migration, or public-API code.
Gotchas
- Monorepo: run per-workspace or configure
workspacesinknip.json. - Entry points it can't infer (CLI bins, serverless handlers) → list them in
knip.jsonso it doesn't report them as unused. - Pairs well as a pre-commit gate (warn, don't block) and before any refactor.