How I Build

My tools and how I use them.

This is a guide to my tools and processes for building software. I'm writing this both to share what I've found with other humans, and as guidance for LLMs that interact with me & share my tools.

I've found these tools helpful building "pre-LLM" software in small and large startups, and for LLM-enabled applications like I'm working on now. My tool choices are largely informed by how I structure software. I don't spend much time justifying my tools here. That's both for brevity, and because I think tools either resonate with a person or they don't . It's also not exhaustive—these are what I keep in the tool chest, not the attic.1

My Laptop

My primary development environment. Working roughly from the bottom up:

My Servers

By this, I mean computers that I own or rent to run services on.

Development Environment

Command Line Tools

Mostly installed through Homebrew or uv.

Backend Services

I like "boring" and reliable here. These are the most commonly used.

Backend (Python)

I mostly write backends in Python, unless there's a good reason not to.

Frontend

Mainly web apps, mobile apps, and static landing pages.

How I Structure Software

These are my opinions and beliefs on effectively structuring software. They're born of my experience and style of building. I believe they are "right" in a sense, but not the only right way. They are mainly in the context of building B2B/B2C application code, and not e.g. firmware for pacemakers.

Types

Exceptions

Configuration

Organization

Comments

Testing

Footnotes

  1. This guide mostly applies to B2B/B2C "web"-based applications—my tools for e.g. PKI and announcing BGP are kept in the attic.

  2. PicoShare's creator Michael Lynch has a very honest and transparent blog about building products / businesses that I enjoy.

  3. llm's creator Simon Willison has a high-signal/high-volume blog that I read every day. It's a great resource, particularly for working with LLMs. His style of working in the open is inspiring, and sparks a lot of ideas for me. Dan Corin is another great example of building in the open like this.

  4. There are a bunch of great plugins for llm, and you can write your own. I use a wrapper I wrote to generate terminal commands and my sister's commitm to generate commit messages. It pairs well with files-to-prompt for including file context.

  5. OpenRouter's got a stacked team. I'm very bullish on them & happy to call them friends.

  6. Obviously, I'm bullish on Astral. Charlie Marsh is building a team of wizards, including sharkdp and BurntSushi, who authored tools on this list.

  7. Hynek Schlawack created attrs, stamina, and structlog on this list. I resonate well with his approach to structuring software. His blog and the documentation on his projects are excellent resources, especially on Python and Docker.

  8. Pydantic is another great team pushing the Python ecosystem forward. Samuel Colvin and the team have great technical taste that shows across their projects.

  9. The This Week in React newsletter is a good source for keeping up to date with React Native news.

  10. I think UIs are going to change a lot as AI improves. Geoffrey Litt does insightful work on the topic of "malleable software" that I suggest reading.

  11. I see a lot of natural hesitation to do this because of a misapplication of the DRY Principle. There's a difference between being explicit and being duplicative. The cost of being explicit is going to 0 with LLMs, and we can harness the benefits for free.

  12. In Python, pattern matching is newer and a bit unintuitive. Raymond Hettinger has a talk explaining the quirks and some complicated workarounds. I use it more simply for matching types. I always check for exhaustiveness, and exclude a default case (or use assert_never) so the type checker tells me when I am missing a case.

  13. I use my fork of result for this in Python, along with stamina to retry things that fail intermittently. I prefer decorators over a bunch of if (err) style logic.