span 00 · page.load // trace viewer for llm pipelines

Put every agent run under the lens.

WideScope turns raw OTLP, Jaeger, and OpenInference JSON into flame graphs, timelines, token costs, and side-by-side diffs — parsed by Rust / WASM, rendered at 60 fps, and never leaving your browser tab.

No backendNo uploadNo telemetryMIT licensed
OTLP resourceSpans Jaeger data[].spans OpenInference spans gen_ai.* OTel semconv langchain.* attributes llm.* OpenInference OpenTelemetry SDK LangGraph LlamaIndex Arize Phoenix Anthropic SDK OpenAI SDK OTLP resourceSpans Jaeger data[].spans OpenInference spans gen_ai.* OTel semconv langchain.* attributes llm.* OpenInference OpenTelemetry SDK LangGraph LlamaIndex Arize Phoenix Anthropic SDK OpenAI SDK

span 01 · inspect // 412 ms

From raw JSON to X-ray in one paste.

Drag a file, paste from clipboard, or point at a hosted URL. WideScope parses multi-MB traces progressively, then gives you four synchronized lenses on the same run — plus an LLM-aware sidebar that speaks your instrumentation's dialect.

Flame graph

Canvas-rendered with level-of-detail collapsing — smooth on traces with tens of thousands of spans.

Timeline lanes

Spans grouped per service with virtualized rows — see concurrency and dead air instantly.

Waterfall & critical path

Cascade view with the critical path highlighted, self-time computed, cycles detected.

Service graph

Who calls whom, how often, and how slowly — plus filters by service, status, kind, and duration.

span llm.call · generate · 519 msOK
resolved · gen_ai.* → llm
gen_ai.request.modelclaude-sonnet-4-6
gen_ai.usage.input_tokens0
gen_ai.usage.output_tokens0
cost.estimate$0.0119
tool_callssearch_docs(query=…)
token budget
prompt 2,047completion 412ctx 8,192
completion preview
“Based on the retrieved context, the regression traces to the reranker batch size…

span 02 · diff // baseline vs candidate

Totals lie.
Diffs don't.

Load two runs side by side. This release looks 1% faster overall — until the diff shows the reranker quietly regressing , masked by an LLM win. WideScope catches what dashboards average away.

baseline v1.2.0 · 2,431 ms candidate · v1.2.0 total 2,431 ms±0.0%
ingestparse + build
180 ms · ±0%174 ms · −3%
embed.queryretriever
95 ms · ±0%89 ms · −6%
vector.searchretriever
310 ms · ±0%298 ms · −4%
rerankbatch=64 → 4
148 ms · ±0%612 ms · +314%
llm.callprompt trimmed
1,420 ms · ±0%978 ms · −31%
streamsse
240 ms · ±0%233 ms · −3%

also diffs tokens, cost, and span counts — open two traces, or one trace against yesterday's share link.


span 03 · privacy // zero egress

Your traces never leave the tab.

Prompts and completions are the most sensitive logs you have. WideScope is a static page plus a WASM binary — there is no server to trust, because there is no server at all.

0
servers

Static files on a CDN. Parsing, layout, and rendering all happen in-process, in your tab.

0
uploads

No ingest endpoint exists. Drag in a 50 MB trace on a plane — it works exactly the same.

0
telemetry

The trace viewer that doesn't trace you. No cookies, no analytics, no runtime fetches.

0fps
rust → wasm

A Rust core parses and lays out tens of thousands of spans without dropping a frame.

share a whole trace as a link — DEFLATE-compressed into the URL fragment, which browsers keep client-side. deep-link straight to view=diff&span=…


span 04 · ship // 0 install · 0 signup

Stop tailing JSON.
Start scoping.

It's a URL, not a platform. Open it, paste a trace, and you're inspecting spans before your terminal finishes scrolling.