Detect feature flag patterns in your codebase. Reports flag locations, detection confidence, and cross-references with dead code findings.
fallow flags
| Flag | Description |
|---|---|
--top <N> | Show only the top N flags |
-f, --format <FORMAT> | Output format: human (default), json, sarif, compact, markdown, codeclimate, gitlab-codequality, pr-comment-github, pr-comment-gitlab, review-github, review-gitlab |
-q, --quiet | Suppress progress output |
--explain | Add metric explanations. In JSON format, adds a _meta object with descriptions and docs links. |
--summary | Print a one-line summary of flag counts at the end of the run. In JSON format, adds a summary counts object. |
| Flag | Description |
|---|---|
-r, --root <PATH> | Project root directory (default: current working directory) |
-c, --config <PATH> | Path to config file (default: auto-detected) |
-w, --workspace <NAME> | Scope output to a single workspace package |
--changed-since <REF> | Only report flags in files changed since a git ref |
--production | Production mode: exclude test/story/dev files |
--no-production | Force production mode off, overriding a project config's production: true (conflicts with --production) |
| Flag | Description |
|---|---|
--no-cache | Disable incremental caching (force full re-parse) |
--threads <N> | Number of parser threads (default: available parallelism) |
--performance | Show pipeline timing breakdown |
| Flag | Description |
|---|---|
--ci | CI mode: equivalent to --format sarif --fail-on-issues --quiet |
--fail-on-issues | Exit with code 1 if flags are found |
--sarif-file <PATH> | Write SARIF output to a file (in addition to --format) |
--group-by <MODE> | Group output by owner (CODEOWNERS), directory (first path component), package (workspace package), or section (GitLab CODEOWNERS [Section] headers). See global flags. |
| Flag | Description |
|---|---|
--baseline <PATH> | Compare against a previously saved baseline file |
--save-baseline <PATH> | Save current results as a baseline file |
--fail-on-regression | Fail if flag count increased beyond tolerance vs a regression baseline |
--tolerance <N> | Allowed increase: "2%" (percentage) or "5" (absolute). Default: "0" |
--regression-baseline <PATH> | Path to regression baseline file (default: .fallow/regression-baseline.json) |
--save-regression-baseline <PATH> | Save current flag counts as a regression baseline |
Fallow detects three categories of feature flag patterns:
| Category | What it finds | Examples |
|---|---|---|
| Environment variable flags | process.env.* checks used as feature gates | process.env.FEATURE_NEW_UI, process.env.ENABLE_DARK_MODE |
| SDK calls | Feature flag SDK method calls from known providers (LaunchDarkly, Statsig, Unleash, GrowthBook, Split, PostHog, Vercel Flags, ConfigCat, Flagsmith, Optimizely, Eppo) | LaunchDarkly variation(), Statsig checkGate(), PostHog useFeatureFlagEnabled(), Vercel Flags flag({ key }) |
| Config object patterns | Object property lookups used as boolean guards (opt-in) | config.featureX, settings.enableNewFlow |
Each detected flag includes a confidence level indicating how certain fallow is that the pattern represents a feature flag.
Fallow ships with built-in detectors for the common providers and env-var conventions, so most projects need no configuration. If fallow flags reports No feature flags detected but your project does use flags, you are likely on an SDK or env prefix fallow does not recognize by default. Extend detection with the flags section in .fallowrc.json, .fallowrc.jsonc, fallow.toml, or .fallow.toml.
When you run fallow flags on full defaults and nothing is found, the CLI lists the built-in env prefixes and SDKs it scanned for, so you can tell a true negative from a missing detector.
The flags fields (sdkPatterns, envPrefixes, configObjectHeuristics) are documented in the configuration reference. Custom sdkPatterns and envPrefixes are merged with the built-in sets, never replace them.
{
"flags": {
"sdkPatterns": [
{ "function": "useMyFlag", "nameArg": 0, "provider": "InHouse" }
],
"envPrefixes": ["NEXT_PUBLIC_FEATURE_", "MYAPP_ENABLE_"],
"configObjectHeuristics": true
}
}
# Detect all feature flags
fallow flags
# Show only the top 10 flags
fallow flags --top 10{
"schema_version": 8,
"version": "3.23.0",
"elapsed_ms": 116,
"feature_flags": [],
"total_flags": 0
}
| Field | Type | Description |
|---|---|---|
schema_version | integer | JSON schema version |
version | string | Fallow version that produced the output |
elapsed_ms | integer | Analysis duration in milliseconds |
feature_flags | array | Detected feature flag patterns |
total_flags | integer | Total number of detected flags |
The feature_flags MCP tool wraps fallow flags --format json --quiet --explain:
{
"tool": "feature_flags",
"arguments": {
"top": 10
}
}
Returns the same JSON envelope as the CLI.
See MCP integration for setup instructions.