What is Homebrew?

Homebrew is a package manager for MacOS and Linux systems. Although it is called homebrew, the command is shortened to brew.

The thing about homebrew is that every command and option sticks to the theme of brewing. I haven’t gone and dug out why this is the case, but I found it amusing.

As I had used homebrew a couple of times when setting up my work laptop and now setting up my own, I got curious and wanted to know what options the command accepted. The brewery terminology also was intriguing.

Learn more about homebrew here - https://docs.brew.sh/Manpage

So to view all there is that you need to know about homebrew, you could either open that link, or you can just type in man brew in your command line and that should open up the manpage for you in your terminal!

Let’s get some terminology out of the way.


According to the manpage, it is a package definition built from upstream sources.

This definition was not good enough for me.

I was like what does upstream sources mean here? Where is this source? So I did a search online like I do a 1000 times a day, and I came across this https://docs.brew.sh/Formula-Cookbook

So a formula for Homebrew is actually a package definition written in Ruby! That is a lot clearer!

Homebrew doesn’t know all the formulae in the world, the default known to homebrew can be seen at Homebrew/homebrew-core.

A formula script contains instructions to the location of the tar or archive of the application you are trying to install. The script also knows how to build the application.

You can create one of your own formulae using the command brew create path-to-zip-or-tarball.

That’s how you package your application for brew. You can then use brew’s installer debugger by running another command brew install –debug –verbose name-of-your-formula.


While we are at it, not every package has to be compiled like this from source code. Homebrew allows installation of binary applications that do not need to be built from scratch. These are Bottles.


Homebrew installs all applications in a Cellar. This is the root directory where homebrew stores all the software installed and built using homebrew.

Homebrew installs things into the Cellar and then creates symlinks to /usr/local to make all the good stuff that’s installed accessible to other applications.


The doc says that Keg is the installation prefix of a Formula! And gives an example path! That wasn’t clear at all to me!

In reality it is the path where a formula is installed in your computer. In your Cellar, homebrew will install a package by creating a directory for each formula-name/version. That fully qualified path is a Keg.

So in summary, you put a formula in a Keg, in the Cellar. Get it?


There are times when installing something homebrew detects that creating a symlink in /usr/local could actually create conflicts with already installed applications. In these scenarios, homebrew could do something called a keg-only installation.

By that it means, you can access your application, only via the keg - i.e by providing a fully qualified path to the application. It won’t be available globally for execution.


Rack is where all the kegs of a formula are. E.g. if a keg is /usr/local/Cellar/foo/0.1, then the the rack is /usr/local/Cellar/foo.

If it is any easier to remember, it is the root folder of the application in the Cellar.


A tap is what gives you formulae. It is a public git repository comprised of a set of formulae.

You can use brew tap url/to/git-repo/that/is/a/tap to make a formula source available to brew. As mentioned earlier, when installed, brew would only be aware of the core formulae, anything beyond that must be communicated to brew.


This is a MacOS only extension of brew that allows you install native MacOs apps from the command line! So when the virgin brew allows you to install tarballs and archives from ruby scripts, cask lets you install full blown .dmg files.


As the name suggests, a bundle is a group of related applications that you can install at once! Instead of manually doing installation of formulae one by one.

A bundle is really just a file named Brewfile that lists out several different taps and formulae.

You would generally install a bundle using: brew bundle install name-of-bundle

brew bundle name-of-bundle would also do the install.

You can choose to install from a Brewfile you have downloaded too: brew bundle --file=path/to/brewfile


Occasionally you have to run some updates too. That’s when you run brew update formula. If you ran the command without mentioning the name of a specific formula, brew would update all the formulae that it knows of in the system and also update itself! Handy!


Upgrade on the other hand - does major version upgrades, unlike its sibling update. It also behaves the same way as the update command. If you specify a formula name, that specific formula is upgraded, else everything that is outdated is upgraded.


I don’t think I have to explain here. brew rm formula or brew uninstall formula.


brew cleanup formula

Removes outdated version of a formula, does this for all formulae if none is specified. Good idea to do this after an upgrade.

That’s all for now

Happy brewing!

Buy me a cookie