stout
Open-source · MIT · Rust

The 10-100x faster
drop-in replacement for Homebrew.

10-100x faster drop-in replacement for Homebrew. Written in Rust. Pre-computed SQLite+FTS5 index, parallel downloads, offline support, and enterprise features — all in a single native binary.

curl -fsSL https://raw.githubusercontent.com/neul-labs/stout/main/install.sh | sh

What is stout?

stout is a package manager for macOS and Linux, written in Rust, that works as a drop-in replacement for Homebrew. It reads the same formulae, uses the same Cellar directory layout, and writes compatible INSTALL_RECEIPT.json files — so your existing packages, taps, and symlinks keep working. The difference is speed: stout replaces Homebrew's Ruby interpreter, sequential downloads, and 700 MB git clone with a native binary, a Tokio async download engine, and a pre-computed ~3 MB SQLite+FTS5 index.

Rust

Single native binary. No Ruby, no git, no Xcode CLT required.

Compatible

Same formulae, taps, and Cellar. Zero-migration drop-in.

Offline

Air-gapped mirrors with Ed25519-signed index updates.

MIT

Open source, built in the open by Neul Labs.

These aren't packaging problems. They're architecture problems.

Homebrew is slow because of decisions baked into its foundations. stout fixes each one at the source while staying fully compatible.

Ruby interpreter startup

The problem

Every brew command boots a Ruby interpreter before it does anything. A bare `brew --version` takes ~500ms.

How stout fixes it

stout is a compiled Rust binary. `stout --version` returns in ~5ms — no interpreter to warm up.

Why Homebrew is slow →

700 MB git clone for metadata

The problem

Homebrew keeps package metadata in a git repository you clone and pull. It grows unbounded and every `update` walks it.

How stout fixes it

stout ships a pre-computed ~3 MB SQLite index with FTS5 search. Metadata queries hit a local database, not the network.

SQLite as a package index →

Sequential downloads

The problem

Bottles download one at a time. Installing a package with several dependencies means waiting through them in series.

How stout fixes it

stout uses a Tokio async runtime to fetch bottles in parallel, saturating your connection instead of stalling on latency.

How parallel downloads work →

No offline or air-gapped story

The problem

Homebrew assumes an internet connection. Restricted networks, CI caches, and air-gapped machines are an afterthought.

How stout fixes it

stout creates local mirrors of any package subset, serves them over HTTP, and verifies updates with Ed25519 signatures.

Air-gapped package management →

Everything Homebrew does, 10-100x faster.

stout eliminates the performance bottlenecks that make Homebrew slow — Ruby startup, sequential downloads, and full git clones — while keeping full compatibility with the ecosystem you already use.

10-100x faster installs

Native Rust binary with Tokio async runtime. No Ruby interpreter overhead — stout starts in 5ms where Homebrew needs 500ms.

SQLite + FTS5 search

Instant full-text package search via a pre-computed ~3MB SQLite index. Works offline, returns results in under 50ms.

Drop-in Homebrew compatible

Same formulae, same taps, same Cellar structure. Zero migration friction — your existing packages work unchanged.

Air-gapped & offline support

Create local mirrors for restricted environments. Host your own index with Ed25519-signed updates.

Vulnerability scanning

Built-in `stout audit` checks installed packages against known CVEs. Security scanning without extra tooling.

Enterprise-ready

Multi-prefix isolation, private index hosting, lock files for reproducible builds, and deterministic CI/CD workflows.

Same commands. A fraction of the wait.

stout mirrors the Homebrew command surface — update, search, install and 30+ more — so muscle memory transfers directly.

Homebrew
$ brew update
Updating Homebrew...
==> Downloading https://.../Homebrew-core
remote: Counting objects: 812394, done.
⏳ 30s later...

$ brew search json
⏳ 3s (network round-trips)

$ brew install wget
==> Downloading dependency 1/4...
==> Downloading dependency 2/4...
   (sequential — one at a time)
stout
$ stout update
✓ Index refreshed (3 MB, Ed25519 verified)
✓ 2.0s

$ stout search json
✓ 14 results in 47ms (SQLite FTS5)

$ stout install wget
✓ Fetching 4 bottles in parallel
✓ Installed wget 1.24.5 — done
   (Tokio async — all at once)

Benchmarks don't lie.

Real-world performance comparisons on the same machine, same packages. stout eliminates Ruby interpreter overhead and replaces network-heavy operations with a pre-computed local index.

--version 100x faster
Homebrew
500ms
stout
5ms
search json 60x faster
Homebrew
3.0s
stout
50ms
info wget 19x faster
Homebrew
1.5s
stout
80ms
update 15x faster
Homebrew
30.0s
stout
2.0s

How stout is built

A single Rust binary orchestrates four subsystems. Everything that was network- or interpreter-bound in Homebrew becomes a local, parallel, or memory-mapped operation.

Layer 1

CLI & resolver

Rust command surface mirroring Homebrew. Dependency resolution runs against the local index — no network.

Layer 2

SQLite + FTS5 index

~3 MB Zstd-compressed database of formulae and casks. Full-text search returns in under 50ms, fully offline.

Layer 3

Tokio download engine

Async runtime fetches bottles in parallel, with resumable transfers and checksum verification.

Layer 4

Cellar & receipts

Writes the same Cellar layout and INSTALL_RECEIPT.json Homebrew does, so both tools stay interoperable.

stout install <pkg>
Resolve deps
local SQLite index
Fetch bottles
parallel, verified
Link into Cellar
Homebrew-compatible

Install in seconds.

Pre-built binaries for macOS (ARM64, Intel) and Linux (x86_64, ARM64). Or build from source with Cargo.

Quick install curl -fsSL https://raw.githubusercontent.com/neul-labs/stout/main/install.sh | sh
Cargo cargo install stout
Homebrew brew install neul-labs/tap/stout
Nix nix profile install github:neul-labs/stout

Start here

Guides to get up and running with stout.

All guides →

From the blog

Deep dives on Homebrew, Rust, package management, and performance.

All articles →

Frequently asked

Is stout a drop-in replacement for Homebrew?
Yes. stout reads the same formulae, uses the same Cellar directory structure, and writes compatible INSTALL_RECEIPT.json files. Your existing packages, taps, and symlinks work unchanged.
How is stout so much faster than Homebrew?
Three architectural changes: (1) stout is a native Rust binary — no Ruby interpreter startup overhead. (2) Package metadata comes from a pre-computed ~3MB SQLite index with FTS5 full-text search instead of cloning a 700MB git repo. (3) Downloads happen in parallel via Tokio async runtime.
Does stout work on Linux?
Yes. stout supports macOS (ARM64, Intel) and Linux (x86_64, ARM64) with pre-built binaries. Linux cask support includes AppImage and Flatpak integration.
Can I use stout in air-gapped environments?
Yes. stout can create offline mirrors of any subset of packages, serve them via a local HTTP server, and verify updates with Ed25519 cryptographic signatures. Designed for enterprise and restricted-network environments.
Is stout open source?
Yes. stout is MIT licensed and developed in the open at github.com/neul-labs/stout. Contributions are welcome.

Explore stout

Everything you need to evaluate, adopt, and roll out stout.

Need Rust performance engineering or AI agent expertise?

Neul Labs — the team behind stout — consults on Rust development, performance optimization, CLI tool design, and AI agent infrastructure. We build fast, reliable systems that ship.