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).