Updates for May 2026
Here's what I've been working on, doing, and thinking about this month.
I implemented a Markdown formatter, incorporated it into my editors, and reformatted all of the input files for the site.
After my trip to London, I took a week off from work to start some house projects and spend time with family.
I wrote an article about updating my site to Zig 0.16 with some screenshots and added a "full screen zoom" feature for images on the site. The screenshots also have light and dark variants depending on the browser's color scheme.
I updated a text-based Instapaper client written in Go to Bubble Tea v2, which was a little confusing at first.
I didn't read any books, despite the best intentions to dig into some non-fiction. My motivation to read books tends to wane going into summer for some reason. But I did keep up with articles:
Shipping a Laptop to a Refugee Camp in Uganda
What had taken nearly two full days of travelling, waiting, stress, negotiation, and indirect requests for unofficial payments was finally completed in a matter of minutes.
And that's just to even be able to pay the taxes on the shipment! One of the most upsetting and uplifting stories about technology I've ever read. That surprise and delight at the end is why I do what I do, but I wish it was vastly more accessible.
The Day I Logged 1 In Every 2000 Public IPv4: Visualizing The AI Scraper DDoS
Every pixel that is red/orange/yellow is a /24 that contains at least a single IPv4 address that, in the span of 24 hours on 2026-04-24, hit my VPS [...]
I'm a sucker for heat map visualizations and this is such a neat application of them.11 The portions grayed out because they're reserved or unused are a nice touch. It's a sad state for the web and there's no relief in sight for those of us who want to stay off the global CDNs.
3 constraints before I build anything
First research, plan, prototype, then write the one pager again. Iterate. If it requires more than one page, it's too complex, don't build it.
I build a lot of things that aren't "products" per se, but I wish more engineers would actually spend the time to write down what it is they're trying to accomplish and why.
But my bags are all the wrong size, too small or so large that the book lays horizontally at the bottom, which annoys me. [...] So I made a bag just for this one book.
I'd love to get more into sewing for bags and other non-clothing items, but all of the independent fabric stores around me are closing and nothing caters to the MYOG crowd.
Minimal Viable Zig Error Contexts
[...] just log error context as
key=valuepairs, guarded byerrdefer. The result is not pretty, but passableBut it still logs whenever an error is handled, which is a problem for
error.Canceledin Zig 0.16.When I picked up Zig coming from Swift and Rust, I was worried about missing dynamic context from returned errors. The technique outlined in this article addresses that concern during prototyping with minimal boilerplate. I started applying a bit of this to my website and unfortunately, it doesn't scale naturally to reporting through a diagnostics array because
deferblocks cannot return errors (or usetry).What’s nice about this is you don’t need to worry about the order of the fields because they’re extracted from the format string. If you squint it looks a little like basic string interpolation.
This is a cute trick for printing, but having to use all of the fields is a bit annoying. Another shortcut that's available if you need it early on, though.
Just Fucking Use Go and the ensuing Lobste.rs discussion
You're out there gluing together fifteen Node packages, three TypeScript build tools, and a Kubernetes cluster to serve a fucking form. You hired a Platform Team to babysit your Rails monolith. You convinced your CTO that Rust was necessary for a CRUD app that does maybe forty requests a second. Congratulations, asshole. You played yourself.
I hate to say it (because Go is a very mid and frankly frustrating language), but I completely agree with this take. If you are working in a space that is well-covered by Go's built-in libraries or even well-known ones (like Bubble Tea for TUIs), they're generally so high-quality that it makes the limitations of the language less important.
It stays this small because it was purpose-built around three goals listed in the package doc: stay hand-editable, store trees of text files for go command test cases, and diff cleanly in git history and code reviews.
What a delightful and simple way to write tests.
You can beat the binary search
[...] the quad approach has little effect on the Apple platform, but it is a decent optimization on the Intel platform for large arrays in the cold case.
As someone who knows a thing or two about optimizing binary search, this feels a bit unfair because the baseline implementation is not branchless. It would be interesting to compare this to a more optimized version.
Downtown San Mateo Is a Monument to Insider Self-Dealing
In 1862, with Polhemus running railroad construction, he commissioned a surveyor to plat the town of San Mateo at the exact point where the right-of-way crossed the creek. Conveniently, that point was the middle of his own holdings.
Any nostalgia for the past evaporated when I realized that the "golden age" of rail travel in the USA was brought about by their equivalent of crypto grifters. I wish that Stanford's board had allowed their mascot to be changed to the robber barons. Max was on a roll this month, despite unsettling feelings of LLM writing.
We're Diversifying the University by Hiring More Crackpots
Many ideas that enjoy enormous popularity among billionaires -- cryogenic immortality, disregard for punctuation, the Antichrist -- have scandalously been excluded from our labs and classrooms.
There exist no incentives at SFSU to hire good teachers. There are no incentives for teachers to improve the quality of teaching. There is no quality control at all to this end.
You can have too much faculty and you can have too much administration, but most educational institutions emphasize the latter with ineffective management roles. The lack of broad systems thinking here is painful to read about.
Japan's invisible electric wall
The result was rolling blackouts in Tokyo and surrounding areas, even though western Japan had spare capacity it could have sent over.
I've heard of the out-of-phase regions in USA and Europe's convoluted set of electric railway standards, but nothing prepared me for Japan's tolerated disfunction.
Japan's Tourism Troubles Are Being Fuelled By Social Media Assholes
In 2026 you couldn't move without hitting a Westerner filming themselves for some kind of content, their cameras raised above them while they narrated the event (whether there was actually an audience I'll never know), each one an oblivious centre of their own universe while the 1000 people around them were just trying to get past them so they could cross the road and get home.
The week and change I took for the staycation was filled with miniature adventures: bike trailer forays into town, Happy Hollow merry-go-round rides by the dozen, a trek through the beleagured California Academy of Sciences, and other visits to pretty much every museum within a thirty minute drive. It was fun to pack the days with that instead of the seemingly-constant work from my business trip. I did fall off the journaling wagon, in a way, switching to a smaller A6-sized "bullet journal" for daily check-ins. The larger notebook got a few long entries when I had something to say, but filled up much slower this month than the previous ones.
My bike storage situation has always been an afterthought, but I finally found the time to install an RS Slide and GearBlocks wall brackets to hang all four commonly-used bikes. I also cleared out more of the garage to make way for a weight lifting bench and rack I ordered. It was Bike to Work Day in the Bay Area this month and I took part in that ritual, too. To mark the occasion, the Rove got its Albatross handlebars back.
I've returned to using the venerable Sublime Text for most text editing tasks. Helix still helps with in-terminal editing tasks and Nova is the dedicated CSS editor due to its browser preview. But I'm trying to stick with Sublime for everything else, including prose (replacing iA Writer). The last time I bounced off Sublime Text was when I wanted search-as-you-type across my entire project, which Helix does pretty well.