Skip to content

Blog

Notes from building the cache I wanted to use.

What I have learned about repeated build work, the approaches that helped, and the ones I stopped using.

RSS feed

Start with the problem in your build.

More from the build log.

  • BoringCache
  • Benchmarks
  • CI caching

Cache, not bigger runners

Why I chose shared cache and object storage instead of larger runners, and what that choice looks like on PostHog and a 40 GB Rust target.

7 min read
  • BoringCache
  • CI caching

Introducing BoringCache

After a year of building it, I am introducing BoringCache: shared cache, build outputs and container images wherever the build runs.

10 min read
  • Rust
  • Cargo
  • CI caching

Reusing large Rust builds on fresh runners

How I use content-defined chunks and client optimizations to save and restore large Cargo targets, and what I am doing about accumulated build outputs.

9 min read
  • BuildKit
  • Benchmarks

The BuildKit backend we deleted after it worked

I tried moving BuildKit state between ephemeral runners. Restoring it was fast, but changed builds were slower than the simpler cache backend.

15 min read
  • Docker
  • BuildKit

Docker build done. Still exporting cache…

A Docker build could finish its build steps and then spend minutes exporting cache. I wanted to prepare the cache while those steps were running.

13 min read
  • BoringCache
  • CI caching

Why I built BoringCache

I started with a slow Ruby install on an old MacBook Air. I wanted to reuse work that another machine had already done, wherever I chose to build.

6 min read

Work through a build problem.

The practical guides cover setup choices, slow exports, and missing cache.