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

Updates

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. ↩︎