Environment variables
Change fallow defaults for a whole CI job, editor, or MCP server without editing every command. Reference for FALLOW_FORMAT, FALLOW_QUIET, and the other environment variables.
Environment variables change fallow defaults for every command in a shell, a CI job, or an MCP server. You set a value once and do not repeat the flag on each command.
| Variable | Description | Values |
|---|---|---|
FALLOW_FORMAT | Default output format | human, json, sarif, compact, markdown (md), codeclimate, gitlab-codequality (gitlab-code-quality), pr-comment-github, pr-comment-gitlab, review-github, review-gitlab, badge, github-annotations, github-summary |
FALLOW_QUIET | Hide progress output | 1 or true |
FALLOW_BIN | Path to the fallow binary | Any valid path |
FALLOW_EXTENDS_TIMEOUT_SECS | Timeout for fetching URL extends | Seconds (default: 5) |
FALLOW_PRODUCTION | Turn production mode on or off for every analysis | true/false/1/0/yes/no/on/off |
FALLOW_PRODUCTION_DEAD_CODE | Production mode for dead-code only (combined runs and fallow audit) | Same values as FALLOW_PRODUCTION |
FALLOW_PRODUCTION_HEALTH | Production mode for health only | Same values as FALLOW_PRODUCTION |
FALLOW_PRODUCTION_DUPES | Production mode for duplication only | Same values as FALLOW_PRODUCTION |
FALLOW_REVIEW_GUIDANCE | Add collapsed "What to do" blocks to review-github and review-gitlab inline comments | 1, true, yes, on |
FALLOW_SUMMARY_SCOPE | Scope of the sticky PR or MR summary for pr-comment-github and pr-comment-gitlab. all shows project-level dependency, catalog, and override findings also when they are outside the diff. diff applies the diff filter to those findings too. Inline review comments do not change | all (default), diff |
FALLOW_PR_COMMENT_LAYOUT | Layout of the sticky PR or MR summary for pr-comment-github and pr-comment-gitlab. Use gate-only when reviewers read the findings in a native Check Run or Code Quality widget | default, compact, gate-only, details |
FALLOW_CACHE_DIR | Directory for the persistent analysis cache | Any valid path |
FALLOW_CACHE_MAX_SIZE | Size limit of the extraction cache. Takes precedence over cache.maxSizeMb | Whole megabytes (default 256) |
FALLOW_PACKAGE_BASELINES | Turns workspaces.changedSince off for every run of the process, like --no-package-baselines | false, 0, no or off turn the map off; other values keep it |
FALLOW_COVERAGE | Istanbul or raw V8 coverage data for CRAP scores. Takes precedence over health.coverage | Path to coverage-final.json, or to a NODE_V8_COVERAGE directory |
FALLOW_COVERAGE_ROOT | Prefix that fallow removes from Istanbul coverage paths. Takes precedence over health.coverageRoot | Absolute path |
FALLOW_TYPE_AWARE | Turn type-aware analysis on or off for the run. The --type-aware and --no-type-aware flags take precedence. This variable takes precedence over audit.typeAware and typeAware.enabled | true/false/1/0/yes/no/on/off |
FALLOW_TYPE_AWARE_TIMEOUT_SECS | Time limit for one request to the TypeScript semantic companion. Raise it for very large TypeScript programs | Seconds (default 120; unset, 0, or a non-numeric value keeps the default) |
FALLOW_TYPE_AWARE_BIN | Path to a trusted TypeScript semantic companion executable. Fallow resolves a relative path from the working directory, before --root applies. Fallow does not search node_modules or PATH | Path (default: the companion next to the active fallow executable) |
FALLOW_AUDIT_BASE | Fixed comparison base for fallow audit when you do not pass --base or --changed-since. Use it for the agent gate and for forks | Any git ref (e.g. origin/main, upstream/main) |
FALLOW_AUDIT_CACHE_MAX_AGE_DAYS | Maximum age of the base-snapshot worktree caches that fallow audit keeps and reuses | Whole days (default 30; 0 disables) |
FALLOW_IMPACT_STORE_MAX_AGE_DAYS | Delete per-project fallow impact stores older than this. A recorded run removes stale stores, for example from deleted repos | Whole days (unset or 0 keeps every store forever) |
FALLOW_CLOCK_EPOCH | Fixed reference time for churn recency, hotspot ranking, and ownership staleness. Two runs on one commit then give the same churn numbers. Read the value of a run from hotspot_summary.clock.epoch_secs and pass it back | Unix epoch seconds |
FALLOW_MAX_FILE_SIZE | Skip source files larger than this many megabytes. While this limit is on, fallow also skips large one-line minified JS assets. Same as --max-file-size. Fallow always analyzes .d.ts files | Whole megabytes (default 5; 0 disables) |
FALLOW_UPDATE_CHECK | Turn off the upgrade hint in local terminal runs and the background latest-version check | off, 0, false, disabled, no |
FALLOW_SUGGESTIONS | Hide the next_steps[] array of read-only follow-up commands in JSON output, and the Next: line in human output | off, 0, false, no, disabled (default on) |
FALLOW_TELEMETRY | Opt-in telemetry mode, off by default (see what it collects) | off/on/inspect (plus 0/1/true/false/disabled/enabled/debug/log) |
FALLOW_TELEMETRY_DISABLED | Turn off telemetry. For admins and fleet setups (top precedence) | 1, true, yes, on |
FALLOW_TELEMETRY_DEBUG | Force inspect mode (takes precedence over FALLOW_TELEMETRY) | 1, true, yes, on |
DO_NOT_TRACK | Turn off telemetry (top precedence) | 1, true, yes, on |
FALLOW_AGENT_SOURCE | Name the calling agent for telemetry classification. Does not turn on telemetry | codex, claude_code, cursor, copilot, opencode, aider, roo, windsurf, gemini (aliases gemini_cli/antigravity), cline, continue, zed, goose, other_known, unknown, none |
FALLOW_INTEGRATION_SURFACE | Name the telemetry integration surface. The MCP server sets it on the CLI that it starts. Does not turn on telemetry | mcp, lsp, vscode, napi, programmatic |
FALLOW_MCP_TOOL | Name the MCP tool for the telemetry mcp_tool dimension. The MCP server sets it. Fallow drops a name that is not on a fixed allowlist. Does not turn on telemetry | An allowlisted MCP tool name (for example find_dupes, audit) |
FALLOW_LSP_REUSE_SESSION | Turn off the project session that the language server keeps between saves. The server then loads the config and reads the parse cache again on each save | 0, false, off, no (default on) |
FALLOW_FORMAT
Set the default output format, so you do not pass --format on every command.
export FALLOW_FORMAT=json
fallow dead-code # Outputs JSON without --format flag
When both are set, the --format CLI flag takes precedence over FALLOW_FORMAT.
FALLOW_QUIET
Hide progress bars and status messages. Use it in CI or when you pipe the output.
export FALLOW_QUIET=1
fallow dead-code # No progress output, only results
This is the same as --quiet on every command.
FALLOW_BIN
Path to the fallow binary. The MCP server (fallow-mcp) uses it to find the fallow CLI.
export FALLOW_BIN=/usr/local/bin/fallow
fallow-mcp # MCP server uses the specified binary
When not set, the default is fallow on PATH.
FALLOW_EXTENDS_TIMEOUT_SECS
Timeout in seconds to fetch remote configs from https:// URLs in the extends field.
export FALLOW_EXTENDS_TIMEOUT_SECS=10
fallow dead-code # URL extends have 10s to respond
When not set, the default is 5 seconds.
FALLOW_CACHE_DIR
Directory for the persistent analysis cache. The CLI, the language server, the MCP server and the Node bindings read it. When both are set, this variable takes precedence over the cache.dir config field. A relative path resolves from the project root.
export FALLOW_CACHE_DIR=/tmp/fallow-cache
fallow dead-code # cache files are stored under /tmp/fallow-cache
By default, fallow stores the cache in .fallow/cache.bin under the project root. Set this variable in these cases:
- The project checkout is read-only.
- CI has a dedicated cache volume.
- Multiple workspace copies share one cache location.
--no-cache turns off the cache fully. This variable then has no effect.
One cache directory for several projects
An absolute path outside the project is one directory for every project. The hosts use it in two ways:
- The CLI, the MCP server and the Node bindings write
cache.binandgraph-cache.bindirectly into the directory. The extraction cache keys on paths relative to the project root, so a CI job still gets cache hits when the checkout path changes. Use one directory for one project: when two projects share it, each run replaces the cache of the other project. - The language server writes into one subdirectory for each project root, for example
web-3f2a9c1d8e7b6a50(the folder name and a hash of the full root path). Two editor windows on two projects can share oneFALLOW_CACHE_DIRand keep both caches.
FALLOW_CACHE_MAX_SIZE
Maximum size in megabytes of the extraction cache on disk (.fallow/cache.bin). When both are set, this variable takes precedence over the cache.maxSizeMb config field. The CLI, the language server, the MCP server and the Node bindings read this variable.
export FALLOW_CACHE_MAX_SIZE=64
fallow dead-code # cache capped at 64 MB
When not set, the default is 256 (MB). When the serialized cache grows past 80% of the limit, fallow removes the least recently used entries until the cache is at 60%. Use this variable on CI runners with disk quotas. Local machines with large disks rarely need it.
--no-cache turns off the cache fully. This variable then has no effect.
One cache directory for several projects
An absolute path outside the project is one directory for every project. The hosts use it in two ways:
- The CLI, the MCP server and the Node bindings write
cache.binandgraph-cache.bindirectly into the directory. The extraction cache keys on paths relative to the project root, so a CI job still gets cache hits when the checkout path changes. Use one directory for one project: when two projects share it, each run replaces the cache of the other project. - The language server writes into one subdirectory for each project root, for example
web-3f2a9c1d8e7b6a50(the folder name and a hash of the full root path). Two editor windows on two projects can share oneFALLOW_CACHE_DIRand keep both caches.
FALLOW_PACKAGE_BASELINES
Set to false, 0, no or off (in any case) to ignore workspaces.changedSince for every run of the process. Every workspace package is then in full scope, as with --no-package-baselines. Other values keep the map, so a typo never widens a run. The CLI, the language server, the MCP server and the Node bindings read this variable.
export FALLOW_PACKAGE_BASELINES=false
fallow dead-code --save-baseline fallow-baselines/dead-code.json # whole-project baseline
FALLOW_AUDIT_BASE
Sets a fixed comparison base for fallow audit. It has an effect only when you pass neither --base nor --changed-since. The precedence is the --base flag, then FALLOW_AUDIT_BASE, then auto-detection.
export FALLOW_AUDIT_BASE=upstream/main
fallow audit # compares against upstream/main instead of the auto-detected base
When unset, fallow audit uses the git merge-base (fork point) as the base. It compares against the upstream of the branch, or the remote default (origin/HEAD, then origin/main, then origin/master). This works for most repositories. Set a fixed base in two cases:
- Forks. On a fork,
originis your fork, which can be behind the real upstream. SetFALLOW_AUDIT_BASE=upstream/mainto compare against the real upstream. - The agent gate.
fallow hooks install --target agentgenerates a hook that runs barefallow audit. Your team may work only ingit worktrees and never update the local default branch. Then set the base with this variable. You do not edit the generated script, which a reinstall overwrites.
A malformed value (a ref with disallowed characters) stops the audit with exit code 2. Fallow does not ignore it, so you see a typo immediately.
FALLOW_AUDIT_CACHE_MAX_AGE_DAYS
Maximum age of a base-snapshot worktree cache that fallow audit keeps and reuses. The age is in whole days since the last reuse or since creation. The next fallow audit run removes older entries when it starts.
When both are set, this variable takes precedence over the audit.cacheMaxAgeDays config field. In fallow audit-cache prune, the --max-age-days flag takes precedence over this variable.
export FALLOW_AUDIT_CACHE_MAX_AGE_DAYS=7
fallow audit --base origin/main # caches older than 7 days are reclaimed
When not set, the default is 30 days. Set 0 to turn off the cleanup fully, for example on CI runners that clean /tmp with a separate process. For an invalid value (not an integer, or negative), fallow uses the config field or the default and gives no message. A typo in a runner variable does not fail audits.
The cleanup runs once per fallow audit run. It looks only at base-snapshot cache entries that fallow owns, never at other content of the temp directory. It never removes a cache entry that another running fallow audit uses (a kernel flock(2) lock per entry).
When it removes caches, fallow writes one fallow: reclaimed N stale base-snapshot caches line to stderr, unless --quiet is set. To run the same cleanup on demand and see the decision for each entry, use fallow audit-cache prune.
FALLOW_IMPACT_STORE_MAX_AGE_DAYS
Delete per-project fallow impact stores that have not changed in this many whole days. Impact keeps one small history file per project in your user config directory. When you delete a project from disk, its store stays. Set this variable so that a recorded run removes these stores.
export FALLOW_IMPACT_STORE_MAX_AGE_DAYS=90
fallow audit --base origin/main # impact stores untouched for 90+ days are reclaimed
When unset (the default), fallow keeps every store forever. 0 and invalid values also keep every store, so a typo never deletes history.
The age is the modification time of the store file. Each recorded run rewrites the file, so a project that you still track never expires. The cleanup never touches the project that you just recorded. It never deletes the advisory .lock sidecar files or the global impact.json opt-in toggle. Impact records only on developer machines (never in CI), so this cleanup is local only.
FALLOW_UPDATE_CHECK
In a local terminal run, fallow can show a one-line upgrade hint when a cached latest-version check finds a newer release. Fallow does not show the hint for machine formats, CI, quiet runs, and non-TTY agent runs. Set FALLOW_UPDATE_CHECK=off to turn off the hint and the background latest-version check on that machine. DO_NOT_TRACK and FALLOW_TELEMETRY_DISABLED also turn them off.
FALLOW_SUGGESTIONS
dead-code, health, dupes, bare fallow, and audit add a top-level next_steps[] array to their --format json output. The array lists read-only follow-up commands, based on the findings of the run. Bare fallow also prints a one-line Next: hint in human output on a TTY.
Set FALLOW_SUGGESTIONS=off (or 0, false, no, disabled) to hide them. Use this when a CI job compares raw JSON output against a snapshot. The CLI that the MCP server starts inherits the variable, so it also removes next_steps from MCP responses.
FALLOW_PRODUCTION and per-analysis overrides
FALLOW_PRODUCTION is the same as the --production CLI flag. It turns on production mode for every analysis. The per-analysis variables (FALLOW_PRODUCTION_DEAD_CODE, FALLOW_PRODUCTION_HEALTH, FALLOW_PRODUCTION_DUPES) change one analysis in bare combined mode (fallow with no subcommand) or in fallow audit.
# Run combined mode with production-only health, full-tree dead-code and dupes
export FALLOW_PRODUCTION_HEALTH=true
fallow --format json --quiet
Precedence (highest to lowest):
- CLI flags (
--production,--production-{dead-code,health,dupes}) - Per-analysis env var (
FALLOW_PRODUCTION_HEALTH, etc.) - Global env var (
FALLOW_PRODUCTION) - Config (
production: truelegacy form, orproduction: { health: true, ... }per-analysis form)
A per-analysis variable takes precedence over the global variable. For example, FALLOW_PRODUCTION=false FALLOW_PRODUCTION_HEALTH=true runs health in production mode and the other analyses in non-production mode.
A single subcommand such as fallow health rejects the per-analysis CLI flag, but it still reads FALLOW_PRODUCTION_HEALTH. For a subcommand, pass --production or set the per-analysis variable.
In CI, set FALLOW_FORMAT=json and FALLOW_QUIET=1 to get machine-readable output with no progress messages.
FALLOW_COVERAGE
Path to Istanbul coverage data (coverage-final.json) or raw V8 coverage (a NODE_V8_COVERAGE directory, or one V8 coverage JSON file). With this data, fallow health, fallow audit, and bare fallow compute accurate CRAP scores per function. An explicit CLI flag or MCP tool parameter takes precedence. After that, the CLI and typed MCP routes read this variable, and then health.coverage from config.
export FALLOW_COVERAGE=./coverage/coverage-final.json
fallow health
FALLOW_COVERAGE_ROOT
Absolute prefix that fallow removes from Istanbul coverage paths before it matches files. Use it when the coverage comes from a different checkout root, such as CI or Docker. An explicit CLI flag or MCP tool parameter takes precedence. After that, the CLI and typed MCP routes read this variable, and then health.coverageRoot from config.
FALLOW_MAX_FILE_SIZE
Maximum size in megabytes of one source file (default 5; 0 means no limit). Fallow skips larger source files before it parses them. This prevents out-of-memory failures on one large generated or bundled file. When both are set, the --max-file-size CLI flag takes precedence. Fallow always analyzes declaration files (.d.ts).
Review and PR-comment formats
These variables change the review-github, review-gitlab, pr-comment-github, and pr-comment-gitlab output formats. The bundled GitHub Action and GitLab CI template set them for you. Set them yourself only when you render these formats outside the bundled integrations.
| Variable | Effect |
|---|---|
FALLOW_ROOT | Project root where the review renderers read source for suggestion blocks. Set it together with --root. |
FALLOW_REVIEW_GUIDANCE | Set to 1, true, yes, or on to add a collapsed guidance block for each finding to inline review comments. |
FALLOW_REVIEW_ID | Stable identifier (1 to 64 characters: ASCII letters, digits, ., _, -) that keeps the inline comments of each job separate when more than one review job posts to the same PR or MR. An invalid value stops the run with exit code 2. |
FALLOW_SUMMARY_SCOPE | all (default) shows project-level dependency, catalog, and override findings in PR-comment summaries, without the diff filter. diff applies the diff filter to them too. |
FALLOW_PR_COMMENT_LAYOUT | Layout of the sticky PR or MR summary for pr-comment-github and pr-comment-gitlab. Values: default, compact, gate-only, or details. Use gate-only when reviewers read the findings in a native Check Run or Code Quality widget. |
FALLOW_CONSOLIDATED_STATUS | When you post one check run per gate (fallow ci post-check-run --split-gates), set to 1, true, yes, or on to also post one aggregate fallow check. |
FALLOW_DIFF_CONTEXT | Number of lines around changed lines that count as part of the diff when fallow scopes findings to a diff (default 3). |
FALLOW_BOT_LOGIN | Bot or token username that fallow treats as its own when it updates existing PR or MR comments. Required when you post with a personal access token. |
FALLOW_API_RETRIES | Maximum HTTP attempts for the API calls that update review comments (default 3). |
FALLOW_API_RETRY_DELAY | Minimum delay in seconds between HTTP retries (default 2). On 429 responses, a Retry-After header from the server overrides it. |
License and cloud
These variables configure the runtime coverage license and the connection to Fallow Cloud, the paid product. See fallow license and fallow coverage.
| Variable | Effect |
|---|---|
FALLOW_LICENSE | License JWT (full string). Use it on shared CI runners. |
FALLOW_LICENSE_PATH | Path to a file that contains the license JWT. |
FALLOW_LICENSE_SKEW_TOLERANCE_SECONDS | Clock-skew tolerance for the iat claim of the license JWT (default 86400). |
FALLOW_COV_BIN | Path to the fallow-cov sidecar binary for runtime coverage. |
FALLOW_COV_BINARY_PATH | Second sidecar path, checked after FALLOW_COV_BIN. Use it for air-gapped installs and sidecars from a distribution package. |
FALLOW_RUNTIME_COVERAGE_SOURCE | Set to cloud to select cloud runtime coverage in fallow coverage analyze without passing --cloud. |
FALLOW_REPO | owner/repo fallback for fallow coverage analyze --cloud when --repo is not passed. |
FALLOW_API_URL | Base URL for Fallow Cloud API calls, for staging or local development. |
FALLOW_API_KEY | Fallow Cloud bearer token for coverage upload commands. |
FALLOW_CA_BUNDLE | Path to a PEM certificate bundle for HTTP calls to Fallow Cloud and providers. It replaces the default WebPKI roots, so include the public roots and any private CA. |
MCP server
Set these in the env block of the MCP server. The CLI that the server starts inherits them. For the full reference, see MCP integration.
| Variable | Effect |
|---|---|
FALLOW_TIMEOUT_SECS | Timeout in seconds for the CLI subprocess of one tool call (default 120). |
FALLOW_DIFF_FILE | Path to a unified diff. Fallow reports only findings on changed lines. A file that cannot be read gives a full-scope report with a not-applied request outcome, not an error. |
FALLOW_CHANGED_SINCE | Git ref. Analysis tools discover only files changed since this ref. A ref that does not resolve gives a full-scope report with a not-applied request outcome. audit, decision_surface, project_info, list_boundaries, and the trace tools return an error. See Diff and ref from the environment. |
FALLOW_MCP_WARM_SESSION | Set to 0, false, off, or no to stop typed tool calls from keeping parsed files in memory between calls. On by default. A later call on unchanged files then does no parse work. Answers are the same either way. |
FALLOW_INTEGRATION_SURFACE | Telemetry surface for integrations other than the CLI. The MCP server sets it on the CLI that it starts. |
FALLOW_MCP_TOOL | Telemetry dimension for each tool. The MCP server sets it together with FALLOW_INTEGRATION_SURFACE=mcp. |
For the complete machine-readable list, see the environment_variables block of fallow schema.