zerobrew (GitHub Repo)
zerobrew brings uv-style performance to Homebrew by using content-addressed storage to achieve significantly faster package installation speeds.
Deep dive
- Content-Addressable Storage: Files are stored based on their content hash, enabling automatic deduplication and zero-overhead copying.
- Performance Gains: Benchmarks show significant improvements in 'warm' installs (where dependencies are cached) compared to standard Homebrew.
- Compatibility: zerobrew reuses Homebrew's existing 'bottles' (pre-compiled binary packages), requiring no changes to formula definitions.
- Design Philosophy: It treats the package store as an interface for linking rather than a place to rebuild and sign binaries upon every invocation.
- Risk: The project is currently experimental and intended for use alongside, rather than as a total replacement for, the official Homebrew client.
Decoder
- Bottle: The term used by Homebrew for a pre-compiled binary package.
- Formula: A Ruby script that defines how to download, compile, and install a piece of software in Homebrew.
- Keg: The specific directory in the Homebrew cellar where a package is installed.
Original article
zerobrew
zerobrew brings uv-style architecture to Homebrew packages on macOS and Linux.
Install
curl -fsSL https://zerobrew.rs/install | bash
The installer updates your shell config. After it finishes, restart your terminal or run the source command it prints.
Or via Homebrew:
brew install zerobrewhq/zerobrew/zerobrew
Update zerobrew
If you used the standalone installer, rerun it:
curl -fsSL https://zerobrew.rs/install | bash zb --version
If you installed with Homebrew:
brew update && brew upgrade zerobrew
If you installed from the old lucasgelfond/zerobrew tap, it's no longer updated. Switch to the new one:
brew uninstall zerobrew brew untap lucasgelfond/zerobrew brew install zerobrewhq/zerobrew/zerobrew
Quick start
zb install jq # install one package zb install wget git # install multiple zb bundle # install from Brewfile zb bundle install -f myfile # install from custom file zb bundle dump # export installed packages to Brewfile zb bundle dump -f out --force # dump to custom file (overwrite) zb uninstall jq # uninstall one package zb outdated # list packages with newer versions zb upgrade # upgrade all outdated packages zb upgrade jq wget # upgrade specific packages zb reset # uninstall everything zb gc # garbage collect unused store entries zbx jq --version # run without linking
Performance snapshot
| Package | Homebrew (cold) | ZB (cold) | Cold speedup | Homebrew (warm) | ZB (warm) | Warm speedup |
|---|---|---|---|---|---|---|
| Overall (100 packages) | 776s | 117s | 6.6x | 638s | 9.3s | 68x |
| python@3.14 | 16.99s | 1.97s | 8.6x | 14.37s | 207ms | 69.4x |
| node | 29.31s | 3.16s | 9.3x | 28.24s | 232ms | 121.7x |
| tesseract | 34.63s | 2.16s | 16.0x | 32.37s | 476ms | 68.0x |
| openjdk | 32.09s | 5.17s | 6.2x | 26.86s | 448ms | 60.0x |
| llvm | 18.22s | 9.14s | 2.0x | 9.66s | 183ms | 52.8x |
Measured on 2026-10-08 with zerobrew 0.3.5 (development release) and Homebrew 7.0.8 on macOS 26.6.2, MacBook Pro (M3 Pro, 18 GB RAM), ~318 Mbit/s download bandwidth. Homebrew started with nothing installed.
- Cold: the package and all of its dependencies uninstalled, empty download cache.
- Warm: the package and all of its dependencies uninstalled, downloads from the cold run still cached.
- The median package was 5.3x faster cold and 56x faster warm. Per package, cold ranged from 1.6x (go) to 20x (ca-certificates) and warm from 18x (go) to 252x (ca-certificates). 24 of the 100 packages installed 100x faster or more warm, which is what the asterisk on the tagline refers to.
- Cold installs are bound by the link. The same run on a ~69 Mbit/s connection came out at 3.3x cold and 69x warm. Big bottles like go and llvm spend nearly all of their cold time downloading, so both tools land close together there.
- zerobrew doesn't run post-install steps yet. Homebrew did in these runs, so for the 13 formulae here that have them (ca-certificates, fontconfig, gcc, glib, gnupg, gnutls, llvm, node, openssl@3, python@3.13, python@3.14, ruby, unbound) Homebrew is doing work we aren't. ca-certificates is the obvious one, its step rebuilds the cert bundle. Next run gets
--skip-post-installon the brew side until we run them too. - Warm installs use more disk. After an uninstall brew keeps the bottle, we keep the bottle and the unpacked keg in the store. That's the whole reason a reinstall is a clone and not a rebuild.
A note on how we are achieving these speeds
WRT Homebrew, I want it to be clear that both brew and zerobrew install the same bottles from Homebrew's build farm.
The difference is what happens after the download: Homebrew runs Ruby to evaluate the formula, unpacks, rewrites paths with install_name_tool, and re-signs each binary one at a time, while zerobrew does the relocation in-process and links from a content-addressed store, so it pays for the download once and almost nothing after.
I want it to be clear that we are basically nothing without Homebrew's bottle build farm. Every package zerobrew installs is one they built, tested and published. We don't compile anything, we don't maintain formulae, and none of these numbers exist without that work. The speed comes from how the artifacts are installed, not from what's in them.
Relationship with Homebrew
zerobrew is more of a performance-optimized client for the Homebrew ecosystem. We rely on:
- Homebrew's formula definitions (homebrew-core)
- Homebrew's pre-built bottles when available
- Homebrew's package metadata and infrastructure
Our innovations focus on:
- Content-addressable storage for deduplication
- APFS clonefiles for zero-overhead copying
- Source build fallback using Homebrew's Ruby DSL
zerobrew is experimental. We recommend running it alongside Homebrew rather than as a replacement, and do not recommend purging homebrew and replacing it with zerobrew unless you are absolutely sure about the implications of doing so.
Project status
- Status: Experimental, but quite useful. I (@cachebag) daily drive it myself.
- Feedback: If you hit incompatibilities, please open an issue or PR.
- License: Dual-licensed under Apache 2.0 OR MIT, at your choice. The source build shim is derived from Homebrew and is covered by its BSD 2-Clause license.
Fresh dev news, AI-digested daily. Never miss a trend at devoured.fyi