Homebrew
The first commit of Homebrew is a 137-line README. The commit message is 'I'll start with a rare Belgian yeast and Sussex hops.'
29d85578e7Some initial commit messages tell you what the commit does. This one tells you what the author is drinking.
That is the commit message, exactly as it appears in the log. No description of what was added. No scope tag. No ticket reference. Just a character sipping at a bar, ordering ingredients.
This is the kind of initial commit that makes you like the author before you have read a single line of code.
1. What's in the commit
Like two of the previous repos we have covered, Homebrew's first commit contains exactly one file: a README. 137 lines. No source, no formulas, no bin/brew. Just a manifesto with brewing puns.
And the manifesto is genuinely interesting, because the Homebrew you use today has drifted substantially from the Homebrew in this file.
Today, Homebrew lives at /opt/homebrew (on Apple Silicon) or /usr/local (on Intel), and you interact with it through the brew command. In the original README, both of those details are different. Here is the opening paragraph, preserved:
"A simple package management system for OS X Leopard. Packages are brewed in individual, versioned kegs. For example:
/Brewery/Cellar/wget/1.14/bin/wget. Then symlinks are created to give a normal POSIX tree:bin/wget -> Cellar/wget/1.14/bin/wget. This way the filesystem is the package database. Everything else is now easy. We are made of win."
Three things to notice.
One: the install prefix is /Brewery, not /usr/local. The project was going to put itself at the root of the filesystem, in a directory named after a real-world place where beer is made. Max argues in a later paragraph that /usr/local is "actually pretty useful if you are a developer" because build scripts look there. He essentially pitches it as an alternative, not the default. The world eventually chose the alternative. /Brewery does not exist on your Mac.
Two: "the filesystem is the package database." This is the entire Homebrew design philosophy in one sentence. Instead of maintaining a SQLite file or a registry of installed packages, Homebrew uses the directory structure itself as its source of truth. Every package installed? Look at what's in Cellar/. Every file owned by a package? It is literally in that package's keg. Every symlink in bin/? That is the installation. There is no metadata to get out of sync, because there is no metadata. The filesystem already tracks what exists; Homebrew just lets it.
It is a beautiful, provocative design decision, and it is stated with complete confidence on day one.
Three: "We are made of win." That is how Max Howell described his project's prospects, in the README, before shipping a single line of code. Nobody wrote software like this in 2009 either. Also in the README: his Twitter handle (http://twitter.com/mxcl), a "Usage" section that recommends running package installs via ruby /Brewery/Formula/wget.rb, and the instruction cd /Brewery && git pull origin master to update your recipes. From day one, Homebrew was going to use git itself as its update mechanism. It still does.
2. What wasn't there yet
The README describes how to use brew, but the brew command did not exist in this commit. There is no bin/brew. There is no Formula. There is no Cellar. The way to "install" things, per the README itself, was to ruby /Brewery/Formula/wget.rb directly, as if the formula were a standalone installer script.
This is another entry in what I am starting to suspect is a pattern across great software projects: the README comes first. Next.js's initial commit was a README. Homebrew's initial commit is a README. Both describe working systems that did not work yet. Both are written in the present tense, as if the software already existed, which it did: in the author's head.
I don't know if this is causal or coincidence, but if you are starting something and you want it to last, maybe write the README before you write the code. Tell the reader who they are, what they get, and why it is made of win. Then go build that.
3. The Max Howell postscript
Four years after this commit, in June 2015, Max Howell posted a tweet that would become more famous than anything else he had ever written:
"Google: 90% of our engineers use the software you wrote (Homebrew), but you can't invert a binary tree on a whiteboard so f** off."*
The tweet is about a job interview he had just failed at Google. The implication was that his work was being used by the very engineers who rejected him. It became a cultural touchstone in the ongoing argument about whether tech hiring measures the right things. Whether or not you think the critique is fair, it is hard to imagine it landing with the same force if the thing he had made had been some other package manager with a sensible name and a sober README.
Homebrew was never just a package manager. It was a project with a voice. The voice is in the commit message. It is in the /Brewery prefix. It is in "We are made of win." It is in the decision to explain the design with beer metaphors that are impossible to forget.
A lot of software is built by people who want to disappear into their work. Homebrew was built by someone who wanted his work to sound like him. You can hear him from the first commit.
4. Footnotes from the commit log
- The filename is
README, notREADME.md. Extension-less READMEs were the norm in 2009 and persisted in Homebrew until a much later commit renamed the file. - The project began hosted on GitHub from day one. Not every 2009 OSS project can say that.
- "Leopard" refers to OS X 10.5. The README targets Leopard specifically. Snow Leopard (10.6) shipped three months after this commit.
- The email in the git author field is Max's personal address, not an employer's. Homebrew has never been a company project.