Writing

Managing Agents With a Shared Work List blog —
Several agents on one repo need a work list of their own. GitHub issues is the wrong shape for that, so I gave them beads and built myself a window onto it.
Global Map Data from Overture til —
Global OSM map data is even easier to get with Overture.
My Second Sabbatical blog —
I took a year away from work between leaving GitHub in June 2025 and starting my next job in early August 2026. This is the second such sabbatical I’ve taken, and I have zero regrets and …
Cookie-free analytics with GoatCounter on Hugo til —
The two Hugo template gates that keep dev-server pageviews out of production analytics.
Technology Is Not the Change You Are Managing blog —
AI is the technology change of the moment, and like every technology change before it, the technology is not the change being managed. This piece treats ADKAR—Prosci’s five-gate model of …
Capacity at Multiple Levels blog —
Determining team and organization capacity for work is relatively simple in theory, and gets messy and even emotional in practice. Here’s a synthesis of a lot of practices from across a bunch of …
Up and running with Pi til —
Instructions and tips for getting the pi.dev agent harness running on a Mac with 8GB of RAM.
Tooling to build learning micro-sites til —
Train My Brain is a Claude Code plugin that builds micro-sites for personal learning. Have an esoteric learning need? Spin up a site—modules, exercises, and a glossary, served locally and ready …
Systems, Not Individuals, Determine Product Quality blog —
When a software product has reliability problems, slow delivery, or mounting technical debt, the instinct in tech leadership is to hire better engineers, performance-manage underperformers, or add …
Markdown to PDF on Mac til —
How to convert a Markdown file to a PDF with pleasant fonts and great footnotes using pandoc and TeX.
Estimation at Multiple Levels blog —
Estimation is a dirty word in software and it has been for decades. But is it always bad? Are there times or situations where estimates add a degree of clarity without being dishonest? I think so, but …
Bookend agents for product quality blog —
Claude kept apologizing for skipping my expectation-based testing rules…and then skipping then again 2 minutes later. This is how I replaced best-effort written instructions with two …
launchd PATH whack-a-mole til —
macOS Launch Agents have a minimal PATH. Here’s how to stop playing whack-a-mole every time you add a new tool.
Caddy and Tailscale on reboot til —
Getting Caddy and Tailscale to serve multiple local apps on reboot without thinking about it.
Pear-ish theme for Zed til —
I made a warm, earthy theme for Zed. It took exactly a month to get merged.
Flow metrics for work in GitHub blog —
I built a GitHub CLI extension for engineering flow metrics. Here’s the philosophy behind it, and two stories about what went wrong.
Caddy + Tailscale for Remote File Serving til —
Serving a local HTML file over your tailnet with Caddy, Tailscale, and a macOS LaunchAgent.
Building the 'Jobs For Me' Agent blog —
What I learned building an AI job search agent as a Claude Work plugin in three days—and why I open-sourced it instead of selling it.
Building a language in Go blog —
What I learned building CalcMark — a calculation language embedded in markdown — in Go. Lexers, parsers, type systems, and the tradeoffs that bit me.
Teaching agents to use CalcMark til —
I wrote an agent skill so Claude Code can use CalcMark for calculations. Then I asked Claude what was hard, and it taught me a few things about building tools for agents.
Compound engineering blog —
How I used compound engineering to build a real product as a solo developer. Not “look how many commits I made” but “look at the quality and speed of issue resolution.” The …
Caddy File Server til —
Using Caddy as a web server for a local file system.
Create a Hugo Site from Scratch blog —
I like Hugo for static web sites but I always forget how to start from from scratch without a template. This is my short guide with some handy tips and reminders.
httpie for JSON data til —
Using a slightly nicer curl
Keep Github Actions Simple til —
A reminder to keep Github Actions simple and as free of logic as possible.
MCP and NumPy til —
I spun up a couple of projects to explore two separate topics: how to implement a basic MCP server; how to use NumPy for numerical computations.
Shrinking output from Go WebAssembly til —
Cross-compiling Go code to WebAssembly (WASM) is really powerful. It also produces massive files to download. So how can we shrink this down?
Git worktrees for local development til —
Using git worktrees for the first time in local development requires some new muscle memory.
Audaciously deciding to write a new language til —
I really wanted a tiny little version of Jupyter notebooks but for personal calculations that can also have Markdown in them. So I started chatting with my buddy, Claude, who gave me an inflated sense …
uv and Jupyter Best Friends til —
In which Claude Makes a Map til —
I decided to vibe code, truly putting Anthropic’s Claude CLI in the driver’s seat. It was instructive!
Week 5: Image and Video Generation blog —
Overview of generative approaches to image and video generation. Includes text-to-image and text-to-video tasks.
JS Modules and Refactoring Hugo Shortcodes til —
In which I finally read some docs on what a JavaScript module is and how it made my Hugo shortcodes self contained.
Week 4: Thinking and Reasoning Models blog —
Complex prompts are better handled with multi-step logical answers. Reasoning models are still an LLM, but we add reasoning before the response is provided.
Moving Ollama Models to a Different Disk til —
I’m running Ollama on a Macbook so shifting the default location that Ollama downloads massive models to is a necessity. It’s just one environment setting away.
Week 3: Agents blog —
Week 3 is all about agents. Workflows, tools, multi-step agents, and the protocols and frameworks involved.
D2 Diagram Rendering in Hugo til —
How I integrated D2 diagram rendering into my Hugo blog with a custom Go script
Tailscale Exit Node on Mac Mini til —
I want to set up an exit node on my Mac Mini using Tailscale. That way I can watch movies from anywhere and print stuff without being at home.
RAFT for RAG blog —
RAFT (Retrieval-Augmented Fine-Tuning) confused me when I first heard about it in a training class. It’s a technique that combines both offline fine-tuning and runtime retrieval to improve the …
Interpret LLM Model Size til —
How to interpret the numbers used to describe LLMs.
Week 2: Adapting LLMs blog —
Part two of the AI Engineering Course, focusing on adapting existing LLMs with post training work. It covers Retrieval Augmented Generation (RAG) and Fine Tuning.
uv for LLM Experiments blog —
Using uv instead of Anaconda environment.yml to set up a virtual environment for LLM experiments.
Week 1: LLM Foundations blog —
Resources from Week 1 of the AI Engineering Course
Previewing Markdown Files with mdserve til —
Dependency free markdown server
TPM Journey at Github blog —
Slides and recording of my presentation about how technical program management (TPM) came about at GitHub. All in context of Tuckman’s model of group development.
Slice by Slice blog —
How two German automotive engineers got inside my head. Or: how I learned to stop stressing out and to start solving problems.
Altitude, Brevity, Contrast, and Directness blog —
How to write with a busy reader in mind by answering some questions. What altitude are they at? How can you be succinct? Are you highlighting the important bits? Are you being as direct as you can be?
Whitelisting Pi-hole til —
Working with Pi-hole and a bit of sed.
Pay It Forward blog —
I had a great chat with a college student about a career in tech. I thought I’d share some of the advice I gave them. It’s not going to change the world, but it might help someone.
Tracking program investments in SQLite blog —
Using SQLite to work with hierarchical data and learning about CTEs and data loading along the way.