Evan Hahn (dot com)
human.json
How I use generative AI on this blog
Introducing llm-eliza
The two kinds of error
Notes from February 2026
Introducing gzpeek, a tool to parse gzip metadata
Track Zelda release anniversaries in your calendar
Notes from January 2026
An LLM that's 7500× stupider
A mental math heuristic to convert between Fahrenheit and Celsius
I set all 376 Vim options and I'm still a fool
Notes from "On Writing Well"
Notes from December 2025
Prediction: Mastodon will outlive Bluesky
Notes from "Bad Company: Private Equity and the Death of the American Dream"
How I implemented relative imports with Pyodide
I made a little audio speed calculator
Notes from November 2025
Draft: Stopping bad guys from using my open source project (feedback wanted)
Notes from "The Story of the Typewriter"
Experiment: making TypeScript immutable-by-default
Fizz Buzz without conditionals or booleans
Kirby Air Riders demo impressions (from a big fan of the original)
"Understanding Unicode": my October 2025 talk at Longhorn PHP
Notes from "Tor: From the Dark Web to the Future of Privacy"
Notes from October 2025
Scripts I wrote that I use all the time
Notes from September 2025
People read your blog in many different ways
@ts-ignore is almost always the worst option
JS fetch converts string request bodies to UTF-8
Notes from August 2025
Notes from July 2025
Notes from "The Weather Machine: A Journey Inside the Forecast"
Notes from "Where Wizards Stay Up Late: The Origins of the Internet"
Local LLMs versus offline Wikipedia
Simple macOS script to extract text from images (OCR)