The blog

Writing from the workshop

119 articles on the parts that actually hurt.

section
Vue Reactivity Explained: ref vs reactive (+ Cheat Sheet)
Vue

Vue Reactivity Explained: ref vs reactive (+ Cheat Sheet)

A complete guide to Vue reactivity: how ref and reactive really work, why destructuring breaks updates, when to use each, and a copy-paste cheat sheet.

Aug 24, 2026 · 14 min
JavaScript Proxy and Reflect: The Complete Guide
JavaScript

JavaScript Proxy and Reflect: The Complete Guide

Learn JavaScript Proxy and Reflect from the ground up — traps, invariants, and reactive state — with worked examples and a copy-paste cheat sheet.

Aug 24, 2026 · 15 min
The CSS Selector Built to Lose Every Fight
CSS

The CSS Selector Built to Lose Every Fight

You keep reaching for !important to override a component's styles. There's a selector that fixes this by contributing zero specificity, on purpose.

Aug 24, 2026 · 5 min
One version bump, 40 files to edit. Import maps fix that.
JavaScript

One version bump, 40 files to edit. Import maps fix that.

Bare specifiers like import _ from 'lodash' don't work in a browser without a bundler — unless you tell the browser how to resolve them yourself, in one JSON block instead of forty hardcoded URLs.

Aug 23, 2026 · 5 min
Your fetch in beforeunload is silently killed. navigator.sendBeacon guarantees delivery.
JavaScript

Your fetch in beforeunload is silently killed. navigator.sendBeacon guarantees delivery.

When the page unloads, the browser may cancel any in-flight fetch or XHR before it completes. navigator.sendBeacon sends a POST the browser commits to delivering, even after the document is gone.

Aug 22, 2026 · 4 min
The Modal Was Open. So Was Everything Behind It.
HTML

The Modal Was Open. So Was Everything Behind It.

A keyboard-only pass found a background button still worked while a modal was open — aria-hidden had hidden it from screen readers but never touched focus or clicks. One boolean attribute, inert, closes that gap in a single line.

Aug 21, 2026 · 5 min
Stop Writing Regex to Match URLs — The Browser Already Can
JavaScript

Stop Writing Regex to Match URLs — The Browser Already Can

A service worker's route regex was missing one anchor and started caching live edit forms as if they were read-only pages. URLPattern, native since 2021, doesn't let you make that mistake.

Aug 20, 2026 · 6 min
Stop Writing Media Queries for Font Size
CSS

Stop Writing Media Queries for Font Size

A design system audit found five breakpoints for one heading. clamp() replaces all of them with one line that never jumps.

Aug 19, 2026 · 4 min
I Ripped Out a Carousel Library. CSS Replaced It.
CSS

I Ripped Out a Carousel Library. CSS Replaced It.

A scroll listener, a debounce, and 200 lines of carousel-library glue code — replaced by three CSS properties that snap smoother than any of it did.

Aug 18, 2026 · 4 min
Stop Writing Math.cos() in a Resize Listener
CSS

Stop Writing Math.cos() in a Resize Listener

CSS learned trigonometry. Here's the radial menu that used to need a resize listener — and doesn't anymore.

Aug 17, 2026 · 4 min
I Can Finally Delete My max-height: 9999px Animation Hack
CSS

I Can Finally Delete My max-height: 9999px Animation Hack

CSS transitions have never been able to animate to height: auto, because auto isn't a number the engine can interpolate. calc-size() and interpolate-size finally give it real numbers — no JavaScript, no magic-number ceiling.

Aug 16, 2026 · 6 min
Five tabs open, one refresh token — the race nobody noticed
JavaScript

Five tabs open, one refresh token — the race nobody noticed

Users with multiple tabs open triggered a silent race: every tab refreshed the same expiring auth token at once, and the server started invalidating its own sessions. navigator.locks fixes it with a real mutex, no polling or localStorage hacks required.

Aug 15, 2026 · 5 min