The blog

Writing from the workshop

202 articles on the parts that actually hurt.

section
Nuxt 4.6 nuxt/server: Why Mixing h3 Imports Throws NUXT_E8012
Nuxt

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.
React

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

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`
CSS

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
Leading

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.
Performance

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
Nextjs

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.
JavaScript

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
Vue

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
JavaScript

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

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
CSS

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