Skip to content

Configuration

Options that blop test reads from blop.config.ts for browser checks. Every option is optional. The programmatic runner accepts more; see Runner options.

import type { BlopConfig } from "@blopai/test";
export default {
include: ["tests/**/*.blop.ts"],
baseUrl: "http://localhost:3000",
browser: "chromium",
retries: 1,
} satisfies BlopConfig;

Blop finds blop.config.ts, .mts, .js or .mjs in the project root; --config <file> picks another. Later sources win:

  1. Built-in defaults.
  2. Environment variables (BLOP_AGENT_*, OTEL_*).
  3. blop.config.ts.
  4. Command-line flags, such as --max-steps 75 in CI.

Agent fields resolve as flag, then config, then BLOP_AGENT_*. Provider-native keys such as OPENAI_API_KEY are never read. OpenTelemetry fields follow their own rules in Environment variables.

blop.config.ts does not configure the collector or coding agent capture.

SettingDefaultWhere to change it
Collector host and port127.0.0.1:27811blop up flags, BLOP_MONITOR_HOST / BLOP_MONITOR_PORT, or .blop/monitor.json
Store pathPlatform state directory (~/.local/state/blop/monitor on Linux), or .blop/monitor/ in an initialized projectBLOP_MONITOR_DB_PATH
Store retention and size cap720 hours, 1024 MBBLOP_MONITOR_RETENTION_HOURS, BLOP_MONITOR_MAX_DB_SIZE_MB, then restart the collector
Capture mode for a new bindingfullblop agents setup <id> --capture <mode>
Body retention and exclusions720 hours (1–720), none excludedblop agents capture-policy set or the Inspector’s Capture and privacy

Flags and environment variables override .blop/monitor.json, which overrides the defaults. See Environment variables.

OptionDefaultPurpose
include["**/*.blop.ts", "**/*.blop.tsx"]Globs for spec discovery; command-line patterns replace it
baseUrlNoneApp under test; relative agent.goto("/path") resolves against it

node_modules/, dist/, .blop/ and .git/ are always skipped. Pattern resolution is in Choose which browser checks run.

OptionDefaultPurpose
browser"chromium"chromium, camoufox, firefox or webkit
viewportPlaywright’s default{ width, height }; Camoufox uses its own window
headedfalseShow the browser window
containerizedfalsetrue or { image, containerName }: run the browser in a warm Docker container
OptionDefaultPurpose
providerBLOP_AGENT_PROVIDER, else "openrouter"Model provider
modelBLOP_AGENT_MODEL; requiredModel name
apiKeyBLOP_AGENT_API_KEYAPI key
maxStepsNo capCap on agent tool steps; finish, timeout and no-progress guards still apply
timeoutMsNo capWall-clock limit per check
retries0Reruns of a failed check
workers1Checks run at once
OptionDefaultPurpose
reporter"all"basic, json, junit or all; files per value are in Report files
reportDir".blop"Where reports go
verbosefalseStream agent events to stderr
captureStepScreenshotsfalseSave a JPEG after each browser action
streamFramestrueLive Chromium screencast when progress or step screenshots are on
frameIntervalMs200Minimum milliseconds between frame progress lines
coveragefalseChromium JavaScript coverage; see Chromium JavaScript coverage
coverageEndpointNoneCollector base URL that receives coverage; does not start a collector
OptionEnvironment variablePurpose
platformUrlBLOP_INGEST_URLBlop Cloud ingest URL
platformApiKeyBLOP_INGEST_SECRETPer-project ingest secret

Upload also needs BLOP_PROJECT_ID. In CI, prefer the three environment variables.

OptionDefaultPurpose
otelEndpointOTEL_EXPORTER_OTLP_ENDPOINTOTLP/HTTP base URL; setting it turns export on
otelHeadersNoneMerged over OTEL_EXPORTER_OTLP_HEADERS
otelServiceName"blop-runner"service.name
otelEnvironmentNonedeployment.environment.name
otelPropagateToAppfalseSend W3C traceparent to the app under test
otelPropagateAllowlistNoneHosts allowed to receive it; empty sends it nowhere
TypeValues
BlopBrowserName"chromium" | "camoufox" | "firefox" | "webkit"
BlopReporter"basic" | "json" | "junit" | "all"
BlopConfigBlopRunOptions without specFile, specFiles and agentStream, plus include and exclude; the CLI reads only the options on this page