Skip to content

Commands

Local observability for coding agents: sessions, traces and issues.

Terminal window
blop <command> [flags]

Running blop with no command runs blop home.

FlagDescriptionDefaultEnvironment
-o, --output <fmt>text (default), json, ndjson or env, per command Values: text, json, ndjson, env.text
--jsonSame as -o json: one blop.cli/v1 document on stdout
-p, --port <n>Collector port (default 27811, env BLOP_MONITOR_PORT)27811BLOP_MONITOR_PORT
--url <url>Collector URL (env BLOP_MONITOR_URL)BLOP_MONITOR_URL
--no-colorDisable colour (also NO_COLOR=1)NO_COLOR
--no-inputNever prompt; a question exits 2 (also BLOP_NO_INPUT=1)BLOP_NO_INPUT
-q, --quietPrint only results and errors
--debugPrint stack traces (also BLOP_DEBUG=1)BLOP_DEBUG
-h, --helpShow help for blop or a command
-V, --versionPrint the version

Start the collector and inspector, or reuse a running one

In a terminal Blop stays in the foreground, with a banner and single keys: o opens the inspector, i the issues, m copies the MCP command, h lists the keys, q quits. It starts in the background instead, and returns once the collector answers, when a coding agent runs it, when stdout is not a terminal, or with —json. Windows always stays in the foreground unless you pass —detach. A collector already running is reused; a background one from an older Blop is restarted.

Terminal window
blop up [--detach | --foreground] [--port <n>] [--host <host>] [--project <id>] [--no-open] [--recover] [--compact] [--json]

Aliases: blop start.

FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--project <id>Default authored-memory project (otherwise BLOP_PROJECT_ID, then all local projects)
--detachStart in the background and return once it answers
--foregroundStay in this terminal, even for an agent or a pipe
--no-openDo not open the inspector (also BROWSER=none)
--recoverIf the store is corrupt or from a newer Blop, move it aside (renamed, never deleted; the check may already have merged a pending WAL into it) and start an empty one
--compactBefore starting, evict to the size cap and VACUUM the store so deleted space returns to the disk (needs twice the store size free; refused while a collector serves it)

JSON fields in data: url, inspector_url, otlp_endpoint, port, pid, instance_id, version, cli_version, store, started, managed, mode, log_path.

Terminal window
blop up # Start the collector and inspector, or reuse a running one
blop up --recover # Move a store Blop cannot open aside and start an empty one
blop up --detach # Start in the background and print where it runs

See also: blop status, blop stop, blop help environment.

Run a command with telemetry: blop run — npm run dev

With no command it runs the package.json dev script through the package manager the lockfile names (pnpm, yarn, bun, else npm; the lockfile may be in a parent workspace folder) and says so on stderr; a dev script that runs blop itself is refused. Before the command starts, one stderr line names the collector, the service name, whether content capture is on, and the agent SDKs found here (—no-summary drops it and the end summary). Inside another blop run that is still running (BLOP_LOCAL_RUN_ID) the command joins that run instead of starting its own, and its own —capture-content, —url and —port do not apply (it says so); a marker left by an ended run is ignored. —no-summary also drops the coding-agent block. The command keeps this terminal: its stdin, stdout and stderr are its own. With —json, Blop writes one blop.cli/v1 document to stderr after the command exits, and nothing else of its own: the last line Blop writes, on a line of its own, starting with {“schema_version”. A background process the command started can still write after it, so —report is the robust path: the document goes to that file (written atomically; if it cannot be written, to stderr with a report_not_written warning). ok is true when the command started, whatever its exit code; data.exit_code is the command’s code. Signals: Ctrl-C or SIGTERM while the collector starts exits 130 or 143 and the command never runs (ok false, interrupted). While the command runs, SIGTERM and SIGHUP are forwarded to it (and Ctrl-C when no terminal already sent it); a command still running BLOP_RUN_KILL_GRACE_MS (10000) ms after SIGTERM or SIGHUP is killed, and Ctrl-C twice within 2 seconds kills it at once. After it exits, Ctrl-C skips the wait for late telemetry: the summary still prints (warning settle_interrupted) and the exit code stays the command’s.

Terminal window
blop run [--capture-content] [--env <name>] [--trigger <kind>] [--trigger-id <id>] [--no-summary] [--json] [--report <file>] [--] [<cmd...>]
FlagDescriptionDefaultEnvironment
--capture-contentAsk instrumented GenAI SDKs to record prompt and completion content
--env <name>deployment.environment.name on the command’s telemetry (an OTEL_RESOURCE_ATTRIBUTES value wins)
--trigger <kind>What started the run (blop.trigger.kind): ci, schedule, manual or your own kind; default: detected CI, else manual
--trigger-id <id>blop.trigger.id: a schedule id or CI run id (CI runs are detected with their run id)
--report <file>Write the run summary as a blop.cli/v1 document to this file
--no-summaryNo start line and no end summary on stderr (new issues and warnings still print)

JSON fields in data: run_id, command, command_line, cwd, git, exit_code, signal, started_at, ended_at, duration_ms, sessions, requests, failed_requests, new_issues, regressed_issues, collector_url, inspector_url, recorded.

Terminal window
blop run -- npm run dev # Run your app with OTel env, git stamp and a run record
blop run npm test # The -- is optional: the first non-flag word starts the command
blop run --report r.json npm test # Also write the run summary (JSON) to r.json

See also: blop up, blop issues, blop help environment.

Record a sample agent failure to explore before you instrument anything

Through the running collector (started in the background when it is stopped) it records two npm test runs in this repo: one that passed 10 minutes ago and one that failed, where an agent’s bash tool call made the app’s POST /api/pay answer 500 after the agent read the memory node demo:checkout-policy. Then blop why —last explains it. Everything it records is tagged blop.demo=true; running it again adds an occurrence to the same issue, never a second issue. —clean deletes only data tagged blop.demo=true (its traces with their runs, occurrences and issue, and the demo memory node with its reads): without —yes it only counts them and exits 1.

Terminal window
blop demo [--clean [--yes]] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--cleanDelete the demo data instead (a preview unless —yes)
--yesWith —clean, delete it

JSON fields in data: issue_id, app_span_id, agent_step_span_id, runs, trace_ids, preview, traces, spans, issues, memory_nodes, memory_reads.

Terminal window
blop demo # Record the demo failure, then run blop why --last
blop demo --clean # Count the demo data that --clean --yes would delete
blop demo --clean --yes # Delete the demo data, nothing else

See also: blop why, blop delete.

Set up every coding agent on this machine (blop setup agents)

blop setup doctor is a read-only whole-loop audit: collector/status, store, browser, runtime, agent recipes, git and binding. Start here when evidence looks empty; failures print exact next commands (exit 1), never auto-repair. blop setup agents detects installed coding agents and installs their supported user-global hooks, starting or reusing a local collector. New capture follows the existing full-content default; —capture metadata-only excludes bodies. Existing capture modes and exclusions are preserved when —capture is omitted. blop setup mcp adds Blop’s MCP server (blop mcp) to a coding agent: through the client’s own command for Claude Code (claude mcp add), Codex (codex mcp add) and Gemini CLI (gemini mcp add), or by editing one entry in its JSON config for Cursor, VS Code, OpenCode and Pi (comments kept, the previous file copied to Blop’s state dir, the file read back). Pi requires pi-mcp-adapter; OMP reads project .mcp.json natively. For Windsurf and Claude Desktop it prints the entry and never writes. First it starts the command and checks that Blop’s MCP server answers; a command that would not start is never written (exit 6). A second run changes nothing; a different blop entry is replaced only with —force; —remove undoes it; —print writes nothing. With no client it lists the coding agents it finds and reports stale blop entries (an old pinned version, npx while blop is on PATH, a command that no longer exists) with the command that updates each.

Terminal window
blop setup <agents|doctor|mcp|plugin|opencode> [flags]
SubcommandPurposeUsage
agentsDetect installed agents and install their supported global hooksblop setup agents [--capture full|conversation-only|metadata-only] [--url URL|--port N] [--json]
doctorRead-only whole-loop environment audit with exact fix commandsblop setup doctor [--url URL|--port N] [--acknowledge-non-loopback] [--json]
pluginPrepare Codex or Claude Desktop hosted plugin setupblop setup plugin <codex|claude-desktop> --app-url URL [--print|--remove] [--force] [--allow-loopback-development] [--json]
mcpAdd Blop’s MCP server to claude, codex, cursor, vscode, opencode, pi, omp, gemini, windsurf, claude-desktopblop setup mcp [<client>|all] [--scope local|project|user] [--print] [--force] [--remove] [--json]
opencodeConfigure and start OpenCode monitoringblop setup opencode [--port <n>] [--remove] [--json]
FlagDescriptionDefaultEnvironment
--capture <mode>agents: capture mode for detected agents; existing choices are preserved when omitted Values: full, conversation-only, metadata-only.
--scope <scope>mcp: where the entry goes: local, project or user (when omitted, the client decides) Values: local, project, user.
--printPrint the setup entry/package instructions, write nothing
--forceReplace a different existing Blop entry/package
--removeRemove the selected Blop entry/package instead (opencode: take back its config edits and setup record)
--app-url <url>plugin: hosted public HTTPS app origin
--allow-loopback-developmentplugin: explicitly permit Codex loopback development
--acknowledge-non-loopbackdoctor: acknowledge a non-loopback target (never contacts external hosts)
Terminal window
blop setup agents # Detect installed agents and install global hooks
blop setup mcp claude # Let Claude Code read Blop issues over MCP
blop setup doctor --json # Audit the whole local loop without changing anything

See also: blop mcp, blop doctor.

Detect agent frameworks and print or write the OTel setup

Terminal window
blop init [--write] [--mcp <client>] [--json]
FlagDescriptionDefaultEnvironment
--writeUpdate .gitignore and .env.blop (nothing else is touched)
--mcp <client>Then add Blop’s MCP server to this coding agent: claude, codex, cursor, vscode, opencode, pi, omp, gemini, windsurf or claude-desktop (same as blop setup mcp ) Values: claude, codex, cursor, vscode, opencode, pi, omp, gemini, windsurf, claude-desktop.

JSON fields in data: write, detections, changed, mcp.

Terminal window
blop init # Print the setup lines for the frameworks found here
blop init --write # Also update .gitignore and .env.blop
blop init --mcp claude # Then let Claude Code read Blop issues over MCP

See also: blop run, blop doctor.

Authored browser checks: init, add, list, run, watch

blop flows is the same group (ls means list). Aliases: test /run -> test run; watch/list -> test watch/list; init —flow -> test init. Evidence is launch provenance, never proof of a fix. Targets still come from the reviewed spec/config or —base-url. Use authorized systems and synthetic data.

Terminal window
blop test init|add|list|run|watch [patterns...] [flags]

Aliases: blop flows.

SubcommandPurposeUsage
initCreate a starter specblop test init [file] [--force]
addAdd another starter specblop test add [file] [--force]
listList authored checks without a browserblop test list [patterns...] [--json]
lsAlias for listblop flows ls [patterns...] [--json]
runRun authored checks, optionally from local evidenceblop flows run [patterns...] [--from trace <id>|--from finding <code>] [flags]
watchRe-run checks when specs changeblop test watch [patterns...] [flags]
FlagDescriptionDefaultEnvironment
-u, --base-url <url>Base URL for the app under test (local, CI, staging, or HTTPS production)
--report-dir <dir>Report output directory (default .blop).blop
--coverageCollect executed JavaScript source coverage (Chromium only)
--coverage-endpoint <url>Send coverage to this local collector base URL (requires —coverage)
--progress-file <file>Append live NDJSON progress (test_start, action, frame, test_finish)
--capture-screenshotsSave a screenshot after each browser action (and stream live frames)
--no-streamDisable the live CDP screencast (use per-action screenshots)
--frame-interval <ms>Min ms between streamed frame progress lines (default 200)200
--forceinit/add: overwrite an existing spec without asking
--headedRun browser headed
--browser <name>Browser to run: chromium, camoufox, firefox or webkit Values: chromium, camoufox, firefox, webkit.
--containerizedRun the browser in a separate warm Docker container
--viewport <size>Viewport as WIDTHxHEIGHT, for example 390x844
-c, --config <file>Config file path
--provider <provider>Agent provider for the native agent loop (env BLOP_AGENT_PROVIDER)BLOP_AGENT_PROVIDER
--model <model>Agent model for the native agent loop (env BLOP_AGENT_MODEL)BLOP_AGENT_MODEL
--api-key <key>Agent API key for the native agent loop (env BLOP_AGENT_API_KEY)BLOP_AGENT_API_KEY
--max-steps <n>Optional hard cap on agent tool steps
--workers <n>Run up to this many agent tests concurrently (default 1)1
-r, --reporter <reporter>Report format: basic, json, junit or all Values: basic, json, junit, all.
--otel-endpoint <url>OTLP/HTTP endpoint for flow telemetry; setting it turns export on (env OTEL_EXPORTER_OTLP_ENDPOINT)OTEL_EXPORTER_OTLP_ENDPOINT
--otel-service-name <name>service.name on exported spans (default blop-runner, env OTEL_SERVICE_NAME)blop-runnerOTEL_SERVICE_NAME
--otel-environment <name>deployment.environment.name on exported telemetry
--otel-propagateSend W3C traceparent to the app under test (also BLOP_OTEL_PROPAGATE_TO_APP=1)BLOP_OTEL_PROPAGATE_TO_APP
--otel-propagate-allowlist <hosts>Comma-separated hosts allowed to receive it (env BLOP_OTEL_PROPAGATE_ALLOWLIST)BLOP_OTEL_PROPAGATE_ALLOWLIST
-v, --verbosePrint agent stream events in real time
--from <kind id>Launch provenance: —from trace or —from finding
--db <path>Existing local evidence database (env BLOP_MONITOR_DB_PATH)BLOP_MONITOR_DB_PATH
--since <duration>Evidence lookback, at most 24h (default 15m)15m
Terminal window
blop test init # Create a reviewed starter spec
blop flows run tests/checkout.blop.ts --from finding app_error --json # Run with bounded local launch provenance
blop flows ls # List authored checks

List issues, current branch first

Terminal window
blop issues [--branch <name>] [--state open|muted|fixed|all] [--failure-kind <kind>] [--limit <n>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--branch <name>Only issues seen on this branch
--failure-kind <kind>Only issues whose sessions blop classify most often labeled app_error, tool_error, model_error, guardrail_denied or agent_error Values: app_error, tool_error, model_error, guardrail_denied, agent_error.
--state <state>open (default), muted, fixed or all Values: open, muted, fixed, all.open
--limit <n>Maximum issues (default 50)50
--headerPiped output: print the column names first

JSON fields in data: id, fingerprint, code, title, agent, service, severity, certainty, state, status, badges, occurrences, sessions, requests, on_branch, trend_24h, trend24h, trend7d, priority, first_seen_ms, last_seen_ms, first_seen_run_id, first_seen_commit, first_seen_branch, fixed_ms, regressed_ms, not_seen_in_latest_run, failure_kind, url.

Terminal window
blop issues # Open issues, current branch first
blop issues --json # Current issues as JSON for a script or agent
blop issues --state all --header # Tab-separated with a header row when piped

See also: blop issue, blop tail, blop help json.

Show one issue: causal chain, evidence and fix context

Terminal window
blop issue <issue-id> [--fix-context | --web] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--fix-contextPrint the issue’s fix context (markdown) for a coding agent
--webOpen the issue in the inspector (same as blop open )

JSON fields in data: issue, status, badges, chain, occurrences, selected, nav, excerpt, different, activity, branches, run, runs, not_seen_in_latest_run, cli, fix_context_url, url, id, markdown.

Terminal window
blop issue iss_0123abcd # Causal chain, occurrences and the inspector link
blop issue iss_0123abcd --fix-context # Markdown to paste into a coding agent
blop issue iss_0123abcd --web # Open it in the inspector

See also: blop issues, blop trace, blop open, blop mcp.

Explain a failure: what broke, where, why, and which memory was read

Explains one failure with ids: the issue (what broke), the agent step span and the app span it made fail (where), the MAST failure mode or none with a reason, plus the failure kind and where it came from (why), and the memory reads recorded for that session. With no id (or —last) it explains the newest failing run in this repo (real runs before demo runs) through its newest issue, else the newest open issue in this repo or with no project. —all-projects widens that to every project. It ends with the next command and an inspector link. An id this collector does not hold exits 4.

Terminal window
blop why [<run|issue|session|trace id> | --last] [--all-projects] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--lastExplain the newest failing run in this repo (the default)
--all-projectsWith —last, look at runs and issues of every project

JSON fields in data: schema, target, demo, issue, where, why, memory, next, links, reason.

Terminal window
blop why # The newest failure in this repo
blop why iss_0123abcd # One issue
blop why --last --all-projects --json # The newest failure anywhere, for a coding agent

See also: blop issue, blop issues, blop open.

List the runs blop run recorded, or inspect one against the previous run

Lists the runs blop run recorded in this repo, newest first: status, command, branch, when, how long and the issues each run first saw. Runs from other projects, or recorded with no project, are left out and counted on stderr; —all-projects shows them. A run Blop’s demo seeded carries (demo). —failed keeps runs that exited non-zero without being stopped by a signal. blop runs show <id> prints one run with the issues it saw and how it differs from the previous run of the same command on the same branch; —timeline adds its spans in time order (at most 200). Each answer ends with the next command and an inspector link. An id this collector does not hold exits 4.

Terminal window
blop runs [--failed] [--since <duration>] [--limit <n>] [--branch <name>] [--all-projects] [--json]
SubcommandPurposeUsage
showOne run, compared with the previous run of the same command on the branchblop runs show <run-id> [--timeline] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--failedOnly runs that failed (a non-zero exit, not stopped by a signal)
--since <duration>Only runs started within this window, e.g. 15m, 1h, 2d, 7d
--limit <n>Maximum runs, 1 to 200 (default 20)20
--branch <name>Only runs on this branch
--all-projectsRuns of every project, not only this repo
--headerPiped output: print the column names first
--timelineshow: also list the run’s spans in time order

JSON fields in data: schema, scope, filters, runs, hidden_elsewhere, next, links.

Terminal window
blop runs # This repo's recent runs
blop runs --failed --since 1h # What failed in the last hour
blop runs show run_abcdefghijklmnopqrst --timeline # One run, its comparison and its spans

See also: blop why, blop run, blop issues.

Stream new issues, runs and sessions as they happen

Terminal window
blop tail [-o text|ndjson] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST

JSON fields in data: schema_version, type, reason, id, title, url, state, status, exit_code, signal, end_reason, kind, trace_id, service.

Terminal window
blop tail # Watch new issues, runs and sessions as they happen
blop tail -o ndjson # One JSON event per line (--json is the same)

See also: blop issues.

Open the inspector at an issue, session, run or trace

Opens the inspector page of an issue (iss_…), session (ses_…), run (run_…) or trace (32 hex), or a page: home (the default), sessions, issues, runs, connect or settings, on the collector this folder resolves to. A path starting with / (what the web app’s blop open chip copies, e.g. /map?env=production&range=24h) opens that screen of the hosted app the blop auth profile (—profile, default “default”) is signed in to. It prints the URL instead of opening a browser with —print or —json, for a coding agent, with —no-input, with BROWSER=none, over SSH and where there is no display. It does not check that the object exists.

Terminal window
blop open [<issue|session|run|trace id> | <page> | /<web path>] [--profile NAME] [--print] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--printPrint the URL, do not open a browser
--profile <name>The blop auth profile whose hosted app a /path opens on

JSON fields in data: url, kind, id, view, opened.

Terminal window
blop open # The inspector's Home
blop open iss_0123abcd # One issue
blop open runs --print # Print the Runs page URL (for SSH)

See also: blop issue, blop issues, blop up.

Author source-scoped scores and review annotation queues locally

Explicit local authoring, not hosted authority or MCP writes. Grants bind one recorded source, principal and permission set for at most 24 hours. Feedback credentials stay in a trusted backend, never browser code. Every mutation names a stable idempotency key and updates name an expected revision. Corrections never replace recorded output.

Terminal window
blop evaluation <grant|revoke|call> [flags]
SubcommandPurposeUsage
grantIssue a bounded source grant as the local database OS ownerblop evaluation grant --db PATH --input FILE --token-file NEW_FILE [--json]
revokeRevoke one local grant immediatelyblop evaluation revoke <grant-id> --db PATH [--json]
callCall the local evaluation HTTP owner with a source-scoped grantblop evaluation call <action> --input FILE_OR_DASH --token-file FILE --url URL [--json]
FlagDescriptionDefaultEnvironment
--input <file-or-dash>Strict JSON input file or - for stdin (maximum 32 KiB)
--db <path>Explicit local collector database for OS-owner grant administration only
--token-file <path>Private local evaluation credential file; grant creates it exclusively with mode 0600
Terminal window
blop evaluation grant --db /tmp/review/telemetry.sqlite --input grant.json --token-file /tmp/review/reviewer.key --json # Create exact-source local human/producer authority without printing the credential
blop evaluation call subject --input subject.json --token-file /tmp/review/reviewer.key --url http://127.0.0.1:27811 --json # Resolve an immutable source reference before annotating
blop evaluation call scores.put --input score.json --token-file /tmp/review/reviewer.key --url http://127.0.0.1:27811 --json # Author a typed score through the actual local HTTP surface

Render a bounded local evidence packet without network access

One local read-only snapshot; no collector discovery, startup, HTTP, analysis, or upload. Findings are stored issues, flows are retained SDK scenario spans. Outcomes and verification are separate: unknown is never success. —until pins the window; identical evidence and options render identically. JSON generated_at is the window end, not the rendering clock. Save stdout to share; publication is a separate explicit operation.

Terminal window
blop report [--since 2h] [--scope service|session|finding] [--format markdown|junit|json]
FlagDescriptionDefaultEnvironment
--db <path>Local collector database (otherwise project/environment configuration) (env BLOP_MONITOR_DB_PATH)BLOP_MONITOR_DB_PATH
--since <duration>Window duration, 1m through 1d (default 2h)2h
--until <timestamp>Fixed exclusive window end for reproducible rendering (ISO UTC)
--scope <kind>Scope kind: service, session or finding; requires its matching selector Values: service, session, finding.
--service <name>Exact service name with —scope service
--session <id>Exact recorded session ID with —scope session
--finding <id>Exact stored issue/finding ID with —scope finding
--format <format>Packet format: markdown (default), junit or json Values: markdown, junit, json.markdown
--limit <n>Source rows per section, 1–100 (default 20)20
--max-bytes <n>Whole output byte cap, 4096–262144 (default 65536)65536

JSON fields in data: window, collector, scope, limits, coverage, unavailable, truncated, reproduce, services, errors, logs, findings, flows.

Terminal window
blop report --since 2h --format markdown # Print local evidence for a PR or agent handoff
blop report --scope service --service checkout --format junit # Render service evidence for CI (no upload)
blop report --since 2h --until 2026-10-21T12:00:00Z --format json # Pin a window for deterministic rendering

Read bounded source-scoped failure evidence without diagnosing a cause

One read-only local-plane snapshot. Source plus at least one selector is required; selectors intersect. Metadata only, with exact IDs, deterministic ranks/reasons, capture coverage and next queries. No inferred links, hosted runs, model diagnosis or verification. Repeat with both —until and —revision; an invalidated snapshot is an explicit conflict. Empty evidence is not a passing check. JSON generated_at is the pinned window end.

Terminal window
blop failure-context --source KEY [--trace ID|--service NAME|--session ID|--attempt ID] [--since 15m] [--json]
FlagDescriptionDefaultEnvironment
--source <key>Exact 64-hex source key from /api/observations/sources
--trace <id>Exact 32-hex retained trace ID
--span <id>Exact 16-hex span ID within the selected scope
--log <id>Exact retained decimal log ID within the selected scope
--service <name>Exact service name within the source
--session <id>Exact recorded session, never a timestamp association
--attempt <id>Exact recorded attempt; absent identity remains unknown
--since <duration>Bounded window duration, 1m through 1d (default 15m)15m
--until <timestamp>Pinned exclusive window end (ISO UTC)
--revision <revision>Require this evidence revision; stale snapshots are rejected
--limit <n>Maximum symptoms, 1–100 (default 20)20
--max-bytes <n>Data byte cap, 4096–262144 (default 65536)65536
--deadline-ms <ms>Server read deadline, 1–5000 ms (default 2000)2000
--db <path>Read an existing local database instead of HTTP; no collector startup

JSON fields in data: schema_version, state, source, collector, window, scope, limits, coverage, symptoms, associations, verification, independently_recorded_outcomes, unavailable, next, truncated.

Terminal window
blop failure-context --source "$SOURCE" --trace "$TRACE" --since 15m --json # Read a standalone application failure
blop failure-context --source "$SOURCE" --session "$SESSION" --until "$END" --revision "$REVISION" --json # Require the exact retained snapshot

Show the agent map: who hands work to whom, which apps they touch

Reads the collector’s agent map over a window: coding-agent sessions and named agents (OTel invoke_agent spans) with runs per hour, error rate and p95, the apps their requests reached, and handoffs recorded by exact parent ids (a parent span, or the parent session a hook reported). Agents active at the same time are never connected.

Terminal window
blop map [--range 1h|24h|7d|30d] [--env <name>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--range <range>Window: 1h, 24h (default), 7d or 30d
--env <name>Only runs that recorded this deployment.environment.name
Terminal window
blop map # The last 24 hours, every environment
blop map --range 7d --env production --json # A week of production, machine-readable

See also: blop session, blop open.

Show product events: what users did in your app, and how the newest version changed it

Reads the collector’s product events over a window: OTel log records that carry an event name (the OTLP event_name field or an event.name attribute), counted per event, with the apps that sent them. When an app’s newest service.version was first seen inside the window, each of that app’s events also shows its count before and after, over equal windows; the version names the coding agent whose run carried it in the same trace, else none. Names and counts only, never a record’s body.

Terminal window
blop events [--range 1h|24h|7d|30d] [--env <name>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--range <range>Window: 1h, 24h (default), 7d or 30d
--env <name>Only events that recorded this deployment.environment.name
Terminal window
blop events # The last 24 hours, every environment
blop events --range 7d --env production --json # A week of production, machine-readable

See also: blop map, blop init, blop open.

Label agent runs with intent, outcome and failure kind (a local batch job)

run (the default) labels the window’s coding-agent sessions and named agents as blop.class.intent (change, operate, explore, converse, unknown), blop.class.outcome (success, failure, running) and blop.class.failure_kind (app_error, tool_error, model_error, guardrail_denied, agent_error). Labels are structural and deterministic: outcome and failure kind come from recorded status, errors and guardrail stops, intent from the tools a run called. —llm lets the configured chat provider (BLOP_AGENT_PROVIDER, _MODEL, _API_KEY; default a free OpenRouter model, BLOP_CLASSIFY_MODEL to override) refine intent from the first retained prompt, for full-capture sessions only. Labels feed Issues, the Agent Map and alert filters; they are evidence aids, not verdicts. list reads the stored labels. Runs outside the collector, which need not be running.

Terminal window
blop classify [run|list] [--range 1h|24h|7d|30d] [--llm] [--relabel] [--failure-kind <kind>] [--outcome <o>] [--intent <i>] [--agent <id>] [--json]
FlagDescriptionDefaultEnvironment
--range <range>Window: 1h, 24h (default), 7d or 30d Values: 1h, 24h, 7d, 30d.
--llmrun: refine intent with the configured model (full-capture sessions only)
--relabelrun: label again runs this version already labeled
--failure-kind <kind>list: only this failure kind: app_error, tool_error, model_error, guardrail_denied or agent_error Values: app_error, tool_error, model_error, guardrail_denied, agent_error.
--outcome <outcome>list: only this outcome: success, failure or running Values: success, failure, running.
--intent <intent>list: only this intent: change, operate, explore, converse or unknown Values: change, operate, explore, converse, unknown.
--agent <id>list: only this map agent, e.g. harness:claude-code
--limit <n>list: at most this many (1-1000, default 200)
Terminal window
blop classify # Label the last 24 hours of runs
blop classify list --failure-kind tool_error --json # Runs that failed on a tool, machine-readable
BLOP_AGENT_API_KEY=... blop classify --llm --range 7d # Refine a week of intents with the free default model

See also: blop issues, blop map, blop alerts.

Alert rules on agent telemetry: list, add, pause, test and route them

Rules watch one Agent Map metric (agent_error_rate, agent_p95_ms, app_outcome, handoff_failure_share, memory_low_trust_reads, agent_guardrail_denials) over 1h or 24h, on one node (—target) or the worst one. The collector evaluates them every minute and records each change into or out of firing. blop alerts connect —profile NAME —project ID sends firings to the hosted app with that blop auth profile, which posts them to the project’s Slack route; without it they stay local. The same link sends the commits an agent made in a blop run (ids only) to GitHub & CI’s Agent-authored view. Rates take 25% or 0.25; p95 takes milliseconds.

Terminal window
blop alerts [list|add|enable|disable|remove|test|connect] [<rule-id>] [flags]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--name <text>Rule name (add)
--metric <metric>Metric (add): agent_error_rate, agent_p95_ms, app_outcome, handoff_failure_share, memory_low_trust_reads or agent_guardrail_denials Values: agent_error_rate, agent_p95_ms, app_outcome, handoff_failure_share, memory_low_trust_reads, agent_guardrail_denials.
--above <value>Fire when the value is above this (add)
--below <value>Fire when the value is below this (add)
--target <id>One map node or edge id (add), e.g. agent:harness:claude-code; default the worst one
--range <range>Window (add): 1h (default) or 24h Values: 1h, 24h.
--severity <severity>Severity (add): critical, warning or info Values: critical, warning, info.
--failure-kind <kind>agent_error_rate (add): count only runs blop classify labeled app_error, tool_error, model_error, guardrail_denied or agent_error Values: app_error, tool_error, model_error, guardrail_denied, agent_error.
--sendtest: also deliver a marked test firing to the connected destination
--profile <name>connect: the blop auth profile that delivers firings
--project <id>connect: the hosted project whose Slack route gets them
--disconnectconnect: keep firings local again
Terminal window
blop alerts add --name "Agent failing" --metric agent_error_rate --above 25% --severity critical # Fire when any agent's error rate passes 25% over the last hour
blop alerts add --name "Checkout outcome" --metric app_outcome --below 85% --target app:checkout-web # Watch one app's outcome
blop alerts connect --profile team --project <project-id> # Send firings to the project's Slack route through the hosted app
blop alerts test alr_0123456789abcdef --send # Evaluate now and send a marked test firing

See also: blop map, blop auth.

Show one coding-agent session as an agent graph

Terminal window
blop session [<session-id>|<trace-id>] [--steps] [--view tree|dag] [--limit <n>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--conversation <id>A span-only agent conversation id (with —service)
--service <name>The agent service that carried —conversation
--stepsOne node per step instead of grouping repeats
--view <view>Draw the graph as a box tree or an ASCII flowchart
--limit <n>Maximum graph nodes
Terminal window
blop session # The newest session as an agent tree
blop session ses_8f2 --view dag # As a flowchart
blop session 4bf92f3577b34da6a3ce929d0e0e4736 --steps --json # Every step, machine-readable

See also: blop trace, blop issue, blop open.

Step through one coding-agent session: prompts, model turns, tool calls and edit diffs

Reads one session’s recorded steps in order from the local collector: each prompt, model turn and tool call with its status and timing, and, where the capture policy recorded content, the prompt text, the tool’s input and output, and an edit’s diff. Content stays local: the hosted app shows the same replay without it. A session captured metadata-only or conversation-only says so and prints the command that turns full capture on. Without an id it replays the newest session; —conversation takes a Claude Code or Codex session id (the hook service by default).

Terminal window
blop replay [<session-id>|<trace-id>|--conversation <id> [--service <name>]] [--step <n>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--conversation <id>A hook-captured session id (the host’s session id)
--service <name>The service that carried —conversation (default blop-agent-hook)
--step <n>Only this step, with its full captured content
Terminal window
blop replay # The newest session, step by step
blop replay --conversation 2f1c9a7e-4b1d-4b7e-9f0e-3c6d1a2b8e90 --step 12 # One step of a Claude Code session, with its diff
blop replay ses_8f2 --json # Every step, machine-readable

See also: blop session, blop agents, blop open.

Print one trace as a span tree

Terminal window
blop trace <trace-id> [--include logs] [--web] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--include <list>Also include, comma separated (logs)
--webOpen the trace in the inspector (same as blop open )
Terminal window
blop trace 4bf92f3577b34da6a3ce929d0e0e4736 --include logs # Spans plus their logs
blop trace 4bf92f3577b34da6a3ce929d0e0e4736 --web # Open it in the inspector
blop session <trace-id> # The same trace as an agent graph

See also: blop issue, blop open, blop help query.

Exact retained OTLP metric points and per-series totals

Reads bounded durable metric facts, preserving exact numeric and nanosecond strings. Totals remain per series, with known/unknown provenance; they are never added to span-derived usage. Use —source to isolate an exact recorded source. A missing cost or currency is not inferred.

Terminal window
blop metrics [--session <id>] [--source <key>] [--since 1h|all] [--name <name>] [--worktree <path>] [--limit <n>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--session <id>Exact recorded session ID (not inferred from traces)
--source <key>Exact 64-hex recorded source key
--since <duration>Positive integer duration in s, m, h or d, or all (default 24h)24h
--name <name>Exact metric name
--worktree <path>Exact recorded worktree
--limit <n>Maximum raw points, 1 to 10000 (default 100)100

JSON fields in data: filters, window, points, totals, truncated, limit, revision.

Terminal window
blop metrics --session SESSION --source SOURCE_KEY --since 1h --json # Exact source-scoped metric facts and totals

See also: blop usage, blop open, blop help json.

Token usage per service, agent or model

Sums the token counters already retained on spans (gen_ai.usage., codex.turn.token_usage.). A counter no span reported is unknown, never 0; spans without usage count only in coverage. Input includes cache read/write and output includes reasoning. Cost remains unknown in this span report; blop metrics reads separate recorded metric facts.

Terminal window
blop usage [--since 1h|24h|all] [--service <name>] [--agent <id>] [--group-by service|agent|model] [--limit <n>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--since <duration>Window: a duration such as 1h or 24h, or all (default 24h)24h
--service <name>Only this service
--agent <id>Only spans with this blop.agent.id
--group-by <field>Group by service (default), agent or model Values: service, agent, model.service
--limit <n>Maximum groups, 1 to 100 (default 20)20

JSON fields in data: window, group_by, filters, coverage, totals, cost, groups, truncated, limit.

Terminal window
blop usage # Tokens per service over the last 24 hours
blop usage --since all --group-by model # Tokens per model over everything retained
blop usage --agent codex --json # One agent's tokens as a blop.cli/v1 document

See also: blop traces, blop help json.

Serve issues and sessions to a coding agent over MCP (stdio)

The default local read-only MCP server preserves list_issues, get_issue, get_fix_context and get_session, and adds bounded authored-memory reads without implicit model downloads. It speaks both MCP eras: initialize (2024-11-05 to 2025-11-25) and the stateless 2026-07-28 revision (server/discover, per-request _meta). Each call reads the collector of the client’s project: BLOP_PROJECT_DIR, else CLAUDE_PROJECT_DIR, else the working directory; —url or BLOP_MONITOR_URL pins one. When several collectors run and none matches, a call says which run and how to choose (BLOP_MONITOR_URL); it never guesses. Add it to a coding agent with blop setup mcp (claude, codex, cursor, vscode, opencode, pi, omp, gemini, windsurf, claude-desktop). Use —target web —profile NAME only for the optional official-SDK bridge to hosted management; it preserves actual enabled schemas and browser approvals, never fetches local telemetry through the web, and never automatically retries a write.

Terminal window
blop mcp [--url <collector-url>] [--target web --profile NAME]
FlagDescriptionDefaultEnvironment
--target <target>MCP authority: local (default) or web; local remains read-only Values: local, web.local
--profile <name>Hosted origin/workspace-bound OAuth profile (web target only)
Terminal window
blop setup mcp claude # Register Blop with Claude Code (or any other client)
claude mcp add blop -- blop mcp # By hand; blop must be on PATH
blop setup mcp # List coding agents and whether blop is registered (and up to date) in each

See also: blop setup mcp, blop issues, blop issue.

Start Claude Code with Blop capture wired

Starts Claude Code with its terminal and exit code: ensures the Blop collector runs, wires Claude Code into Blop for this repo when it is not connected yet (its hooks, Blop’s MCP server and the capture binding, project scope, never a prompt; the first launch lists on stderr every file it changed), then runs claude. It fails open: if the collector cannot start or the wiring is refused (a symlinked settings file, drift, a conflicting entry), one warning on stderr names the problem and the fix, and claude starts anyway without capture. To wire an agent without launching it, use blop agents setup and blop setup mcp. Arguments after — go to claude; without —, every argument but —no-connect does. Before —, only —no-connect, -p and —url are accepted. Blop’s help is this page: for Claude Code’s own, run blop claude — —help. A missing claude binary exits 127 with an install hint.

Terminal window
blop claude [--no-connect] [-p <n> | --url <url>] [-- <claude args>]
FlagDescriptionDefaultEnvironment
--no-connectDo not connect Claude Code to Blop first; just start it (capture runs only if it is already connected)
Terminal window
blop claude # Start Claude Code, connected to Blop
blop claude -- --resume abc # Pass arguments to Claude Code
blop claude --no-connect -- --help # Claude Code's own help, without connecting anything

See also: blop agents setup, blop setup mcp, blop run.

Start Codex with Blop capture wired

Starts Codex with its terminal and exit code: ensures the Blop collector runs, wires Codex into Blop for this repo when it is not connected yet (its hooks, Blop’s MCP server and the capture binding, project scope, never a prompt; the first launch lists on stderr every file it changed), then runs codex. It fails open: if the collector cannot start or the wiring is refused (a symlinked settings file, drift, a conflicting entry), one warning on stderr names the problem and the fix, and codex starts anyway without capture. To wire an agent without launching it, use blop agents setup and blop setup mcp. Arguments after — go to codex; without —, every argument but —no-connect does. Before —, only —no-connect, -p and —url are accepted. Blop’s help is this page: for Codex’s own, run blop codex — —help. A missing codex binary exits 127 with an install hint.

Terminal window
blop codex [--no-connect] [-p <n> | --url <url>] [-- <codex args>]
FlagDescriptionDefaultEnvironment
--no-connectDo not connect Codex to Blop first; just start it (capture runs only if it is already connected)
Terminal window
blop codex # Start Codex, connected to Blop
blop codex -- resume --last # Pass arguments to Codex
blop codex --no-connect -- --help # Codex's own help, without connecting anything

See also: blop agents setup, blop setup mcp, blop run.

Start OpenCode with Blop capture wired

Starts OpenCode with its terminal and exit code: ensures the Blop collector runs, wires OpenCode into Blop for this repo when it is not connected yet (its hooks, Blop’s MCP server and the capture binding, project scope, never a prompt; the first launch lists on stderr every file it changed), then runs opencode. It fails open: if the collector cannot start or the wiring is refused (a symlinked settings file, drift, a conflicting entry), one warning on stderr names the problem and the fix, and opencode starts anyway without capture. To wire an agent without launching it, use blop agents setup and blop setup mcp. Arguments after — go to opencode; without —, every argument but —no-connect does. Before —, only —no-connect, -p and —url are accepted. Blop’s help is this page: for OpenCode’s own, run blop opencode — —help. A missing opencode binary exits 127 with an install hint.

Terminal window
blop opencode [--no-connect] [-p <n> | --url <url>] [-- <opencode args>]
FlagDescriptionDefaultEnvironment
--no-connectDo not connect OpenCode to Blop first; just start it (capture runs only if it is already connected)
Terminal window
blop opencode # Start OpenCode, connected to Blop
blop opencode -- --model anthropic/claude-sonnet-4 # Pass arguments to OpenCode
blop opencode --no-connect -- --help # OpenCode's own help, without connecting anything

See also: blop agents setup, blop setup mcp, blop run.

Recall authored memory and read-only Markdown knowledge

Unbound reads use the accountless local graph. An explicit repository binding selects hosted reads across subdirectories/worktrees; —scope local stays offline. Bindings contain no credentials and never upload local files. Writes retain explicit scope/profile requirements and expected revisions; organization policy changes require browser approval.

Terminal window
blop memory <context|search|get|reads|neighbors|history|skills|bind|binding|unbind|markdown|index|add|edit|patch|batch|retire|restore|purge|propose|publish> [flags]
SubcommandPurposeUsage
bindBind this Git repository/worktrees to a verified hosted memory projectblop memory bind --profile NAME --project ID [--json]
bindingInspect credential-free repository memory destination, offlineblop memory binding [--json]
unbindRemove this repository memory destination without deleting knowledgeblop memory unbind [--json]
markdownInitialize, attach, index, list or detach a read-only local Markdown source (no model)blop memory markdown <init|attach|index|list|detach> [folder|attachmentId] [--project ID] [--json]
contextRead live graph contextblop memory context [--text TEXT] [--scope local|organization] [--profile NAME] [--project ID] [--json]
searchRead live graph searchblop memory search [--text TEXT] [--scope local|organization] [--profile NAME] [--project ID] [--json]
getRead one node or bounded document sectionblop memory get <nodeId> [--revision N] [--field SECTION] [--body-offset N] [--body-length N] [--scope organization --profile NAME] [--json]
readsCount which agents read which nodes (ids and counts, never content)blop memory reads [--project ID] [--node ID] [--agent ID] [--range 1h|24h|7d|30d] [--scope organization --profile NAME] [--json]
neighborsRead node neighborsblop memory neighbors <nodeId> [--scope organization --profile NAME] [--limit N] [--cursor CURSOR] [--json]
historyRead node historyblop memory history <nodeId> [--scope organization --profile NAME] [--limit N] [--cursor CURSOR] [--json]
skillsProgressive procedure lookup: list or getblop memory skills <list|get> [nodeId] [--document ID] [--field SECTION] [--scope organization --profile NAME] [--json]
indexExplicitly index memory with current pinned model statusblop memory index [--scope organization --profile NAME] [--project ID] [--json]
addAdd memory with flags or a shared graph change documentblop memory add (--kind KIND --title TEXT --body TEXT [--tags a,b] [--id namespace:name] | --input FILE_OR_DASH) [--project ID] [--scope organization --profile NAME] [--json]
patchExplicit patch using the shared graph change schemablop memory patch --input FILE_OR_DASH [--scope organization --profile NAME] [--project ID] [--idempotency-key KEY] [--expected-policy-revision N] [--json]
editExplicit edit using the shared graph change schemablop memory edit --input FILE_OR_DASH [--scope organization --profile NAME] [--project ID] [--idempotency-key KEY] [--expected-policy-revision N] [--json]
batchExplicit batch using the shared graph change schemablop memory batch --input FILE_OR_DASH [--scope organization --profile NAME] [--project ID] [--idempotency-key KEY] [--expected-policy-revision N] [--json]
retireExplicit retire using the shared graph change schemablop memory retire --input FILE_OR_DASH [--scope organization --profile NAME] [--project ID] [--idempotency-key KEY] [--expected-policy-revision N] [--json]
restoreExplicit restore using the shared graph change schemablop memory restore --input FILE_OR_DASH [--scope organization --profile NAME] [--project ID] [--idempotency-key KEY] [--expected-policy-revision N] [--json]
purgeExplicit purge using the shared graph change schemablop memory purge --input FILE_OR_DASH [--scope organization --profile NAME] [--project ID] [--idempotency-key KEY] [--expected-policy-revision N] [--json]
proposeExplicit propose using the shared graph change schemablop memory propose --input FILE_OR_DASH [--scope organization --profile NAME] [--project ID] [--idempotency-key KEY] [--expected-policy-revision N] [--json]
publishPreview/publish one selected authored node or Markdown snapshotblop memory publish <nodeId> --profile NAME --project ID [--dry-run] [--reviewed-hash SHA256] [--json]
FlagDescriptionDefaultEnvironment
--input <file-or-dash>Finite JSON input file, or - for stdin (maximum 1 MiB)
--idempotency-key <key>Retained unique key for the exact write attempt
--expected-policy-revision <revision>Reviewed live policy revision; stale revisions are rejected
--profile <name>Named origin/workspace-bound OAuth profile (default default)default
--kind <kind>Kind of memory to add: entity, document, finding, decision, rule or procedure; cannot combine with —input Values: entity, document, finding, decision, rule, procedure.
--title <text>Memory title; required with —kind
--body <text>Memory body; required with —kind
--tags <a,b>Comma-separated tags for convenience add
--id <namespace:name>Explicit memory identity; default local: plus SHA-256 of JSON.stringify([title, body]) in UTF-8
--scope <scope>Authority plane: local or organization; overrides repository read binding; organization requires a profile Values: local, organization.local unless bound
--project <id>Explicit project ID selector (not authorization)
--limit <n>Bounded page size
--cursor <cursor>Opaque page cursor
--text <text>Context or search query text
--revision <n>Exact stored node revision
--document <id>Load one document explicitly referenced by the selected procedure
--field <section>Address content or complete metadata JSON without losing omitted references Values: body, whenToUse, procedure, pitfalls, verification, metadata.
--body-offset <n>Content/metadata section offset in Unicode code points
--body-length <n>Maximum section length (1–4,000 Unicode code points; byte limits may shorten it)
--reviewed-hash <sha256>Hash of the exact reviewed publication payload
--dry-runPreview exact selected content without publishing
--agent <id>Agent id recorded with this read (default $BLOP_AGENT_ID); for reads, filter by it
--session <id>Session id recorded with this read (default $BLOP_SESSION_ID)
--node <id>Only reads of this node
--range <range>Read-log window: 1h, 24h (default), 7d or 30d Values: 1h, 24h, 7d, 30d.24h
Terminal window
blop memory context --json # Recall local knowledge without an account
blop memory context --scope organization --profile team --project project-id --json # Read hosted authority explicitly
blop memory reads --range 7d --json # See which agents read which memory nodes
blop memory publish local:finding --profile team --project project-id --dry-run --json # Review the exact payload before sharing

Author, version, label and fetch prompts in a local registry

Local and account-free: no network, no model, no hosted authority. Prompts live in prompts.db beside the telemetry store and never change capture or retention. Versions are immutable and numbered from 1; create always moves the managed latest label. Labels start with a letter, so a label can never be read as a version, and get refuses —version together with —label. A missing prompt, version or label exits 2 with no fallback. get reports its selector’s cache entry: cold (never fetched), fresh (within —cache-ttl and the same version), stale (expired, or the label moved) or disabled (—cache-ttl 0). Up to 10,000 prompts, 1,000 versions and 32 labels each; a full registry exits 4. JSON data (blop.cli/v1): list gives prompts[] of {name, version, versions, labels[{label, version}], sha256, bytes, updated_at} with page {limit, returned, truncated}; get gives name, version, selector {kind, value}, labels, content, sha256, bytes, created_at and cache {status, reason, ttl_seconds, previous_version, previous_fetched_at}; create gives name, version, labels, sha256, bytes, created_at; label gives name, label, version, previous_version.

Terminal window
blop prompts <list|get|create|label> [flags]
SubcommandPurposeUsage
listList prompts, one line each, in name orderblop prompts list [--name <name>] [--label <label>] [--limit <n>] [--json]
getFetch one version by label (default latest) or numberblop prompts get <name> [--version <n> | --label <label>] [--cache-ttl <seconds>] [--json]
createStore the next immutable version from a fileblop prompts create <name> --file <path> [--label <label>] [--json]
labelPoint a label at an existing versionblop prompts label <name> <version> <label> [--json]
FlagDescriptionDefaultEnvironment
--name <name>Only the prompt with this exact name
--label <label>list: only prompts carrying this label; get: fetch the version it names; create: also assign it
--limit <n>Most prompts to list (1-200) (default 50)50
--version <n>Fetch this exact immutable version
--cache-ttl <seconds>Seconds a fetched selector stays fresh (0 disables the cache, maximum 86400) (default 60)60
--file <path>UTF-8 prompt text, or - for stdin (maximum 64 KiB)
Terminal window
blop prompts create support/triage --file triage.md --label staging # Store a new version and label it staging
blop prompts label support/triage 3 production # Promote version 3 to production
blop prompts get support/triage --label production --json # Fetch the production version with its cache status
blop prompts list --label production # One line per prompt that has a production label

See also: blop memory, blop help json.

Detect, configure, or launch a coding agent

Terminal window
blop agents list|status|doctor|info|setup|install-hooks|run|capture-policy|env|hook-config [<id>] [flags]

Aliases: blop agent.

SubcommandPurposeUsage
listDetect installed coding agentsblop agents list
detectDetect installed coding agentsblop agents detect
statusShow detection, selected-scope configuration and capture evidence separatelyblop agents status [--scope global|project] [--project <local-id>]
doctorDiagnose the selected capture scope; never starts a collector or calls a providerblop agents doctor <id> [--scope global|project] [--project <local-id>]
infoInspect one agentblop agents info <id>
setupEnable selected-scope capture or remove owned setup; global is the defaultblop agents setup <id> [--scope global|project] [--project <local-id>] [--capture <mode>] [--collector-url <url>] [--remove]
install-hooksInstall selected-scope user-level hooks for plain launches; preview unless —applyblop agents install-hooks <id> [--scope global|project] [--project <local-id>] [--apply] [--remove]
runLaunch a configured capture scope without changing normal extensionsblop agents run <id> [--scope global|project] [--project <local-id>] -- <host args>
capture-policyRead or change selected-scope capture without deleting historyblop agents capture-policy show|set <id> [--scope global|project] [--project <local-id>] [--mode <mode>] [--exclude <class> ...|--clear-exclusions] [--enabled true|false] [--retention-hours <hours>] [--inject on|off]
envPrint telemetry exports; capture permission follows the selected bindingblop agents env <id> [--scope global|project] [--project <local-id>] [--collector-url <url>]
hook-configPrint hook registration instructionsblop agents hook-config <id>
hookEmit best-effort metadata from a stdin eventblop agent hook --agent <id> [--collector-url <url>] [--timeout-ms <n>]
contextPrint opt-in memory context for a harness to inject (capture-policy —inject on)blop agent context --agent <id> --event session_start|turn_start --session <id>
guardAnswer one tool call against approved guardrail rules (allow prints nothing)blop agent guard --agent <id>
launchLaunch an agent with telemetry injectedblop agent launch <id> [-- args...]
FlagDescriptionDefaultEnvironment
--agent <id>Agent registry ID
--collector-url <url>Exact local collector origin
--project <local-id>Local project binding
--capture <mode>New capture mode; existing choices are preserved when omitted Values: full, conversation-only, metadata-only.
--scope <scope>Capture scope: global (all working directories) or project; defaults global without —project Values: global, project.
--mode <mode>Change capture mode without clearing class exclusions Values: full, conversation-only, metadata-only.
--exclude <class>Exclude a content class; repeat for an explicit exclusion set
--clear-exclusionsExplicitly clear the class exclusion set
--enabled <boolean>Enable or disable this binding without removing its setup Values: true, false.
--retention-hours <hours>Body retention from original observation; integer1–720
--removeRemove matching owned hook setup; install-hooks restores pre-install bytes with —apply
--applyApply native hook changes; otherwise print an exact diff without writing
--inject <on|off>Inject scoped memory context into the harness (Claude Code only; off by default) Values: on, off.

Show whether Blop is running, where, and what it stores

One quick call to the collector this folder resolves to. It shows the URL, how it runs (background, foreground or outside this state dir), pid, instance id, collector and CLI versions, uptime, store, retention and telemetry counts. -o env prints the OTel variables blop run sets as export lines, quoted for eval or an env file. —logs prints the background collector’s log; blop logs is the OTel log query.

Terminal window
blop status [-o text|json|env] [--logs [-f]]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--logsPrint the background collector’s log instead
-f, --followWith —logs: keep printing new lines until Ctrl-C

JSON fields in data: ok, service, version, url, pid, instance_id, collector_id, last_retention, compaction, hook_capture, started_at, workdir, database_path, db_size_bytes, retention_hours, max_db_size_mb, stats, observation, reachable, source_lifecycle, ingestion, running, inspector_url, otlp_endpoint, port, mode, managed, cli_version, collector_version, uptime_ms, log_path, memory_project, mcp_command, connected_agents, storage, last_ingest_at, hooks, failing_run_id, next.

Terminal window
blop status # Where Blop runs, its versions and its store
blop status --json # The same as one blop.cli/v1 document
eval "$(blop status -o env)" # Point this shell's OTel SDKs at Blop

See also: blop up, blop stop, blop doctor.

Stop the background collector

Stops the collector this folder started, or every one with —all, but only collectors recorded in this state dir whose identity checks out: the process, its launch line or its /api/health answer must match the record. It sends SIGTERM, waits up to 5 seconds, then SIGKILL, and removes the record. Nothing running is not an error (exit 0). A collector in the foreground of another terminal is left running (exit 1, press q or Ctrl-C there) unless you pass —force.

Terminal window
blop stop [--all] [--force] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--allStop every collector recorded in this state dir
--forceAlso stop a collector running in the foreground of another terminal

JSON fields in data: collectors, not_running.

Terminal window
blop stop # Stop the collector started from this folder
blop stop --all # Stop every collector this state dir knows
blop stop --force # Also stop one running in another terminal

See also: blop up, blop status.

Check the setup end to end and print the fix for each failure

Terminal window
blop doctor [--profile NAME] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--profile <name>Also verify hosted grant, MCP, capabilities and memory

JSON fields in data: id, category, status, ok, detail, fix, advisory.

Terminal window
blop doctor # Collector, OTLP ingest, git, setup and stitching checks
blop doctor --json # The same checks as one blop.cli/v1 document

See also: blop status, blop help exit-codes.

Show every effective setting and where it came from

Shows each setting once, with its value and its source: the flag, a BLOP_* environment variable, the project .blop/config.json (the older .blop/monitor.json is still read; config.json wins when both exist), the user file $XDG_CONFIG_HOME/blop/config.json (~/.config/blop/config.json when unset), or the default. That is also the order of precedence, first match wins. A project file that sets no port keeps the one shared collector; a project port means a collector and store of its own. Values whose name looks like a credential print as ***.

Terminal window
blop config show [--port <n>] [--host <host>] [--json]
SubcommandPurposeUsage
showShow every effective setting and its sourceblop config show [--port <n>] [--host <host>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
Terminal window
blop config show # Every setting with its source
blop config show --json # The same as data.<key> = {value, source, path}
BLOP_MONITOR_RETENTION_HOURS=48 blop config show # See an environment variable take over

See also: blop init, blop doctor.

Print a shell completion script

Prints a completion script for commands, subcommands, flags and their values, generated from this version of Blop; issue and run ids complete live from the running collector (nothing when it is down). Install it once, and again after upgrading Blop. Bash: add eval ”$(blop completion bash)” to ~/.bashrc. Zsh: add source <(blop completion zsh) to ~/.zshrc, after compinit. Fish: write it to ~/.config/fish/completions/blop.fish.

Terminal window
blop completion bash|zsh|fish
Terminal window
blop completion bash # Bash: add eval "$(blop completion bash)" to ~/.bashrc
blop completion zsh # Zsh: add source <(blop completion zsh) to ~/.zshrc
blop completion fish # Fish: save it as ~/.config/fish/completions/blop.fish

See also: blop help.

Authorize and verify a hosted workspace without passwords

Device login prints the provider’s verification URL and user code, then waits for browser consent. Status verifies current membership/grants online. Logout revokes the remote refresh grant before removing credentials; uncertain revocation is reported separately.

Terminal window
blop auth <login|status|logout> [flags]
SubcommandPurposeUsage
loginAuthorize using the provider device flowblop auth login --app-url URL [--profile NAME] [--scopes SCOPES] [--no-open] [--json]
statusVerify the current grant and workspace onlineblop auth status [--profile NAME] [--json]
logoutRevoke remotely, then remove local credentialsblop auth logout [--profile NAME] [--json]
FlagDescriptionDefaultEnvironment
--profile <name>Named origin/workspace-bound OAuth profile (default default)default
--app-url <url>Hosted HTTPS app origin (loopback HTTP for development)
--scopes <scopes>Space/comma-separated public OAuth scopes; include blop:read. Defaults to all non-admin scopes; request blop:admin explicitly as an owner
--no-openDo not open the device verification page
Terminal window
blop auth login --app-url https://blop.example --profile team # Choose workspace/projects and approve the displayed non-admin access
blop auth login --app-url https://blop.example --profile owner --scopes 'blop:read blop:write blop:execute blop:admin blop:memory:read blop:memory:write' # Explicit owner-only full administrative grant
blop auth status --profile team --json # Verify the grant rather than decoding token claims

Discover and call the enabled hosted operations

Calls use current server schemas, no cached operation list or automatic write retries. Requires-approval is not completion; queued is acceptance, not verification. A policy change is never silently retried with a new revision.

Terminal window
blop cloud <operations|call|action> [flags]
SubcommandPurposeUsage
operationsRead a bounded page of actual enabled schemasblop cloud operations [--profile NAME] [--limit N] [--cursor CURSOR] [--json]
callCall one enabled operation with exact JSON inputblop cloud call <operationId> --input FILE_OR_DASH [--idempotency-key KEY] [--expected-policy-revision N] [--profile NAME] [--json]
actionObserve a durable action (never approve it)blop cloud action <actionId> [--profile NAME] [--json]
FlagDescriptionDefaultEnvironment
--profile <name>Named origin/workspace-bound OAuth profile (default default)default
--input <file-or-dash>Finite JSON input file, or - for stdin (maximum 1 MiB)
--idempotency-key <key>Retained unique key for the exact write attempt
--expected-policy-revision <revision>Reviewed live policy revision; stale revisions are rejected
--limit <n>Catalog page size (1–100) (default 100)100
--cursor <cursor>Opaque next catalog cursor
Terminal window
blop cloud operations --profile team --json # Discover enabled capabilities and schemas
blop cloud call workspace.context --input context.json --profile team --json # Read current authorized workspace context

Preview, then delete one trace, session or source

Without —yes nothing is removed: it prints the exact rows per table (spans, span attributes, logs, metric points/series, observation rows, issues, run links and fully removed session bookmarks) and their stored bytes. IDs are exact, never patterns or names: a 32-hex trace ID, a session ID (with —source when it exists under more than one source) or a 64-hex observation source key. —yes recomputes the same selection and removes it in one bounded transaction, then prints what it removed and any difference. Retention settings and capture policy are not changed.

Terminal window
blop delete --scope trace|session|source --id <id> [--source <key>] [--since <window>] [--yes] [--json]
FlagDescriptionDefaultEnvironment
--scope <kind>What to delete: trace, session or source Values: trace, session, source.
--id <id>The exact trace ID, session ID or source key
--source <key>With —scope session: the exact source key, when the session ID is ambiguous
--since <window>Only evidence that started within this window, e.g. 1h, 7d
--yesApply the deletion; without it the command only previews
--db <path>SQLite database path (env BLOP_MONITOR_DB_PATH)BLOP_MONITOR_DB_PATH

JSON fields in data: preview, scope, counts, bytes, total, traces, limit, planned, delta, not_touched.

Terminal window
blop delete --scope trace --id 4bf92f3577b34da6a3ce929d0e0e4736 # Preview what deleting one trace removes
blop delete --scope trace --id 4bf92f3577b34da6a3ce929d0e0e4736 --yes # Remove it and print the removed counts
blop delete --scope session --id ses_123 --since 1h --json # Preview the last hour of one session as JSON

See also: blop traces, blop status, blop help json.

Services seen in the lookback window

Terminal window
blop services [--summary] [--since <duration>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--summaryReturn the bounded per-service window summary
--since <duration>Lookback window, e.g. 15m, 2h, 1d (default 15m)15m

See also: blop help query.

Authenticated worker observations (also: overview, detail)

Terminal window
blop workers [overview|detail] [--limit <n>] [--json]
SubcommandPurposeUsage
overviewLive bounded overview of observed workersblop workers overview [--machine <id>] [--state <state>] [--limit <n>] [--snapshot <file>] [--json]
detailOne exact worker attemptblop workers detail --machine <id> --worker <id> --attempt <id> --instance <id> --revision <n> [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--limit <n>Maximum rows

See also: blop help query.

Search traces

Terminal window
blop traces [--service <name>] [--status ok|error] [--operation <name>] [--since <duration>] [--duration-min <ms>] [--limit <n>] [--cursor <token>] [attr.key=value] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--service <name>Only this service
--status <status>Only spans with this status: ok or error Values: ok, error.
--operation <name>Only this operation name
--since <duration>Lookback window, e.g. 15m, 2h, 1d (default 15m)15m
--duration-min <ms>Only traces at least this long (ms)
--limit <n>Maximum rows
--cursor <token>Continue from a previous page
--headerPiped output: print the column names first

See also: blop help query.

Search spans

Terminal window
blop spans [--service <name>] [--trace-id <id>] [--operation <name>] [--status ok|error] [--since <duration>] [--limit <n>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--service <name>Only this service
--trace-id <id>Only this trace
--operation <name>Only this operation name
--parent-operation <name>Only children of this operation
--status <status>Only spans with this status: ok or error Values: ok, error.
--since <duration>Lookback window, e.g. 15m, 2h, 1d (default 15m)15m
--limit <n>Maximum rows

See also: blop help query.

Print one span

Terminal window
blop span <span-id> [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST

See also: blop help query.

Search logs

Terminal window
blop logs [--service <name>] [--severity <level>] [--trace-id <id>] [--span-id <id>] [--contains <text>] [--since <duration>] [--limit <n>] [--cursor <token>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--service <name>Only this service
--severity <level>Minimum log severity, e.g. WARN
--trace-id <id>Only this trace
--span-id <id>Only this span
--contains <text>Log body contains this text
--since <duration>Lookback window, e.g. 15m, 2h, 1d (default 15m)15m
--limit <n>Maximum rows
--cursor <token>Continue from a previous page

See also: blop help query.

Logs of one trace

Terminal window
blop trace-logs <trace-id> [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--since <duration>Lookback window, e.g. 15m, 2h, 1d (default 15m)15m
--limit <n>Maximum rows
--cursor <token>Continue from a previous page

See also: blop help query.

Logs of one span

Terminal window
blop span-logs <span-id> [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--since <duration>Lookback window, e.g. 15m, 2h, 1d (default 15m)15m
--limit <n>Maximum rows
--cursor <token>Continue from a previous page

See also: blop help query.

Aggregate traces

Terminal window
blop trace-stats <groupBy> <count|avg_duration|p95_duration|error_rate> [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--group-by <field>Group by this field
--agg <agg>Aggregation
--service <name>Only this service
--status <status>Only spans with this status: ok or error Values: ok, error.
--operation <name>Only this operation name
--duration-min <ms>Only traces at least this long (ms)
--since <duration>Lookback window, e.g. 15m, 2h, 1d (default 15m)15m
--limit <n>Maximum rows

See also: blop help query.

Aggregate logs

Terminal window
blop log-stats <groupBy> [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--group-by <field>Group by this field
--agg <agg>Aggregation
--service <name>Only this service
--trace-id <id>Only this trace
--span-id <id>Only this span
--contains <text>Log body contains this text
--since <duration>Lookback window, e.g. 15m, 2h, 1d (default 15m)15m
--limit <n>Maximum rows

See also: blop help query.

Distinct values of a field

Terminal window
blop facets <traces|logs> <field> [--key <name>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--type <type>Facet source: traces or logs Values: traces, logs.
--field <field>Facet field
--key <name>Attribute key for attribute facets
--service <name>Only this service
--since <duration>Lookback window, e.g. 15m, 2h, 1d (default 15m)15m
--limit <n>Maximum rows

See also: blop help query.

Deterministic audit against a baseline

Terminal window
blop audit [--service <name>] [--since <duration>] [--baseline <duration>] [--duration-min <ms>] [--fail-on error|regression|never] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--service <name>Only this service
--since <duration>Lookback window, e.g. 15m, 2h, 1d (default 15m)15m
--baseline <duration>Baseline window to compare against
--duration-min <ms>Only traces at least this long (ms)
--fail-on <when>Exit 1 on this audit outcome: error, regression or never (default) Values: error, regression, never.never

See also: blop help query.

Status and the next step

Starts the collector in the background when it is stopped, then prints where Blop runs, what is connected and stored, and one next command. It never stays in the foreground and never asks a question; —detach and —no-open are accepted for compatibility and have no effect (it always detaches and never opens the browser); —foreground is rejected (exit 2). blop up is the foreground collector with its banner and keys.

Terminal window
blop [--port <n>] [--host <host>] [--project <id>] [--recover] [--compact] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--project <id>Default authored-memory project (otherwise BLOP_PROJECT_ID, then all local projects)
--detachStart in the background and return once it answers
--foregroundStay in this terminal, even for an agent or a pipe
--no-openDo not open the inspector (also BROWSER=none)
--recoverIf the store is corrupt or from a newer Blop, move it aside (renamed, never deleted; the check may already have merged a pending WAL into it) and start an empty one
--compactBefore starting, evict to the size cap and VACUUM the store so deleted space returns to the disk (needs twice the store size free; refused while a collector serves it)

JSON fields in data: inspector_url, otlp_endpoint, mcp_command, connected_agents, storage, retention_hours, version, last_ingest_at, hooks, failing_run_id, next.

Terminal window
blop # Start Blop if it is stopped, show its status and the next step
blop -p 28100 # The same on another port

See also: blop up, blop status.

Old names for up, stop and status, plus init

Terminal window
blop monitor init|start|stop|status [--port <n>] [--db <path>] [--detach] [--json]
SubcommandPurposeUsage
initInitialize project-local monitor configblop monitor init [--port <n>]
startNow blop up —foreground (or blop up —detach)blop monitor start [--host <host>] [--port <n>] [--db <path>] [--project <id>] [--detach] [--recover]
stopNow blop stopblop monitor stop [--json]
statusNow blop statusblop monitor status [--json]
daemonNow blop up —detachblop monitor daemon [--project <id>] [--json]
FlagDescriptionDefaultEnvironment
--host <host>Collector host (default 127.0.0.1, env BLOP_MONITOR_HOST)127.0.0.1BLOP_MONITOR_HOST
--db <path>SQLite database path (env BLOP_MONITOR_DB_PATH)BLOP_MONITOR_DB_PATH
--project <id>Default authored-memory project (otherwise BLOP_PROJECT_ID, then all local projects)
--detachSame as blop up —detach
--recoverSame as blop up —recover
Terminal window
blop monitor start --detach # Now blop up --detach
blop monitor stop # Now blop stop

See also: blop up, blop stop, blop status.

Print the Blop version

Terminal window
blop version [--json]

JSON fields in data: version, node.

Terminal window
blop version --json # The version as a blop.cli/v1 document

Print the JSON Schema of the —json output (blop.cli/v1)

Without a name, lists the schemas. With one, prints that JSON Schema (draft 2020-12) as it ships in the package under schema/: envelope, error, or the data of a command (issues, issue, run, status, tail, …).

Terminal window
blop schema [<name> | <command>] [--json]

JSON fields in data: schemas, name, id, schema.

Terminal window
blop schema # List the schemas
blop schema envelope # The document every --json prints
blop schema issues # The data schema of blop issues (blop schema tail for tail lines)

See also: blop help json.

Browser Harness flow checks: test, watch, list, init

Flow checks drive a browser through Browser Harness and need no hosted Blop account. HTTPS production targets are supported. Use test-safe accounts and data, and only target systems you are authorized to test.

Terminal window
blop flow test|watch|list|init [patterns...] [flags]
SubcommandPurposeUsage
testRun Browser Harness-backed flow checksblop flow test [patterns...] [flags]
watchRe-run flow checks when specs changeblop flow watch [patterns...] [flags]
listList discovered flow checksblop flow list [patterns...] [--config <file>]
initCreate a starter flow specblop flow init [file] [--force] (default tests/homepage.blop.ts)
FlagDescriptionDefaultEnvironment
-u, --base-url <url>Base URL for the app under test (local, CI, staging, or HTTPS production)
--report-dir <dir>Report output directory (default .blop).blop
--coverageCollect executed JavaScript source coverage (Chromium only)
--coverage-endpoint <url>Send coverage to this local collector base URL (requires —coverage)
--progress-file <file>Append live NDJSON progress (test_start, action, frame, test_finish)
--capture-screenshotsSave a screenshot after each browser action (and stream live frames)
--no-streamDisable the live CDP screencast (use per-action screenshots)
--frame-interval <ms>Min ms between streamed frame progress lines (default 200)200
--forceinit/add: overwrite an existing spec without asking
--headedRun browser headed
--browser <name>Browser to run: chromium, camoufox, firefox or webkit Values: chromium, camoufox, firefox, webkit.
--containerizedRun the browser in a separate warm Docker container
--viewport <size>Viewport as WIDTHxHEIGHT, for example 390x844
-c, --config <file>Config file path
--provider <provider>Agent provider for the native agent loop (env BLOP_AGENT_PROVIDER)BLOP_AGENT_PROVIDER
--model <model>Agent model for the native agent loop (env BLOP_AGENT_MODEL)BLOP_AGENT_MODEL
--api-key <key>Agent API key for the native agent loop (env BLOP_AGENT_API_KEY)BLOP_AGENT_API_KEY
--max-steps <n>Optional hard cap on agent tool steps
--workers <n>Run up to this many agent tests concurrently (default 1)1
-r, --reporter <reporter>Report format: basic, json, junit or all Values: basic, json, junit, all.
--otel-endpoint <url>OTLP/HTTP endpoint for flow telemetry; setting it turns export on (env OTEL_EXPORTER_OTLP_ENDPOINT)OTEL_EXPORTER_OTLP_ENDPOINT
--otel-service-name <name>service.name on exported spans (default blop-runner, env OTEL_SERVICE_NAME)blop-runnerOTEL_SERVICE_NAME
--otel-environment <name>deployment.environment.name on exported telemetry
--otel-propagateSend W3C traceparent to the app under test (also BLOP_OTEL_PROPAGATE_TO_APP=1)BLOP_OTEL_PROPAGATE_TO_APP
--otel-propagate-allowlist <hosts>Comma-separated hosts allowed to receive it (env BLOP_OTEL_PROPAGATE_ALLOWLIST)BLOP_OTEL_PROPAGATE_ALLOWLIST
-v, --verbosePrint agent stream events in real time
Terminal window
blop flow test tests/checkout.blop.ts --base-url http://localhost:3000 # Run one spec against a local app
blop flow init # Create tests/homepage.blop.ts

See also: blop help environment.

CodeLabelMeaning
0okSuccess
1failureThe command ran and reported a failure (an audit threshold, a failed doctor check), or the collector failed while answering
2usage errorUsage error: unknown command or flag, bad value, port taken, invalid project config, a prompt under —no-input. Nothing was sent
3Blop not runningBlop is not running at the resolved URL. Start it with blop up
4query rejectedThe collector rejected the query, for example an unknown issue id
5timeoutThe collector did not answer in time
6could not verifyCould not verify (blop init, blop setup mcp): the result could not be confirmed, or nothing was written because it would not work
78store unrecoverableStore unrecoverable or incompatible. Do not retry; run blop up —recover
127not foundThe command was not found: blop run’s wrapped command, or the agent binary a launcher (blop claude, codex, opencode) starts
129hangupThe terminal closed (SIGHUP) before the command finished
130interruptedInterrupted (Ctrl-C)
143terminatedStopped by SIGTERM (for example blop stop or kill) before the command finished

blop run and the launchers (blop claude, codex, opencode) exit with the child’s own code, or 128+N when it dies from signal N.

VariableDescriptionFlag
BLOP_MONITOR_PORTCollector port (default 27811)--port
BLOP_MONITOR_URLCollector URL--url
NO_COLORDisable colour--no-color
BLOP_NO_INPUTNever prompt; a question exits 2--no-input
BLOP_DEBUGPrint stack traces--debug
BLOP_MONITOR_DB_PATHLocal collector database (otherwise project/environment configuration)--db
BLOP_MONITOR_HOSTCollector host (default 127.0.0.1)--host
BLOP_AGENT_PROVIDERAgent provider for the native agent loop--provider
BLOP_AGENT_MODELAgent model for the native agent loop--model
BLOP_AGENT_API_KEYAgent API key for the native agent loop--api-key
OTEL_EXPORTER_OTLP_ENDPOINTOTLP/HTTP endpoint for flow telemetry; setting it turns export on--otel-endpoint
OTEL_SERVICE_NAMEservice.name on exported spans (default blop-runner)--otel-service-name
BLOP_OTEL_PROPAGATE_TO_APPSend W3C traceparent to the app under test--otel-propagate
BLOP_OTEL_PROPAGATE_ALLOWLISTComma-separated hosts allowed to receive it--otel-propagate-allowlist
VariableDescriptionDefault
FORCE_COLORColour even in a pipe; 0 turns it off. Wins over NO_COLOR
CLICOLOR_FORCEColour even in a pipe, unless NO_COLOR is set
CLICOLOR0 turns colour off
COLUMNSTable width when stdout is not a terminal that reports one
BLOP_FORCE_TTY1 prints the terminal layout (aligned tables) into a pipe
FORCE_HYPERLINK1 or 0 turns clickable ids (OSC 8) on or off
BROWSERnone: blop up and blop open never open a browser (blop open prints the URL). Any other value is the command that opens one
BLOP_AGENTName of the coding agent running blop, or 0 for none. Without it Blop reads AI_AGENT, CLAUDECODE, CODEX_THREAD_ID, CURSOR_AGENT, OPENCODE, GEMINI_CLI and other agents’ own variables. An agent gets no prompts

Collector and inspector (blop up, blop monitor)

Section titled “Collector and inspector (blop up, blop monitor)”
VariableDescriptionDefault
BLOP_MONITOR_STATE_DIRWhere the collector registry, PID and log files live
BLOP_MONITOR_RETENTION_HOURSHours of telemetry the store keeps720
BLOP_MONITOR_MAX_DB_SIZE_MBStore size cap in MB; the oldest data goes first1024
BLOP_MONITOR_OPENtrue or false: whether the inspector opens on start (blop config show lists it)true
BLOP_MONITOR_CAPTURE_CONTENTtrue or false: whether prompt and response content is captured (blop config show lists it)false
BLOP_MONITOR_RETENTION_INTERVAL_SECONDSSeconds between retention passes
BLOP_MONITOR_RETENTION_TRACE_BATCHTraces deleted per retention pass
BLOP_MONITOR_RETENTION_LOG_BATCHLogs deleted per retention pass
BLOP_MONITOR_TRACE_LOOKBACK_MINUTESCollector-side lookback in minutes when a query names none
BLOP_MONITOR_TRACE_LIMITCollector-side trace rows when a query sets no limit
BLOP_MONITOR_LOG_LIMITCollector-side log rows when a query sets no limit
BLOP_LEDGER_POLICY_FILEPrivate operator policy file for worker ledgers
BLOP_SOURCE_POLICY_FILEPrivate capture-consent policy file for application and filelog sources
BLOP_AGENT_PROVIDERModel provider for the inspector chat
BLOP_AGENT_MODELModel for the inspector chat
BLOP_AGENT_API_KEYAPI key for the inspector chat
BLOP_PROJECT_IDDefault authored-memory project at collector startup (overridden by —project); also the hosted project receiving flow results
BLOP_PROJECT_DIRblop mcp: the project whose collector to read (user-scope Cursor and VS Code entries set it to ${workspaceFolder}); else CLAUDE_PROJECT_DIR, else the working directory
CLAUDE_PROJECT_DIRblop mcp: set by Claude Code for the servers it starts; the project when BLOP_PROJECT_DIR is unset
BLOP_MCP_VERIFYInternal, set by blop setup mcp for its start check; do not set it. blop mcp then contacts no collector and every tool call says so
BLOP_MCP_HANDSHAKE_TIMEOUT_MSblop setup mcp: how long to wait for blop mcp to answer its start check (10000, or 20000 for npx)
VariableDescriptionDefault
BLOP_RUN_KILL_GRACE_MSMilliseconds the command has to exit after blop run forwards a SIGTERM or SIGHUP, before it is SIGKILLed10000
VariableDescriptionDefault
BLOP_AGENT_BASE_URLBase URL of the agent model API, for any provider
BLOP_OTEL_TEAMTeam name recorded on flow runs
BLOP_INGEST_URLHosted Blop ingest URL for flow results
BLOP_INGEST_SECRETHosted Blop ingest secret for flow results
BLOP_TRIGGERWhat started the flow run (for example ci), sent with results
BLOP_RUN_IDRun id to report results under, when CI dispatched the run
OTEL_EXPORTER_OTLP_PROTOCOLhttp/protobuf (default) or http/json for flow telemetry
OTEL_EXPORTER_OTLP_HEADERSHeaders sent with flow telemetry, key=value pairs
OTEL_EXPORTER_OTLP_TIMEOUTExport timeout in ms for flow telemetry
OTEL_EXPORTER_OTLP_<SIGNAL>_*Per-signal ENDPOINT, PROTOCOL, TIMEOUT and HEADERS, where SIGNAL is TRACES, METRICS or LOGS
OTEL_RESOURCE_ATTRIBUTESservice.name and deployment.environment.name when no flag sets them

Opencode (blop setup opencode, blop opencode)

Section titled “Opencode (blop setup opencode, blop opencode)”
VariableDescriptionDefault
BLOP_OPENCODE_BINOpenCode executable to configure and launch
BLOP_OPENCODE_SETUP_PATHWhere blop setup opencode records its state
BLOP_OTLP_ENDPOINTCollector the Blop OpenCode plugin exports to (else OTEL_EXPORTER_OTLP_ENDPOINT)
OTEL_EXPORTER_OTLP_TRACES_HEADERSIgnored by the Blop OpenCode plugin, which never sends OpenCode’s own headers to Blop

Set for the command blop run starts (otel_* only when unset)

Section titled “Set for the command blop run starts (otel_* only when unset)”
VariableDescriptionDefault
OTEL_EXPORTER_OTLP_ENDPOINTThe collector’s OTLP endpoint (always set)
BLOP_OTLP_ENDPOINTSame endpoint, for the Blop OpenCode plugin (always set)
OTEL_RESOURCE_ATTRIBUTESblop.run.id, the git branch, commit and dirty flag, and blop.trigger.kind/id (plus blop.trigger.person, git user.name, on a manual run to a local collector), merged into yours
BLOP_TRIGGER_KINDWhat started the run (—trigger, detected CI, else manual), so agents and hooks it starts keep it; BLOP_TRIGGER (as blop flow reads it) is honoured too
BLOP_TRIGGER_IDThe schedule or CI run id (—trigger-id, or the CI’s run id)
BLOP_TRIGGER_PERSONgit user.name on a manual run to a local collector; never set otherwise
OTEL_SERVICE_NAMEThe package.json name, else the folder name
OTEL_TRACES_EXPORTERotlp
OTEL_LOGS_EXPORTERotlp
OTEL_EXPORTER_OTLP_PROTOCOLhttp/protobuf
OTEL_BSP_SCHEDULE_DELAY1000, so spans reach Blop within a second
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENTtrue, with —capture-content only
OTEL_LOG_USER_PROMPTS1, with —capture-content only
BLOP_LOCAL_RUN_IDThe run’s id (set with or without a collector). A blop run inside it joins that run while its blop runs, and a bare blop run there is refused
BLOP_LOCAL_RUN_PIDThe pid of the blop run that owns BLOP_LOCAL_RUN_ID; with BLOP_LOCAL_RUN_START it tells a live run from an ended one
BLOP_LOCAL_RUN_STARTThat process’s start identity, so a reused pid does not count as the run
BLOP_LOCAL_RUN_DEPTHHow many blop runs enclose the command; at 8, blop run refuses to start another
TRACEPARENTThe run’s root span, so the command’s spans join the run
CLAUDE_CODE_ENABLE_TELEMETRY1, so Claude Code exports its telemetry
VariableDescriptionDefault
OTEL_EXPORTER_OTLP_ENDPOINTThe collector’s OTLP endpoint
BLOP_OTLP_ENDPOINTThe same endpoint, for the Blop OpenCode plugin
OTEL_RESOURCE_ATTRIBUTESThe project namespace, merged into yours
VariableDescriptionDefault
BLOP_MONITOR_INSTANCE_IDIdentity the managed collector reports, so blop can verify it
BLOP_MONITOR_STATE_DIRThe state directory the managed collector was started with

Every command prints a blop.cli/v1 document with --json.

FieldMeaning
schema_versionAlways blop.cli/v1 for this shape
commandThe command that ran, or null when it was not recognised
generated_atWhen the document was made (ISO 8601, UTC); setup doctor uses a documented fixed epoch sentinel, not the audit time, for deterministic output
oktrue exactly when the exit code is 0. blop run is the one exception: true when the wrapped command started, whatever its exit code (data.exit_code)
dataThe result. blop help lists its JSON FIELDS. It may be kept on a failure, for example doctor’s checks
pageFor lists: limit, lookback, returned, truncated, coverage and next_cursor. null otherwise
warningsNotes that did not stop the command: a list of {code, message}
nextCommands worth running next, most useful first: a list of {command, when}. On a failure, the same list as error.next
errorOnly when ok is false: code, message, hint, docs and next
FieldMeaning
codeStable snake_case id to branch on, for example collector_not_running
messageOne sentence for a person
hintA command to run or one sentence, or null
docsA link with more detail, or null
nextSteps worth trying, most useful first: a list of {command, when}