- The pitfalls of things that seem easy … Mar 14, 2025
- On actually reading error messages … Mar 14, 2025
- The invisible layers of the stack, or why whitespace broke authentication … Mar 13, 2025
- A rat’s nest of configuration management … Feb 20, 2025
- Coordinating Unicorn worker processes with flock … Jan 31, 2025
- How to instrument DNS lookups in Ruby … Dec 19, 2024
- True BASIC/4d/Star Pattern/01 … Dec 4, 2024
- DIY unit tests … Nov 20, 2024
- Reading programming languages you don't understand … Nov 10, 2024
- Golang, flow state, and Copilot … Oct 29, 2024
- Mental models of the command line … Oct 7, 2024
- Command line tool design … Oct 1, 2024
- Pointers in Ruby … Sep 26, 2024
- Always document flows … Sep 25, 2024
- A confusing issue to debug, or the mysterious case of 5000ms server delays … Sep 5, 2024
- Identity management in big places … Aug 18, 2024
- The perils of IPv6, or, why I got rid of my virtual private server … Jan 21, 2024
- Software and softness … Sep 16, 2023
- How to write your own Jira client and suffer slightly less … Aug 22, 2023
- Two years in enterprise software … Jul 21, 2023
- How to downsize a tiny web server and the services on it … May 9, 2023
- Just where do env vars come from? … Mar 6, 2023
- My first day using Docker … Nov 29, 2022
- Were you root? … Oct 18, 2022
- Thoughts on URL path routing … Oct 7, 2022
- The hacker spirit … Oct 3, 2022
- How this site is built … Oct 2, 2022
- Web projects in a Humanities division … Sep 16, 2022
- A day in the life of a web agency … Aug 21, 2021
- Reading as caching … Mar 16, 2016
- A day in the life of campus IT … Jan 1, 2016