The blog

Writing from the workshop

202 articles on the parts that actually hurt.

section
React 19.2 useEffectEvent: Why It Won't Fix Your Deps Array
React

React 19.2 useEffectEvent: Why It Won't Fix Your Deps Array

React's useEffectEvent (stable in 19.2) kills stale closures in Effects without a ref trick — but it's not a deps-array shortcut. Guide + cheat sheet.

Oct 17, 2026 · 15 min
Inferred Type Predicates Won't Save filter(Boolean). Here's What Will.
TypeScript

Inferred Type Predicates Won't Save filter(Boolean). Here's What Will.

TypeScript 5.5 added inferred type predicates, and the internet decided that meant filter(Boolean) finally narrows. It doesn't. Here's exactly what the feature fixed, why the mix-up happened, and the one-line pattern that actually gets you type-safe filtering.

Oct 17, 2026 · 5 min
Stop Letting One Widget Reflow the Whole Page. `contain` Scopes It.
CSS

Stop Letting One Widget Reflow the Whole Page. contain Scopes It.

A live counter or chat widget shouldn't make the rest of your page recompute layout every time it updates. The CSS contain property draws a hard boundary the browser can actually trust — here's what it promises, and the one gotcha that breaks pages when people misuse it.

Oct 16, 2026 · 6 min
Stop Electing a Leader Tab. SharedWorker Just Holds the Connection.
JavaScript

Stop Electing a Leader Tab. SharedWorker Just Holds the Connection.

Electing a leader tab to own one shared WebSocket works great — until the leader is the tab someone closes. SharedWorker skips the election: the connection lives in the worker, not in any tab, so there's no leader to lose.

Oct 15, 2026 · 6 min
I Turned 44 Blog Posts Into a Frontend Roadmap You Have to Pass
JavaScript

I Turned 44 Blog Posts Into a Frontend Roadmap You Have to Pass

A free frontend roadmap where every level is an article and a quiz you have to pass. Skip what you already know, no sign-up to start, cheat sheet inside.

Oct 14, 2026 · 18 min
Remote work means someone else is telling your story for you
Company shapes

Remote work means someone else is telling your story for you

When you're not in the room where advancement gets decided, your manager becomes the only account of your work that reaches it. Here's what that changes, and what to actually say before the next one happens.

Oct 14, 2026 · 7 min
You Installed a Library for Numbers PerformanceObserver Already Has.
JavaScript

You Installed a Library for Numbers PerformanceObserver Already Has.

The web-vitals npm package gets credit for data your browser already computes. Here's what three PerformanceObserver calls give you for free — and the one piece of math it quietly saves you from getting wrong.

Oct 14, 2026 · 7 min
Your Tabs Each Open Their Own WebSocket. navigator.locks Elects One.
JavaScript

Your Tabs Each Open Their Own WebSocket. navigator.locks Elects One.

Six open tabs means six live connections to your server, six duplicate pushes, six timers draining the battery. navigator.locks elects a single leader tab to hold the real connection — the rest just listen.

Oct 13, 2026 · 6 min
Next.js 16 Image: priority Deprecated, quality Now Allowlisted
Nextjs

Next.js 16 Image: priority Deprecated, quality Now Allowlisted

Next.js 16 quietly deprecated Image's priority for preload and restricts quality to an allowlist (default: 75). What breaks, plus a copy-paste cheat sheet.

Oct 13, 2026 · 15 min
Vue watch vs watchEffect: The Complete Guide
Vue

Vue watch vs watchEffect: The Complete Guide

Vue's watch() and watchEffect() look interchangeable but track dependencies, run timing, and cleanup differently. The exact rules, verified against Vue 3.5.

Oct 12, 2026 · 15 min
I Shipped a Fix. My Service Worker Kept Serving the Bug.
JavaScript

I Shipped a Fix. My Service Worker Kept Serving the Bug.

A critical bug fix went out, and support tickets kept coming in from people who swore they'd refreshed. The code was fine. The service worker's cache-first strategy was doing its job perfectly — which was the whole problem.

Oct 12, 2026 · 6 min
Nuxt 4 Migration: The Breaking Changes That Actually Bite
Nuxt

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.

Oct 11, 2026 · 14 min