Experience your product and talk naturally — “this button does nothing”. Witness welds every word to the causal evidence of that exact second, then hands the package to your AI coding agent.
A human notices “the button fades weirdly when I scroll” in two seconds. Writing that up for an AI agent takes ten minutes of screenshots, element selectors and prompt crafting — and the result still loses the why. Voice is the cheapest annotation channel there is; it just never had a recorder.
This is a real recorded session — speech, marking, the dead click, the save. The Pay button below produces nothing, and that absence is captured as fact.
wit start <dev-url> opens a managed browser. From that moment, three streams run in parallel — zero manual work:
Each spoken fragment becomes a block on a timeline with the causal facts of that moment attached — the “causal burst”. Click a quote:
wit mcp — evidence as an API.Instead of a static dump, the session becomes a stdio MCP server. Point any MCP-capable agent at it and it queries exactly the evidence it needs:
list_saysevents_aroundget_dom_stateget_errorsget_shot / get_bodysession_mdget_asr / set_asr…of 12 registered tools — the session is a queryable API, not a dump.
The packet is self-describing and lock-in free. Two paths, picked per agent capability:
wit config asr). No API key needed; LLM polish is an optional layer, never the pipeline.WIT_NO_BODIES for sensitive apps.You could type the bug report, or attach a video. Here's where each approach actually lands:
| A written report | A screen recording | Witness | |
|---|---|---|---|
| Cost to file one issue | ≈10 min: shots, crops, careful words | a few min — but rewatched every read | say it once, evidence attached |
| Agent can act on it | only what you remembered to write | pixels — a human re-derives context | session.md + events.jsonl + MCP |
| “Clicked → nothing” | easy to forget | invisible on video | captured as evidence |
| Causal burst per click | — | — | req / res / console / DOM in ~1.8s |
| Rewind the page state | — | video ≠ DOM | rrweb full-DOM replay |
| Stays on your disk | — | depends where it uploads | always — .witness/sessions |
N. Hand the session to an agent, or attach review.html to the ticket.wit session instead of a screenshot: selector, console and network arrive in one self-describing folder.Node 18+ and a system Edge or Chrome — Witness prefers your real browser and only falls back to bundled chromium. npm i -g github:wookat/witness, done.
The evidence packet stays in .witness/sessions/ on your disk, gitignored by default. Live captions stream mic audio to the ASR engine you pick (doubao-web by default); --asr sr uses the OS/browser recognizer, --asr off skips live text entirely. The final transcript goes to bcut (free) or whisper with your own OPENAI_API_KEY — --no-transcribe skips that too. Optional LLM layers (correction, association) only run when you pass the flag and set a key.
Any agent that can run a CLI can read session.md + PROMPT.md. MCP-capable ones (Devin, Claude Code, Cursor, Codex…) connect to wit mcp — 12 tools to query evidence on demand instead of one static dump. Devin also gets a native skill that drives the whole recording flow.
Password fields are masked across four channels, POST bodies redact credential fields, P freezes everything mid-session including the mic, and WIT_NO_BODIES=1 drops response capture entirely for sensitive apps.
--lang sets the recognition language (zh-CN default, e.g. en-US). Your words always land verbatim — ASR mistakes stay auditable; LLM correction is an opt-in display layer.
Any URL — it's a real managed browser you drive normally, so logins work. It's sharpest on local dev, where the agent can see the source while it fixes.
events.jsonl streams to disk line by line; at most the last few hundred milliseconds are lost. wit recover <dir> rebuilds session.md, review.html and PROMPT.md from the stream.
MIT, no accounts, no required keys. Free ASR engines are the default path; paid-model hooks are bring-your-own-key and optional.
You give instructions; your agent runs the commands. Witness is a CLI (wit) that agents drive — it opens a managed browser, records, and hands back a local evidence package: review.html for you, session.md/PROMPT.md/wit mcp for the agent. Node 18+, system Edge/Chrome, no cloud, no keys.