Engineering insights

Practical notes on technical ownership, collaboration and building maintainable products.

Aug 182 min read

React 19 Actions: forms, useActionState and useOptimistic

Replace hand-written pending, error and optimistic state with the built-in form primitives.

React 19 made async mutations a first-class concept. A function passed to a form's action prop is an Action: React tracks its pending state, handles errors, and resets the form on success.

Read article

Jul 142 min read

TypeScript 7: what the native compiler changes in practice

A Go-based compiler that is roughly an order of magnitude faster. What to expect in CI, editors and tooling.

TypeScript 7.0 is the compiler rewritten in Go. Microsoft reports full-build speedups in the range of 8x to 12x on large codebases (for example, VS Code going from about 126 seconds to about 11 seconds). The type system is a faithful port, so the same code should produce the same errors.

Read article

Jun 092 min read

React Compiler 1.0 in practice: do you still need useMemo?

What automatic memoization changes, how to adopt it incrementally and when manual hooks still matter.

React Compiler reached 1.0 in October 2025. It is a build-time tool that analyzes components and inserts memoization for you, so most useMemo, useCallback and React.memo calls become unnecessary.

Read article

May 122 min read

Upgrading to Next.js 16: proxy.ts, Turbopack and async params

A practical upgrade checklist for the changes that actually break builds.

Next.js 16 is mostly an evolutionary upgrade, but a few changes will touch every project. This is the checklist we use.

Read article

Apr 142 min read

Modern JavaScript you can use now: iterator helpers, Set methods and more

Features that are now safe in current browsers and Node.js, with before/after examples.

Several long-awaited additions are now widely available. Here are the ones that remove the most boilerplate. Verify support for your audience on MDN or caniuse before shipping.

Read article

Mar 262 min read

TypeScript 6.0: the bridge release before the native compiler

New defaults, deprecations and a migration checklist for getting your tsconfig ready for TypeScript 7.

TypeScript 6.0 shipped on March 23, 2026 as the last release built on the JavaScript codebase. It adds little new syntax. Its job is to align defaults and deprecate legacy options so that the move to the native TypeScript 7 compiler is boring.

Read article

Mar 032 min read

CSS container queries: components that respond to their own space

Size queries, container units, style queries and scroll-state queries, with what is safe to use today.

Media queries ask about the viewport. But a card in a sidebar and the same card in a wide grid need different layouts at the same viewport width. Container queries let a component respond to the size of its container instead.

Read article

Feb 241 min read

React 19.2: Activity and useEffectEvent

Keep hidden UI alive without paying for it, and stop effects from re-running for the wrong reasons.

React 19.2 (October 2025) adds two features that fix long-standing annoyances: <Activity> for preserving UI state, and useEffectEvent for effects that read fresh values.

Read article

Feb 102 min read

Temporal: JavaScript dates, finally fixed

Immutable, time-zone-aware date and time types that ship in Chrome 144 and Firefox 139. How to use them and what to do about Safari.

Date has been a source of bugs for decades: it is mutable, months are zero-based, parsing is inconsistent, and time zones are implicit. Temporal replaces it with a set of explicit, immutable types.

Read article

Jan 202 min read

Next.js 16 Cache Components: explicit caching with use cache

Why the App Router moved from implicit caching to opt-in, and how to cache pages, components and functions.

Next.js 16 (October 2025) changes the caching model. Earlier App Router versions cached aggressively by default, which surprised many teams. With Cache Components, code is dynamic at request time unless you opt in with the "use cache" directive. It builds on Partial Pre-Rendering: a static shell is served instantly and dynamic parts stream in.

Read article