Every step, nested
Model calls, tool runs, retrievals and your own functions on one waterfall, nested the way your code ran them. Streaming included.
Every model call, tool run, token and cent your app or coding agent spends, on one timeline. When something breaks, you see exactly where. One npm install, a dashboard on localhost, no account.
npx blackbox-recorder
Model calls, tool runs, retrievals and your own functions on one waterfall, nested the way your code ran them. Streaming included.
Tokens and dollars per call, per run, per day, per model. Cache reads counted. Claude Code's own cost wins when it reports one.
Failed calls, tool errors and rejected tools light up red. Search across prompts, outputs and error messages.
// Anthropic or OpenAI const claude = wrap(new Anthropic());
score('grounded', 1) from code, 👍/👎 from the dashboard. Attach them to any run.
Recordings are plain JSON lines in ~/.blackbox. No account, no cloud, no telemetry, no Docker. Delete the folder and it's gone.
Coding agents speak OpenTelemetry. Point them at Blackbox and every session becomes one trace: your prompts, each model call with tokens and cost, every tool run, every tool you rejected.
export CLAUDE_CODE_ENABLE_TELEMETRY=1 export OTEL_LOGS_EXPORTER=otlp export OTEL_EXPORTER_OTLP_PROTOCOL=http/json export OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4500 export OTEL_LOG_USER_PROMPTS=1 # optional
# ~/.codex/config.toml [otel] log_user_prompt = true exporter = { otlp-http = { endpoint = "http://127.0.0.1:4500/v1/logs", protocol = "json" } }
export OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4500 export OTEL_EXPORTER_OTLP_PROTOCOL=http/json # spans with gen_ai.* attributes become model calls
why did my last agent run fail?
blackbox · recent_errors
Blackbox ships an MCP server. Add it once and ask in plain words: what failed, what it cost, what happened in that run.
claude mcp add blackbox -- npx -y blackbox-recorder mcprecent_traces runs with status, time, tokens, costget_trace the step-by-step of one runrecent_errors what failed and whyspend cost by day and modelexperiments eval scoresRun your prompt or agent over a dataset, score every answer, compare runs side by side. Exact match, regex, JSON, length, or an LLM judge.
import {evaluate, scorers} from 'blackbox-recorder'; await evaluate({ name: 'support-v2', dataset: 'support-golden', task: ({input}) => agent(input), scorers: [scorers.contains(), scorers.llmJudge({client})], });
npx blackbox-recorderDashboard on http://127.0.0.1:4500. Try demo for sample runs.
import {wrap, trace} from 'blackbox-recorder'; const ai = wrap(new OpenAI());
Or point Claude Code / Codex at it. No code at all.
Runs land live. Click one for the timeline, inputs, outputs, tokens and cost of every step. tail streams them in your terminal.
launching soonETH sent to the burner can only ever become burned tokens: it buys $BBX (on the Pons curve, or the pool after graduation) and sends it to the dead address. No owner, no withdraw. Anyone can press burn.
The tool is free and open source either way; the token is optional. Nothing here is financial advice. Memecoins are volatile and can go to zero.
Nowhere. Blackbox writes JSON lines to ~/.blackbox/events.jsonl on your machine and serves the dashboard on 127.0.0.1. Set BLACKBOX_DIR to move it, BLACKBOX_DISABLED=1 to pause.
One small file append per step. Recording never throws into your code: if it can't write, it skips.
Anthropic messages.create, OpenAI chat.completions and responses, streaming or not, plus anything that exports OpenTelemetry with gen_ai.* attributes. Costs use list prices; override any model in ~/.blackbox/prices.json.
Any app that exports OpenTelemetry (Python included, via OpenLLMetry or OpenInference) can send to /v1/traces as JSON. A native Python SDK is on the list.
Each session is one trace named "Claude Code session", with the prompt, every model call (tokens and the cost Claude Code reports) and every tool run. Turn on OTEL_LOG_USER_PROMPTS=1 to see prompt text.
It's the community coin for the project, launched on Pons on Robinhood Chain. ETH sent to the BlackboxBurner contract buys it and burns it. The software doesn't need it.