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

Nuxt 4 Migration: The Breaking Changes That Actually Bite
Nuxt 3 reached end-of-life on July 31, 2026. Here's exactly what breaks moving to Nuxt 4 — directories, data fetching, TypeScript — plus a cheat sheet.
Your Lighthouse Score Is 100. Long Animation Frames Explain the Jank.
Oct 11 · 6 min ReactReact 19.3 Fragment Refs: Skip the Wrapper Div for a Ref
Oct 10 · 13 min CSSYou Added will-change to Fix the Jank. You Made It Worse.
Oct 10 · 5 min CSSYou're Animating for Everyone. prefers-reduced-motion Fixes That.
Oct 9 · 6 min 
Stop Losing Promise Errors. unhandledrejection Catches Them.
A rejected promise with no .catch doesn't crash and doesn't show up in your error tracker — it just disappears. The unhandledrejection event is the global safety net most apps never wire up.
Oct 8, 2026 · 5 min
Junior interviews don't test what they used to, and nobody updated you
You prepped for an entry-level loop and got asked to defend tradeoffs like a senior hire. That's not the interviewer overreaching — the job underneath the title actually changed. Here's what they're listening for now, and the words that show it.
Oct 7, 2026 · 6 min
Stop Retrying Immediately. Exponential Backoff Fixes It.
Retrying a failed fetch() right away feels responsible — until the server that failed was already overloaded, and five instant retries per client turn a blip into an outage. Exponential backoff with jitter is the fix.
Oct 7, 2026 · 6 min
I Built Cross-Tab Logout. The storage Event Skipped One Tab.
A cross-tab 'log out everywhere' feature built on the storage event worked in every tab except the one the user actually clicked in. The storage event never fires in the tab that made the change — and that's spec, not a bug.
Oct 6, 2026 · 6 min
Next.js Streaming Metadata: Why Your <head> Looks Incomplete
Next.js 16 streaming metadata sends users a page before generateMetadata resolves, but blocks crawlers for a complete head. How it works, plus a cheat sheet.
Oct 6, 2026 · 14 min
Vue defineModel: The v-model Contract, Explained
Vue's defineModel macro replaces the modelValue prop and update:modelValue event with one ref. The exact v-model contract behind it, verified against Vue 3.5.
Oct 5, 2026 · 13 min
beforeunload Can Still Kill Your bfcache. Mount It Only When Dirty.
A `beforeunload` listener you left mounted forever can still quietly cost you bfcache eligibility — and an `unload` listener reliably will. Here's the pagehide/pageshow fix, and why 'mount it only when there's something to lose' is the durable rule.
Oct 5, 2026 · 6 min