Element-anchored reports
Every report is pinned to a real DOM element — CSS selector plus the React component path — so an agent opens the right file instead of guessing.
Non-technical UAT testers point at what’s wrong. Their reports — element anchor, screenshots, console and network evidence — land as an agent-ready queue your Claude Code works through over MCP, and close with the commit SHA that fixed them.
The loop
Four steps, no bug-tracker busywork in between. This is the real sequence every report runs.
A tester points at the element that's wrong and describes it. The widget attaches the React component path, element + viewport screenshots, and the console / network / error tail from the last few minutes.
The report lands in your self-hosted triage queue, bound to one project and environment, ordered oldest-first — the order an agent should work it.
Claude Code pulls the next report over MCP: the screenshot as a native image block, the element anchor, the diagnostics. It reproduces and fixes it in your repo.
The status closes with the commit SHA that fixed it, and the tester sees their report resolved — no status meeting, no back-and-forth thread.
What's in the box
Everything an agent needs to reproduce a bug, assembled from proven pieces — and nothing a production build has to carry.
Every report is pinned to a real DOM element — CSS selector plus the React component path — so an agent opens the right file instead of guessing.
An always-on ring buffer holds the last few minutes of console, network, and errors. Testers never have to reproduce what just happened.
Element and viewport PNGs, plus a re-renderable DOM snapshot kept as ground truth for how the page actually looked at report time.
The widget is env-gated at build time. No key, no import — it tree-shakes out entirely. Nothing ever ships to your production users.
Organizations → projects → environments, each with its own ingest key, origin allowlist, and privacy flags. Several allowed origins per environment.
Reports arrive over a stateless HTTP MCP server with native screenshot image blocks and token-budgeted responses — built for Claude Code to consume.
A REST v1 API is the source of truth; a zero-dependency bugcraft CLI wraps it for agents that would rather Read a file than parse an image block.
One Next.js service plus Postgres on your own Railway. Your feedback, screenshots, and diagnostics stay on your infrastructure — not ours.
Inputs are masked before anything is captured, and passwords are never unmasked — whatever an environment's relax-for-test-data flag is set to.
For Claude Code
Three commands. No SDK, no glue code — your triage queue becomes a slash command.
Use an org API token from Settings. <BASE_URL> is your service origin — here, the hosted one.
claude mcp add --transport http bugcraft https://bugcraft.betacraft.com/mcp \
--header "Authorization: Bearer $BUGCRAFT_TOKEN"One line drops the skill into .claude/skills/ — it teaches Claude the triage loop and which tools to call.
mkdir -p .claude/skills/bugcraft && curl -fsSL \
https://bugcraft.betacraft.com/skill/bugcraft/SKILL.md \
-o .claude/skills/bugcraft/SKILL.mdClaude works the queue oldest-first: reads each report, reproduces and fixes it in your repo, and closes it with the commit SHA.
/bugcraftCreate your organization, add a project and an environment, and drop the widget into your UAT build. Self-hostable on your own Railway whenever you want your data on your infrastructure.