The blog

Writing from the workshop

111 articles on the parts that actually hurt.

section
Next.js Cache Components Explained (with Cheat Sheet)
Nextjs

Next.js Cache Components Explained (with Cheat Sheet)

How Next.js Cache Components decide what's static, what's cached, and what streams — the use cache directive, cacheLife, and Suspense explained.

Sep 1, 2026 · 14 min
Your Router Doesn't Intercept Navigation. It Reacts To It.
JavaScript

Your Router Doesn't Intercept Navigation. It Reacts To It.

Double-click a link during a slow route change and most SPA routers render two pages and settle on the wrong one — because they're listening for navigation after it already happened. The Navigation API lets you stop it before it starts.

Sep 1, 2026 · 5 min
Debounce and Throttle in JavaScript: The Complete Guide
JavaScript

Debounce and Throttle in JavaScript: The Complete Guide

Learn debounce and throttle in JavaScript step by step, with worked examples, edge cases, and a copy-paste cheat sheet for search, scroll, and resize.

Aug 31, 2026 · 14 min
You Don't Need a WebSocket for That Live Feed
JavaScript

You Don't Need a WebSocket for That Live Feed

A live notification badge, a progress bar, a dashboard counter — you reached for socket.io and started hand-rolling reconnect logic. The browser already ships a simpler API that does it for you.

Aug 31, 2026 · 6 min
Nuxt useState vs ref(): Why Server State Leaks Across Users
Nuxt

Nuxt useState vs ref(): Why Server State Leaks Across Users

A module-scope ref() in Nuxt is shared by every request that hits your server. Learn why useState isolates state per user, and how to fix the leak.

Aug 30, 2026 · 14 min
Delete Your padding-bottom Aspect-Ratio Hack
CSS

Delete Your padding-bottom Aspect-Ratio Hack

For a decade the only way to keep a responsive box's shape was a padding percentage and an absolutely positioned wrapper. One CSS property replaces it — with one gotcha on real images nobody warns you about.

Aug 30, 2026 · 6 min
React Multi-Step Form: The Complete Guide (with Cheat Sheet)
Article

React Multi-Step Form: The Complete Guide (with Cheat Sheet)

Build a React multi-step form that validates per step, survives a refresh, and stays accessible — the mental model, the traps, and a copy-paste cheat sheet.

Aug 30, 2026 · 20 min
React Re-render vs Remount: What Actually Triggers Each
React

React Re-render vs Remount: What Actually Triggers Each

A practical guide to React re-render vs remount: what type, position, and key decide, why state resets unexpectedly, and how to force a remount.

Aug 29, 2026 · 13 min
The outline: none Debate Has Been Over Since 2020
CSS

The outline: none Debate Has Been Over Since 2020

A designer flags the ugly blue focus ring in review. An engineer deletes it with outline: none. Nobody notices the keyboard-only user who now can't tell where they are on the page.

Aug 29, 2026 · 4 min
NestJS Request Lifecycle Explained (with Cheat Sheet)
Nestjs

NestJS Request Lifecycle Explained (with Cheat Sheet)

A complete guide to the NestJS request lifecycle: the exact order middleware, guards, interceptors, pipes, and filters run, and why it matters.

Aug 28, 2026 · 13 min
Your Grid Has Invisible Columns: auto-fill vs auto-fit
CSS

Your Grid Has Invisible Columns: auto-fill vs auto-fit

A responsive card grid that works perfectly with twelve items breaks with two — not from a bug, but from one word in a repeat() you copy-pasted without reading.

Aug 28, 2026 · 5 min
You're truncating bios with `.slice()`. `Intl.Segmenter` knows where the emoji actually end.
JavaScript

You're truncating bios with .slice(). Intl.Segmenter knows where the emoji actually end.

A 30-character bio limit that cuts off mid-emoji isn't a rendering bug — it's .length counting UTF-16 code units instead of what's on screen. Intl.Segmenter counts graphemes, words, and sentences the way a reader actually sees them, and every major browser supports it now.

Aug 27, 2026 · 5 min