Blog
Practical notes on JavaScript tooling, module systems and the platform decisions behind the work we do
-
Passkeys in Node.js Without Locking Users Out
How to add passkeys to a Node.js app with @simplewebauthn, from registration and conditional-UI login to the credential lifecycle that prevents lockouts.
-
Astro Server Islands: Cache the Page, Not the User
Astro server islands defer one component with server:defer so the rest of the page stays static and CDN-cacheable, plus the traps to avoid.
-
CSS Anchor Positioning: Replace Floating UI
CSS anchor positioning now ships in Chrome, Firefox and Safari, so dropdowns and tooltips can follow their trigger without Floating UI.
-
TypeScript 7 Migration: Fix Your tsconfig First
TypeScript 7 removes a dozen deprecated compiler options, flips eight tsconfig defaults and ships no API, so here is the upgrade order.
-
Vite 8 Rolldown Migration: What Actually Breaks
Vite 8 replaces esbuild and Rollup with Rolldown; the migration breaks build.rollupOptions, manualChunks, decorators and the esbuild minifier.
-
Node's Built-In Test Runner: Ready to Replace Jest?
Node's built-in test runner handles suites, mocking, snapshots and coverage with no dependencies, though watch mode and module mocking are experimental.
-
Hydrogen vs Next.js for a Shopify Storefront
Hydrogen hands you Shopify's cart, caching and customer accounts on Oxygen; Next.js hands you a runtime choice and the rest of the work.
-
How to Fix INP: Diagnose It Before You Optimise
How to fix INP: use web-vitals attribution and the Long Animation Frames API to name the slow script, then fix the phase that dominates.
-
Next.js use cache: Keys, Lifetimes and Limits
How Next.js builds a use cache key, what the cacheLife profiles actually mean, and why cookies() inside a cached scope throws.
-
Oxlint vs Biome: Picking an ESLint Replacement
Oxlint is lint-only and runs real tsc type checking through tsgolint, while Biome bundles the formatter and infers types without a compiler.
-
Cloudflare Pages vs Workers: Which to Deploy On
Cloudflare now says to start new projects on Workers, not Pages: what Static Assets changes, what breaks, and when Pages still wins.
-
Run TypeScript in Node Without ts-node or tsx
Node can run TypeScript without ts-node by stripping types from .ts files, as long as you avoid the four syntax forms it refuses.