This week
- In Kidz Fun Art, I recently increased the resolution of images by two, letting young artists draw at much higher quality (important for my 10 year old who was hitting the limits of the program, she’s amazing). However this introduced an annoying crash on Safari where, after...
Last week
- The reason I write more Go than JavaScript nowadays is not because there is anything wrong with the language, but because I’m tired of the ecosystem. The language on its own is really good, it is the first programming language that I became productive with and I’m still...
- For decades, one of the most notoriously-challenging problems on the web has been sticking one element to another element, for things like tooltips and nested menus. The CSSWG has decided to provide a first-class solution to this problem, and it’s pretty friggin’ cool! In this...
- I made some updates to my notes blog, including a change to how my “Shuffle” feature worked. Figured I’d blog about it. Shuffle? On a Blog? At the time of this writing, I have 974 “notes” that I’ve published. For fun, I have a “shuffle” button that digs up a random note from the...
- Do you remember the little drama with Apple and Google proposing two contradicting ideas about the native CSS way for masonry layout implementation? It is all over, and what we got is a beautiful compromise between the two in a the form of display: grid-lanes. This is super...
- I had a simple question: Why do websites load lots of individual images instead of stitching them into one giant image and cropping out the pieces they need? At first glance, an image atlas sounds g...
- I was popping off about negation being an act of creativity, when Blake Watson introduce me to the idea of the “This Page Intentionally Left Blank”-Project (Internet Archive): In former times printed manuals had some blank pages, usually with the remark “this page intentionally...
Two weeks ago
- Pretty big month for the web. Tons of great posts came out, Apple WWDC took place and a few shocking acquisitions happened as well. I have been travelling for work and with family this month a lot so no other crazy updates from my personal life this month, but as always great...
- I recently gave a talk on customizable (as in fully-stylable) <select>, and as I was building demos I realised there's a sizing 'pattern' that's almost always the-one-you-want, but it took me a long time to figure out how to do it in CSS. Well, I say I figured it out. I actually...
About a month ago
- This morning on Hacker News I saw Moebius: 0.2B Lightweight Image Inpainting Framework with 10B-Level Performance, describing a small but effective inpainting model—a model where you can mark regions of …
- Named slots are one of web components’ biggest superpowers ✨. Imagine a Button component with an optional icon; in Web Components we don’t need a separate Button and IconButton, a single Button component with <slot name="icon"> will do. Or a card component with a handful of...
about 1 month ago
- Drama about the pricing of AI models, countless npm vulnerabilities and Google I/O that at this point should be rebranded to Google AI. This is a short summary of the past month in software. Most of the news from these categories I entirely ignore, so I prepared for you a list...
- Gradient shaderPlanted: May 2026Status: seedIntended Audience: Creative coders and front-end developers with a basic understanding of WebGL shaders.How to create an organic gradient animation using a WebGL shader. If you're new to shaders, check out this note. What we'll make:...
about 2 months ago
- My colleague Chris Griffith, with whom I collaborated to put The Effects of Nuclear Weapons, Third Edition (1977) online, is also a spaceflight enthusiast (and an urban trails hiker: check out his new book!). He recently asked me how I would mark up a table with a split diagonal...
- There are a bunch of JavaScript animation libraries out there, and you might have wondered whether there’s a performance cost compared to traditional CSS transitions and keyframe animations. In this blog post, we’ll compare the same animation across several different strategies...
2 months ago
- Safari and Firefox change how big sites render based on the domain. TikTok, Netflix, Instagram… even SeatGuru. Chrome doesn’t. Why is that?...
- I’ve been posting about how you can make lots of HTML pages and leverage navigations over in-page, JS-dependent interactions. Now I’m gonna post another example. On my icon sites, I have a little widget that allows you to resize the icons you’re looking at. Previously, I...
- Forgive me, Reader. It’s been five months since my last vibe check. That’s a lot of ground to cover and it’s not possible to get into everything that happened. Like in real life conversations, instead of telling you how I’m doing, I’ll tell you what I’ve been doing these past...
- I wrote about building websites with LLMs — (L)ots of (L)ittle ht(M)l page(s) — and I think it’s time for a post-mortem on that approach: I like it. I’ve tweaked a few things from that original post but the underlying idea is still the same, which I would describe as: Avoid...
3 months ago
- The new Animation Timeline API allows us to create dynamic scroll animations without any JavaScript! It’s honestly a very lovely API, and in this blog post, we’ll explore some of the super cool things we can do with it....
- A practical use case for rendering HTML+CSS to a canvas, an emerging API being previewed in Chrome....
- Indirect draws in WebGPU 1. The two kinds of passes Every frame, CPU records commands grouped into passes. Two kinds matter here. Render pass = pixels come out. Runs the standard graphics pipeline: V...
- LlamaIndex have a most excellent open source project called LiteParse, which provides a Node.js CLI tool for extracting text from PDFs. I got a version of LiteParse working entirely in …
- Lately, I’ve been talking websites into existence. Not metaphorically, but actually sitting in important meetings with people — clients, collaborators, my wife, friends, neighbors — watching real websites materialize in front of us as we converse. I’ve been half-jokingly call...
Rows per page