github kunobi-ninja/kache v0.15.0

latest release: v0.15.1
5 hours ago

kache 0.15.0 — transparent compiler shims, safer parallel builds, and faster warm hits

kache 0.15.0 makes adoption easier across large, heterogeneous build environments. Unix compiler shims can intercept C/C++ builds with one PATH change, explicit bypass rules keep unsafe invocations out of the cache, and correctness fixes isolate worktrees, parallel Cargo targets, and concurrent restores.

Warm builds also do less work: preprocessing, restored-artifact hashing, environment-use scanning, and large-file hashing are now reused or streamed where safe.

Why

Sharing one cache across many repositories, worktrees, and concurrent builds exposes ownership boundaries that simpler setups rarely hit. Cargo fingerprints, generated dep-info paths, hardlinked restores, and daemon configuration all need deterministic ownership.

0.15.0 closes those gaps while improving observability, automation, cleanup, and everyday CLI usability.

What's new

  • Config-free C/C++ interception. kache install-shims creates Unix compiler-name shims, allowing projects to be cached through a single PATH change instead of per-project CC/CXX configuration. C/C++ caching remains experimental and local-only. (#796)
  • Explicit safety bypasses. Cache policy can now bypass exact crate names, argument patterns, or environment conditions—useful when an invocation depends on external state that cannot be represented safely in a cache key. (#793)
  • Safer worktrees and parallel builds. Rust inputs retain their path identity, dep-info follows the consuming worktree and target directory, and concurrent hardlink restores no longer expose shared mutable inodes. (#769, #797, #809)
  • Less warm-path work. Kache reuses safe C/C++ preprocessing results and restored blob digests, memoizes runtime environment-use scans, and streams ordinary file hashes with bounded memory. (#802, #803, #804, #805)
  • More predictable operations. Auto-started daemons now resolve remote configuration deterministically, planner metrics are available for Prometheus/SigNoz, and S3 requests can carry a custom user agent. (#795, #753, #800)
  • Better automation and ergonomics. JSON reports now have a versioned schema, partial kache sync failures return non-zero, obsolete cache schemas are reclaimed, list output uses a pager, and clean/TUI reporting is clearer.

Upgrade notes

  • Auto-started daemons no longer inherit remote-defining KACHE_S3_* variables. Put remote settings in the watched [cache.remote] configuration, or start the daemon explicitly from the intended environment.
  • kache sync now exits non-zero if any transfer or import fails. Use --allow-partial when best-effort success is intentional.
  • The cache-key schema reaches v27. Older entries may cold-miss and are eligible for automatic reclamation.

These notes were drafted with LLM assistance and edited by the maintainers.


What's Changed

  • feat(service): serve planner metrics and let SigNoz scrape them by @jleni in #753
  • fix(release): keep prereleases off the floating image tags by @jleni in #755
  • chore(release): 0.15.0-rc.1 by @jleni in #754
  • feat(cli): page kache list output through a pager by @jleni in #764
  • fix(cli): report reclaimable bytes, not raw sizes, in kache clean by @jleni in #765
  • fix(cargo): keep canonical config aliases transparent by @jleni in #768
  • fix(chart): force Recreate when the planner DB is on a PVC by @jleni in #767
  • fix(cc): cache ordinary existing outputs by @jleni in #772
  • feat(gc): reclaim stale cache key schemas by @jleni in #773
  • fix(test): tolerate unsupported FIEMAP on ZFS by @jleni in #771
  • fix(probe): pin LC_ALL=C on compiler probe spawns (#741) by @Ysh204 in #775
  • fix(probe): eliminate env-mutation race in probe_key tests (#742) by @Ysh204 in #776
  • fix(cache_key): make the key stashes thread-local (#777) by @jleni in #778
  • fix(rust): isolate cache inputs across worktrees by @jleni in #769
  • fix(tui): stop Esc quitting, scope filters per tab, fix Shift+Tab by @jleni in #780
  • fix(wrapper): make minted session ids distinct under coarse clocks by @jleni in #781
  • fix(policy): stop transient read failures destroying learned state (#756) by @jleni in #783
  • feat(nix): maintain a stable release branch via the release job by @jleni in #770
  • fix(bench): give firefox-windows the pull job's working toolchain path (#728) by @jleni in #784
  • feat(report): version and regression-test the JSON output contract (#699) by @Ysh204 in #779
  • fix(sync): return non-zero when any transfer or import fails (#697) by @Ysh204 in #786
  • fix(store): serialize meta.json lifecycle with the registration lock by @jleni in #785
  • chore(release): 0.15.0-rc.2 by @jleni in #787
  • fix(lint): satisfy Rust 1.98's chunks_exact_to_as_chunks in the Mach-O parser by @jleni in #789
  • fix(nix): drop unneeded apple-sdk_15 dependency (#610) by @Ysh204 in #788
  • test(e2e): gate in-flight coalescing across simultaneous cargo invocations by @jleni in #791
  • feat(config): declarative bypass rules for argv, env and crate name (#222) by @jleni in #793
  • fix(daemon): stop an auto-started daemon inheriting an ambient remote (#706) by @jleni in #795
  • fix: isolate concurrent hardlink restores by @jleni in #797
  • feat(cc): compiler-name shims for transparent, config-free interception (#310) by @jleni in #796
  • chore(release): 0.15.0-rc.3 by @jleni in #799
  • fix(macos): allow LaunchAgent local-network remotes by @jleni in #801
  • feat(s3): support custom user-agent header by @Ysh204 in #800
  • perf: reuse restored blob digests in file hash memo by @jleni in #803
  • perf(cc): memoize warm preprocess hashes by @jleni in #802
  • perf(hash): stream file digests by @jleni in #804
  • perf(key): memoize runtime env-use scans by @jleni in #805
  • fix(rustc): classify source-bearing print queries by @jleni in #807
  • fix(depinfo): rebase generated sources across parallel targets by @jleni in #809
  • chore(release): prepare 0.15.0 by @jleni in #806

Full Changelog: v0.14.2...v0.15.0

Don't miss a new kache release

NewReleases is sending notifications on new releases.