This week
- Introduction Buttons that scale on hover with CSS feel dead. No overshoot. No bounce. No life. Spring physics fix this. The button pops past its target scale and settles back. Feels like it has weight...
- The Problem When using TanStack Table with TanStack Virtual and many columns that extend beyond the viewport, scrolling horizontally causes the header cells to appear transparent. Body row content ble...
Last week
- The Problem Vite SPA serves one index.html for all routes. Social crawlers (X, Discord, Slack, LinkedIn, etc.) read the first HTML response and don't run JavaScript. So every shared link shows the sam...
- So I got an email earlier, which you’ll find out about in my next post, which made me think “hey, the reply to this would make a great blog post”, and then I thought “…and it would be even better if people could add their own comments to it”, and so I plugged in the rather...
- Pretext went viral for its beautiful canvas demos. But the community is showcasing the wrong feature....
Two weeks ago
- 1. Separate what you know once from what changes There is work that depends on data that rarely changes, and work that depends on data that changes constantly. When you mix them together, you pay the...
- Introduction Most React developers have heard of startTransition. Few actually understand what it does. Even fewer know when they need it. Let me explain it from the ground up. How React renders with...
- Introduction Every React tutorial tells you the same thing. "Never use array index as key." It is one of those rules people repeat without thinking about why it exists. And because they never think ab...
- There is a lil’ UI detail on this blog. Most people don’t even notice it, but the ones who do often reach out, asking how on earth it works. It feels like it defies the rules of CSS! In this blog post, I’ll break down the surprisingly-straightforward implementation so you can...
- I shipped some updates to my notes site. Nothing huge. Just small stuff. But what is big stuff except a bunch of small stuff combined? So small stuff is important too. What follows is a bunch of tiny details you probably don’t care about, but they were all decisions I had to...
About a month ago
- Introduction This is the note for future me. This bug was not random. Chrome was correct. We tried to start background music from mousemove. That feels like usage. It is not a real activation event fo...
- Introduction You have a combobox using cmdk (shadcn Command component) inside a Radix Dialog. The list has more items than fit. You expect it to scroll. It does not scroll. You are not alone. This iss...
- Introduction Sonner is the best toast library for React. But the docs barely cover advanced styling. This is everything I learned building a custom dark toast system with colored rails, action buttons...
- This post is the fourth and last in a series comparing the same sample blog in Web Origami and Eleventy: - Eleventy version: Source code and Demo - Origami version: Source code and Demo As a very crude metric, the conciseness of legible code can roughly...
- This post is the second in a series comparing the same sample blog in Web Origami and Eleventy: - Eleventy version: Source code and Demo - Origami version: Source code and Demo Today let's look at how both projects define the overall structure of the site...
- March 17, 2026 This post series is for people who want to build or rebuild a site. You may have heard of Eleventy, a popular static site generator, and maybe heard it’s simple to use. To evaluate that simplicity, I’ll compare a sample blog in Eleventy to the same blog in Web...
- If you’ve been building web for a while, you probably remember the mess of six million files in your head element just to have a well-supported favicon. This is all over now, and a handful of files should be more than enough. Alleluia! “How to Favicon in 2026” on Evil Martians...
about 1 month ago
- Introduction If you ever tried to put an editable input next to a Radix UI context menu. You probably hit this wall. The input loses focus. It refuses to stay focused. You click on it. Nothing happens...
- I’m interested in helping to create a shared JavaScript library for letting Electron apps authenticate with Netlify (and potentially GitHub/GitLab pages) via OAuth for the purpose of creating new projects and uploading files to existing projects.
- Introduction You added overflow: hidden and the collapse still looks wrong. The problem is not the motion component. It is the gap on your parent flex container. What is happening AnimatePresence keep...
- The Problem With a Fixed Textarea A normal has a fixed height. When content overflows that height, the browser adds a vertical scrollbar. This is fine for long-form editing like a notes app...
- Walking into London’s Barbican Estate is like stepping into a parallel timeline, a concrete vision of what the 1960s thought the future would look like. When people first encounter the term “brutalist”, the association that usually springs to mind is “brutal” – harsh, cruel,...
- After an absolutely devastating January, my February was chilled and productive, and I really hope to keep that trend. Today is the State of the Browsers day, and I’m well pumped to be there with my best friends, surrounded by the best folks from the web community. I’m still...
about 2 months ago
- In game development, it’s common to use spritesheets for animation, but this technique isn’t as widely used on the web. Which is a shame, because we can do some pretty cool stuff with sprites! In this post, we’ll share the niche CSS function you can use to leverage this...
Rows per page