The launch-polish release. A full Slate Indigo rebrand across every surface (widget, exports, extension, website — with "Trace", the pixel-sprite mascot), the exported replay slims down ~3–4× via gzip, issue-tracker exports file real GitHub/Linear/Slack items with your own token, and the website gains a live sandbox running the actual SDK plus a 15-second real-capture demo video. Zero lint warnings, dead code removed, adoption friction audited and fixed.
- Slate Indigo brand + "Trace" the pixel mascot(
src/theme.ts,website/,tracebug-extension/) — one palette across all five token surfaces (widget, replay export, AI export, extension popup, website): slate-tinted near-black neutrals, a single refined indigo accent (#6366F1), green reserved strictly for success. New 8-bit mascot appears in the website flow diagram, 404, footer, hero headline (as the blinking caret), and the extension's "can't run here" state — crisp at every size because it *is* pixels. All icons (favicon, extension, apple-touch) regenerated. - Live sandbox — the real widget on the website(
website/public/try.html) — a checkout page with two intentional bugs (a TypeError and a failingPOST) running the actual IIFE SDK bundle. Visitors trigger a bug, capture it with the real toolbar, and export a genuine self-contained report. Linked from the demo section; the extension opens it as the first-install welcome tab. - Real demo video(
website/public/tracebug-demo.webm) — a 15-second captioned screen recording of TraceBug catching a live crash on the sandbox (recorded by scripting the real product with Playwright, so re-cuts are a script run). Embedded in the website demo section with lazy mount, reduced-motion handling, and a poster fallback; replaces the scripted walkthrough iframe and the stale README GIF. - MCP tool picker on the hand-off card(
src/ui/quick-bug.ts) — the post-export card now shows the one-time setup command for Claude Code / Cursor / VS Code with per-tool copy, instead of assuming Claude Code. - First-install welcome(
tracebug-extension/background.js) — installing the extension opens the live sandbox with a tailored "try your first capture" banner instead of nothing. - reproducible Chrome Web Store upload zip, versioned from
npm run zip:extpackage.jsonintoreleases/. - Website: flow diagram, changelog page, and motion polisha Userback-style "everything connects" section with measured SVG beams; a
/changelogpage rendered from this file at build time; a self-assembling hero report card (events stream in, skeletons hand off to the root-cause box); cursor-spotlight cards; OS-level dark-mode auto-detect; a DevTools console easter egg. - html2canvas fallback for script-tag consumers(
src/screenshot.ts) — when the lazyimport("html2canvas")can't resolve (no bundler — e.g. the IIFE bundle on a plain page), the SDK now picks up a page-providedwindow.html2canvasUMD global, so screenshots work outside bundled apps and the extension. - Real issue-tracker integrations (BYO-token)(
src/integrations/tracker-client.ts) — the GitHub / Linear / Slack export buttons now create a real issue/message via the provider's API using the user's own token, instead of only prefilling a URL or copying markdown. The call goes directly from the browser to the provider — token inlocalStorage, no OAuth, no TraceBug backend — the same privacy pattern as the BYO-key AI Debugger. GitHub uses a PAT (POST /repos/{owner}/{repo}/issues), which also lifts the ~6–8 KB URL-prefill truncation cap (the full report body travels in the request body); Linear uses a personal API key (GraphQLissueCreate, returns the issue URL + identifier); Slack uses an incoming webhook (fire-and-forget). A 🔗 Configure integrations modal (More menu) stores per-provider tokens; when a provider is configured its export button files for real, otherwise it falls back to the existing URL/copy flow. Jira Cloud is intentionally excluded (CORS-blocked for browser XHR) and stays copy-markup. New SDK exports:createTrackerIssue,createGitHubIssue,createLinearIssue,sendSlackMessage,getIntegrationsConfig/setIntegrationsConfig/clearIntegrationsConfig,hasIntegration. (src/ui/quick-bug.ts,tests/tracker-client.test.ts— 11 tests) - Self-contained DOM replay export (rrweb)(
src/rrweb-recorder.ts,src/exporters/html-replay.ts,src/exporters/html-template.ts) — Export .html now embeds an interactive DOM replay instead of the multi-MB base64 video. rrweb records a full DOM snapshot plus incremental mutation events (KB, not MB); the exported.htmlinlines rrweb's Replayer runtime and reconstructs the page in a sandboxed<iframe>, scaled-to-fit, with a play/seek control bar and click-to-seek from the Console/Network/Events rows. Inputs are masked and.tb-block/.tb-maskrespected;inlineImagesembeds images so the replay is genuinely offline (no requests back to the original site). The Replayer runtime is regenerated bynpm run gen:rrweb(aprebuildhook, gitignored). Falls back to the screenshot gallery if the Replayer orDecompressionStreamis unavailable. - Compressed replay stream(
gzipToBase64inhtml-replay.ts;inflateRrwebinhtml-template.ts) — the rrweb event stream is gzip-compressed via the browser-nativeCompressionStreamand base64-embedded (rrwebEventsGz), then inflated at load withDecompressionStream. Repetitive DOM JSON compresses ~8–12×, cutting a typical replay file ~3–4× (measured 2.96 MB → 0.87 MB) with a byte-exact round-trip. No bundled compression library. The Export .html button's size estimate reflects the compressed size. - Export for AI (.html)(More menu;
generateAiHtml/exportReportAsAiHtmlinsrc/exporters/ai-prompt.ts) — a tiny (~5 KB) text-only HTML report for users who want to paste/upload a report into a chat (Claude/ChatGPT) without MCP. Renders the same capped/deduped structured content as the.mdexport — no rrweb runtime, no DOM blob, no base64 media — so it fits well under a chat's context limit. HTML-escaped throughout.
- (
npx tracebug initis now honest and actually usefulcli/bin.ts) — it no longer claims to "set up" the project or print "Done! ready" when it only echoes a snippet. It now states plainly that it prints (doesn't install/edit), and — the real value — leads with the framework gotcha developers actually trip on: the Next.js App-Router"use client"+useEffectrequirement, Nuxt's.client.tsSSR rule, and Svelte'sonMount. All snippets now include the dev-onlyenabled: "auto"flag with an explainer. Website "CLI setup" tab updated to match. - shadcn (new-york) UI re-skinthe injected widget (
src/theme.ts), the exported replay viewer (src/exporters/html-template.ts), the AI export (src/exporters/ai-prompt.ts), and the extension popup (tracebug-extension/styles.css) all now share the website's brand palette (now the Slate Indigo palette — indigo-500 primary, slate near-black dark, hairline borders, 10/12/16 radii). Buttons match new-york variants (glow primary,activepress,focus-visiblerings via--tb-ring); the Quick Bug modal is arounded-2xlcard. Hardcoded off-palette colors in the draw/annotate tools were tokenized. prebuildhook regenerates the rrweb runtimesrc/exporters/rrweb-runtime.generated.tsis gitignored and rebuilt by aprebuildstep wired into allbuild*scripts, so a fresh clone builds cleanly.- Zero lint warningscleared all 177 (
no-explicit-any×116,no-unused-vars×61) with real types, not suppressions: proper axe-core/DOM/Web-Speech typings, small interfaces for provider API responses,unknown+ narrowing for genuinely dynamic values. Noeslint-disable, noas any.DrawRegionnow officially includes the pen shape it always stored. - Dead code removedthe cut v1 onboarding tour machinery (the surviving logo pulse now actually injects its keyframe — it silently never animated before), six dead toolbar functions and write-only state, orphaned website components, stale release zip, and the pre-rebrand
docs/demo.gif. - Adoption audit fixes
npx tracebughelp pointed at a dead domain; the README's Chrome Web Store badge was a broken URL; docs led with--dirwhile the homepage taught the zero-config MCP form; the popup now surfaces theCtrl+Shift+Bshortcut and explains the mic toggle;example-app/gained a README; the website sandbox SDK copy is auto-synced by every build.
- The exported replay no longer shows TraceBug's own UI(
src/rrweb-recorder.ts) — rrweb was recording the injected widget (#tracebug-root, the compact toolbar) and the blank draw canvas into the DOM stream, so they rendered on top of the user's page in the exported.htmlreplay (an empty box + the floating toolbar). AblockSelectornow excludes TraceBug's own overlay UI from the capture while keeping the draw SVG overlay, so the replay shows only the user's page + the annotations. - Pen drawing is smooth, not laggy(
src/draw-mode.ts) — freehand strokes re-stroked the *entire* growing path on every pointer move (O(n²), so it got laggier the longer you drew) and were raw polylines. Now each move draws only the newest segment (O(1)) and all strokes are quadratic-smoothed (canvas, the committed render, and the SVG replay path). - Pen/draw annotations now appear in the exported replay(
src/draw-mode.ts) — during a recording, freehand pen strokes and shapes are drawn on a<canvas>, which rrweb's DOM replay can't capture (recordCanvasis off), so they showed in the modal's video preview but vanished from the exported.htmlDOM replay. Each committed shape is now mirrored as an SVG element in the page DOM with the same appear→fade lifecycle, so rrweb records it as ordinary DOM mutations and the annotations replay at the exact moment they were drawn — no file-size cost, norecordCanvas. - Event capture no longer stops on full-page navigation(
src/index.ts,src/storage.ts,src/compact-toolbar.ts) — the Track session (events-only) capture now survives clicking a link to another page. A persisted capture mode (tracebug_active_capture_mode) lets the SDK resume an event-only session on the next page (keeping one session id across the whole flow) while still finalizing a *video* session whose tab-share Chrome ended. Also: durable flush onpagehide/visibilitychange:hidden(bfcache-safe), no duplicatesession:startper navigation, and the toolbar's tracking state is restored after the load. - MCP server finds reports with zero setup(
cli/mcp-server.ts,cli/bin.ts) —get_bug_report(and the otherget_*tools) now resolve a report by bare filename or fragment from the user's Downloads/Desktop folders — where browser exports land — in addition to--dir. Previously the copy-pasted hand-off prompt failed unless the server was pointed at the download folder. Shared folders are shallow-scanned and name-prefiltered (tracebug-*) to stay fast.list_bug_reportswidens to those folders only when the server started without an explicit--dir(an explicit--dirstays scoped to that folder). The generated hand-off prompt (generateMcpPrompt) drops the--dirrequirement. (src/exporters/ai-prompt.ts,tests/mcp-server.test.ts)