Musings on software development, design, and the web.

Writings in the endless search for becoming a better software engineer.

Drag, drop, and the optimistic update race

My usual React Query reflex — just invalidate to get the real deal — fell apart the moment I added drag-and-drop to a kanban board. Here's what concurrent optimistic updates actually require, and where each concern belongs.

Architectural Decisions

Architectural decisions shape codebases for years. Here are the principles I've developed over 25 years to make better ones — covering simplicity, vendor lock-in, reversibility, and total cost of ownership.

Pragmatic ESLint: My recommendations

A philosophy-driven approach to ESLint configuration that catches bugs without getting in your way, with practical migration strategies for real codebases.

More CLI Tips

Generate a cli using your favorite tools.

Enum or const

I've been using enums for a while now, but I've been wondering if I should be using const instead.

Simplify those useEffects

useEffect's can cause a lot of headaches. Simplifying them can help spend less time debugging error prone code.

Disabled buttons make for sad users

A short list of other people explaining why disabled buttons should be avoided and a very short list about why not

Quick grid

Using grid instead of flex

Quick context

Setting up context quickly

Opensourcery: Theme types

A dive into how Stitches uses generics to type a theme