nanobrew v0.1.190
Zig 0.16 + faster everything

Zig 0.16.0 compiler, native tar extraction, persistent HTTP, O(1) resolver queue, and 15+ correctness fixes.

nb update # to v0.1.190
140x faster than Homebrew on warm installs

tree warm: Homebrew 2.38s → v0.1.083 23ms → v0.1.190 17ms

Performance benchmarks

Apple Silicon (M-series), macOS, median of 3 runs — v0.1.083 vs v0.1.190 vs Homebrew

tree warm install
140x faster than Homebrew
Homebrew
2.38s
v0.1.083
23ms
v0.1.190
17ms
tree cold install
9x faster than Homebrew
Homebrew
3.13s
v0.1.083
394ms
v0.1.190
356ms
v0.1.190 vs v0.1.083 warm speedup
1.4x improvement
v0.1.083
23ms
v0.1.190
17ms
v0.1.190 vs v0.1.083 cold speedup
1.1x improvement
v0.1.083
394ms
v0.1.190
356ms

What changed in v0.1.190

0.16

Zig 0.16 compiler

New std.Io threading model. Mach-O relocation (install_name_tool, codesign) now runs via real I/O — was silently failing with a stub allocator that returned OOM on every alloc.

0

Subprocess calls for tar

Native Zig USTAR/GNU tar parser replaces tar xzf subprocess. No fork/exec for extraction. File permissions preserved exactly from mode bits.

O(1)

Resolver queue pop

Topological sort called orderedRemove(0) on every step — O(n²). Replaced with an index cursor: O(V+E) total. Noticeable on packages with 10+ transitive deps.

GHCR token per batch

Auth token prefetched once before parallel workers start. HTTP client reused across all downloads. Head buffer bumped to 32 KiB, fixing truncated redirects.

What was fixed

15+ bugs addressed in this release

BugDetail
Mach-O relocationinstall_name_tool/codesign never ran — stub allocator OOM on first alloc
Non-atomic DB savestate.json written via temp + rename, safe against power-loss
Release tarballBinary inside tarball is now named nb (was nb-arch-os), fixing nb update
UB in ReleaseFast6 files used direct .Exited field access — converted to exhaustive switch
ncurses man pageswalkAndReplaceText no longer skips man/ dir — placeholders now replaced
Unbounded threadsDownload worker count capped at 8
nb cleanup sizeReported hardcoded 10 MB regardless of actual bytes freed — fixed