bugmark_

web debugging tool

A browser debugging tool for the bugs you can’t reproduce

The hardest bugs are the ones that vanish when you open DevTools. Bugmark records the evidence at the moment the problem appears — the JavaScript errors, the failing API response and the clicks that led there — so debugging starts from facts.

Add to Chrome — freeUpdated September 17, 2026 · 5 min read
Console tab listing log, warning and error messages recorded at capture time

Debugging starts with evidence, not reproduction

Classic debugging advice says reproduce first. That works for deterministic bugs on your own machine. It falls apart for a race condition that shows up on a slow connection, a feature flag enabled for one account, a stale cache, or a 500 from an upstream service that recovered ten minutes later. “Cannot reproduce” is often the honest answer, and the ticket is closed with the bug still live.

A web debugging tool that runs where the bug happens changes the order of operations. Instead of trying to recreate the state, you read what the browser logged when the state was wrong. Bugmark does that as a Chrome extension: it keeps a rolling record of console output, network traffic and user actions in the tab, and freezes it into a report the instant someone captures the problem.

The signals Bugmark preserves

  • JavaScript errors and unhandled promise rejections, alongside the last 150 console messages. An await that threw with no catch often produces no visible UI change at all; here it appears in the log.
  • The last 150 network requests, with status and timing. Filter to failures to see the 4xx and 5xx responses first, then open a fetch or XHR request to read its headers, payload and response body (bodies are kept for the 60 most recent, up to 16 KB request and 32 KB response).
  • Steps to reproduce: the last 30 actions, including clicks with element labels, form submits and SPA route changes, which tells you the sequence that led into the broken state.
  • Environment: browser, OS, viewport, pixel ratio and scroll position, the variables that most often explain why a bug is intermittent.
Network tab showing the 402 JSON response body for a declined payment
The 402 response body for a declined payment, captured at the moment of the bug. The message the API returned is right there.

A worked example: the checkout button that does nothing

A support agent reports that “Confirm and pay” does nothing for a customer who applied a promo code. Here is how the report narrows it down:

  1. The steps show: open checkout, apply promo, type in the name field, click Confirm and pay. The promo step is the unusual one.
  2. Filtering the network log to failures shows POST /api/payments/intents returned a 4xx.
  3. The request payload shows the discounted amount; the response body explains the rejection reason.
  4. The console shows an unhandled promise rejection from the checkout handler, which is why the button appeared to do nothing rather than showing an error.
  5. The developer copies the request as cURL, replays it against staging with the same payload, and has a failing case in minutes.

Two bugs come out of one report: the pricing logic that produced an invalid amount, and the missing error handling that hid it. Neither needed a live reproduction session with the customer.

Notice what the agent did not need to know. They never opened DevTools, never identified which request mattered, and never wrote steps. They reproduced the problem once on the customer's account in their own browser, pressed a shortcut and wrote one sentence. The debugging skill stayed with the developer; the evidence collection moved to wherever the bug was seen.

Recording intermittent problems

For bugs that happen over several screens, start a recording with ⌥⇧R before walking the flow. Recordings run up to 5 minutes, continue across page loads, and can include microphone narration so the tester can say what they expected at each step. The console and network logs are attached to the recording in the same way as a screenshot. The screen recorder for bug reports page covers this workflow in more detail.

Steps to reproduce recorded automatically: open checkout, apply promo, type name, click Confirm and pay
The recorded action sequence often explains an intermittent bug on its own: the order of clicks is the missing variable.

Where Bugmark ends and DevTools begins

Bugmark is a capture tool, not an interactive JavaScript debugging tool. It does not set breakpoints, step through code, watch variables, map minified stack traces back to source, or profile CPU and memory. It does not record every session in the background either: logs are a rolling window of the most recent activity in the tab, and a video only exists if someone pressed record.

The intended hand-off is simple. Use the report to find which request failed and which error was thrown, then download the HAR into DevTools or replay the request with cURL and set your breakpoints there. If you want to collect logs manually for comparison, see how to capture console logs.

Secrets stay out of the logs

Before a report is saved, passwords, tokens, API keys, session IDs, card numbers and Authorization/Cookie headers are replaced with [redacted] in JSON keys, form fields and URL params. Reports stay in local browser storage until you export them.

Who gets the most out of it

Front-end and full-stack developers debugging reports from staging or production. Support engineers who need to escalate with proof. QA testers on exploratory sessions, where the interesting failures are rarely scripted; see the QA testing tool page. And anyone who has closed a ticket as “cannot reproduce” and suspected the bug was still there.

Debug from what actually happened

Bugmark is free, needs no account and keeps data on your device. It works in Chrome, Edge, Brave and Arc. Add Bugmark to Chrome — free.

Frequently asked questions

How do I debug a website in Chrome?

Open Chrome DevTools with F12 or Ctrl+Shift+I (Cmd+Option+I on Mac), check the Console for errors, then use the Network panel to find failed requests and the Sources panel to set breakpoints. When the bug happened on someone else’s machine, a capture tool like Bugmark gives you those logs from their session.

How do you debug a bug you cannot reproduce?

Collect evidence from the moment it occurred instead of recreating it: the console errors, failed network requests with response bodies, the exact sequence of user actions and the environment. Bugmark records these in the background and attaches them to a screenshot or recording, which usually reveals the missing condition.

Does Bugmark capture unhandled promise rejections?

Yes. Along with the last 150 console messages, Bugmark records JavaScript errors and unhandled promise rejections. These are common causes of buttons that silently do nothing, because the error never reaches the interface, so having them in the report saves a lot of guesswork.

Can Bugmark set breakpoints or step through JavaScript?

No. Bugmark is not an interactive debugger. It captures console output, network traffic, user steps and environment details for a report. To step through code, export the HAR or copy a request as cURL, reproduce the failing case locally, and use the Sources panel in Chrome DevTools.

Does Bugmark record every session automatically?

No. It keeps a rolling window of recent tab activity: the last 30 actions, 150 console messages and 150 network requests, attached when you capture. Video is only recorded when you start a recording. Bugmark does not offer replay of past sessions that were not recorded.

Try Bugmark free — no account needed

  • Screenshots & screen recording
  • Console & network logs
  • Steps to reproduce
  • GitHub issues & reports
Add to Chrome — free