kareki

English | 日本語

header image

pub package CI License: MIT

枯木 (kareki): dead wood in Japanese — the unused branches that need pruning.

A workspace-wide dead code finder for Dart and Flutter. Unlike dart analyze, which only flags private unused declarations inside a single package, kareki resolves cross-package references across Melos / pub workspaces to surface the dead code that actually accumulates in real projects: public APIs no one calls, files nobody imports, and pub dependencies that ride along unused.

Why kareki?

What you get
🌲 Workspace-wide. Resolves references across every package in Melos / pub workspaces — not just one.
🔓 Public APIs too. Finds the public classes, methods, and fields dart analyze ignores.
🧬 Codegen-friendly. Built-in presets for freezed, json_serializable, riverpod, auto_route, go_router, drift, hive.
🧪 test_only_used. Catches lib/ code that only its own tests still use.
📉 Baseline. Adopt on legacy code without fixing everything first — CI fails only on new findings.
🩺 Doctor. kareki doctor flags stale ignore entries, dead excludes, and orphan suppression comments.
⚙️ CI-ready. JSON output, deterministic exit codes, portable baselines.

What it finds

Rule Detects
unused_element Public classes / functions / methods / getters / setters / fields / top-level variables / extensions / typedefs with no caller anywhere in the workspace.
unused_file .dart files that are not import-ed, part-ed, or export-ed from any other file.
unused_pub_dependency Packages declared in pubspec.yaml whose imports never appear in source.
test_only_used Public declarations under lib/ that are only referenced from test code (*_test.dart, files under test/ or integration_test/). The implementation has no production consumer — typically its tests are the only thing keeping it alive.
unused_parameter Parameters of a function, method, or named constructor that are never referenced in the body or initializers. Covers required and public-API parameters that Dart's built-in unused_element_parameter doesn't reach.
unused_parameter_optional Optional parameters (named or positional optional) of a function, method, or constructor that are never passed at any call site in the workspace. The public / cross-package counterpart to Dart's built-in unused_element_parameter, which only inspects private optional parameters within a single library.

Install

# pubspec.yaml
dev_dependencies:
  kareki: ^0.1.0
dart pub get

Usage

Run from the workspace root:

dart run kareki

See doc/cli.md for all options.

Adopting on an existing codebase

Don't try to delete every finding before turning on CI. Snapshot what's there, commit it, fail only on new dead code from now on:

dart run kareki --baseline .kareki-baseline.json --write-baseline

See doc/baseline.md.

Keeping the config honest

Once you start excluding files or whitelisting dependencies, the list rots — packages move, files get renamed, the excludes still pass. kareki doctor finds dead entries in your own config:

dart run kareki doctor

See doc/doctor.md.

Documentation

  • CLI reference — every option, every exit code
  • Configurationkareki-config.yaml, defaults, built-in presets, custom presets, suppression, full example
  • Baseline — incremental adoption
  • Doctor — config-rot detection
  • How it works — analysis pipeline, entry-point seeding, supported versions

License

MIT. See LICENSE.

Libraries

kareki
kareki — multi-package dead-code detector for Dart and Flutter monorepos.