Writing from the workshop
202 articles on the parts that actually hurt.

Nuxt 4.6 nuxt/server: Why Mixing h3 Imports Throws NUXT_E8012
Nuxt 4.6 added a new nuxt/server import source alongside h3 — mix the two in one handler and you hit NUXT_E8012. The real boundary, plus a cheat sheet.
Oct 25, 2026 · 16 min
Your Custom Hooks Tear in React 18. useSyncExternalStore Fixes It.
A useState + useEffect hook that subscribes to window size, localStorage, or a WebSocket looks fine until React 18's concurrent rendering shows two parts of your UI two different values at once. useSyncExternalStore is the hook built to stop that.
Oct 23, 2026 · 5 min
NestJS 12 Lifecycle Hooks: The Order You Can't Assume
NestJS 12 changed how lifecycle hooks are ordered. Learn what onModuleInit and onApplicationBootstrap really guarantee, plus a copy-paste cheat sheet.
Oct 23, 2026 · 13 min
Stop Jamming Translate, Rotate, and Scale Into One transform
A CSS :hover scale and a JS drag handler both write to `transform` — and the moment JS sets it, the hover rule silently stops working, no error, no warning. The `translate`, `rotate`, and `scale` properties exist so this never happens.
Oct 22, 2026 · 5 min
Someone else got the promotion, and you're being told to wait
The decision didn't happen in the conversation where you heard about it — it happened weeks earlier, in a room you weren't in, with a budget you didn't see. Here's what to actually ask, and what the honest answer sounds like.
Oct 21, 2026 · 6 min
You're Letting the Browser Guess. fetchpriority Fixes That.
Your hero image is losing a bandwidth fight against a web font and a chat-widget script — fetchpriority tells the browser which request actually matters first.
Oct 21, 2026 · 5 min
Next.js 16.3 Instant Navigations: How Partial Prefetching Works
Next.js 16.3 shipped Instant Navigations: Partial Prefetching plus the App Shell. Learn the model, the Suspense gotcha, and a copy-paste cheat sheet.
Oct 20, 2026 · 14 min
Stop Formatting Currency With Regex. Intl.NumberFormat Does It.
A hand-rolled formatMoney() with toFixed() and a comma regex looks fine in a US demo and quietly breaks the moment a real user, a negative balance, or a non-dollar locale shows up. Intl.NumberFormat has handled all of it, built into every modern browser, since before most teams' codebases existed.
Oct 20, 2026 · 5 min
Vue 3.6: When a Watcher Throws, Your Other Watchers Stall
A Vue 3.6 reactivity regression let a throwing watcher silently stall its siblings. The exact flush() mechanism, the fix, and a copy-paste cheat sheet.
Oct 19, 2026 · 15 min
Your 'Expand All' Button Is Quietly Causing Layout Thrashing
An 'expand all' click that stutters isn't a slow CPU — it's layout thrashing, a loop that forces the browser to recalculate layout once per row instead of once per click. Here's how to spot it and the two-line fix.
Oct 19, 2026 · 5 min
Nuxt 4.6 useSession: Server Sessions Without a Database
Nuxt 4.6 ships useSession and runtimeConfig.appSecret — real, sealed-cookie sessions with no database or session store. How it works, plus a cheat sheet.
Oct 18, 2026 · 13 min
Stop Shipping Custom UI That Disappears in forced-colors Mode
Windows High Contrast Mode doesn't just boost contrast — it strips your backgrounds, shadows, and colors outright. Here's what `forced-colors` actually does, why a styled <div> vanishes while a real <button> survives, and the fix.
Oct 18, 2026 · 7 min