Skip to content

Writing

Thoughts & essays

Notes on frontend engineering, performance, animation, and the decisions behind shipped work.

#CSS#Architecture

Subgrid: Nested Grids That Share the Parent's Tracks

A nested grid normally invents its own tracks. Subgrid makes it reuse the parent's instead, which fixes card rows, but also removes the implicit grid and lets padding leak into parent sizing.

Read
#TypeScript#Performance

Base64 Without the String Detour: Native Encoding on Uint8Array

ES2025 puts base64 and hex codecs on Uint8Array itself. What the four methods do, why lastChunkHandling decides whether your decoder validates anything, and what I measured.

Read
#TypeScript#Performance#Architecture

Set Algebra Is Now a Language Feature

JavaScript Set finally ships union, intersection, difference and three predicate methods. The set-like protocol, the ordering rules, and the reference-equality trap.

Read
#Architecture#TypeScript#Performance

One Tab to Rule Them All: Leader Election with the Web Locks API

The Web Locks API gives you cross-tab leader election with no heartbeat, no TTL, and no dependencies. A practical tour of modes, ifAvailable, signal, and why steal is a loaded weapon.

Read
#TypeScript#Architecture#Performance

Time Zones Are a Type Problem: What Temporal Actually Fixes

Temporal splits JavaScript's one vague Date into precise types. Measured DST behaviour in Node 26, and where the adoption claims in this year's blog posts get the browser versions wrong.

Read
#TypeScript#Architecture

URLPattern: Matching URLs Without a Router Library

The URL Pattern API replaces per-framework route matchers with one standardized grammar — and Node's native implementation diverges from the spec in one narrow case.

Read
#Performance#Architecture

The RegExp v Flag: Intersection, Subtraction and Properties of Strings

The v flag rewrites JavaScript's character-class grammar: intersection with &&, subtraction with --, nested classes and properties of strings. What shipped, and what breaks on upgrade.

Read
#Performance#Architecture

Iterator Helpers: Pipelines That Never Materialize an Array

Iterator helpers map, filter and take over a Map, a generator or an infinite sequence without ever spreading it into an array — plus the one footgun that shares its source.

Read
#CSS#Architecture

Cascade Layers as Architecture: Priority Without a Specificity War

Cascade layers make the layer itself a design decision, so specificity becomes a local concern inside a layer instead of a global arms race across your whole stylesheet.

Read
#CSS#Animation#Architecture

Entry Animations Without a Mount Class: @starting-style and Discrete Transitions

@starting-style gives a first-render element a state to transition from, and allow-discrete lets display flip mid-transition. Together they replace the mount-class dance.

Read
#CSS#Animation#Architecture

@property in Practice: Typed, Animatable CSS Variables

@property upgrades a CSS custom property from an untyped token stream to a typed, validatable, interpolable value — and the rules are stricter than they look.

Read
#TypeScript#Architecture#Performance

Text Segmentation Is a Locale Problem: Intl.Segmenter in Practice

Intl.Segmenter replaces the whitespace split with locale-aware segmentation: graphemes, words and sentences as the browser defines them.

Read
#Architecture#Performance#React

Moving DOM Nodes Without Losing State: The moveBefore() API

moveBefore() adds the DOM's missing move primitive: nodes relocate without the implicit remove-and-insert that resets iframes, focus, animations and dialogs.

Read
#CSS#Architecture#Performance

Scoped Styles Without a Build Step: The @scope At-Rule

The @scope at-rule limits selector reach in pure CSS — and adds scoping proximity, a zero-weight & rewrite, and a hard line between selector and style isolation.

Read
#CSS#Architecture#Performance

Overlays Without a Library: The Popover API as a Protocol

The Popover API is a browser-level overlay protocol: one attribute owns stacking, dismissal, focus order and events — no positioning library, no close listener.

Read
#Performance#Architecture#TypeScript

Cancellation as a Protocol: AbortSignal Beyond fetch()

AbortSignal is not just fetch() cancellation — it is a general protocol for stopping async work, with a typed reason, composable signals, and standard teardown.

Read
#CSS#Performance#Architecture

Skipping the Work You Can't See: content-visibility in Production

content-visibility lets the browser skip layout and paint for off-screen content, while contain-intrinsic-size keeps the scrollbar honest. What auto skips and where the gains disappear.

Read
#Performance#Architecture#CSS

Instant Navigation Without a Router: The Speculation Rules API

How the Speculation Rules API lets the browser prefetch or prerender the page a visitor is about to open — and what your code must stop doing to be safe to render ahead of time.

Read
#CSS#Animation#Performance

Scroll-Driven Animations Without a Scroll Listener

CSS scroll-driven animations swap an animation's clock timeline for scroll position: how animation-timeline, scroll(), view(), and animation-range work, and where the support floor sits.

Read
#CSS#Architecture#React

Anchored UI Without a Positioning Library

How the Popover API and CSS anchor positioning replaced JavaScript positioning libraries: tethering, position-area, edge fallbacks, and the support floor.

Read
#Performance#Architecture#TypeScript

Breaking Up Long Tasks with scheduler.yield()

How scheduler.yield() hands the main thread back without losing your place in the task queue — with cross-browser fallbacks and LoAF measurement.

Read
#CSS#Performance#Architecture

Container Queries in Practice: Responsive Components Without Media Queries

Container queries let components adapt to their own space instead of the viewport. Learn how to build truly reusable responsive UI with modern CSS, including fallbacks and real-world patterns.

Read
#React#Animation#CSS

View Transitions Without Framework Lock-In

A progressive-enhancement pattern for adding polished route and panel transitions while keeping state, accessibility, and fallbacks under your control.

Read