README.md

# Bedrock

[![Elixir CI](https://github.com/bedrock-kv/bedrock/actions/workflows/elixir_ci.yaml/badge.svg)](https://github.com/bedrock-kv/bedrock/actions/workflows/elixir_ci.yaml)
[![Coverage Status](https://coveralls.io/repos/github/bedrock-kv/bedrock/badge.png?branch=develop)](https://coveralls.io/github/bedrock-kv/bedrock?branch=develop)

Bedrock is an embedded, distributed key-value store with guarantees beyond ACID.
It features consistent reads, strict serialization, transactions across the
key-space and a simple API.

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `bedrock` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:bedrock, "~> 0.5"}
  ]
end
```

## Example

[![Run in Livebook](https://livebook.dev/badge/v1/blue.svg)](https://livebook.dev/run?url=https%3A%2F%2Fraw.githubusercontent.com%2Fbedrock-kv%2Fbedrock%2Frefs%2Fheads%2Fdevelop%2Flivebooks%2Fclass_scheduling.livemd)

## Durability Foundation Guides

- [Durability Foundation Overview](guides/durability-foundation.md)
- [Durability Profile Contract](guides/durability-profile.md)
- [S3 Object Storage Backend](guides/object-storage-s3.md)
- [Async Persistence Queue](guides/async-persistence-queue.md)
- [Distributed Durability Suite](guides/distributed-durability-tests.md)

## Durability Defaults

- Runtime durability mode defaults to `:strict`.
- Unsupported durability mode values resolve to `:strict`.
- Use explicit relaxed mode for local development or single-node rollout only:

```elixir
config :bedrock, MyCluster,
  durability_mode: :relaxed
```

Commit acknowledgments are gated by WAL durability: a log server acknowledges
only after the WAL append is written and fsynced. Async object persistence
remains separate and does not gate commit ACKs.

## S3/MinIO Tests

S3-focused tests use a local MinIO process and are tagged with `:s3`.

Install MinIO test binaries:

```bash
MIX_ENV=test mix minio_server.download --arch darwin-arm64 --version latest
```

Run S3 tests:

```bash
mix test --include s3
```

If MinIO is not available, tests tagged `:s3` are skipped automatically.