zerobrewhq/zerobrew

An up to 100x* faster Homebrew alternative

Rust

7,559

478 commits

updated Oct 8, 2026

See the code

See what people are saying

SourceMessageScoreDate

A 100x faster* alternative to homebrew

1

Oct 8, 2026

zerobrew is now 100x faster* than homebrew (r/commandline)

...On warm installs of single packages, tbf. 24 of the 100 most installed Homebrew formulae came in at 100x or more, ca-certificates was 252x. across all 100 it's 68x warm and 6.6x cold. If you would like to see the full results (or run them yourself!), you can [go…

6

Oct 8, 2026

zerobrew is now 100x faster* than homebrew (r/rust)

...On warm installs of single packages, tbf. 24 of the 100 most installed Homebrew formulae came in at 100x or more, ca-certificates was 252x. across all 100 it's 68x warm and 6.6x cold. If you would like to see the full results (or run them yourself!), you can [go…

12

Oct 8, 2026

README

zerobrew

English · 中文

Lint Test Release Discord License: MIT License: Apache 2.0

zerobrew demo

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

PackageHomebrew (cold)ZB (cold)Cold speedupHomebrew (warm)ZB (warm)Warm speedup
Overall (100 packages)776s117s6.6x638s9.3s68x
python@3.1416.99s1.97s8.6x14.37s207ms69.4x
node29.31s3.16s9.3x28.24s232ms121.7x
tesseract34.63s2.16s16.0x32.37s476ms68.0x
openjdk32.09s5.17s6.2x26.86s448ms60.0x
llvm18.22s9.14s2.0x9.66s183ms52.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 (results/2026-10-07) 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.
Full results
PackageHomebrew (cold)ZB (cold)Cold speedupHomebrew (warm)ZB (warm)Warm speedup
Overall (100 packages)775.60s117.43s6.60x637.50s9.33s68.31x
ca-certificates7.65s376ms20.35x6.55s26ms252.12x
openssl@311.02s1.30s8.46x9.18s64ms143.47x
xz2.39s454ms5.26x1.46s29ms50.31x
sqlite2.99s591ms5.06x2.04s27ms75.67x
readline2.48s494ms5.02x1.46s26ms56.08x
icu4c@783.32s1.57s2.11x1.96s33ms59.42x
python@3.1416.99s1.97s8.62x14.37s207ms69.41x
awscli27.22s3.37s8.08x25.56s483ms52.92x
node29.31s3.16s9.28x28.24s232ms121.72x
harfbuzz29.34s2.20s13.34x22.35s364ms61.41x
ncurses3.13s1.04s3.01x2.04s69ms29.59x
gh2.60s903ms2.87x1.35s38ms35.58x
pcre22.58s631ms4.08x1.57s35ms44.94x
libpng2.49s854ms2.92x1.50s27ms55.70x
zstd4.12s672ms6.13x2.74s34ms80.50x
glib7.02s1.72s4.08x5.24s94ms55.76x
lz42.89s635ms4.54x1.48s27ms54.74x
gettext4.72s1.30s3.61x3.25s64ms50.81x
libngtcp210.79s1.40s7.73x9.20s66ms139.36x
libnghttp32.38s436ms5.47x1.47s27ms54.44x
pkgconf2.35s469ms5.02x1.47s27ms54.59x
libunistring2.57s981ms2.62x1.49s26ms57.12x
mpdecimal2.53s705ms3.59x1.47s27ms54.33x
brotli2.65s776ms3.41x1.48s27ms54.67x
jpeg-turbo2.55s889ms2.87x1.48s27ms54.78x
xorgproto2.21s484ms4.57x1.21s29ms41.59x
ffmpeg18.57s1.76s10.54x17.62s164ms107.41x
cmake4.04s1.66s2.44x1.73s80ms21.64x
libnghttp22.63s635ms4.14x1.46s26ms56.31x
go5.43s3.36s1.61x3.40s190ms17.92x
uv2.90s1.37s2.12x1.27s28ms45.43x
gmp2.62s543ms4.83x1.47s26ms56.42x
libtiff7.08s821ms8.62x6.11s53ms115.19x
fontconfig9.35s982ms9.52x8.13s77ms105.61x
python@3.1314.28s1.76s8.12x13.15s186ms70.71x
git6.46s1.67s3.88x4.98s101ms49.33x
little-cms27.85s792ms9.91x6.83s55ms124.16x
dav1d2.49s544ms4.58x1.47s26ms56.42x
openexr9.95s712ms13.98x8.83s59ms149.59x
c-ares2.51s513ms4.90x1.51s32ms47.34x
tesseract34.63s2.16s16.01x32.37s476ms68.01x
p11-kit9.26s996ms9.30x7.95s32ms248.53x
imagemagick14.51s1.21s12.00x13.20s82ms160.95x
zlib2.36s430ms5.48x1.46s25ms58.44x
libx115.70s932ms6.11x4.71s174ms27.05x
freetype3.51s585ms5.99x2.21s32ms69.22x
protobuf4.06s725ms5.60x3.09s57ms54.21x
gnupg21.97s1.36s16.16x20.63s192ms107.44x
openjph7.88s697ms11.31x6.80s54ms126.02x
libtasn12.30s461ms4.99x1.49s28ms53.25x
ruby16.01s3.83s4.18x14.56s801ms18.18x
gnutls14.93s1.19s12.52x13.93s134ms103.96x
expat2.40s442ms5.42x1.48s26ms56.88x
libsodium2.44s884ms2.76x1.48s27ms54.96x
simdjson2.52s619ms4.08x1.49s26ms57.12x
gemini-cli29.98s2.23s13.43x27.64s235ms117.60x
libarchive5.02s594ms8.45x4.04s35ms115.31x
pyenv12.61s1.39s9.06x11.44s135ms84.76x
pixman2.44s487ms5.01x1.49s26ms57.19x
curl16.37s1.47s11.12x15.20s173ms87.88x
opus2.37s497ms4.76x1.47s27ms54.59x
unbound12.24s1.35s9.07x11.03s113ms97.58x
cairo19.28s1.48s12.99x17.74s370ms47.95x
pango24.48s1.69s14.46x23.06s411ms56.10x
leptonica9.48s914ms10.37x8.39s66ms127.18x
libxcb4.88s887ms5.50x3.89s132ms29.45x
jpeg-xl12.96s997ms13.00x11.92s70ms170.31x
coreutils3.31s760ms4.35x2.24s38ms58.97x
certifi7.81s461ms16.95x6.98s31ms225.06x
krb510.49s1.34s7.85x9.28s68ms136.44x
docker2.26s734ms3.08x1.21s29ms41.83x
libheif10.88s961ms11.32x9.59s63ms152.24x
webp4.31s578ms7.46x3.37s35ms96.40x
libxext6.45s982ms6.57x5.42s182ms29.80x
libxau2.74s512ms5.35x1.85s33ms56.06x
gcc12.23s3.55s3.45x8.58s67ms128.00x
bzip22.09s368ms5.69x1.14s26ms43.65x
libxdmcp2.74s540ms5.08x1.86s33ms56.42x
abseil3.05s800ms3.82x1.90s50ms38.04x
xcbeautify2.22s481ms4.62x1.15s26ms44.35x
libuv2.51s482ms5.20x1.47s26ms56.65x
giflib2.31s673ms3.44x1.46s26ms56.12x
utf8proc2.36s452ms5.23x1.46s27ms54.15x
libxrender6.35s976ms6.51x5.42s179ms30.25x
m42.00s431ms4.65x1.13s25ms45.28x
graphite22.47s428ms5.78x1.46s26ms56.23x
openjdk32.09s5.17s6.21x26.86s448ms59.96x
uvwasi2.95s483ms6.10x2.11s29ms72.66x
libffi2.56s575ms4.46x1.43s26ms55.08x
libdeflate2.44s458ms5.33x1.46s26ms56.12x
llvm18.22s9.14s1.99x9.66s183ms52.79x
aom3.25s699ms4.65x2.16s32ms67.50x
lzo2.38s449ms5.31x1.46s26ms56.00x
libevent10.66s1.33s7.99x9.19s71ms129.42x
libgpg-error5.06s1.11s4.56x3.84s70ms54.81x
libidn24.97s1.09s4.56x3.87s69ms56.12x
berkeley-db@54.05s1.96s2.06x2.60s56ms46.45x
deno10.57s1.46s7.23x9.24s57ms162.09x
libedit2.35s442ms5.33x1.45s26ms55.65x
oniguruma2.37s508ms4.67x1.46s26ms56.19x

To reproduce, run just bench --full results/ on a machine with nothing installed in Homebrew. It resets zerobrew, uninstalls everything it installed in Homebrew, and writes a table to results/benchmark.md.

A smaller version runs in CI: the parity workflow installs a fixed set of formulae with both tools on the same runner and compares the resulting prefixes byte for byte, and the timing workflow times those formulae plus node and python@3.14, cold and warm, with both tools and with the last zerobrew release.

The nightly timing run fails if zerobrew is less than 1.5x faster than Homebrew cold or 3x warm on any of them, or more than 20% slower than the last release overall.

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.

This is a good read, if you're interested in what zerobrew is and isn't: Standing on the shoulders of Homebrew by Andrew Nesbitt. It makes the point better than I can.

nanobrew:

nanobrew’s published numbers time a “warm install” of a package that is already installed, which is an early exit, not an install, and compare against zerobrew 0.1.0.

Every number above is a real install from an uninstalled state, with the script and the full log in this repo, so you can run it yourself.

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.

zerobrewhq/zerobrew

An up to 100x* faster Homebrew alternative

Rust

7,559

478 commits

updated Oct 8, 2026

See the code

See what people are saying

SourceMessageScoreDate

A 100x faster* alternative to homebrew

1

Oct 8, 2026

zerobrew is now 100x faster* than homebrew (r/commandline)

...On warm installs of single packages, tbf. 24 of the 100 most installed Homebrew formulae came in at 100x or more, ca-certificates was 252x. across all 100 it's 68x warm and 6.6x cold. If you would like to see the full results (or run them yourself!), you can [go…

6

Oct 8, 2026

zerobrew is now 100x faster* than homebrew (r/rust)

...On warm installs of single packages, tbf. 24 of the 100 most installed Homebrew formulae came in at 100x or more, ca-certificates was 252x. across all 100 it's 68x warm and 6.6x cold. If you would like to see the full results (or run them yourself!), you can [go…

12

Oct 8, 2026

README

zerobrew

English · 中文

Lint Test Release Discord License: MIT License: Apache 2.0

zerobrew demo

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

PackageHomebrew (cold)ZB (cold)Cold speedupHomebrew (warm)ZB (warm)Warm speedup
Overall (100 packages)776s117s6.6x638s9.3s68x
python@3.1416.99s1.97s8.6x14.37s207ms69.4x
node29.31s3.16s9.3x28.24s232ms121.7x
tesseract34.63s2.16s16.0x32.37s476ms68.0x
openjdk32.09s5.17s6.2x26.86s448ms60.0x
llvm18.22s9.14s2.0x9.66s183ms52.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 (results/2026-10-07) 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.
Full results
PackageHomebrew (cold)ZB (cold)Cold speedupHomebrew (warm)ZB (warm)Warm speedup
Overall (100 packages)775.60s117.43s6.60x637.50s9.33s68.31x
ca-certificates7.65s376ms20.35x6.55s26ms252.12x
openssl@311.02s1.30s8.46x9.18s64ms143.47x
xz2.39s454ms5.26x1.46s29ms50.31x
sqlite2.99s591ms5.06x2.04s27ms75.67x
readline2.48s494ms5.02x1.46s26ms56.08x
icu4c@783.32s1.57s2.11x1.96s33ms59.42x
python@3.1416.99s1.97s8.62x14.37s207ms69.41x
awscli27.22s3.37s8.08x25.56s483ms52.92x
node29.31s3.16s9.28x28.24s232ms121.72x
harfbuzz29.34s2.20s13.34x22.35s364ms61.41x
ncurses3.13s1.04s3.01x2.04s69ms29.59x
gh2.60s903ms2.87x1.35s38ms35.58x
pcre22.58s631ms4.08x1.57s35ms44.94x
libpng2.49s854ms2.92x1.50s27ms55.70x
zstd4.12s672ms6.13x2.74s34ms80.50x
glib7.02s1.72s4.08x5.24s94ms55.76x
lz42.89s635ms4.54x1.48s27ms54.74x
gettext4.72s1.30s3.61x3.25s64ms50.81x
libngtcp210.79s1.40s7.73x9.20s66ms139.36x
libnghttp32.38s436ms5.47x1.47s27ms54.44x
pkgconf2.35s469ms5.02x1.47s27ms54.59x
libunistring2.57s981ms2.62x1.49s26ms57.12x
mpdecimal2.53s705ms3.59x1.47s27ms54.33x
brotli2.65s776ms3.41x1.48s27ms54.67x
jpeg-turbo2.55s889ms2.87x1.48s27ms54.78x
xorgproto2.21s484ms4.57x1.21s29ms41.59x
ffmpeg18.57s1.76s10.54x17.62s164ms107.41x
cmake4.04s1.66s2.44x1.73s80ms21.64x
libnghttp22.63s635ms4.14x1.46s26ms56.31x
go5.43s3.36s1.61x3.40s190ms17.92x
uv2.90s1.37s2.12x1.27s28ms45.43x
gmp2.62s543ms4.83x1.47s26ms56.42x
libtiff7.08s821ms8.62x6.11s53ms115.19x
fontconfig9.35s982ms9.52x8.13s77ms105.61x
python@3.1314.28s1.76s8.12x13.15s186ms70.71x
git6.46s1.67s3.88x4.98s101ms49.33x
little-cms27.85s792ms9.91x6.83s55ms124.16x
dav1d2.49s544ms4.58x1.47s26ms56.42x
openexr9.95s712ms13.98x8.83s59ms149.59x
c-ares2.51s513ms4.90x1.51s32ms47.34x
tesseract34.63s2.16s16.01x32.37s476ms68.01x
p11-kit9.26s996ms9.30x7.95s32ms248.53x
imagemagick14.51s1.21s12.00x13.20s82ms160.95x
zlib2.36s430ms5.48x1.46s25ms58.44x
libx115.70s932ms6.11x4.71s174ms27.05x
freetype3.51s585ms5.99x2.21s32ms69.22x
protobuf4.06s725ms5.60x3.09s57ms54.21x
gnupg21.97s1.36s16.16x20.63s192ms107.44x
openjph7.88s697ms11.31x6.80s54ms126.02x
libtasn12.30s461ms4.99x1.49s28ms53.25x
ruby16.01s3.83s4.18x14.56s801ms18.18x
gnutls14.93s1.19s12.52x13.93s134ms103.96x
expat2.40s442ms5.42x1.48s26ms56.88x
libsodium2.44s884ms2.76x1.48s27ms54.96x
simdjson2.52s619ms4.08x1.49s26ms57.12x
gemini-cli29.98s2.23s13.43x27.64s235ms117.60x
libarchive5.02s594ms8.45x4.04s35ms115.31x
pyenv12.61s1.39s9.06x11.44s135ms84.76x
pixman2.44s487ms5.01x1.49s26ms57.19x
curl16.37s1.47s11.12x15.20s173ms87.88x
opus2.37s497ms4.76x1.47s27ms54.59x
unbound12.24s1.35s9.07x11.03s113ms97.58x
cairo19.28s1.48s12.99x17.74s370ms47.95x
pango24.48s1.69s14.46x23.06s411ms56.10x
leptonica9.48s914ms10.37x8.39s66ms127.18x
libxcb4.88s887ms5.50x3.89s132ms29.45x
jpeg-xl12.96s997ms13.00x11.92s70ms170.31x
coreutils3.31s760ms4.35x2.24s38ms58.97x
certifi7.81s461ms16.95x6.98s31ms225.06x
krb510.49s1.34s7.85x9.28s68ms136.44x
docker2.26s734ms3.08x1.21s29ms41.83x
libheif10.88s961ms11.32x9.59s63ms152.24x
webp4.31s578ms7.46x3.37s35ms96.40x
libxext6.45s982ms6.57x5.42s182ms29.80x
libxau2.74s512ms5.35x1.85s33ms56.06x
gcc12.23s3.55s3.45x8.58s67ms128.00x
bzip22.09s368ms5.69x1.14s26ms43.65x
libxdmcp2.74s540ms5.08x1.86s33ms56.42x
abseil3.05s800ms3.82x1.90s50ms38.04x
xcbeautify2.22s481ms4.62x1.15s26ms44.35x
libuv2.51s482ms5.20x1.47s26ms56.65x
giflib2.31s673ms3.44x1.46s26ms56.12x
utf8proc2.36s452ms5.23x1.46s27ms54.15x
libxrender6.35s976ms6.51x5.42s179ms30.25x
m42.00s431ms4.65x1.13s25ms45.28x
graphite22.47s428ms5.78x1.46s26ms56.23x
openjdk32.09s5.17s6.21x26.86s448ms59.96x
uvwasi2.95s483ms6.10x2.11s29ms72.66x
libffi2.56s575ms4.46x1.43s26ms55.08x
libdeflate2.44s458ms5.33x1.46s26ms56.12x
llvm18.22s9.14s1.99x9.66s183ms52.79x
aom3.25s699ms4.65x2.16s32ms67.50x
lzo2.38s449ms5.31x1.46s26ms56.00x
libevent10.66s1.33s7.99x9.19s71ms129.42x
libgpg-error5.06s1.11s4.56x3.84s70ms54.81x
libidn24.97s1.09s4.56x3.87s69ms56.12x
berkeley-db@54.05s1.96s2.06x2.60s56ms46.45x
deno10.57s1.46s7.23x9.24s57ms162.09x
libedit2.35s442ms5.33x1.45s26ms55.65x
oniguruma2.37s508ms4.67x1.46s26ms56.19x

To reproduce, run just bench --full results/ on a machine with nothing installed in Homebrew. It resets zerobrew, uninstalls everything it installed in Homebrew, and writes a table to results/benchmark.md.

A smaller version runs in CI: the parity workflow installs a fixed set of formulae with both tools on the same runner and compares the resulting prefixes byte for byte, and the timing workflow times those formulae plus node and python@3.14, cold and warm, with both tools and with the last zerobrew release.

The nightly timing run fails if zerobrew is less than 1.5x faster than Homebrew cold or 3x warm on any of them, or more than 20% slower than the last release overall.

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.

This is a good read, if you're interested in what zerobrew is and isn't: Standing on the shoulders of Homebrew by Andrew Nesbitt. It makes the point better than I can.

nanobrew:

nanobrew’s published numbers time a “warm install” of a package that is already installed, which is an early exit, not an install, and compare against zerobrew 0.1.0.

Every number above is a real install from an uninstalled state, with the script and the full log in this repo, so you can run it yourself.

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.

Significant stargazers

Bogdan Chadkin

1,157 followers · starred Feb 2026

Rui Chen

921 followers · starred Jan 2026

Walter Purcaro

86 followers · starred Jan 2026

Kaem

30 followers · starred May 2026