Articles
Long-form, practical writing on AI engineering, React and JavaScript — hosted right here.
JSON Modules and Import Attributes: Import JSON Without fetch or a Bundler
JSON modules are Baseline: import JSON directly with the ES2025 with { type: 'json' } syntax in every modern browser, Node 22+ and Deno — and when fetch still wins.
Array.fromAsync, Promise.try and RegExp.escape: Three ES2026 Features Worth Using Today
A practical guide to the most useful ES2026 additions — Array.fromAsync for collecting async iterables, Promise.try for unifying sync/async calls, and RegExp.escape for safe dynamic regexes.
React's use() Hook: Reading Promises and Context the New Way
React 19's use() reads promises and context right in render — even conditionally. How it works with Suspense and Server Components, plus the caching gotcha.
The Navigation API Is Baseline: A Practical Guide to Replacing History Hacks
The Navigation API now works in Chrome, Edge, Firefox and Safari. How navigation.navigate, intercept() and entries() replace History API hacks in real SPAs — with code.
AbortController in Practice: Cancel Fetch, Add Timeouts, and Auto-Clean Event Listeners
A practical guide to AbortController and AbortSignal — cancelling fetch requests, AbortSignal.timeout and AbortSignal.any, React useEffect cleanup, and one-line event listener removal.
React Server Components in 2026: A Practical Mental Model (Finally)
React Server Components are now the default for new projects — but the mental model still trips people up. What actually runs where, what 'use client' really marks, and where to draw the boundary.
JavaScript's using Keyword: Explicit Resource Management, Explained with Real Code
ES2026's using and await using declarations auto-dispose resources when a scope exits. How Symbol.dispose, DisposableStack and async disposal work in practice.
JavaScript Set Methods: union, intersection, difference and Friends, Explained
JavaScript finally has real set operations: union, intersection, difference, symmetricDifference and the subset checks. How each works, the set-like rules, and where they beat array tricks.
JavaScript Signals: A Practical Guide to the TC39 Proposal
What the TC39 Signals proposal actually gives you: Signal.State, Signal.Computed, and Watchers explained with runnable code, framework context, and honest caveats.
React ViewTransition and Activity: Smooth UI Transitions the React Way
A practical guide to React's ViewTransition component and the Activity API: animated navigation, shared element transitions, and state-preserving hidden UI — with code.
MCP Architecture Explained: Hosts, Clients, Servers, and the 2026 Spec
How the Model Context Protocol actually works — hosts, clients, servers, transports, and primitives — plus what the 2026 spec changes for anyone building MCPs.
Building MCPs: A Practical Guide to Your First MCP Server in TypeScript
Building MCPs demystified: what an MCP server actually is, how to write one in TypeScript with the official SDK, wire it into Claude, test it, and avoid the classic stdio mistakes.
React's Activity Component: Hide UI Without Losing State
A practical guide to React 19.2's Activity component: hide tabs, modals and routes without losing state, and pre-render the screens users visit next.
JavaScript using Declarations: Deterministic Cleanup Without try/finally Pyramids
Explicit Resource Management brings using and await using to JavaScript. How Symbol.dispose, Symbol.asyncDispose and DisposableStack replace nested try/finally - with real code.
Migrating from Create React App to Vite: A Practical 2026 Guide
Create React App is dead and Vite is the default. A step-by-step migration guide: index.html, env vars, proxies, Jest to Vitest, and the gotchas nobody mentions.
Popover API + CSS Anchor Positioning: Tooltips and Dropdowns Without a Library
Build accessible tooltips and dropdown menus with the native Popover API and CSS anchor positioning - no Floating UI required - and wire them into React 19.
React Compiler in Practice: Adopting Automatic Memoization Without Surprises
React Compiler auto-memoizes your components so you can delete most useMemo/useCallback calls. How it works, how to adopt it incrementally, and where it will not save you.
The Temporal API Is Finally Here: A Practical Guide to JavaScript's New Dates
Temporal is now shipping in Chrome and Firefox. A hands-on tour of PlainDate, ZonedDateTime, Instant and Duration — with the recipes you actually need day to day.
JavaScript Iterator Helpers: Lazy .map, .filter and .take Pipelines Without Intermediate Arrays
Iterator helpers are now Baseline in every browser. A hands-on guide to .map, .filter, .take and .toArray — lazy pipelines with no intermediate arrays.
React 19 Form Actions: useActionState, useFormStatus and useOptimistic Explained
How React 19's Actions replace the useState/loading/error boilerplate in forms — a practical walkthrough of useActionState, useFormStatus and useOptimistic with real code.
Looking for my posts on Medium, dev.to and elsewhere? See external writing.