Blog
Practical notes on JavaScript tooling, module systems and the platform decisions behind the work we do
-
Next.js after(): Background Work Without a Queue
Next.js after() runs background work once the response is sent: where it is allowed, which request APIs work inside it, and when you need a queue.
-
Astro Content Layer: Writing a Custom Loader
How to write a custom Astro content loader for a headless CMS: the data store, digests for incremental builds, and when live collections win.
-
Speculation Rules API: Prefetch or Prerender?
The Speculation Rules API prefetches or prerenders next pages for instant navigation, and prefetch is the safer default for most sites.
-
Web Components in React 19: What Actually Works
React 19 passes every Custom Elements Everywhere test, so web components in React work without a wrapper, but the property, typing and SSR edges remain.
-
Content Security Policy: Nonces vs Hashes
Nonces need per-request HTML and hashes do not, so your Content Security Policy choice decides whether pages can stay cached.
-
React Router v8 Upgrade: Flags First, Then Bump
React Router v8 makes middleware, ESM and split route modules the default, so upgrade by enabling the v7 future flags first.
-
The JavaScript Temporal API: Adopt It or Wait
Temporal ships natively in Chrome 144, Firefox 139 and Node 26 but not Safari, so the JavaScript Temporal API still needs a polyfill in the browser.
-
Shopify's New Discount Function API: How to Migrate
Shopify's Product, Order and Shipping discount function APIs are deprecated: here is what changes when you migrate to the unified Discount API.
-
OpenTelemetry Node.js Setup That Actually Traces
A working OpenTelemetry Node.js setup needs four packages, two startup flags and a sampling decision, and ESM apps need one flag more.
-
Standard Schema: TypeScript Validation Without Adapters
Standard Schema lets a TypeScript tool accept Zod, Valibot or ArkType through one property, and here is what quietly breaks when you swap.
-
Server-Sent Events vs WebSockets: How to Choose
SSE gives you automatic reconnection and event replay over plain HTTP, while WebSockets buy a client-to-server channel most streaming features never use.
-
node:sqlite vs better-sqlite3: When to Switch
node:sqlite matches better-sqlite3 for everyday queries and drops the native build step, but it is still a release candidate with no transaction helper.