Build1 publisher3 min readPublished
Six Node suites covered band arithmetic and PDF structure without ever touching a DOM, so a print path that never opened a dialog still reported 130 passed, 0 failed. A thirteen-check browser harness found it on the first run.
The Engineer · Build desk

build
A receipt intent written before dispatch turns an SMS timeout into a poll instead of a resend1 publisher
build
A key in the app binary is a bucket handover; presigned uploads also drop the proxy data bill1 publisher
build
A GAN beauty filter is a device budget allocation, not a feature toggle1 publisher
build
Every viewer hits your HLS key endpoint in the same second, and almost nobody tests it1 publisher
Compiled by The EngineerSomething wrong?How this is made
The mechanism fits in a sentence. A print stylesheet has to hide the capture container on screen, hiding it means a `display:none` subtree, and by the author's account the `decode()` promise on an image inside such a subtree never resolves [5]. `printCanvas` awaited that promise once per encoded slice, so the command sat on an await with no path to settling, and no dialog ever appeared [4][5].
For that to bite you, two things have to be true at once: your print path builds its own hidden container, and something inside it awaits image decoding instead of painting. The writeup treats the non-resolving decode as a fact about Firefox that the author would otherwise have to keep being right about [9]. It tests nothing else, so it says nothing about what a Chromium build does with the same call. The extension's source is not public [2], which makes this a report you can reason from rather than rerun.
The options considered were stopping the await on `decode()`, moving the container out of the hidden subtree until decoding finishes, or dropping the blob URLs and appending canvas elements directly, which paint synchronously and leave nothing to decode and no object URL to revoke [8][9]. The first two make printing work and leave the component's correctness resting on that Firefox behaviour [9]. The third option eliminates the question altogether. Picking the third required knowing the cause, and as the author puts it, a green suite that goes green again is not evidence of which fix you applied [10].
The same batch produced a second failure one level in. Choosing PDF broke "Open in editor" because `deliver()` handed the editor a PDF blob and `createImageBitmap` cannot decode one; both stages had tests, the seam between them did not [7]. The author's generalisation is that every bug the project has produced has lived at a boundary, either his code to a browser API or one stage to another, and that a suite of pure functions cannot represent a boundary at all [17]. The six Node suites cover band arithmetic, canvas dimension limits, filename sanitising, the background module graph under stubbed extension APIs, PDF structure and scan geometry [6]. Those 130 assertions were correct answers to other questions, and printing simply was not among them.
`test-pages/harness.html` runs the options page and the print pipeline against stubbed extension APIs, with storage backed by a plain object and `window.print` intercepted so the real page logic runs unmodified [11]. Thirteen checks, one tenth the assertion count of the Node suites [16], and it caught the total print failure on its first run [11].
What matters is that the harness was fed an injected hang and reported "timed out after 8s" [12] rather than the raw count of thirteen checks, because a test never shown to fail cannot be distinguished from a test that cannot fail, and a harness for a hang is the case most likely to silently do nothing [14]. Every check is timeout-bounded so a hang reports rather than truncating the run, and imports are cache-busted after a stale cached module made an already-fixed file look broken and cost more time than the bug had [13].
The OCR harness shows the payoff of asserting against pixels: 13 of 13 words recognised, mean confidence 95, digits included, and word boxes landing where the text was drawn [15]. No wrapper unit test can assert that last part, because it never drew anything.
Ranked by verification strength, evidence, and original report placement.
Longshot is a Firefox screenshot extension written to replace FireShot, with full page, visible area, drag region and element capture, an editor with eleven annotation tools, export to PNG, JPEG, WebP and PDF, and local OCR producing a searchable text layer. It has no runtime dependencies.
The extension's code is not public, so the writeup is a description rather than something a reader can inspect.
At one point the project had 130 passing Node assertions across six suites and zero failing, while the print command hung indefinitely and no print dialog ever appeared; the suites reported 130 passed, 0 failed, the same as the day before.
printCanvas encoded each slice of the image to a blob URL and awaited img.decode().
img.decode() does not resolve for an image inside a display:none subtree, and the print stylesheet creates exactly such a subtree by design because the container has to be hidden on screen, so the await never returned and the dialog never opened.
The six Node suites test band arithmetic, canvas dimension limits, filename sanitising, the background module graph under stubbed extension APIs, PDF structure and scan geometry, and none of them goes near a real DOM.
Publishers with included, body-backed reporting in this cluster.
1 article · September 7, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Solo account, unverified claims
The mechanism is specific enough that any Firefox developer could test it: a decode promise that never settles inside a display:none subtree, and a canvas rewrite that removes the promise entirely. Nobody has tested it here. Longshot's code is private by the author's choice, so the 130 assertions and the "timed out after 8s" report exist only as his description of them, and the one dated measurement in the account is a run of his own harness. What raises the floor is the account's willingness to subtract: printer output unconfirmed, capture engines uncovered.
A private tool with one user
There is nothing to measure. The extension is one person's private replacement for FireShot, and the account mentions no installs, no listing and no user other than its author. Careful testing is not uptake, and only the former is on offer here.
The caveats outrun the boast
The comparison that carries the piece, thirteen browser checks catching what 130 Node assertions could not, is the kind of line that usually needs discounting, and mostly it does not, because the author keeps deducting from his own case. He says the harness would be worth roughly what the suites were worth had he not injected a hang to see it fail, he names the capture engines as the identical blind spot still open, and he distinguishes a dialog that opens from a page that prints. The one claim reaching past what a reader can see is the sweep of the generalisation about every bug the project has produced.
Reputation is the payoff, not price
Publishing a postmortem about your own extension on dev.to buys standing, and the piece does describe a product its author built and controls. The usual commercial pull is missing: nothing is for sale, there is no repository to star, and the closed code means the post cannot funnel a reader anywhere. What remains is the wish to look like a careful engineer, which also happens to explain the unusually frank list of what has not been tested.
One coherent voice, not yet checked
The technical account hangs together the way invented ones usually do not: the failure, the two rejected fixes and the chosen one are all consistent with how Firefox treats images in hidden subtrees, and the PDF-to-editor seam bug has the same shape one level in. Against that, every figure comes from a single self-published post about code no one else can open, and a mechanism this checkable has not actually been checked. A public commit, or a second developer reproducing the decode hang, would move this.