Capture screenshots, annotate, auto-capture console errors & browser info, and file bug reports in one click. Zero dependencies. No build step.
- Screenshot capture — Visible viewport (JPEG, quality 85) or select a specific element
- 6 annotation tools — Arrow, rectangle, circle, freehand draw, text (inline input), blur/redact
- Undo/redo — Full history with Ctrl+Z / Ctrl+Y
- Auto-captured metadata — URL, page title, viewport size, DPR, browser, OS, user agent
- Console error interception — Captures
console.log,.warn,.error,.info, unhandled rejections - Network failure capture — Intercepts failed
fetch,XHR, andwebRequestcalls (4xx/5xx) - Auto reproduction steps — Tracks clicks, text inputs, scrolls, and SPA navigations automatically
- Badge counter — Real-time error count on the extension icon per tab
- Keyboard shortcut —
Cmd+Shift+B(Mac) /Ctrl+Shift+B(Windows) - Dark theme UI throughout
| Platform | How |
|---|---|
| GitHub Issues | Personal Access Token + repo. Creates formatted issue with environment table. |
| Jira Cloud | Domain + email + API token. Full ADF body with tables, code blocks, ordered lists. Uploads screenshot as attachment. |
| Slack | Incoming Webhook URL. Formatted with Block Kit — title, severity, repro steps, errors. |
| Clipboard | Copies full bug report as Markdown. |
| PNG | Downloads annotated screenshot. |
| JSON | Downloads structured report with all captured data. |
| Shareable HTML | Self-contained HTML file with embedded screenshot, dark theme, and full report. Zero backend needed. |
- Clone or download this repo
- Open Chrome and go to
chrome://extensions - Enable Developer mode (top right toggle)
- Click Load unpacked and select the
bugshotfolder - Navigate to any website and click the BugShot icon
- Click the BugShot icon in the toolbar (or press
Cmd+Shift+B) - Click "Capture Bug Report" — takes a screenshot and opens the side panel
- Annotate the screenshot with arrows, rectangles, text, blur, etc.
- Fill in title, description, and severity
- Export — copy to clipboard, download, or send directly to GitHub/Jira/Slack
Click "Select Element" in the popup to enter element selection mode. Hover over any element on the page — it highlights with a blue border. Click to capture just that element.
Click the gear icon in the side panel to configure:
- GitHub — Personal Access Token (needs
reposcope) + default repository (owner/repo) - Jira — Domain (
yourcompany.atlassian.net), email, API token, default project key - Slack — Incoming Webhook URL
bugshot/
├── manifest.json # Chrome Extension Manifest V3
├── background.js # Service worker: capture, storage, API calls
├── content/
│ ├── interceptor.js # MAIN world: console/network/interaction tracking
│ └── content-bridge.js # ISOLATED world: message relay, element selection
├── popup/
│ ├── popup.html # Extension popup
│ ├── popup.css
│ └── popup.js
├── sidepanel/
│ ├── sidepanel.html # Main app UI
│ ├── sidepanel.css
│ ├── sidepanel.js # Report form, exports, integrations
│ └── annotation-editor.js # Canvas-based annotation tools
└── icons/
├── icon16.png
├── icon32.png
├── icon48.png
└── icon128.png
- Manifest V3 — Service worker, no persistent background page
- No build step — Plain HTML/CSS/JS, load directly as unpacked extension
- No dependencies — Zero npm packages, everything is vanilla
- Canvas 2D API — Annotation editor built from scratch, no external libraries
- Circular buffers — Capped at 50 console entries, 100 network entries, 30 repro steps per tab
- Batched broadcasting — Interceptor debounces at 100ms to avoid flooding
- Privacy-first — Blur/redact tool for sensitive data. No data sent anywhere unless you explicitly export.