Articles
Homebrew, Rust, package management, and performance engineering.
Managing Developer Dependencies at Scale
When your team grows past 10 developers, 'just brew install it' stops working. Here's how to standardize, audit, and scale developer tooling.
Using Homebrew Inside Docker Containers
Homebrew in Docker adds bloat and build time. Here's how to minimize the impact — and why stout's single binary is a better fit for containers.
Package Manager Security Best Practices
Supply chain attacks target package managers. Here's how to protect your development environment — signed packages, vulnerability scanning, and verified indexes.
Deterministic Builds with Lock Files
Why reproducible builds matter, how Homebrew fails at them, and how stout lock ensures every machine installs the exact same packages.
Package Management in Air-Gapped Environments
How to manage software packages in networks without internet access — challenges, solutions, and how stout's mirror and private index features help.
Cross-Compiling Rust CLI Tools for macOS and Linux
How we build stout for 4 targets (macOS ARM64, macOS Intel, Linux x86_64, Linux ARM64) in CI — cross-compilation, static linking, and release automation.
SQLite as a Package Index: Architecture Deep Dive
Why we chose SQLite with FTS5 over a REST API or git repository for package metadata — and how a 3MB database replaces 700MB of git history.
Using Tokio for Parallel Package Downloads
How stout uses Tokio's async runtime to download, verify, and extract multiple packages concurrently — a practical guide to async Rust patterns.
Why Rust Over Go for a Package Manager
Both Rust and Go produce fast native binaries. Here's why stout chose Rust — memory control, error handling, the type system, and the crate ecosystem.
Why We Built a Package Manager in Rust
The Rust ecosystem for CLI tools is mature and fast. Here's why we chose Rust over Go, Python, and C++ for stout — and what the ecosystem looks like in 2026.
Brewfile and Bundle Management with stout
Use stout bundle to manage your development environment declaratively with Brewfiles — install, check, and snapshot your entire setup.
Cask Support: Install GUI Apps on macOS and Linux with stout
stout cask installs macOS .app bundles, Linux AppImages, and Flatpaks — GUI applications with the same speed and reliability as CLI packages.
Hosting a Private Package Index with stout
Set up a private stout index for your organization — curated packages, Ed25519-signed updates, and internal tool distribution.
Multi-Prefix Environments: Per-Project Package Isolation
Use stout's multi-prefix feature to install different package versions for different projects — no conflicts, no global pollution.
Vulnerability Scanning for Installed Packages with stout audit
How stout audit checks your installed packages against CVE databases — and how to integrate it into your security workflow.
Setting Up an Offline Mirror with stout
Create a local package mirror for air-gapped environments with stout mirror — including the built-in HTTP server and Ed25519 verification.
Instant Package Search with SQLite FTS5
How stout's pre-computed SQLite index with FTS5 full-text search delivers sub-50ms package lookups — offline, with no API calls.
Parallel Package Downloads with stout
How stout uses Tokio's async runtime to download multiple packages simultaneously — saturating your network instead of waiting sequentially.
Homebrew in CI/CD: Best Practices for Fast Pipelines
Homebrew adds 30-60 seconds to every CI run. Here's how to minimize that — caching strategies, HOMEBREW_NO_AUTO_UPDATE, and why stout is built for CI.
brew doctor: Common Warnings and How to Fix Them
A guide to the most common brew doctor warnings — outdated Xcode CLT, unlinked kegs, config issues — and what each one actually means.
Homebrew Uses Too Much Disk Space: How to Clean Up and Prevent Bloat
Homebrew can consume 10GB+ of disk space with old versions, caches, and the git repository. Here's how to clean up — and how stout stays lean.
Homebrew on Apple Silicon: Performance Tips and Common Issues
Homebrew on M1/M2/M3 Macs uses /opt/homebrew instead of /usr/local. Here's what to know about ARM64 bottles, Rosetta fallbacks, and how stout handles both.
How to Speed Up brew update (And Why It's Slow)
brew update pulls a 700MB+ git repository every time. Here are workarounds — and why stout's 3MB SQLite index makes the problem disappear.
Homebrew Install Stuck on Resolving? Here's Why and How to Fix It
When brew install hangs on 'Resolving dependencies', it's usually a slow API call or a complex dependency tree. Here's what's happening and how to fix it.
Why Is Homebrew So Slow? A Technical Deep Dive
Homebrew's slowness comes from Ruby startup overhead, a 700MB git-based metadata repo, and sequential downloads. Here's exactly why — and what stout does differently.