Latest posts
- In defense of GitHub's poor uptimeApr 10, 2026
In short: GitHub’s downtime is bad, but uptime numbers can be misleading. It’s not as bad as it looks; more like a D than an F. “Zero nines uptime”? 99.99% uptime, or “four nines”, is a common industry standard. Four nines of uptime is equivalent to 1.008 minutes of downtime per week. GitHub is not meeting that, and it’s frustrating. Even though they’re owned by Microsoft’s, one of the richest com
- Notes from March 2026Mar 31, 2026
March always seems to be my life’s busiest month. Things I wrote and made “The two kinds of error”: in my mind, software errors are divided into two categories: expected and unexpected errors. I finally wrote up this idea I’ve had for a long time. “All tests pass” is a short story about a strange, and sorta sad, experience I had with a coding agent. Inspired by others, I published a disclaimer abo
- All tests pass: a short storyMar 22, 2026
One night, I wrote a simple tool to pick a random programming language. After shuffling a few times, I landed on Arturo. I decided to try it for fun. What’s Arturo? Best I understand, Arturo is a stack-based programming language. It’s primarily maintained by Yanis Zafirópulos. They published a vision of the language in 2020. Here’s the stated goal from that post: to make something that I myself wi
- Little web app to pick a random programming languageMar 22, 2026
I wrote a web app to choose a random programming language. It’s very simple; I hestitate to even call it an “app”! The interesting part was scraping all the languages on Rosetta Code, and even that wasn’t very interesting. But I hope you like it! I learned about a language called Arturo this way, and wrote a short story about that experience.
- human.jsonMar 14, 2026
To quote the human.json Protocol: human.json is a protocol for humans to assert authorship of their site content and vouch for the humanity of others. It uses URL ownership as identity, and trust propagates through a crawlable web of vouches between sites. I think this is a neat idea, so I added it to my site. It’s available at evanhahn.com/human.json. For more, see the human.json documentation. A
- How I use generative AI on this blogMar 12, 2026
Inspired by others, I’m publishing how I use generative AI to write this little blog. General feelings on generative AI Generative AI, like any technology, has tradeoffs. I think the cons far outweigh the pros. In other words, the world would be better off without generative AI. Despite this belief, I use it. I’m effectively forced at work, but I also use LLMs to help write this personal blog. I t
- Introducing llm-elizaMar 08, 2026
LLM is a popular CLI tool for talking with language models. I built llm-eliza, a plugin to chat with the ELIZA language model. Usage: llm install llm-eliza llm -m eliza "I'm worried about computers." # => What do you think machines have to do with your problem? ELIZA, released in 1966, is a state-of-the-art language model. It offers zero-GPU inference with sub-millisecond semantic throughput, an
- The two kinds of errorMar 01, 2026
In short: in my mind, errors are divided into two categories. Expected errors (think “user entered invalid data”), which are part of normal operation, aren’t the developer’s fault, and should be handled. Unexpected errors (think “null pointer exception”) are the developer’s fault, likely indicate a bug, and are allowed to crash. Error handling is an important, but often neglected, part of programm
- Notes from February 2026Feb 28, 2026
Things I did and saw this February. Things I made I shipped my first feature at Ghost: Inbox Links. When a member enters their email to log in or sign up, we now show a button that takes them straight to their inbox. In addition to shipping a neat feature, I also enjoyed learning about MX records and RFC-compliant email address parsing. The source code for the main logic is here. I was surprised t
- Introducing gzpeek, a tool to parse gzip metadataFeb 26, 2026
In short: gzip streams contain metadata, like the operating system that did the compression. I built a tool to read this metadata. I love reading specifications for file formats. They always have little surprises. I had assumed that the gzip format was strictly used for compression. My guess was: a few bytes of bookkeeping, the compressed data, and maybe a checksum. But then I read the spec. The g