Skip to content

Environment variables

Environment variables for the blop CLI, the collector and browser checks. An unset variable means no override. Variables listed in the Commands reference (port, host, URL, database path, output, colour, agent provider keys, OTLP flags) are not repeated here. Blop Cloud server variables are in Blop Cloud environment variables.

The collector resolves explicit start options first, then environment variables, then the project’s .blop/monitor.json when the project is initialized, then built-in defaults. blop.config.ts configures browser checks, not the collector. blop status --json reports the store and retention of the selected collector; the Inspector’s Settings shows effective values and their sources, never secret values.

VariableDefaultPurpose
BLOP_MONITOR_DB_PATHProject: .blop/monitor/telemetry.sqlite; else telemetry.sqlite in the state directoryStore path; an existing file is reused
BLOP_MONITOR_RETENTION_HOURS, BLOP_MONITOR_MAX_DB_SIZE_MB720 hours, 1024 MBStore age limit and approximate size cap. Restart the collector to apply. Size eviction removes the oldest evidence first, even before its age limit.
BLOP_MONITOR_STATE_DIR$XDG_STATE_HOME/blop/monitor, else ~/.local/state/blop/monitorRegistry, PID and log files; a project collector keeps runtime files in .blop/monitor/runtime
BLOP_MONITOR_RETENTION_TRACE_BATCH100Traces evicted per retention pass
BLOP_MONITOR_RETENTION_LOG_BATCH5000Logs evicted per retention pass
BLOP_MONITOR_RETENTION_INTERVAL_SECONDS10Seconds between retention passes
BLOP_MONITOR_TRACE_LOOKBACK_MINUTES1440Store fallback lookback; HTTP list routes keep their own defaults
BLOP_MONITOR_TRACE_LIMIT100Store fallback trace limit
BLOP_MONITOR_LOG_LIMIT100Store fallback log limit
BLOP_SOURCE_POLICY_FILEsource-policy.json in the state directoryCapture consent for application and filelog sources and coding agent bindings. Setup, the collector and an enrolled receiver must use the same file.
BLOP_LEDGER_POLICY_FILEUnset: no operator authorityOperator policy for worker ledgers; a private regular file owned by the collector user
XDG_CACHE_HOME~/.cacheblop/models under it caches the local CPU embedding model for local memory index and search. First use downloads it from Hugging Face; telemetry and queries are never sent.

The port defaults to the project’s port, else 27811; automatic startup picks a free port when none is explicit. Without an explicit URL, port or project, the CLI picks a registered local collector: the longest working-directory match wins, a sole running collector is accepted, and ambiguity is an error. An explicit target is never replaced after a connection failure.

VariableDefaultPurpose
BLOP_CLAUDE_CODE_BIN, BLOP_CODEX_BIN, BLOP_CURSOR_AGENT_BIN, BLOP_GEMINI_BIN, BLOP_GOOSE_BIN, BLOP_OMP_BIN, BLOP_PI_BIN, BLOP_HERMES_BIN, BLOP_CRUSH_BIN, BLOP_AMP_BINPATH and known install locationsBinary that blop agents list and the launchers use for that coding agent
BLOP_AGENT_SETUP_DIRblop/agents (setup) and blop/capture (capture) under the XDG config directoryAgent setup records; global records are <id>-global.json
BLOP_OPENCODE_SETUP_PATH$XDG_CONFIG_HOME/blop/opencode.json, else ~/.config/blop/opencode.jsonOpenCode setup record
BLOP_AGENT_HOOK_DISABLEDOffExactly 1 stops hook capture and delivery; OTEL_SDK_DISABLED=true does the same
BLOP_AGENT_HOOK_STATE_DIRCollector state directoryHook outbox and install state
BLOP_AGENT_HOOK_COLLECTOR_URLBLOP_MONITOR_URL, else requiredCollector for blop agent hook when no --collector-url is given
BLOP_AGENT_HOOK_AGENTNoneDefault --agent for blop agent hook
BLOP_AGENT_HOOK_TOOL_OWNERDetectedoh-my-pi hooks: native drops duplicate tool callbacks
CLAUDE_CONFIG_DIR, CODEX_HOME, GEMINI_CLI_HOME, HERMES_HOME, HERMES_DATA_DIR_SUFFIX, GOOSE_PATH_ROOT, CRUSH_GLOBAL_CONFIG, XDG_CONFIG_HOMEThe host’s own defaultWhere blop agents install-hooks writes that host’s configuration. Without HERMES_HOME, Hermes uses ~/.hermes<suffix> (<LOCALAPPDATA>/hermes<suffix> on Windows). Overrides of PI_CODING_AGENT_DIR and oh-my-pi profiles are refused.

Hooks that Blop installs carry their own binding through BLOP_AGENT_HOOK_POLICY_FILE, BLOP_AGENT_HOOK_SOURCE_ID, BLOP_AGENT_HOOK_PROJECT_ID and BLOP_AGENT_HOOK_TOKEN. Do not set them yourself. blop agents env <id> prints the telemetry variables a host needs; a printed recipe does not prove the host sent telemetry.

The same variables have different defaults in browser checks and in the Inspector’s chat. blop test uses flags, then blop.config.ts, then these variables. The chat reads the collector’s environment and never loads blop.config.ts.

VariableBrowser check defaultInspector chat default
BLOP_AGENT_PROVIDERopenrouteropenai
BLOP_AGENT_MODELNone; requiredgpt-4o-mini (openai/gpt-4o-mini with OpenRouter)
BLOP_AGENT_API_KEYNone; requiredNone; chat stays unconfigured
BLOP_AGENT_BASE_URLThe provider’s OpenAI-compatible endpointSame

Provider-native keys such as OPENAI_API_KEY are never read. Map one explicitly: BLOP_AGENT_API_KEY="$OPENAI_API_KEY". BLOP_AGENT_BASE_URL is the model API, not your app or the collector. See Agent providers.

Browser checks export their own traces, metrics and logs to an OTLP backend only when an endpoint is set. Without one the OpenTelemetry SDK is not loaded.

VariableDefaultPurpose
OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_ENDPOINTThe generic endpoint plus the signal pathFull URL for one signal
OTEL_EXPORTER_OTLP_PROTOCOLhttp/protobufhttp/json also works; grpc is rejected
OTEL_EXPORTER_OTLP_TIMEOUTCapped at 4500 msPer-export timeout; per-signal variants are capped the same way
OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_HEADERSNoneMerged over OTEL_EXPORTER_OTLP_HEADERS

Runs are not sampled and metrics use delta temporality. An export failure is logged and never fails the check run; shutdown waits at most 5 seconds in total.

A browser check run uploads its results only when BLOP_INGEST_URL, BLOP_INGEST_SECRET and BLOP_PROJECT_ID are all set; platformUrl and platformApiKey in blop.config.ts can supply the first two. Keep the secret private. An upload failure does not fail the run, and local capture needs none of these. BLOP_RUN_ID (default: generated) attaches results to a check run Blop Cloud already dispatched.

VariableDefaultPurpose
BLOP_ATTEMPT_NONoneAttempt number sent by the ingest client
BLOP_BASE_URLNoneGitHub Actions secret that Blop Cloud provisions; its generated workflow passes it as --base-url
BLOP_MACHINE_TOKENNonePrivate token read by the generated remote OpenTelemetry Collector configuration

Read only by --containerized runs; without that flag, nothing here enables a container.

VariableDefaultPurpose
BLOP_PLAYWRIGHT_IMAGEmcr.microsoft.com/playwright:v<installed version>-nobleWarm Playwright server image
BLOP_PLAYWRIGHT_CONTAINERblop-playwrightPlaywright container name
BLOP_PLAYWRIGHT_NETWORKNoneShared Docker network
BLOP_CAMOUFOX_IMAGEA local tag built from the installed versionsWarm Camoufox image; built locally when missing
BLOP_CAMOUFOX_CONTAINERblop-camoufoxCamoufox container name
BLOP_CAMOUFOX_NETWORKBLOP_PLAYWRIGHT_NETWORKCamoufox Docker network
BLOP_CONTAINER_DISABLE_CORS_BYPASSUnset: bypass onAny non-empty value turns off the Playwright container’s CORS bypass

BLOP_BROWSER_* variables belong to the Browser Harness CLI, not to browser checks.