# Configuration

> Look up every blop.config.ts option for browser checks, how values are resolved, and where collector settings live instead.

Options that `blop test` reads from `blop.config.ts` for [browser checks](/reference/glossary/#browser-check). Every option is optional. The programmatic runner accepts more; see [Runner options](/reference/runner/#runner-options).

```ts
import type { BlopConfig } from "@blopai/test";

export default {
  include: ["tests/**/*.blop.ts"],
  baseUrl: "http://localhost:3000",
  browser: "chromium",
  retries: 1,
} satisfies BlopConfig;
```

## Config files and precedence

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](/reference/environment/#browser-check-opentelemetry-export).

## Collector configuration

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

| Setting | Default | Where to change it |
|---|---|---|
| Collector host and port | `127.0.0.1:27811` | `blop up` flags, `BLOP_MONITOR_HOST` / `BLOP_MONITOR_PORT`, or `.blop/monitor.json` |
| Store path | Platform state directory (`~/.local/state/blop/monitor` on Linux), or `.blop/monitor/` in an initialized project | `BLOP_MONITOR_DB_PATH` |
| Store retention and size cap | `720` hours, `1024` MB | `BLOP_MONITOR_RETENTION_HOURS`, `BLOP_MONITOR_MAX_DB_SIZE_MB`, then restart the collector |
| Capture mode for a new binding | `full` | `blop agents setup <id> --capture <mode>` |
| Body retention and exclusions | `720` hours (1–720), none excluded | `blop agents capture-policy set` or the Inspector's [Capture and privacy](/reference/settings/#capture-and-privacy) |

Flags and environment variables override `.blop/monitor.json`, which overrides the defaults. See [Environment variables](/reference/environment/#collector-variables).

## Discovery options

| Option | Default | Purpose |
|---|---|---|
| `include` | `["**/*.blop.ts", "**/*.blop.tsx"]` | Globs for spec discovery; command-line patterns replace it |
| `baseUrl` | None | App 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](/checks/#choose-which-browser-checks-run).

## Browser options

| Option | Default | Purpose |
|---|---|---|
| `browser` | `"chromium"` | `chromium`, `camoufox`, `firefox` or `webkit` |
| `viewport` | Playwright's default | `{ width, height }`; Camoufox uses its own window |
| `headed` | `false` | Show the browser window |
| `containerized` | `false` | `true` or `{ image, containerName }`: run the browser in a warm Docker container |

## Agent options

| Option | Default | Purpose |
|---|---|---|
| `provider` | `BLOP_AGENT_PROVIDER`, else `"openrouter"` | Model [provider](/checks/providers/) |
| `model` | `BLOP_AGENT_MODEL`; required | Model name |
| `apiKey` | `BLOP_AGENT_API_KEY` | API key |
| `maxSteps` | No cap | Cap on agent tool steps; finish, timeout and no-progress guards still apply |
| `timeoutMs` | No cap | Wall-clock limit per check |
| `retries` | `0` | Reruns of a failed check |
| `workers` | `1` | Checks run at once |

## Reporting options

| Option | Default | Purpose |
|---|---|---|
| `reporter` | `"all"` | `basic`, `json`, `junit` or `all`; files per value are in [Report files](/reference/runner/#report-files) |
| `reportDir` | `".blop"` | Where reports go |
| `verbose` | `false` | Stream agent events to stderr |
| `captureStepScreenshots` | `false` | Save a JPEG after each browser action |
| `streamFrames` | `true` | Live Chromium screencast when progress or step screenshots are on |
| `frameIntervalMs` | `200` | Minimum milliseconds between `frame` progress lines |
| `coverage` | `false` | Chromium JavaScript coverage; see [Chromium JavaScript coverage](/checks/agent-authored/#chromium-javascript-coverage) |
| `coverageEndpoint` | None | Collector base URL that receives coverage; does not start a collector |

## Upload options

| Option | Environment variable | Purpose |
|---|---|---|
| `platformUrl` | `BLOP_INGEST_URL` | Blop Cloud ingest URL |
| `platformApiKey` | `BLOP_INGEST_SECRET` | Per-project ingest secret |

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

## OpenTelemetry options

| Option | Default | Purpose |
|---|---|---|
| `otelEndpoint` | `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP/HTTP base URL; setting it turns export on |
| `otelHeaders` | None | Merged over `OTEL_EXPORTER_OTLP_HEADERS` |
| `otelServiceName` | `"blop-runner"` | `service.name` |
| `otelEnvironment` | None | `deployment.environment.name` |
| `otelPropagateToApp` | `false` | Send W3C `traceparent` to the app under test |
| `otelPropagateAllowlist` | None | Hosts allowed to receive it; empty sends it nowhere |

## Configuration types

| Type | Values |
|---|---|
| `BlopBrowserName` | `"chromium" \| "camoufox" \| "firefox" \| "webkit"` |
| `BlopReporter` | `"basic" \| "json" \| "junit" \| "all"` |
| `BlopConfig` | `BlopRunOptions` without `specFile`, `specFiles` and `agentStream`, plus `include` and `exclude`; the CLI reads only the options on this page |
