Recent Posts
-
The Zeigarnik Effect: Why Half-Done Things Live Rent-Free in Your Head
A 1927 observation about waiters and unpaid bills that explains cliffhangers, open browser tabs, and that one TODO in your code you can't stop...
-
Clawdbot: the open-source personal AI assistant
An open-source personal AI assistant, maybe this is what practical AI actually looks like.
-
Cloudflare Buys AstroJS!
Cloudflare has acquired the team behind Astro. Some thoughts - half excited, half cautious, all in on Astro either way.
-
View Transitions on the Web — for SPAs and Plain Old Multi-Page Sites
What the View Transitions API actually does, how it now works for server-rendered multi-page sites with @view-transition, and the gotchas with...
-
A collection of old ChromeDriver
A github repo for older ChromeDriver versions.
-
Optimistic UI Patterns
The mental model behind optimistic updates, why React 19's useOptimistic matters, and how the same trick has lived inside GraphQL clients for...
-
TypeScript Narrowing - The Rules Every Dev Should Know
Type guards, the in operator, discriminated unions, and exhaustive checks with never. The narrowing rules I keep reaching for.
-
Moving My Blog to Astro
After almost a decade on Jekyll, I rebuilt this site on Astro. Here's the migration story, the plugins I wrote, and the content collection setup...
-
Anchor Positioning Is Going to Kill the Floating UI Libraries
Native CSS anchor positioning is shipping in browsers. Here's what it does, why it matters, and what it means for floating-ui, Popper, and the...
-
AbortController for Cancelling Fetches
How AbortController works, why every search-as-you-type input should use one, and the hooks/patterns I keep reaching for.