Skip to main content

vulkro env

Every VULKRO_* environment variable, grouped by topic.

Command reference​

Generated from vulkro env --help (vulkro 0.36.0). Run scripts/gen-docs.sh in the product repository to refresh it; do not edit this section by hand.

Print the environment variables vulkro reads, by topic.

vulkro env [OPTIONS] [TOPIC]

Arguments​

ArgumentDescription
[TOPIC]A topic name (listed below) or all (the default)

Options​

FlagDescription
-f, --format <FORMAT>text (default) or markdown, the form the README and the docs site embed. Default: text. Possible values: text, markdown.
--offlineHard-disable every outbound network call for this run (sets VULKRO_OFFLINE=1). Blocks the CVE feed, the license heartbeat, the update check, webhooks, and any cloud AI endpoint; a loopback model (http://127.0.0.1, http://localhost) is still allowed. Equivalent to exporting VULKRO_OFFLINE=1, and the flag wins when both are set.
-q, --quietPrint only warnings and errors on stderr: no progress, tips or next-step hints. Results on stdout and exit codes are unchanged.
--no-colorTurn off coloured output. Colour is also off when NO_COLOR is set to a non-empty value or TERM=dumb.
-h, --helpPrint help (see a summary with '-h')
Full vulkro env --help
Print the environment variables vulkro reads, by topic.

Topics: network (the offline switch and outbound endpoints), account (vulkro login), cloud (vulkro cloud), org (vulkro publish), scan (output, precision and dependency CVEs), engine (opt-in analysis depth), console (vulkro serve and the local store), notify (scan --post-to credentials), ai (the optional model), editor (the language server, MCP and the extension installer), hooks (vulkro install-hook), rules (custom rules and rule packs). With no topic every topic is printed.

Exit codes: 0 = printed; 2 = unknown topic.

Usage: vulkro env [OPTIONS] [TOPIC]

Arguments:
[TOPIC]
A topic name (listed below) or `all` (the default)

Options:
-f, --format <FORMAT>
`text` (default) or `markdown`, the form the README and the docs site embed

[default: text]
[possible values: text, markdown]

--offline
Hard-disable every outbound network call for this run (sets VULKRO_OFFLINE=1). Blocks the CVE feed, the license heartbeat, the update check, webhooks, and any cloud AI endpoint; a loopback model (http://127.0.0.1, http://localhost) is still allowed. Equivalent to exporting VULKRO_OFFLINE=1, and the flag wins when both are set

-q, --quiet
Print only warnings and errors on stderr: no progress, tips or next-step hints. Results on stdout and exit codes are unchanged

--no-color
Turn off coloured output. Colour is also off when NO_COLOR is set to a non-empty value or TERM=dumb

-h, --help
Print help (see a summary with '-h')

Network: the offline switch and outbound endpoints
==================================================

A scan never needs the network. These variables control the few
commands and background tasks that do make an outbound call.

VULKRO_OFFLINE
Set to refuse every outbound network call. The
global `--offline` flag sets it for one run. Under it: `vulkro
update` will not fetch the CVE bundle (apply a local one with
`vulkro update --bundle <path>`), the live CVE lookup, the usage
heartbeat, the lease refresh and the release version check do
not run, `login`, `publish`, `probe`, `notify`, `install-extension`
and `scan --validate-secrets` are refused, and `scan --post-to`
is skipped with a warning. A cloud AI endpoint is refused; a
loopback model (http://127.0.0.1, http://localhost) is still
allowed. Any value turns offline mode on, including an empty one,
except `0`, `false`, `no` and `off` (any case), which turn it off
and print a one-time warning. The editor extension, the npm
wrapper and the install scripts read it the same way.
VULKRO_CVE_LIVE
Set to 1 to opt in to the live CVE lookup: each declared
dependency's name, version and ecosystem is sent to api.osv.dev
to catch advisories published since your local bundle. OFF by
default, so nothing about your dependency tree leaves the
machine. Transitive (lockfile-only) packages are never sent.
Ignored under VULKRO_OFFLINE.
VULKRO_NO_UPDATE_CHECK
Any non-empty value skips the release version check that
`vulkro update` runs. A scan never contacts the release feed.
VULKRO_NO_HEARTBEAT
Any non-empty value disables only the usage heartbeat (and
with it the online lease refresh), leaving every other network
call untouched. VULKRO_OFFLINE also disables it.
VULKRO_HEARTBEAT_URL
Override the heartbeat endpoint. Default
`https://api.vulkro.com/v1/heartbeat`. For a self-hosted or test
server.
VULKRO_CDN_BASE_URL
Override the base URL `vulkro update` fetches the signed CVE
bundle from. Default `https://dist.vulkro.com/cve`. The bundle
signature is still verified against the keys built into the
binary.
VULKRO_DNS_REBIND_DOMAIN
`vulkro probe` only: a hostname on a DNS server you control that
answers a public IP first and 127.0.0.1 second. The probe does not
run a rebinding check yet: with it set the report carries a Low
informational row saying the probe is set up, and without it a Low
row saying the probe was skipped.

Account: vulkro login
=====================

VULKRO_ACCOUNT_URL
Override the account / API base that `vulkro login` and `vulkro
logout` talk to. Default `https://app.vulkro.com/api`.
VULKRO_ACCOUNT_TOKEN
A CI key created in your account (app.vulkro.com, Settings), for
CI and headless machines. Every scanning command signs in with it
automatically when no licence is cached on the machine (so CI needs
no `vulkro login` step), and `vulkro login` uses it with no browser
and no pasted code. An explicit `--code` wins over it.
VULKRO_LICENSE_B64
The base64 of a `.lic` file, for air-gapped CI runners: every
scanning command verifies it in memory (nothing is written to
~/.vulkro) when no licence is installed. Create it with
`base64 < your-key.lic` (`base64 -w0` on Linux).

Vulkro Cloud: vulkro cloud
==========================

`vulkro cloud` uses the connection `vulkro cloud connect` saved
(~/.vulkro/cloud.json). For CI against a company workspace:
VULKRO_CLOUD_URL
The workspace address (https://<slug>.vulkro.com) to use instead
of the saved connection. Needs VULKRO_CLOUD_TOKEN, unless it
matches the saved workspace.
VULKRO_CLOUD_TOKEN
A workspace token (vkws_...) to use instead of the saved one.
Needs VULKRO_CLOUD_URL when this machine has no saved
connection. Workspace access only: it is not a vulkro licence.
Pro Cloud (`vulkro cloud connect --pro`) stores no token: each request
carries this machine's Vulkro sign-in, or VULKRO_ACCOUNT_TOKEN (see the
account topic) when it is set. VULKRO_OFFLINE refuses every `cloud`
command.

Organisation dashboard: vulkro publish
======================================

VULKRO_ORG
Default organisation slug for `vulkro publish` when `--org` is
not given. Unset is fine for a token that belongs to one org.
VULKRO_ORG_TOKEN
An account API-key token to publish with. When unset, a machine
signed in with `vulkro login` publishes with its device token.
VULKRO_ORG_URL
The org server to publish to. Default
`https://app.vulkro.com/api`. Point it at a self-hosted server.
VULKRO_ORG_SCHEMA2
Any non-empty value sends the lighter schema-2 snapshot (counts,
category labels and hashed finding ids) instead of the default
full-detail schema 3, for a server that only understands schema
2.
VULKRO_ORG_SCHEMA1
Any non-empty value sends the original schema-1 snapshot. Wins
over VULKRO_ORG_SCHEMA2.
VULKRO_ORG_NO_DEPS
Any non-empty value drops the per-package dependency inventory
from a schema-2 snapshot, keeping the redacted advisory counts.

`vulkro publish --preview` prints the exact snapshot and sends nothing.
Publishing is refused under VULKRO_OFFLINE.

Scan: output, precision and project context
===========================================

Boolean switches below accept 1 / true / yes / on to turn on and
0 / false / no / off to turn off, unless the entry says otherwise.

VULKRO_DISABLE_CACHE
Same as `scan --no-cache`: any value other than empty or 0
bypasses the per-file extraction cache, the git-history cache
and the code-graph cache (code-graph, assess-change, from-trace).
VULKRO_TIMINGS
Same as `scan --timings`: any value other than empty or 0 records
per-pass wall-clock times in `stats.pass_timings`. Changes no
finding and no exit code.
VULKRO_SCAN_BUDGET_SECS
Wall-clock ceiling for the detector passes, in seconds (whole or
fractional). Unset or 0 means unlimited (the default). Checked at
pass boundaries only: once reached, the remaining passes are
skipped, named in `degraded_passes`, and a partial-results line
is added to `warnings`. Exit codes are unchanged.
VULKRO_DETERMINISTIC
Set to 1 to pin `scanned_at` (the output's only clock field) so
the full JSON is byte-reproducible run to run; `scan
--no-timestamp` sets it for one run. SOURCE_DATE_EPOCH (integer
seconds) also pins it, to that instant. Ids and ordering are
always deterministic.
VULKRO_GIT_COMMIT
The full commit SHA (40 or 64 hex characters) to report as the
scanned revision in the `git` object of `--format json`, the NDJSON
summary line and SARIF `versionControlProvenance`, in place of
HEAD. For a CI runner or container whose checkout has no `.git`.
Any other value is ignored with a warning and HEAD is read.
VULKRO_GIT_BRANCH
The branch name to report in the same places, in place of the
checked-out branch (a shallow clone is often on a detached HEAD,
which reports `branch: null`). A leading `refs/heads/` is removed.
VULKRO_QUIET_PRESET_HINT
Set to 1 to silence the one-time hint a bare `vulkro scan [path]`
prints when no preset is named.
VULKRO_STRICT_CONFIDENCE
Set to 1 for the same effect as `scan --strict-confidence`: High
findings with an empty evidence bag are filtered out.
VULKRO_STRICT_PROOF
The strict-proof tier, ON by default. A Medium finding that rests
only on heuristic signals (no dataflow, secret-format or
reachability proof) is shown at Low, outside the default view and
`--fail-on`, and still visible under `--all-confidence`. Set to
0 to restore the fuller default view.
VULKRO_STRICT_ADMISSION
The high-tier admission gate, ON by default. A Critical or High
finding keeps its severity only when its disposition is
`admitted` (a proven source-to-sink trace, a value-verified
secret, an advisory-proven dependency hit, or a dispositive
injection shape); every other one is capped at Medium, which
takes it out of `--fail-on critical,high` while leaving it fully
reported. Set to 0 to restore the pre-gate view and exit codes.
VULKRO_ABSENCE_AUTHZ
ON by default. Authorization findings that fire only because no
guard was visible in the lines the rule read are reported at Low
confidence (out of the default view and `--fail-on`). A finding
of that family with a real source-to-sink trace keeps its tier.
Set to 0 to restore the previous default view.
VULKRO_NO_SUPPRESS
Set to 1 to ignore `// vulkro:disable` source annotations, so a
CI lane can see what would normally be suppressed.
VULKRO_NO_FOLD
Set to 1 to turn off the one-issue-per-root-cause fold: every
engine's report of one bug is listed as its own row again. By
default rows of the same vulnerability family within two lines of
one sink in one file fold into the strongest row, which lists the
others under `also_reported_by`.
VULKRO_GIT_BLAME
Set to 1 to fill each finding's `owner` from `git blame` of the
offending line. Off by default because it can add tens of
seconds on a large repository (bounded at 30 seconds).
VULKRO_AUTH_MIDDLEWARE_NAMES
Comma-separated names of project-specific auth middleware to
recognise as a route guard, added to the built-in list and to
`auth_middleware_names` in `vulkro.toml`. Applies to Node.js /
TypeScript and Go routes (Go: a per-route middleware argument, a
`.Use(...)` call or a router-group guard). Only identifier
characters are accepted; other names are skipped.
`vulkro config show-patterns` lists the result.
VULKRO_SCAN_VENDORED
Set to exactly 1 to scan vendored, minified and generated files
that the security passes skip by default.
VULKRO_NO_FRONTEND_SCAN
Set to 1 to skip the frontend check subset over JavaScript /
TypeScript files that were not registered as modules.
VULKRO_MAX_AST_FILE_BYTES
Files larger than this many bytes are skipped by the syntax-tree
security passes. Default 1500000; 0 disables the cap.
VULKRO_MAX_AST_FILE_LINES
Files longer than this many lines are skipped by the syntax-tree
security passes. Default 8000; 0 disables the cap.
VULKRO_PARSE_CACHE_MAX_BYTES
Cap, in source bytes, on the per-scan parse cache (default
67108864, 64 MiB). A file past the cap is parsed again when a pass
needs it, so findings are the same whatever the value; lowering it
trades speed for memory.
VULKRO_DISABLE_PARALLEL_DISPATCH
Set to 1 or true to run the independent detector passes one after
another instead of in parallel. The output is identical either way;
unset (parallel) is faster.
VULKRO_NEXTJS_FULL_MODULES
Set to 1 to register every file of a Next.js project with all
detectors. By default only route-shaped files and the server files
they import are registered. Off by default: on three real apps the
extra High and Critical rows were about 6% true positives, and it
roughly doubles scan time.
VULKRO_DIFF_ONLY_REF
Same as `scan --diff-only <ref>` (the flag sets it): only files that
differ from this git ref are scanned. When nothing differs or git
fails, the whole project is scanned.
VULKRO_VERIFIED_REQUIRES_PROOF
OFF by default. Set to 1 to reserve the top `Verified` confidence
tier for findings with a machine-checkable proof (a taint trace hop
or the `admitted` disposition). By default an auth finding on an
unprotected route whose handler reads user input is also promoted
to `Verified`.
VULKRO_AUTOFIX_WIDE
Set to 1 to widen the one-click `suggestion` blocks of `--format
gh-pr-inline` from the four read-only fix classes to the full
deterministic fix catalogue. A widened suggestion is emitted only
for an `admitted` finding whose rewrite a re-scan confirms clears
it. Off by default.
VULKRO_DEBUG
Any value, even an empty one, prints the project cache fingerprint
in the scan progress log, notes Helm templates too complex to
render, and keeps full webhook URLs in `--post-to` error messages
instead of redacting them. Leave it unset in shared CI logs.
VULKRO_LEGACY_UNCONFIRMED_TAINT
DEPRECATED, removed in the next release. Any non-empty value lets an
injection finding whose taint check failed be promoted back into the
default view (and so into `--fail-on`), as before 0.22. Only for
keeping a pipeline's exit code stable while you re-baseline; a scan
with it set prints a deprecation warning.
VULKRO_LEGACY_TIER
DEPRECATED, removed in the next release. Any non-empty value lets a
finding in a test, example, fixture, migration, generated, doc,
dev-tool or framework-internal file stay Critical or High (it is
otherwise capped at Medium). A scan with it set prints a
deprecation warning.

Dependency CVEs (SCA):

VULKRO_SCA_DEV_DEP_DEMOTE
ON by default. A CVE in a package declared only as a development
dependency (and never as a production one in any manifest) is
held at Low confidence, so it leaves the default view and
`--fail-on critical,high`; it stays in JSON and SARIF, tagged
`(dev dependency)`. Set to 0 to keep such CVEs at full
confidence.
VULKRO_SCA_NO_TRANSITIVE
Set to 1 to report only the dependencies your manifests declare.
By default every package in the lockfiles is matched against the
local CVE bundle and hits no manifest declares are reported at
Medium confidence, marked `(transitive dependency)`.
VULKRO_SCA_REACHABLE
ON by default. Labels each dependency CVE `reachable` or
`unreachable` with the entry-point call chain as evidence; the
label never changes severity (use `--fail-on-reachable-only` to
act on it). Set to 0 to skip the labelling; set to 1 to also
downgrade first-party taint findings whose sink no entry point
reaches.
VULKRO_INSPECT_DEPS
Set to 1 to inspect the installed source of the npm dependencies
your reachable code imports (`node_modules/<pkg>`, top level only)
for compromised-package payloads (time-bomb gates and
download-and-run loaders). Off by default; npm only.

`vulkro gate` and `vulkro review`:

VULKRO_GATE_BASE
Default base ref for `vulkro gate` when `--base` is not given,
so a CI lane sets it once (`VULKRO_GATE_BASE=origin/main`).
VULKRO_GATE_SEVERITY_ONLY
Compatibility switch, off by default. A `not-examined` finding is
normally reported but never fails `scan --fail-on`, `vulkro gate`,
`vulkro review --fail-on` or the MCP gate. Set to 1 to let severity
alone decide again; it also turns VULKRO_ABSENCE_AUTHZ off and
restores the previous `vulkro guard check` verdict.
VULKRO_REVIEW_CONTEXT
Default number of diff context lines `vulkro review` shows around
each change (default 3). `--context` wins over it.

Engine: opt-in analysis depth
=============================

Call-graph and taint switches. Each one that is OFF by default can
add findings when turned on. Set to 1 / true / yes / on to turn on.

VULKRO_GO_SAMEPKG_EDGES
ON by default (since Wave 5; set to 0 to opt out). Go
same-package call-graph edges: an unqualified call `foo()` can
bind to a top-level `func foo` in a sibling file of the same
directory and `package` clause (free functions only, never
across packages). Measured: no finding changed on the Go corpora,
the reachable closure grew on every Go repository.
VULKRO_CODEGRAPH_LADDER
Call-graph half ON by default (since Wave 5; set to 0 to opt
out): a parameter's declared type (`p: T`, `p T`, `T p`) binds
`p.method()` to T's method. Set to 1 to also turn on co-located
test linking in `vulkro assess` (still opt-in).
VULKRO_XPKG_GO
OFF by default. Strips the `go.mod` module prefix off qualified
Go imports so a cross-package import resolves to the in-repo
package and taint can follow it across the package boundary.
Kept off: in the Wave 5 A/B it added a Critical lookalike on the
Go ground-truth app and no true positive.
VULKRO_XPKG_JVM
OFF by default. Java cross-file call-graph edges: import and
same-package resolution of method calls, bound only to a unique
declaring class. Wave 5: no finding changed on the Java corpora
and reachability grew; kept off until the Java advisory replay
is measured with it on.
VULKRO_JS_RECEIVER_RESOLVE
OFF by default. Receiver-typed callee resolution for JavaScript
and TypeScript taint: a method call on a never-reassigned
`new Foo()` local, where Foo is a project class nothing extends,
binds to that class's method instead of every same-named one.
Kept off: in the Wave 5 A/B it added 26 Critical/High rows on
the precision repos, all sampled ones false positives.
VULKRO_REACHABILITY_CLOSURE
ON by default. The reachability-closure repair, which makes
framework route handlers call-graph nodes so the forward closure
from entry points is complete. Set to 0 / false / no / off to
opt out.
VULKRO_XPKG_JS_EXPORTS
ON by default (set to 0 to opt out). Resolves a JS / TypeScript
workspace-package import (`@scope/pkg` in a pnpm, turbo or nx
monorepo) through the package's `package.json` `exports`, `module`
or `main`, so taint and reachability cross the package boundary.
Binds only to an in-project source file, never `node_modules`.
VULKRO_DISABLE_INTERPROC_TAINT
Set to 1 to skip the cross-file taint pass, the call-graph build and
its propagation; they are named in `degraded_passes`. Off by
default.
VULKRO_INTERPROC_TAINT_MAX_MODULES
Above this many modules the cross-file taint pass is skipped
automatically, with a progress note naming this variable. Default
6000; 0 turns the automatic skip off.

Taint precision in the proof-carrying engines:

VULKRO_TAINT_FLOW_ORDER
ON by default (set to 0 to opt out). JS/TS, Python, Go and Java: a
trace is kept only when the assignment that taints the value sits
above the sink, except in the same loop body or across a closure,
where text order says nothing about run order.
VULKRO_TAINT_VALUE_DEFUSE
OFF by default. JS/TS: a local carries taint only when its assigned
value preserves it (concatenation, interpolation, property read,
spread, ternary). A value-destroying call (`sha1(...)`, `parseInt`,
`.length`) clears it; a reshape (`.toString()`, `JSON.parse`,
`atob`) passes it through.
VULKRO_TAINT_CALLBACK_PARAM
OFF by default. JS/TS: the first parameter of a `.map`, `.forEach`,
`.filter`, `.flatMap`, `.find`, `.some` or `.every` callback
inherits the receiver's taint. Kept off because the name stays
bound for the whole enclosing function, so a reused short name can
report a flow that does not exist.
VULKRO_TAINT_RESOLVED_BIND
OFF by default. JS/TS: pins an ambiguous cross-file callee with the
type-aware call-graph resolver before the by-name fallback, and
treats a local assigned from a helper proven to return a constant
as clean. Measured neutral, so kept opt-in.
VULKRO_TAINT_SANITIZER_SUMMARY
OFF by default. Go: a project helper that validates or encodes its
parameter before every return, or is marked `// vulkro:
sanitizer`, counts as a sanitizer.
VULKRO_TAINT_VALUE_SCOPED_SANITIZER
OFF by default. Go: a cross-method sanitizer clears only the
variable it was applied to, not an unrelated field on the same call
edge.
VULKRO_TAINT_GO_BODY_BIND
ON by default (set to 0 to opt out). Go: a request body bound into
a struct (`c.ShouldBindJSON(&req)`, `c.Bind`, fiber `BodyParser`,
`json.NewDecoder(r.Body).Decode`) is a taint source.
VULKRO_GO_FIELD_TAINT
ON by default (set to 0 to opt out). Go: a keyed struct literal
taints only the field built from tainted data, a `url.URL` is a
redirect or SSRF target only when a destination field is tainted,
and a statement spanning several lines is read whole.
VULKRO_TAINT_GO_ERR_WASH
ON by default (set to 0 to opt out). Go: `err = f(tainted)` does not
taint `err`; an error built from the value (`fmt.Errorf`,
`errors.New`, `errors.Wrap`) still does.
VULKRO_TAINT_GO_REDIRECT_CONFIG
ON by default (set to 0 to opt out). Go: a redirect to a
configuration URL getter, optionally with a new path or query, is
not reported as an open redirect.
VULKRO_TAINT_GO_SCALAR_PARAM
ON by default (set to 0 to opt out). Go: taint does not flow into a
parameter declared as a number, `bool` or `time.Duration`; `byte`,
`rune`, `int8`, `uint8` and `int32` stay tainted.

Data-layer SQL sinks:

VULKRO_TAINT_P7_QB_IDENT
ON by default (set to 0 to opt out). A tainted value in an SQL
identifier slot (ORDER BY / GROUP BY column, table name) of a JS/TS,
Python or Go query builder is reported, always at Low severity and
confidence, so it stays out of the default view.
VULKRO_TAINT_P7_HEURISTIC_SQL_GATE
ON by default (set to 0 to opt out). Clears a heuristic INJ-001
store-then-execute finding only when the call is provably
parameterised (bound parameters and placeholder-only query text).
VULKRO_TAINT_P7_ORM_RAW_ESCAPE
OFF by default. JS/TS: also treats `sql.unsafe`, `sql.lit` and
`Sequelize.literal` as raw-SQL sinks.
VULKRO_TAINT_P7_RECEIVER_NAMES
OFF by default. JS/TS: also treats a handle named `instance` as an
SQL handle.
VULKRO_TAINT_P7_PY_RAW
OFF by default. Python: Django `objects.raw`, `.extra` and `RawSQL`,
`cursor.executescript` and `conn.execute` / `.fetch` / `.fetchval` /
`.fetchrow` are SQL sinks, behind the parameterisation gate.
VULKRO_TAINT_P7_JVGO_RAW
OFF by default. Java `JdbcTemplate.update` / `queryForStream` and
jOOQ `resultQuery` / `fetch`, and Go sqlx `Queryx` / `QueryRowx` /
`NamedExec` / `NamedQuery` / `MustExec`, are SQL sinks, behind each
engine's parameterisation gate.

Bruteforce sinks (`scan --bruteforce-sinks`; Python and JS/TS):

VULKRO_BRUTEFORCE_SINKS
Set to exactly 1 to run the bruteforce-sinks pass: every critical
call site is driven against an adversarial payload corpus and a
payload that reaches the sink with no recognised guard is reported.
The flag sets it; `vulkro lsp` honours it too. Off by default and
slower.
VULKRO_BRUTEFORCE_CATEGORIES
Comma-separated sink categories to check: sql, shell, http, payment,
llm, file-write, deserialization, email. Unset means all.
`--bruteforce-categories` sets it.
VULKRO_BRUTEFORCE_PAYLOAD_CLASSES
Comma-separated payload classes: type-confusion, numeric, size,
unicode, injection, path-traversal, prompt-injection, payment.
Unset means all. `--bruteforce-payload-classes` sets it.
VULKRO_BRUTEFORCE_CONFIDENCE
Lowest confidence reported: high (the default), medium or low.
`vulkro scan` always sets it from `--bruteforce-confidence`, so the
variable matters only for scans started another way, such as by the
language server.
VULKRO_BRUTEFORCE_DEPTH
Maximum expansion depth per function. Default 6, clamped to [2, 12].
VULKRO_BRUTEFORCE_PATHS_PER_FN
Maximum paths walked per function. Default 64, clamped to
[8, 512].

Console and local store: vulkro serve
=====================================

VULKRO_SERVE_TOKEN
The console access token to require instead of the random one
each start generates. It is not printed; scripts send it as
`Authorization: Bearer <token>`. Shared with `vulkro-sf serve`.
A blank value is ignored.
VULKRO_SERVE_ALLOWED_HOSTS
Comma-separated extra host names the console answers to, and
whose `Origin` it accepts, for a console behind a reverse proxy
that rewrites `Host` (for example `vulkro.internal:8723`).
VULKRO_DB
Full path of the local SQLite store, instead of
`~/.vulkro/scans.db`. One file holds the per-file cache, the
scan history and trend snapshots, and local licence state, so
this moves all of them together. The parent directory is created
if missing.

Notifications: scan --post-to
=============================

`--post-to` integrations (Slack / Teams / Jira / PagerDuty) read
their secrets from environment variables so credentials never land in
shell history. A value missing from both the flag and the environment
falls back to `~/.vulkro/notify.json` (`--post-to saved` posts to every
destination saved there). Notification failures are non-fatal: the scan
exit code is unchanged and a warning is printed to stderr. Skipped under
VULKRO_OFFLINE. `--post-to` is a Pro capability (`notify`).

VULKRO_SLACK_WEBHOOK
Slack incoming-webhook URL, used by `--post-to slack`. A URL
passed inline as `--post-to slack=<url>` wins over it.
VULKRO_TEAMS_WEBHOOK
MS Teams Adaptive Card webhook URL, used by `--post-to teams`. A
URL passed inline as `--post-to teams=<url>` wins over it.
VULKRO_JIRA_BASE_URL
Jira Cloud base for `--post-to jira=<PROJECT_KEY>`, for example
`https://acme.atlassian.net`. One issue per Critical finding.
VULKRO_JIRA_EMAIL
Atlassian account email for basic auth.
VULKRO_JIRA_TOKEN
Atlassian API token for basic auth.
VULKRO_PD_ROUTING_KEY
PagerDuty Events API v2 routing key for `--post-to pagerduty`.
One incident when at least one Critical is present.
VULKRO_NOTIFY_RETRIES
Attempts per integration (default 3, clamped to [1, 5]), with
backoff of 250ms, 1s, 4s, 10s, 20s between attempts. 1 disables
retry.

AI: optional model for triage and fixes
=======================================

Resolution order: the per-run flags (`--ai-model`, `--ai-url`,
`--no-ai`), then these variables, then the selection saved by `vulkro ai
use`, then the local default (Ollama at http://127.0.0.1:11434/v1). A
blank value counts as unset.

VULKRO_AI_MODEL
Model tag to use, for example `qwen2.5-coder:7b`.
VULKRO_AI_URL
OpenAI-compatible base URL. A loopback URL is a local model; any
other URL is a cloud endpoint and is refused under
VULKRO_OFFLINE.
VULKRO_AI_KEY
API key sent to a cloud endpoint. Ignored for a local URL and
never saved to disk.
VULKRO_AI_ENDPOINT_CLASS
Set to `cloud` to treat the AI endpoint as cloud even when its
URL is loopback, so VULKRO_OFFLINE refuses it. For a local relay
that forwards to a cloud model (the editor extension's editor-AI
option sets it; so should a LiteLLM-style proxy). Only `cloud`
is honoured: nothing can make a remote URL count as local.
VULKRO_TRIAGE_API_KEY
Older name for the key `vulkro triage` sends to an Anthropic cloud
URL. Used only when no AI key (VULKRO_AI_KEY) is set;
ANTHROPIC_API_KEY is the last fallback.

Editor, language server and MCP
===============================

VULKRO_LSP_LOG
Any value other than empty or 0 writes per-message trace lines
from `vulkro lsp` to stderr. Off by default so the stdio
JSON-RPC channel stays clean.
VULKRO_LSP_DEBOUNCE_MS
The `textDocument/didChange` debounce window for `vulkro lsp`,
in milliseconds. Default 300, clamped to [50, 5000]; a value
that does not parse falls back to 300.
VULKRO_LSP_INCREMENTAL
Incremental save is the default: a save re-analyses only the
saved file and reuses the cached findings for the rest, falling
back to a full rescan when the file is part of a cross-file
finding. Set to 0 / false / no / off to rescan the whole project
on every save instead. The old opt-in value 1 still works and
prints a note that it is no longer needed.
VULKRO_MCP_LOG
Any value other than empty or 0 writes per-request trace lines
from `vulkro mcp serve` to stderr. Off by default.
VULKRO_VSIX_URL
Full URL of the .vsix that `vulkro install-extension` downloads,
instead of the Vulkro CDN (a self-hosted mirror). Still refused
under VULKRO_OFFLINE; use `--vsix <file>` for an air-gapped
machine.
VULKRO_PQ_AUDIT
Set to exactly 1 to add the post-quantum crypto audit pass to the
scans `vulkro lsp` runs (slower). The editor's deep-scan setting
sets it.

Scans started by the language server and the MCP server honour the
scan and engine variables (`vulkro env scan`, `vulkro env engine`) in
the same way, including VULKRO_BRUTEFORCE_SINKS.

Git hooks: vulkro install-hook
==============================

VULKRO_SKIP_HOOKS
Set to exactly 1 to bypass the pre-commit and pre-push hooks that
`vulkro install-hook` writes, for one commit or push.
VULKRO_SKIP_PRECOMMIT
Set to exactly 1 to bypass the pre-commit hook that the deprecated
`vulkro init` writes, for one commit.
VULKRO_GIT_HOOK
Exported by those hooks (set to the hook name) so the command a
hook runs knows it is inside a git hook. Not something you set
yourself.

Custom rules and rule packs
===========================

VULKRO_RULES
Path to a YAML custom-rule file to load in place of
`vulkro-rules.yaml` (or `.yml`) at the project root. Used only when
the file exists.
VULKRO_RULES_REGISTRY_URL
Override the rule-pack registry index that `vulkro rules` fetches
(list, update, adding a pack). Default
`https://dist.vulkro.com/rules/index.json`. For a mirror or proxy.