A high-performance local compiler cache daemon
Project description
zccache
A blazing fast cpp compiler cache
Inspired by sccache, but optimized for local-first use with aggressive file metadata caching and filesystem watching.
Performance
Benchmark: 50 C++ files, 5 warm trials
| Scenario | Bare Clang | sccache | zccache | vs sccache | vs bare clang |
|---|---|---|---|---|---|
| Single-file, Cold | 12.641s | 20.632s | 13.430s | 1.5x faster | 1.1x slower |
| Single-file, Warm | 11.705s | 1.576s | 0.050s | 32x faster | 236x faster |
| Multi-file, Cold | 11.358s | 11.759s | 12.867s | 1.1x slower | 1.1x slower |
| Multi-file, Warm | 11.553s | 11.530s | 0.017s | 695x faster | 696x faster |
Cold = first compile (empty cache). Warm = median of 5 subsequent runs. Single-file = 50 sequential
clang++ -c unit.cppinvocations. Multi-file = oneclang++ -c *.cppinvocation. sccache cannot cache multi-file compilations — its "warm" multi-file time is a full recompile.
Response-file benchmark: 50 C++ files, ~283 expanded args, 5 warm trials
| Scenario | Bare Clang | sccache | zccache | vs sccache | vs bare clang |
|---|---|---|---|---|---|
| Single-file RSP, Cold | 12.063s | 20.607s | 14.087s | 1.5x faster | 1.2x slower |
| Single-file RSP, Warm | 12.540s | 1.558s | 0.047s | 33x faster | 267x faster |
| Multi-file RSP, Cold | 13.030s | 25.303s | 13.975s | 1.8x faster | 1.1x slower |
| Multi-file RSP, Warm | 12.049s | 12.434s | 0.019s | 669x faster | 648x faster |
All args passed via nested response files:
flags.rsp->@warnings.rsp+@defines.rsp. 200-Ddefines + 50-Ipaths + 30 warning flags = ~283 total expanded args per compile.
Run the benchmark yourself: uv run perf
Install
pip install zccache
This installs native Rust binaries (zccache and zccache-daemon) directly
onto your PATH — no Python runtime dependency. Pre-built wheels are available for:
| Platform | Architecture |
|---|---|
| Linux | x86_64, aarch64 |
| macOS | x86_64, Apple Silicon |
| Windows | x86_64 |
Verify the install:
zccache --version
Use it as a drop-in replacement for sccache — just substitute zccache:
Build system integration (ninja, meson, cmake, make)
zccache is a drop-in compiler wrapper. Point your build system's compiler
at zccache <real-compiler> and it handles the rest:
# meson native file
[binaries]
c = ['zccache', '/usr/bin/clang']
cpp = ['zccache', '/usr/bin/clang++']
# CMake
set(CMAKE_C_COMPILER_LAUNCHER zccache)
set(CMAKE_CXX_COMPILER_LAUNCHER zccache)
The first build (cold cache) runs at near-bare speed. Subsequent rebuilds
(ninja -t clean && ninja, or touching source files) serve cached artifacts
via hardlinks in under a second.
Single-roundtrip IPC: In drop-in mode, zccache sends a single
CompileEphemeral message that combines session creation, compilation, and
session teardown — eliminating 2 of 3 IPC roundtrips per invocation.
Session stats: Track hit rates per-build with --stats:
eval $(zccache session-start --stats --log build.log)
export ZCCACHE_SESSION_ID=...
# ... build runs ...
zccache session-stats $ZCCACHE_SESSION_ID # query mid-build
zccache session-end $ZCCACHE_SESSION_ID # final stats
Persistent cache: Artifacts are stored in ~/.zccache/artifacts/
and survive daemon restarts. No need to re-warm the cache after a reboot.
Compile journal (build replay): Every compile and link command is recorded
to ~/.zccache/logs/compile_journal.jsonl as a JSONL file with enough
detail to replay the entire build:
{"ts":"2026-03-17T10:30:00.123Z","outcome":"hit","compiler":"/usr/bin/clang++","args":["-c","foo.cpp","-o","foo.o"],"cwd":"/project/build","env":[["CC","clang"]],"exit_code":0,"session_id":"uuid","latency_ns":1234567}
Fields: ts (ISO 8601 UTC), outcome (hit/miss/error/link_hit/link_miss),
compiler (full path), args (full argument list), cwd, env (omitted when
inheriting daemon env), exit_code, session_id (null for ephemeral),
latency_ns (wall-clock nanoseconds). One JSON object per line — pipe through
jq to filter, or replay builds by extracting compiler + args + cwd.
Per-session compile journal: Pass --journal <path> to session-start to
write a dedicated JSONL log containing only the commands from that session.
The path must end in .jsonl:
result=$(zccache session-start --journal build.jsonl)
session_id=$(echo "$result" | jq -r .session_id)
export ZCCACHE_SESSION_ID=$session_id
# ... build runs ...
# Inspect this session's commands only (no noise from other sessions)
jq . build.jsonl
zccache session-end $session_id
The session journal uses the same JSONL schema as the global journal. Entries
are written to both the global and session journals simultaneously. The session
file handle is released when session-end is called.
Multi-file compilation (fast path)
When a build system passes multiple source files to a single compiler invocation
(e.g. gcc -c a.cpp b.cpp c.cpp -o ...), zccache treats this as a fast path:
- Each source file is checked against the cache in parallel.
- Cache hits are served immediately — their
.ofiles are written from the cache. - Remaining cache misses are batched into a single compiler process, preserving the compiler's own process-reuse and memory-sharing benefits.
- The outputs of the batched compilation are cached individually for future hits.
This hybrid approach means the first build populates the cache per-file, and subsequent builds serve as many files as possible from cache while still letting the compiler handle misses efficiently in bulk.
Recommendation: Configure your build system to pass multiple source files per compiler invocation whenever possible. This gives zccache the best opportunity to parallelize cache lookups and minimize compiler launches.
Concurrency
The daemon uses lock-free concurrent data structures (DashMap) for artifact and metadata lookups, so parallel compilation requests from multiple build workers never serialize on a global lock.
Status
Early development — architecture and scaffolding phase.
Goals
- Extremely fast on local machines (daemon keeps caches warm)
- Portable across Linux, macOS, and Windows
- Correct under heavy parallel compilation (no stale cache hits)
- Simple deployment (single binary)
Architecture
See docs/ARCHITECTURE.md for the full system design.
Key components
| Crate | Purpose |
|---|---|
zccache-cli |
Command-line interface (zccache binary) |
zccache-daemon |
Daemon process (IPC server, orchestration) |
zccache-core |
Shared types, errors, config, path utilities |
zccache-protocol |
IPC message types and serialization |
zccache-ipc |
Transport layer (Unix sockets / named pipes) |
zccache-hash |
blake3 hashing and cache key computation |
zccache-fscache |
In-memory file metadata cache |
zccache-artifact |
Disk-backed artifact store with redb index |
zccache-watcher |
File watcher abstraction (notify backend) |
zccache-compiler |
Compiler detection and argument parsing |
zccache-test-support |
Test utilities and fixtures |
Building
cargo build --workspace
Testing
cargo test --workspace
Documentation
License
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zccache-1.0.33-py3-none-win_amd64.whl.
File metadata
- Download URL: zccache-1.0.33-py3-none-win_amd64.whl
- Upload date:
- Size: 2.4 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cca28647401b75434322816727b222c70246cc7b8a5190c2034ad6bfd12ac21b
|
|
| MD5 |
e73251570d3775d1178a30c35d0a9e17
|
|
| BLAKE2b-256 |
da655f6e7eb8bca275b05a2c4cf8ce5159037cb2990ba62361b2709c1ceef764
|
File details
Details for the file zccache-1.0.33-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: zccache-1.0.33-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 2.6 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba2bae4558db71a0c82d54683ca5c7cc92b6a20b229e002b0c4db0ae26cb782f
|
|
| MD5 |
5b1b1c0c1c67ca2d5044118a6952b7e1
|
|
| BLAKE2b-256 |
dcf9d9a98dfbf3ead02d3b384fdb2a67a4839f504b1212ae7254aa92caa70992
|
File details
Details for the file zccache-1.0.33-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: zccache-1.0.33-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 2.4 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e12811e7b7a2eeecee384fc956272262597bfb22dc35e4fd527872e9dac4d6b7
|
|
| MD5 |
4119c4213c2d88e85ac0808c9afffdb8
|
|
| BLAKE2b-256 |
f9da3e073a010858431ce16a6d85db4806e3316a9fcaa52417833fe9b3b7b858
|
File details
Details for the file zccache-1.0.33-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: zccache-1.0.33-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.3 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d5b5332a86685d76ebe626e4913652d099e2fa16bcd29368b5d72d2c684d8e75
|
|
| MD5 |
d933c47d68c61b2e24a9c053f1ee2e9e
|
|
| BLAKE2b-256 |
3b414f6387a67462bd0d5e919e708ae992d50550faff18443aa42974e4eafedd
|
File details
Details for the file zccache-1.0.33-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: zccache-1.0.33-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 2.4 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1cdfe31da486ce8a031e22a5dd15db9488735d2c46ce44eb07ff9918c4d40313
|
|
| MD5 |
47ede28dd1688b6291975908a78cdb20
|
|
| BLAKE2b-256 |
5aa26ca49fd3fbd081531f3d9f24ba451007ed3d4cb56c4b96a0ff50798c21c5
|