Skip to content
Getting Started

Configuration

kache reads configuration from three places, in order of priority:

  1. Environment variables — always win, useful for CI overrides
  2. Config file~/.config/kache/config.toml (respects XDG_CONFIG_HOME)
  3. Defaults — sensible values that work without any configuration

Config file

The config file is TOML. You can edit it directly or use the TUI editor:

kache config

The TUI editor shows all fields with their current values, marks which ones are coming from env vars, and lets you toggle or edit them interactively.

A minimal config that enables a remote cache looks like this:

[cache.remote]
type = "s3"
bucket = "my-build-cache"
endpoint = "https://s3.example.com"   # omit for AWS S3
profile = "my-aws-profile"            # omit to use the default credential chain

All settings

Environment variableConfig keyDefaultDescription
KACHE_CACHE_DIRcache.local_store~/.cache/kacheLocal cache directory
KACHE_MAX_SIZEcache.local_max_size50GiBMaximum local store size
KACHE_S3_BUCKETcache.remote.bucketS3 bucket name
KACHE_S3_ENDPOINTcache.remote.endpointS3 endpoint URL (required for Ceph, MinIO, R2)
KACHE_S3_REGIONcache.remote.regionus-east-1AWS region
KACHE_S3_PREFIXcache.remote.prefixartifactsKey prefix inside the bucket
KACHE_S3_PROFILEcache.remote.profileAWS credentials profile
KACHE_S3_ACCESS_KEYExplicit S3 access key
KACHE_S3_SECRET_KEYExplicit S3 secret key
KACHE_CACHE_EXECUTABLEScache.cache_executablesfalseCache bin/dylib/cdylib/proc-macro outputs
KACHE_CLEAN_INCREMENTALcache.clean_incrementaltrueRemove incremental dirs during GC
KACHE_COMPRESSION_LEVELcache.compression_level3Zstd compression level (1–22)
KACHE_S3_CONCURRENCYcache.s3_concurrency16Max concurrent S3 operations
KACHE_DISABLED0Disable caching entirely (pass-through to rustc)
KACHE_LOGkache=warnLog level for stderr output
KACHE_LOG_FILEkache=infoLog level for the file log
KACHE_PROGRESSautoCI progress lines: always, never, or auto

KACHE_PROGRESS=auto (the default) prints per-crate progress lines to stderr when stderr is not a terminal. In CI this is usually the right behavior without any configuration.

Size values

Size fields (KACHE_MAX_SIZE, cache.local_max_size) accept human-friendly strings:

50GiB   10GB   512MiB   1024MB

Log levels

KACHE_LOG follows the tracing subscriber syntax:

KACHE_LOG=kache=debug   # verbose, useful when diagnosing cache misses
KACHE_LOG=kache=info    # operational detail
KACHE_LOG=kache=warn    # default — only surface real problems

The file log is written to ~/Library/Logs/kache/kache.log on macOS and ~/.cache/kache/kache.log elsewhere. It rotates automatically when it exceeds 5 MB.

Local store layout

~/.cache/kache/
├── index.db          # SQLite index (WAL mode)
├── events.jsonl      # build event log
├── daemon.sock       # daemon unix socket
└── store/            # content-addressed blobs
    ├── ab/
    │   └── abcdef...  # blake3 hash-named files
    └── ...

The store directory is excluded from Time Machine and Spotlight on macOS automatically.