Browser and build traps

What breaks in a Next.js 16, fumadocs, canvas or SVG site, learned on this one: each trap with its symptom, its cause, the fix and the numbers.

Updated

A Next.js 16 site with fumadocs docs and live canvas fields fails in ways the browser rarely reports: a field draws black, a click paints an empty layout, two builds of one page differ. This site and generaltranslation.com, General Translation's site, met each of these traps between July and October 2026, and every fix comes with its numbers and the file, lint or skill that keeps it from coming back.

Ten traps

SymptomCauseFix
A WebGL field draws black after a dozen client-side navigations, with no errorChrome keeps about 16 live WebGL contexts, and each mount made oneOne engine and one context per engine module for the session
Every route of the dev server answers 500 with "Unexpected non-whitespace character after JSON"next dev under load left its prerender manifest half writtenStop the server by PID, delete .next/dev, start it again
A click on a docs folder paints the layout with no article for about 280 msThe page threw redirect() during renderLink to the leaf page; redirect in next.config.ts
Two builds of one page ship different code coloursShiki stops tokenizing a line after 500 ms on a loaded machinetokenizeTimeLimit: 0
A Markdown twin answers 200 locally and 500 in productionThe route read MDX from disk, which the deployed function does not havePrerender every twin with dynamicParams = false
Utilities such as font-semibold and mt-6 do nothing on headingsAn unlayered reset outranks Tailwind 4's layered utilitiesMetrics in the section's stylesheet, gaps on the parent
A canvas goes soft after browser zoomZoom changes devicePixelRatio without resizing the boxWatch the resolution media query and re-arm it on every change
Shader and dither canvases come back blank in an embedded browser paneThe pane reports the page hidden and pauses requestAnimationFrameTake pixels with Playwright in Chrome for Testing
A translated Lottie animation draws nothing after one text layerA character missing from the glyph list throws inside lottie-web's canvas textAn empty glyph entry for every drawable character
Strings render in English in every localeThe gt generate command does not follow a gt destructured out of Promise.allconst gt = await getGT(); on its own line

On this page