Skip to main content

Notes from shipping code

Deep-dives on the problems I've debugged, the patterns I've extracted, and the decisions I'd make differently next time.

Posts

Organized tools hanging on a workshop pegboard

Three Tools I Add to Every Monorepo Now

Knip finds dead code, Renovate updates dependencies with cooldowns, and size-limit tracks bundle cost. Each took under an hour to configure for Nx.

3 min read
A ruler and measuring tools on a wooden surface

Turning a Prose Style Guide into Zod Build Checks

Character limits, canonical tags, and em dash rules encoded as a Zod discriminated union. The script caught a duplicate cover image on its first run.

3 min read
Checklist with green checkmarks on a clipboard

Replacing CSS Class Assertions with ARIA in Storybook

CSS classes break when Tailwind configs change. ARIA attributes are the semantic contract. Six rules for interaction tests that survive refactors.

3 min read
Colorful tags and labels sorted into rows

Client-Side Tag Filtering Without Losing SEO URLs

One component renders Link for crawlable tag pages or button for instant client filtering. The same TagChipStrip serves both without duplicating code.

3 min read
A single bright thread connecting scattered fabric swatches on a table

Killing Split-Brain Content with One Metadata Export

How moving cover images, titles, and excerpts into MDX metadata eliminated 680 lines of duplicate records and the silent drift between them.

3 min read
A shield icon protecting a circuit board

Sentry Should Be Optional in Your Next.js App

A single boolean guard across three runtimes keeps Sentry from crashing local dev when the DSN is missing.

1 min read
A grid of device screens showing the same interface at different sizes

Mobile Visual Regression Without Doubling Your Test Count

A typed page config array turns 9 copy-pasted Playwright tests into a loop that runs at two viewports with zero duplication.

2 min read
A funnel pouring colored liquid into a glass flask

Correlating a Multi-Step Funnel with One sessionStorage ID

A timestamp and random suffix in sessionStorage ties scan, completion, email capture, and calendar booking into one GA4 funnel with zero backend state.

2 min read
Search results with ranked filters on a screen

Upgrading cmdk Search with MiniSearch Field Boosting

cmdk does substring matching. Keeping its UI shell and swapping the filter engine for MiniSearch gives ranked, fuzzy results with match highlighting.

2 min read
A sunrise and sunset gradient on the horizon

Cycling Theme Toggle: From Radio Group to Single Button

Replacing a three-button theme picker with a single cycling button and a keyboard shortcut reclaims nav space without losing discoverability.

2 min read
A slow-motion water droplet frozen in time

Systematic prefers-reduced-motion Across a Component Library

Auditing every animated component for motion sensitivity reveals which animations are decorative and which need static alternatives.

2 min read
A command palette interface on a dark screen

Site Search Without a Server: Static Index and cmdk

A build-time search index and cmdk power Cmd+K search across 47 pages with zero API calls.

2 min read