Blog
Posts on software development, careers, and craft.
Claude's init command is impressive
Claude's init command is impressive. It inspected my project and generated this markdown file for future reference. I only had to make one minor tw...
So I'm using Tanstack Router on another new project and I gotta say it again...
So I'm using Tanstack Router on another new project and I gotta say it again - it's fantastic. Elegant API File or config based routing Superb type...
I enjoy having my own an app that’s just for experiments
I enjoy having my own an app that’s just for experiments. It’s a spot where I can try new tech, ideas, patterns, and libraries. I can toy with perf...
Each time I open up an old JS project, I get dozens of breaking changes when...
Each time I open up an old JS project, I get dozens of breaking changes when I update npm packages. It's wonderful that all these open source proje...
How I've fetched in React over 10 years: 2014: Fetch in componentDidMount...
How I've fetched in React over 10 years: 2014: Fetch in componentDidMount 2019: Fetch in useEffect 2020: Custom useFetch hook 2021: React query 202...
If you give a junior dev a vague task, you’ll probably get bad results
If you give a junior dev a vague task, you’ll probably get bad results. Same story with an LLM. Vague, high-level prompts produce bad results. Be s...
I’m eager to see how LLM usage changes when the venture capital money dries up
I’m eager to see how LLM usage changes when the venture capital money dries up. People think it’s expensive today, but it’s actually artificially c...
I think sync engines are the future
I think sync engines are the future. These slides show why. https://www.dropbox.com/scl/fi/ofac1voz9hwj3mgrzfd6o/Local-first-web-apps.pptx?rlkey=mz...
How I’d pick a router in React in 2025: 1
How I’d pick a router in React in 2025: 1. Using a framework with a built-in router like Next? Use the built-in router, but add nuqs for type safe...
Wild story of working with Claude I just heard from a friend: I was coding...
Wild story of working with Claude I just heard from a friend: I was coding late at night and angrily prompting Claude. Claude replied "It's late. P...
Theory: The fewer long-lived environments the better
Theory: The fewer long-lived environments the better. I prefer having only one long-lived environment - Production. Here's my ideal 3 step workflow...
I'm curious - Who's doing development with just two environments
I'm curious - Who's doing development with just two environments? (dev and prod) Would love to hear your experience and approach. If you have more...
Just heard of a team where non-developers (such as designers and product...
Just heard of a team where non-developers (such as designers and product owners) are contributing code using AI. Like any other code, the dev team...
AI is supposed to make us faster coders, right
AI is supposed to make us faster coders, right? So, 3 questions: 1. Are your estimates lower now? 2. Has your team’ velocity increased? 3. Does you...
My preferred React stack for 2025 Package manager: Bun Starter: Vite...
My preferred React stack for 2025 Package manager: Bun Starter: Vite Language: TypeScript Router: Tanstack Router Remote state: Sync engine like Co...
When learning a new tech, I like to open PRs to improve the docs
When learning a new tech, I like to open PRs to improve the docs. It's easy for a maintainer to forget what it's like for a beginner to try their p...
I'm bullish on sync engines, but I admit there's a lot of downsides to...
I'm bullish on sync engines, but I admit there's a lot of downsides to consider too. Here's 9. 1. Distributed state is a complex mental model 2. Ha...
"Should my web app use a sync engine?" If your web app would benefit from...
"Should my web app use a sync engine?" If your web app would benefit from caching, live queries, retries, instantaneous UX, offline support, stream...
"Developers don't write automated tests
"Developers don't write automated tests. That's QA's job". I just had a consulting call with a dev team in this situation. I see this often, and it...
I've found arguing is more productive when I do 3 things: 1
I've found arguing is more productive when I do 3 things: 1. Be open to changing my mind. 2. Be curious. Why do we disagree? How do our experiences...
Two related, but separate ideas: 1
Two related, but separate ideas: 1. Local-first: An app that stores data locally, and works offline. 2. Sync-engine: Automatically syncing data bet...
After 25 years of coding I've realized there is no end to learning
After 25 years of coding I've realized there is no end to learning. So go enjoy your 4th of July weekend 🇺🇸 Don't worry, work will be waiting for...
I wish more library/framework docs had a section for “Stuff we don’t do well”
I wish more library/framework docs had a section for “Stuff we don’t do well”. Example: “Tailwind works best with a component abstraction. Without...
I've spent the last few weeks experimenting with different local-first /...
I've spent the last few weeks experimenting with different local-first / sync engine solutions. So far I've built the same app using: @convex_dev @...
One of my favorite uses for rest/spread is creating a new object that omits...
One of my favorite uses for rest/spread is creating a new object that omits one or more properties. In this example, I created a vehicle object wit...
Shots fired
Shots fired. I've been a fan of Tanstack Query for years, but this post on caching by Convex has me thinking. "Periodic invalidation and stale-whil...
I've never enjoyed writing CSS, but two innovations solved that: 1
I've never enjoyed writing CSS, but two innovations solved that: 1. Tailwind. No more wasting time coming up with class names. No more worries abou...
What are people using instead of Storybook these days
What are people using instead of Storybook these days? One simple alternative I enjoy: Create a page in the app that shows reusable components. Thi...
5 types of React state, and when I use each: 1
5 types of React state, and when I use each: 1. useState - For simple component-local state 2. useReducer - For complex component-local state 3. Zu...
Programming isn't easy
Programming isn't easy. But, it's getting easier. Innovations that made shipping software easier: 1890: Punch cards 1945: High-level languages 1958...