TraceBug
Capture the bug. Let AI fix it.
Local-first, zero backend. One .html file โ full replay, console
errors, network requests, repro timeline โ that your AI coding agent reads over
MCP and fixes. Opens offline for humans too.
โถ Watch the 15-second demo ยท watch Claude debug a real bug ยท try it live in the sandbox
TraceBug is a local-first debugging assistant. Capture a bug โ produce a single self-contained .html file โ hand it to your AI coding agent (Claude Code, Cursor, Windsurf), which reads the evidence over a local MCP server and fixes it โ or email/Slack it to a human dev who opens it offline. Every report also embeds a failing test the agent runs to verify the fix.
Every report opens with:
๐ Possible Cause (high confidence): API POST /orders failed with 500 after clicking 'Place Order'
> TL;DR: TypeError thrown on /checkout when clicking 'Place Order' button
No accounts. No SaaS lock-in. Data stays in your browser by default.
Optional cloud sharing (built, UI-gated off by default): if you'd rather share a URL than a file, sign in once and get a share link with the same content. The code ships behind a feature flag (PHASE2-CLOUD); the Share button stays disabled until the portal is switched on. Local .html export is the supported sharing path today.
Works with any frontend framework: React, Angular, Vue, Next.js, Nuxt, Vite, Svelte, SvelteKit, Remix, Astro, or plain HTML.
โก Get Started in 30 Seconds
New here? Report your first bug in 2 minutes โ
That's it. The CLI detects your framework and prints the exact 2-line snippet. Paste it into your app, run npm run dev, and you'll see the TraceBug toolbar on the right edge.
Report a bug in 2 clicks:
- Press
Ctrl+Shift+B (or click the โก button on the toolbar)
- Review the auto-filled report, click "Copy GitHub Issue"
- Paste into your repo. Done.
What TraceBug Does
Tester opens the page
โ
Arm a session (idle until you act):
โข โก Quick Bug โ Ctrl+Shift+B opens the ticket-review modal
โข ๐ท Screenshot / Region
โข ๐ด Record โ Sentry mode: rolling video buffer + HUD with timestamped
comments. File multiple bugs from one screen-share.
โข โบ Track session โ event-only capture (no video). Survives full-page
navigation, so clicking a link keeps recording.
โ
The SDK captures: clicks, inputs, navigation, API calls, console, errors, the DOM
stream (rrweb), environment, and a redacted Web-Storage snapshot
โ
Review the ticket, then export:
โข Export .html โ self-contained interactive DOM replay (KB, not MB)
โข Export for AI (.html) โ tiny text-only report to paste into a chat
โข Download report (.md) ยท .zip (GitHub-attachable) ยท failing test (.spec.ts)
โข Export HAR ยท file a real GitHub/Linear/Slack/Jira issue
โ
Complete report includes:
- Auto-generated title + smart summary + root-cause hint (high/medium/low confidence)
- Steps to reproduce, full session timeline
- Interactive DOM replay (or screen recording .webm), screenshots
- Console errors + stack traces, failed network requests with response snippets
- Environment (browser, OS, viewport, device)
โ
Send the .html โ developer opens it offline and sees exactly what happened,
or an MCP-connected coding agent reads it and debugs from it.
Scan Page (a11y via axe-core, broken images, mixed content, frustration
signals, failed/slow APIs, JS errors) is available programmatically as
TraceBug.scanPage(); it is no longer a toolbar button.
Two Ways to Use TraceBug
Option 1: npm Package (For Developers)
Install the SDK in your project โ best for teams who want TraceBug always active on dev/staging.
import TraceBug from "tracebug-sdk";
TraceBug.init({ projectId: "my-app" });
Option 2: Chrome Extension (For Non-Developers)
Install the browser extension โ no code needed. QA testers, PMs, and clients can use it on any website.
Install from Chrome Web Store โ one click, works immediately.
| Browser | Supported |
|---|
| Chrome | Yes โ install from Chrome Web Store |
| Edge | Yes โ Chrome Web Store extensions work natively |
| Brave | Yes โ Chrome Web Store extensions work natively |
| Opera | Yes โ install "Install Chrome Extensions" add-on first |
| Firefox | Not yet โ use the npm SDK instead |
Browser support
| Browser | npm SDK | Extension |
|---|
| Chrome | โ
| โ
|
| Edge | โ
| โ
|
| Brave / Opera | โ
| โ
|
| Firefox | โ
| โณ (port paused โ SDK only) |
| Safari | โ
ยน | โ (SDK only) |
The SDK is framework- and browser-agnostic โ it runs anywhere modern JS runs.
ยน The interactive DOM-replay export uses the browser-native CompressionStream /
DecompressionStream (Chrome 80+, Firefox 113+, Safari 16.4+); on older engines
the exporter ships the replay uncompressed and the viewer falls back to the
screenshot gallery. The extension is Chromium-only today (Firefox port paused;
no Safari build) โ on those, use the npm SDK.
Features
๐ง Debugging Assistant (v1.3)
Every report opens with four derived signals that turn "what happened" into "why it likely happened":
| Signal | What it looks like |
|---|
| ๐ Root Cause Hint | "API POST /orders failed with 500 after clicking 'Place Order'" with confidence tier (high/medium/low) |
| TL;DR | One-sentence summary combining network + error + click + page signals |
| User clicked | Tag, text, selector, id, aria-label, testId for the last click before the bug |
| Recent Actions | Last ~10 user actions as plain-English steps ("Clicked 'Edit' button", "Navigated to /checkout") |
Plus:
- Network response snippets โ first 200 chars of every failed
fetch/XHR response body, captured asynchronously (never blocks the request)
- In-memory failure buffer โ last 10 failed requests accessible via
TraceBug.getNetworkFailures()
- Deterministic โ pure functions, no AI APIs, O(1) on already-computed report fields
All four signals ship inline in GitHub issues, Jira tickets, PDF reports, and the Quick Bug modal. See docs/bug-reporting.md for full output examples.
๐ค MCP Server โ AI Agents Debug Your Reports (v1.5)
Your coding agent (Claude Code, Cursor, Windsurf, VS Code) reads TraceBug bug reports and fixes the bug โ fully local, nothing uploaded:
claude mcp add tracebug -- npx -y tracebug mcp --dir ./bug-reports
The server reads the same self-contained .html files TraceBug exports. A tester hands a dev the report file, the dev drops it in the repo, and the agent gets nine tools: list_bug_reports, get_bug_report, get_console_errors, get_network_activity, get_repro_steps, get_screenshot (real image content), get_playwright_test, resolve_stack, and get_fix_context. get_bug_report returns a prioritized investigation guide computed from what the report contains, so the agent knows exactly which tools to call next. Console stacks + failed-request bodies + repro steps + frustration signals โ everything an agent needs to go from bug report to fix.
The last three close the fix loop (v1.9): get_playwright_test returns the generated failing Playwright spec that replays the session and asserts the captured failure is gone โ red until the bug is fixed, green after โ so the agent can run it, patch, and re-run until green. resolve_stack maps the report's minified stack frames to original source files/lines using .map files found in the repo the server runs from. get_fix_context is a one-call fix starter: the failing request with response snippet, the user action that triggered it, the source-map-resolved top stack frames, and whether a failing test is available.
Kicking off is one paste: the extension shows a ready-made agent prompt after every Export .html (auto-copied), the exported file itself carries the same prompt in its AI tab, and in Claude Code you can just type /tracebug:debug_bug_report.
Other tools' MCP servers are cloud-hosted: your bug data must live on their servers first. TraceBug's runs on your machine over stdio and opens zero network connections. Try it instantly โ this repo ships a demo report and a pre-configured .mcp.json. See docs/mcp.md.
๐ญ Playwright Reporter โ Bug Reports From Failed Tests (v1.6)
Every failed Playwright test becomes the same self-contained .html bug report โ assertion error + code snippet, step timeline as repro steps, page console + network (via the optional fixture), failure screenshot, and a root-cause hint. Upload bug-reports/ as a CI artifact, then debug it with your agent via the MCP server:
reporter: [["list"], ["tracebug-sdk/playwright", { outputDir: "bug-reports" }]],
Nobody else captures bugs from test runs as portable files โ cloud tools can't attach their viewer to a CI artifact. See docs/playwright.md.
๐ง AI Debugger โ BYO-Key LLM Analysis (v1.6)
Run real LLM root-cause analysis with your own key โ Anthropic, OpenAI, or local Ollama. The call goes directly from your browser to the provider: TraceBug never sees the key, the prompt, or the response, and the prompt is scrubbed of secret shapes before it leaves the page. No metered credits, no vendor cloud in the path.
Combined with the local heuristic hint and the local MCP server, this is AI debugging that never phones home โ the one position no cloud-hosted, metered competitor can copy. See docs/ai-debugger.md.
๐ HAR Export (v1.6)
One click exports the captured network activity as a standard HAR 1.2 file that opens in DevTools, Charles, Fiddler, or Postman. No competitor ships this โ Jam even markets "everything a HAR offers" without the export. Your network capture is a portable file you own, not a row in someone's cloud. See docs/har-export.md.
๐งช Generated Failing Playwright Test (v1.9)
Every export carries a runnable Playwright spec that replays the captured session (locators prefer data-testid โ id โ aria-label โ role+name โ captured CSS selector) and asserts the captured failure is gone โ the failing endpoint must stop failing, the console errors must stop being thrown. Red while the bug exists, green after the fix. Get it three ways: Download failing test (.spec.ts) in the Quick Bug More menu, embedded in the .html export, or via the MCP get_playwright_test tool โ so an agent can run it, patch, and re-run until green.
๐ Inspect Mode โ Style Evidence for Design-QA Bugs (v1.9)
"The button looks wrong" now ships with the receipts. A DevTools-style inspect mode (extension popup โ Inspect element, or TraceBug.activateInspectMode()): hover paints the box-model highlight plus a computed-style summary tooltip; click attaches the element to the report with a curated style snapshot โ typography, colors as hex, box model โ plus a WCAG text-contrast verdict (ratio + AA pass/fail). Surfaced on annotation cards, in generated GitHub issues, in the export, and as structured data MCP agents get from get_bug_report.
๐ฌ Pre-Recording Options + Element-Level Blur (v1.9)
The extension popup's โ Record options panel picks the capture surface (current tab / desktop picker), an optional 3s/5s countdown, and Blur before recording โ redact sensitive areas before the first frame is captured. Also public SDK API: TraceBug.prepareRecording({ blurFirst, delaySec, surfaceMode, withMicrophone }).
Blur itself is element-level, click-to-blur: hover highlights, click applies filter: blur(12px) to the element itself, click again unblurs. Because the blur is part of the element's own rendering, it physically cannot lag behind scrolling. Blurred elements also get tb-mask, so the DOM replay masks their text, not just the video pixels.
๐ฆ Reports the Recipient Can Act On (v1.8)
- Download .zip (attach to GitHub) โ the same offline replay wrapped in a
.zip, because GitHub issues accept .zip attachments by drag-and-drop but reject bare .html.
- Issue actions inside the exported report โ the viewer header has Open GitHub issue (prefilled URL when the exporter configured
githubRepo) and Copy issue markdown (fully offline, pastes into any tracker). Both are precomputed at export time from the already-redacted report.
Auto-Captured (Zero Effort)
| What | Details |
|---|
| Clicks | Element tag, text, id, className, aria-label, role, data-testid, href, button type |
| Inputs | Field name, type, value (sensitive fields auto-redacted), placeholder |
| Dropdowns | Selected option text + value, all available options |
| Form Submits | Form id, action, method, all field values (passwords redacted) |
| Navigation | Route from โ to (supports pushState, replaceState, popstate) |
| API Requests | URL, method, status code, response time (both fetch and XMLHttpRequest) |
| Errors | Message, stack trace, source file, line, column |
| Console | console.error + warn + info + log (each non-error level capped at 50/session); warn/info render in the repro timeline |
| Unhandled Rejections | Promise rejection reason + stack |
| Environment | Browser, OS, viewport, device type, connection, language, timezone |
Sentry Mode โ Rolling Video Buffer
Click Record once at the start of a QA session, file as many bug tickets as you want from the same screen-share. Inspired by NVIDIA Shadowplay / OBS replay buffer.
| Feature | What it does |
|---|
| One-time picker | Click Record โ pick screen/window/tab in the OS dialog. The HUD appears; you do QA normally. |
| ๐ธ Capture button | Snapshots the in-progress recording into a finished .webm and opens the ticket modal. Recording keeps running. |
| Timestamped comments | Type a note in the HUD โ press Enter โ it's saved with the current video timestamp. |
| Auto-capture on error | When a JS error fires while armed, the error toast offers "Capture with video" โ one click captures the buffer. |
| Smart Stop | If you took at least one capture, Stop ends silently. Otherwise it opens the modal with the full recording. |
Auto-Scanner
Click Scan to run six in-browser detectors in parallel and surface issues you might not have noticed:
| Detector | What it catches |
|---|
| a11y | WCAG 2.0/2.1 A+AA violations via axe-core |
| Broken images | <img> elements that failed to load |
| Mixed content | http:// resources on HTTPS pages (CSP-blocked or downgraded) |
| JS errors | Deduped console errors + unhandled rejections |
| Failed requests | 4xx/5xx/network-error API calls with response body snippets |
| Slow APIs | Successful calls over 2s |
Each issue offers Locate (flash the offending element), File ticket (pre-fills the Quick Bug modal), and Dismiss.
| Tool | What it does |
|---|
| Quick Bug Capture | Ctrl+Shift+B opens the ticket-review modal with auto-filled title + description |
| Screenshot | Captures viewport with auto-generated name (e.g., 01_click_add_vendor.png); added to the active ticket |
| Region Screenshot | Drag-to-select snipping-tool style; added to ticket |
| Voice Note | Speak to describe the bug โ speech-to-text via Web Speech API |
| GitHub Issue | Generates complete GitHub markdown โ copies to clipboard, screenshots + .webm auto-download |
| Jira Ticket | Generates Jira markup with priority + labels |
Available Programmatically (cut from default UI in v1.0)
These features still ship in the bundle but no longer have toolbar buttons. Power users can call them directly:
TraceBug.activateAnnotateMode();
TraceBug.activateDrawMode();
TraceBug.downloadPdf();
TraceBug.exportAnnotationsJSON();
Auto-Generated
| Output | Details |
|---|
| Bug Title | Smart title from session context (e.g., "Vendor Update Fails โ TypeError") |
| Repro Steps | Numbered steps generated from event timeline |
| Session Timeline | Debug timeline with elapsed timestamps for every event |
| Environment Snapshot | Browser version, OS, viewport, device type, connection |
Smart Filtering
- SDK self-filtering: TraceBug never records its own UI interactions (clicks on the dashboard, annotation canvas, buttons)
- Framework noise removal: Internal dev-server requests (webpack HMR, Vite ping, Next.js stack frames) are automatically excluded from timeline and reports
- Duplicate error dedup: Consecutive identical errors are collapsed
User Identification & Bug Workflow
TraceBug.setUser({ id: "user_123", email: "dev@co.com", name: "Jane" });
TraceBug.markAsBug();
const summary = TraceBug.getCompactReport();
Plugin & Hook System
Extend TraceBug without forking โ filter events, enrich reports, or trigger custom actions:
TraceBug.use({
name: "slack-webhook",
onReport: (report) => { fetch("https://hooks.slack.com/...", { method: "POST", body: JSON.stringify(report) }); return report; },
});
TraceBug.on("error:captured", (error) => console.log("Bug found:", error.data.error.message));
CI/CD Helpers
expect(TraceBug.getErrorCount()).toBe(0);
const json = TraceBug.exportSessionJSON();
Installation
From npm
From GitHub
npm install github:prashantsinghmangat/tracebug-ai
Chrome Extension (No Code Required)
See Chrome Extension section below.
Configuration
TraceBug.init({
projectId: "my-app",
maxEvents: 200,
maxSessions: 50,
enableDashboard: true,
enabled: "auto",
});
enabled option
| Value | Behavior |
|---|
"auto" | Enabled in dev/staging, disabled in production (default) |
"development" | Only when NODE_ENV is "development" |
"staging" | Dev + staging hosts (staging, stg, uat, qa in hostname) |
"all" | Always enabled, including production |
"off" | Completely disabled |
string[] | Custom hostnames, e.g. ["localhost", "staging.myapp.com"] |
Programmatic API
Core
import TraceBug from "tracebug-sdk";
TraceBug.pauseRecording();
TraceBug.resumeRecording();
TraceBug.startRecording();
TraceBug.stopRecording();
TraceBug.isRecording();
TraceBug.getSessionId();
TraceBug.destroy();
Screenshots
const screenshot = await TraceBug.takeScreenshot();
const region = await TraceBug.takeRegionScreenshot();
const allScreenshots = TraceBug.getScreenshots();
Voice Recording
if (TraceBug.isVoiceSupported()) {
TraceBug.startVoiceRecording({
onUpdate: (text, interim) => console.log("Transcript:", text),
onStatus: (status, msg) => console.log("Status:", status),
});
const transcript = TraceBug.stopVoiceRecording();
TraceBug.getVoiceTranscripts();
}
Voice transcripts are automatically included in GitHub Issue, Jira Ticket, and PDF reports.
Tester Notes
TraceBug.addNote({
text: "Button doesn't respond after selecting Inactive status",
expected: "Vendor should update successfully",
actual: "App throws TypeError and freezes",
severity: "critical",
});
Reports
const report = TraceBug.generateReport();
const title = TraceBug.getBugTitle();
const markdown = TraceBug.getGitHubIssue();
const ticket = TraceBug.getJiraTicket();
TraceBug.downloadPdf();
const env = TraceBug.getEnvironment();
Data Access
import { getAllSessions, clearAllSessions, deleteSession } from "tracebug-sdk";
const sessions = getAllSessions();
const bugs = sessions.filter(s => s.errorMessage);
clearAllSessions();
deleteSession("session-id");
Standalone Utilities
import {
generateReproSteps,
captureEnvironment,
buildReport,
generateGitHubIssue,
generateJiraTicket,
generateBugTitle,
buildTimeline,
formatTimelineText,
} from "tracebug-sdk";
Element Annotation & Draw
TraceBug.activateAnnotateMode();
TraceBug.activateDrawMode();
TraceBug.isAnnotateModeActive();
TraceBug.isDrawModeActive();
const report = TraceBug.getAnnotationReport();
const md = TraceBug.exportAnnotationsMarkdown();
await TraceBug.copyAnnotationsToClipboard("markdown");
TraceBug.deactivateAnnotateMode();
TraceBug.deactivateDrawMode();
TraceBug.clearAnnotations();
Dashboard
The compact toolbar on the right edge of the screen provides:
- โก Quick Bug โ open the ticket-review modal (
Ctrl+Shift+B)
- ๐ท Screenshot โ capture the page, with an annotation editor
- โข Region โ capture a selected region
- ๐ด Record โ screen recording (Sentry mode: rolling buffer + HUD)
- โบ Track session โ event-only capture, no video (survives navigation)
- โ View saved tickets โ the offline Saved Tickets list
- โ โ turn TraceBug off on this page
Annotate and Draw modes still ship in the bundle but were cut as standalone
toolbar buttons in v1.0 โ reach them programmatically or via the recording
HUD's Pen button. See docs/annotate-and-draw.md.
Quick Bug modal
Review and edit the ticket, then export or file it:
- Auto-generated title, summary, root-cause hint, reproduction steps, timeline
- Interactive DOM replay (or the screen recording), screenshots gallery
- Tabs: Info ยท Console ยท Network ยท Actions ยท AI ยท Events
- Export: Export .html (replay) ยท Export for AI (.html) ยท Download report (.md) ยท Download .zip (GitHub-attachable) ยท Download failing test (.spec.ts) ยท Export HAR
- File directly: GitHub ยท Linear ยท Slack ยท Jira (real issues with a configured token)
Keyboard Shortcuts
| Shortcut | Action |
|---|
Ctrl+Shift+B | Open the Quick Bug ticket modal |
Ctrl+Shift+S | Take a screenshot |
Esc | Exit the current mode / close the modal |
Note: Ctrl+Shift+A (annotate) and Ctrl+Shift+D (draw) are no longer bound by default. The underlying modes remain callable via the programmatic API (TraceBug.activateAnnotateMode() / activateDrawMode()); draw mode is also reachable from the โ button on the recording HUD.
Documentation
Full documentation is in the docs/ folder:
- Getting Started โ Install, setup, first use
- API Reference โ Complete programmatic API
- Configuration โ All config options explained
- Bug Reporting โ Screenshots, notes, voice, export
- MCP Server โ Let AI agents (Claude Code, Cursor) debug your reports
- Annotate & Draw โ UI annotation features
- Chrome Extension โ Extension install & usage
- Architecture โ How TraceBug works internally
- ADRs โ Why local-first, single-file HTML, rrweb, MV3, zero deps
- Performance โ Measured numbers + the reproducible benchmark
- Compatibility โ Browser matrix, support policy, known limitations
- Migration Guide โ Upgrade notes and API stability
- Roadmap โ Shipped ยท in progress ยท planned ยท long-term
Chrome Extension
The TraceBug Chrome Extension lets non-developers use all TraceBug features without writing code.
How to Install
Recommended: Install from Chrome Web Store โ works in Chrome, Edge, Brave, and Opera.
From source (for developers):
git clone this repo, then npm install && npm run build
- Open
chrome://extensions/ โ Enable Developer mode โ Load unpacked โ select tracebug-extension/
How to Use
- Navigate to any website (staging, production, localhost, internal tools)
- Click the TraceBug extension icon in the toolbar
- Toggle "Enable on this site" โ the page reloads with TraceBug active
- The floating bug button appears on the page
- Use all QA tools: screenshots, notes, GitHub/Jira issues, PDF reports
- Quick actions also available directly from the extension popup
Extension Features
- Per-site toggle โ enable only on sites you're testing
- Badge indicator โ shows "ON" in green when active on current tab
- Quick actions โ Annotate, Draw, Screenshot, PDF Report, GitHub Issue, Jira Ticket from the popup
- Active sites list โ manage all enabled sites from the popup
- Compact toolbar on page โ same full-featured toolbar as the npm SDK
- CSP-safe โ uses
chrome.scripting.executeScript with world: "MAIN" to bypass Content Security Policy restrictions
Browser Compatibility
| Browser | Supported |
|---|
| Google Chrome | Yes |
| Microsoft Edge | Yes |
| Brave | Yes |
| Opera | Yes (install "Install Chrome Extensions" add-on first) |
| Firefox | Not yet โ use the npm SDK |
Chrome Web Store
TraceBug is published on the Chrome Web Store:
Install TraceBug Extension
Build from Source
git clone https://github.com/prashantsinghmangat/tracebug-ai.git
cd tracebug-ai
npm install
npm run build
Run Example App
cd example-app
npm install
npm run dev
Test the Example Bug
- Go to
/vendor
- Click "Edit"
- Change Status to "Inactive"
- Click "Update" โ triggers TypeError
- Click the bug button to see the report with reproduction steps
Privacy
- Sensitive fields auto-redacted (
password, secret, token, ssn, credit)
- ~20 token-shape patterns masked at capture (JWT,
Bearer headers, cloud provider keys) โ a logged secret never enters the report object
- The export flow and the exported report show exactly what was masked:
๐ก N sensitive values auto-masked
- App-specific PII covered via
redact: { fields, patterns } in config โ also settable in the extension popup's ๐ก Redaction rules section
- All data stays in
localStorage โ nothing leaves the browser
- SDK never captures its own UI interactions
- No external servers, no tracking, no analytics
Framework Compatibility
| Format | File | Works with |
|---|
ESM (import) | dist/index.js | Vite, Next.js, Nuxt, SvelteKit, modern webpack |
CJS (require) | dist/index.cjs | Angular CLI, older webpack, Node.js |
| IIFE (global) | tracebug-extension/tracebug-sdk.js | Chrome Extension, plain <script> tag |
| TypeScript | dist/index.d.ts | Full type support in both ESM and CJS |
Uninstall
npm Package
npm uninstall tracebug-sdk
Then remove the TraceBug.init() call from your app's entry file.
โญ Star this repo if it saves you time
If TraceBug helped you ship faster, a star is the best way to say thanks โ it helps other developers find it too.
Spread the word:
Found a bug or have a feature idea? Open an issue โ TraceBug was built because bug reports sucked. We're here to make them suck less.
Built with โค by Prashant Singh Mangat
MIT Licensed ยท No tracking ยท No backend ยท Your data stays in your browser
Chrome Extension
Go to chrome://extensions/ โ click Remove on TraceBug.
License
MIT
Author
Prashant Singh Mangat