The blog

Writing from the workshop

202 articles on the parts that actually hurt.

section
Your Lighthouse Score Is 100. Long Animation Frames Explain the Jank.
JavaScript

Your Lighthouse Score Is 100. Long Animation Frames Explain the Jank.

Lighthouse says 100 and CI is green, but a user still says the filter button feels sluggish. The Long Animation Frames API names the exact script and phase that blocked the frame — here's how to read it instead of squinting at a flame chart.

Oct 11, 2026 · 6 min
React 19.3 Fragment Refs: Skip the Wrapper Div for a Ref
React

React 19.3 Fragment Refs: Skip the Wrapper Div for a Ref

React 19.3 Fragment Refs let you ref a sibling group with no wrapper div. Learn the FragmentInstance API, its limits, and get a copy-paste cheat sheet.

Oct 10, 2026 · 13 min
You Added `will-change` to Fix the Jank. You Made It Worse.
CSS

You Added will-change to Fix the Jank. You Made It Worse.

will-change: transform looks like a free performance switch. Applied broadly or left on permanently, it does the opposite — here's the narrow, temporary pattern that actually works.

Oct 10, 2026 · 5 min
You're Animating for Everyone. `prefers-reduced-motion` Fixes That.
CSS

You're Animating for Everyone. prefers-reduced-motion Fixes That.

Most animated UIs never check whether the visitor asked for less motion. `prefers-reduced-motion` is the CSS media feature that tells you — and a fail-closed pattern keeps you honest even when a browser doesn't support it.

Oct 9, 2026 · 6 min
Stop Losing Promise Errors. `unhandledrejection` Catches Them.
JavaScript

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
Getting hired

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

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

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
Nextjs

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

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

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
Nuxt 4.5 SSR Streaming: The Route Rules That Disable It
Nuxt

Nuxt 4.5 SSR Streaming: The Route Rules That Disable It

Nuxt 4.5's experimental SSR streaming flushes HTML early, but cache, isr, swr, redirect, and ssr:false route rules silently fall back to buffering. Cheat sheet included.

Oct 4, 2026 · 14 min