blog

How to write a bug report that gets fixed

A screenshot is a tiny message to the person who has to reproduce your problem. What to capture, how to annotate the repro, what to redact — the report that doesn't end in 'unable to reproduce.'

2026-08-23workflow · communication · hypershot

The difference between a bug report that gets fixed and one that dies in a queue is almost never the bug. It’s the evidence. “Unable to reproduce” is not a wall. It’s a polite way of saying your screenshot didn’t contain the thing I needed to see.

A screenshot is a tiny message sent to a person who wasn’t in the room. Here’s how to make sure they get what you meant.

Capture the scene, not just the symptom

The error toast is the headline. The state of the screen behind it is the story. Prefer a window capture (⌘⇧W / Ctrl+Shift+W) of the whole app — title bar, toolbar, whatever state is visible — over a tight crop of just the red text. The person fixing this needs to know which screen you were on, what was open, what was selected. If the reproduction depends on a menu or a hover state, that’s what you’re capturing: use the delay timer (⌘⇧7) so the dropdown is still open when the frame fires.

If the problem moves — a flicker, a race, an animation that stutters — that’s a multi-frame job. Take the region capture, open the timeline, and you’ve got the burst: nudge through the frames and pick the one where it visibly goes wrong. A single static frame of a flickering control proves nothing. Three frames do.

Annotate the reproduction, not the opinion

Number the steps. The counter (C) exists for exactly this: click at each step of the repro and the tool hands you ①②③, so the reader follows your exact path in order. Add an arrow (A) where your eye can’t do it, and a spotlight (S) if the screen is busy and the important part is small.

Two rules keep it honest:

Redact before it travels

Your report is leaving your machine and probably your company. Before it ships, sweep it with the redact tool (X): account names, customer data, keys, the URL in the address bar if it’s internal. When it’s truly sensitive, use Secure (solid block) rather than blur — a blur is a curtain, a block is a wall.

Send it in a form that survives

Two options, in order of usefulness:

The report that gets fixed

Scene captured whole. Steps numbered. The one thing that mattered spotlighted. Everything private redacted. Sent as a file that still works.

“Unable to reproduce” is a compliment, when it happens anyway. But you just made it a lot harder.

Stay in the loop

New posts, product drops, and the occasional weird thing. One click to confirm, unsubscribe whenever.