Pre-release. bakelite is unreleased and still under active testing — docs and behaviour may change without notice.

Changelog

For the upgrade rules behind bakelite's version numbers, see Versioning & compatibility. The full history lives in CHANGELOG.md and on the releases page.

Unreleased

First public release. bakelite is continuous, point-in-time backup and replication for SQLite: it watches the database's -wal file and ships every commit, so you can restore to any moment you've kept — encrypted at rest, fanned out to multiple destinations, and self-verifying.

Added

Replication & restore — continuous, event-driven WAL replication (≈0% CPU on an idle database); point-in-time restore to the latest commit, a wall-clock --timestamp, or an exact --index; a self-describing storage format (v1, the manifest is a rebuildable cache, not the source of truth); bounded WAL and restore chains via incremental checkpointing and automatic re-snapshot rotation.

Storage backends — local filesystem, S3 / S3-compatible (AWS S3, MinIO, Cloudflare R2, Backblaze B2), Google Cloud Storage, Azure Blob, and SFTP, all behind one trait; multi-destination fan-out with backfill; an async mirror with repair.

Security — encryption at rest (XChaCha20-Poly1305) with keygen and reencrypt (encrypt / rotate / decrypt); S3 server-side encryption (SSE-S3 / SSE-KMS).

Operations — retention and compaction (WORM / Object-Lock-tolerant) with storage-limit guards, enforced on every backup, at startup, and on a prune_interval cadence (so a lowered cap reclaims space even when re-snapshots are rare), plus prune to reclaim on demand; verify (+ --deep); doctor (config, Object Lock, and mirror-drift health); status (+ --check for cron alerting); a Prometheus metrics endpoint; usage and reclaim.

macOS — Homebrew install (brew install duggan/tap/bakelite) with a signed + notarized universal binary and brew services supervision; bakelite service to manage a launchd agent; list --json; and a preview menu-bar app shipped as a notarized DMG via a Homebrew cask (brew install --cask duggan/tap/bakelite-menu). On macOS the WAL watcher uses a 1-second polling backend instead of FSEvents (whose run loop clashed with the async reactor and froze the daemon's idle safety-poll backstop); write-to-sync latency is bounded by the poll interval rather than instant. Linux is unaffected (inotify, event-driven).