The blog

Writing from the workshop

204 articles on the parts that actually hurt.

section
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
Stop Using outline: none. Use :focus-visible Instead.
CSS

Stop Using outline: none. Use :focus-visible Instead.

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
Delete Your Auto-Resize Textarea JS. CSS Does It Now.
CSS

Delete Your Auto-Resize Textarea JS. CSS Does It Now.

The scrollHeight hack everyone copy-pastes for auto-growing textareas has a one-line CSS replacement — plus the one gotcha that bites if you skip max-height.

Aug 26, 2026 · 5 min
Nobody tells you the question window is closing
Starting somewhere new

Nobody tells you the question window is closing

In your first week you get to ask anything and it costs nothing. That window shuts quietly, usually around week three, and nobody announces it. Here's how to use it before it goes.

Aug 25, 2026 · 7 min
JavaScript Closures: The Complete Guide (with Cheat Sheet)
JavaScript

JavaScript Closures: The Complete Guide (with Cheat Sheet)

Learn how JavaScript closures really work — lexical scope, private state, memoization, and the classic loop bug — with worked examples and a cheat sheet.

Aug 25, 2026 · 14 min