When Claude Code, Cursor, Copilot, or ChatGPT in your browser hangs, watson tells you who to blame: your network, your machine, or the provider. It reads timing, never content. No decryption. Nothing leaves your laptop.
Native clients and web chatbots land in the same log, scored against the same baselines, so you can compare Claude Code with Claude in a browser tab.
Recognises each app by the process that owns the connection, and the provider by the TLS server name.
AppsRecords when each streamed chunk arrived and how big it was. Passive capture adds round-trip and retransmit evidence where it can see the connection.
Any Chromium browserBrowser caveat: over HTTP/3 (QUIC), or on a connection opened before watch started, the network is hidden. You still get the exact first byte, duration and pauses, but the score falls back to time-to-first-byte only and is marked ~. For full network evidence, start watch first, then relaunch the browser.
Ask them in this order. Most "slow AI" complaints are settled by question two.
Check round-trip time and retransmits against your normal. Only touch Wi-Fi, VPN or ISP if they're off.
Long time-to-first-byte or provider wait on a healthy path means the provider is the bottleneck. Nothing local will fix it.
Network fine, service fine, still slow? The time is going somewhere off the wire: local tools, model thinking, or giant context.
On an encrypted stream, a thinking model and a stalled network look identical. watson checks what else was happening during every pause over 1 second, in this order:
A retransmit or an RTT spike big enough to explain the pause.
The same app was talking to non-AI hosts. A heuristic, labelled as one.
System CPU above 90% during the pause.
None of the above. Healthy path, idle machine. The service was working.
Each response also gets a 0–100 Transport Score against your own rolling baseline per provider and app: connection health 35%, TTFB 30%, network stalls 25%, setup 10%. Provider wait never counts against it.
Roughly 960 interactions across Claude Code, Claude Desktop, ChatGPT, Codex and VS Code, before browser support landed.
"Other" is time with nothing on the network: a tool running, the model deciding, or you. No network fix touches it.
watson serve: tiles vs your normal, every interaction split into setup, round-trip, server time, provider wait, stall and transfer, plus the worst offenders.One Go binary plus an optional browser extension. macOS and Linux. Capture needs root; the live page doesn't.
# build $ go build -o watson ./cmd/watson # terminal 1: watch every AI response on this machine $ sudo ./watson watch --min-duration 1 # terminal 2: open the live page it prints $ ./watson serve # optional, for web chatbots: in any Chromium browser # chrome://extensions → Developer mode → Load unpacked → extension/
watson watch: one row per response. SILENT 1N 2P = one network stall, two provider waits.Known blind spots: no tokens or model names; QUIC/HTTP3 hides retransmits and RTT; corporate VPNs and Zscaler tunnels hide destinations (watson detects this and tells you which interface to capture on instead).
Profiles for bulk transfer, real-time media, remote sessions and push are coming, so the same question works for any desktop or web app.