Zerobrew: Een alternatief voor Homebrew dat tot 100x sneller is

Installatie

Via het installatiescript:

curl -fsSL https://zerobrew.rs/install | bash

De installer bijwerkt je shell-configuratie. Start je terminal opnieuw op nadat de installatie is voltooid, of voer het source-commando uit dat in de terminal wordt weergegeven.

Via Homebrew:

brew install zerobrewhq/zerobrew/zerobrew

Zerobrew bijwerken

Als je de standalone-installer hebt gebruikt, voer deze dan opnieuw uit:

curl -fsSL https://zerobrew.rs/install | bash
zb --version

Als je via Homebrew hebt geïnstalleerd:

brew update && brew upgrade zerobrew

Indien je de oude lucasgelfond/zerobrew tap hebt gebruikt: deze wordt niet meer bijgewerkt. Stap over naar de nieuwe versie:

brew uninstall zerobrew
brew untap lucasgelfond/zerobrew
brew install zerobrewhq/zerobrew/zerobrew

Snelstart

CommandoBeschrijving
zb install jqInstalleer één pakket
zb install wget gitInstalleer meerdere pakketten
zb bundleInstalleer vanuit een Brewfile
zb bundle install -f myfileInstalleer vanuit een aangepast bestand
zb bundle dumpExporteer geïnstalleerde pakketten naar een Brewfile
zb bundle dump -f out --forceDump naar een aangepast bestand (overschrijven)
zb uninstall jqVerwijder één pakket
zb outdatedLijst pakketten op waarvoor nieuwere versies beschikbaar zijn
zb upgradeUpdate alle verouderde pakketten
zb upgrade jq wgetUpdate specifieke pakketten
zb resetVerwijder alles
zb gcGarbage collectie van ongebruikte store-items
zbx jq --versionVoer uit zonder te linken

Prestatieoverzicht

PakketHomebrew (koud)ZB (koud)Versnelling koudHomebrew (warm)ZB (warm)Versnelling warm
Totaal (100 pakketten)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

Meetgegevens: Gemeten op 2026-10-08 met zerobrew 0.3.5 (development release) en Homebrew 7.0.8 op macOS 26.6.2, MacBook Pro (M3 Pro, 18 GB RAM), ~318 Mbit/s downloadbandbreedte. Homebrew startte met geen geïnstalleerde pakketten.

  • Koud (Cold): Het pakket en alle afhankelijkheden zijn niet geïnstalleerd, en de downloadcache is leeg.
  • Warm (Warm): Het pakket en alle afhankelijkheden zijn niet geïnstalleerd, maar downloads uit de koude run zijn nog gecached.

De mediaan van de pakketten was 5,3x sneller koud en 56x sneller warm. Per pakket varieerde de koude installatie van 1,6x (go) tot 20x (ca-certificates) en de warme installatie van 18x (go) tot 252x (ca-certificates). 24 van de 100 pakketten werden 100x of meer sneller warm geïnstalleerd, waar het asterisk-teken in de tagline naar verwijst.

Koude installaties worden beperkt door de verbinding. Dezelfde run op een ~69 Mbit/s verbinding (results/2026-10-07) resulteerde in 3,3x koud en 69x warm. Grote "bottles" zoals go en llvm besteden bijna al hun koude tijd aan downloaden, waardoor beide tools daar dicht bij elkaar liggen.

Volledige resultaten

PakketHomebrew (koud)ZB (koud)Versnelling koudHomebrew (warm)ZB (warm)Versnelling warm
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

Reproduceerbaarheid en CI

Om deze resultaten te reproduceren, voer just bench --full results/ uit op een machine waar niets in Homebrew is geïnstalleerd. Dit reset zerobrew, verwijdert alles wat in Homebrew was geïnstalleerd en schrijft een tabel naar results/benchmark.md.

Een kleinere versie draait in CI:

  • De parity workflow installeert een vaste set formules met beide tools op dezelfde runner en vergelijkt de resulterende prefixes byte voor byte.
  • De timing workflow meet de tijd voor deze formules, plus node en python@3.14, zowel koud als warm, met beide tools en de laatste zerobrew-release.

De nachtelijke timing-run faalt als zerobrew op enig van deze pakketten minder dan 1,5x sneller is dan Homebrew koud, of 3x warm, of als het overall meer dan 20% trager is dan de vorige release.

Hoe deze snelheden worden behaald

Het is belangrijk om te benadrukken dat zowel brew als zerobrew dezelfde "bottles" installeren van de build farm van Homebrew.

Het verschil zit in wat er gebeurt na de download: Homebrew voert Ruby uit om de formule te evalueren, pakt het pakket uit, herschrijft paden met installnametool en ondertekent elk binair bestand één voor één. Zerobrew voert de relocatie in-process uit en linkt vanuit een content-addressed store. Hierdoor wordt de download slechts één keer betaald en is de rest bijna kosteloos.

Zerobrew is fundamenteel afhankelijk van de build farm van Homebrew. Elk pakket dat zerobrew installeert, is gebouwd, getest en gepubliceerd door Homebrew. Zerobrew compileert niets zelf en onderhoudt geen eigen formules. De snelheid komt voort uit de manier waarop de artefacten worden geïnstalleerd, niet uit de inhoud ervan.

Voor meer informatie over wat zerobrew is en niet is, zie het artikel: Standing on the shoulders of Homebrew door Andrew Nesbitt.

Vergelijking met nanobrew

De gepubliceerde cijfers van nanobrew meten een "warm install" van een pakket dat al is geïnstalleerd. Dit is in feite een early exit en geen installatie. Bovendien zijn deze cijfers vergeleken met zerobrew 0.1.0. Alle bovenstaande cijfers van zerobrew zijn echte installaties vanuit een niet-geïnstalleerde status.

Relatie met Homebrew

Zerobrew kan worden beschouwd als een prestatie-geoptimaliseerde client voor het Homebrew-ecosysteem. Het project leunt op:

  • De formule-definities van Homebrew (homebrew-core).
  • De vooraf gebouwde bottles van Homebrew (indien beschikbaar).
  • De pakket-metadata en infrastructuur van Homebrew.

De innovaties van zerobrew richten zich op:

  • Content-addressable storage voor deduplicatie.
  • APFS clonefiles voor kopiëren zonder overhead.
  • Source build fallback via de Ruby DSL van Homebrew.

Waarschuwing: Zerobrew is experimenteel. We raden aan het naast Homebrew te draaien in plaats van als vervanging. We raden niet aan om Homebrew volledig te verwijderen en te vervangen door zerobrew, tenzij je absoluut zeker bent van de implicaties hiervan.

Projectstatus

  • Status: Experimenteel, maar zeer nuttig. Wordt dagelijks gebruikt door de auteur (@cachebag).
  • Feedback: Bij incompatibiliteiten verzoeken we om een issue of PR te openen.
  • Licentie: Dual-licensed onder Apache 2.0 OF MIT, naar keuze.