Skip to content

Latest commit

 

History

159 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Chronicle Elixir Client

Event sourcing for Elixir — the idiomatic client for Cratis Chronicle, the open-source (MIT) event-sourcing database and processing runtime.

Hex.pm Hex Docs License: MIT

Overview

cratis_chronicle brings event sourcing and CQRS to Elixir applications: append events to an event store, project them into read models, and react to them — all backed by the Chronicle Kernel. It builds on Chronicle's language-agnostic gRPC API and exposes OTP-native constructs including:

  • use Chronicle.EventType — annotate structs as event types with stable IDs
  • use Chronicle.ReadModel — declare model-bound projections executed server-side
  • use Chronicle.Reactor — react to events with side effects
  • use Chronicle.Reducer — fold events into read models in your own process
  • use Chronicle.Seeder — seed event stores with baseline events at startup
  • Model-bound constraints — unique and unique-event-type constraints on event types
  • Context-aware appends — process-scoped identity, correlation, and causation metadata
  • Optimistic concurrency — guard appends with scoped tail-sequence checks
  • Transactions — buffer and commit multi-event units of work
  • Jobs and webhooks — inspect Chronicle jobs and manage webhook registrations
  • Resilient connection — automatic reconnection with exponential backoff

We believe event sourcing is worth it for almost any system dealing with information and business flows — and that in Elixir it should feel like Elixir: modules, structs, and use macros rather than a foreign paradigm. The client is designed to keep friction and boilerplate low, so it reads as familiar code even if you have never event-sourced before. It is part of one deliberately simple Cratis ecosystem, built with productivity, quality, and reliability in mind — AI-friendly by design, with free AI skills for building with the stack.

Install

Add cratis_chronicle to your mix.exs dependencies:

defp deps do
  [
    {:cratis_chronicle, "~> 2.2"}
  ]
end

Structure

Source/
  chronicle/       ← cratis_chronicle Hex package
Documentation/     ← User-facing documentation
Samples/
  console/         ← Runnable console example

Prerequisite: Chronicle Running

You need a Chronicle Kernel available before running samples or application code.

The easiest local setup is the development Docker image:

docker run -p 35000:35000 cratis/chronicle:latest-development

Getting Started

See Documentation/get-started.md for installation and usage instructions.

Quick Example

defmodule MyApp.Events.AccountOpened do
  use Chronicle.EventType, id: "account-opened-v1"
  defstruct [:account_id, :owner_name, :initial_balance]
end

defmodule MyApp.ReadModels.Account do
  use Chronicle.ReadModel

  alias MyApp.Events.AccountOpened

  defstruct account_id: nil, owner_name: nil, balance: 0

  from AccountOpened,
    set: [
      account_id: :event_source_id,
      owner_name: :owner_name,
      balance: :initial_balance
    ]
end

defmodule MyApp.Application do
  use Application

  def start(_type, _args) do
    children = [
      {Chronicle.Client,
        connection_string: "chronicle://localhost:35000",
        event_store: "my-app",
        otp_app: :my_app}
    ]

    Supervisor.start_link(children, strategy: :one_for_one)
  end
end

# Append an event
:ok = Chronicle.append("account-42", %MyApp.Events.AccountOpened{
  account_id: "account-42",
  owner_name: "Alice",
  initial_balance: 1000
})

# Read back the current read model
{:ok, account} = Chronicle.read_model(MyApp.ReadModels.Account, "account-42")

Building

cd Source/chronicle
mix deps.get
mix compile

Running the Console Sample

A working example is in the Samples/console directory.

Prerequisites: A Chronicle kernel running locally on port 35000.

cd Samples/console
mix deps.get
mix run --no-halt

Set CHRONICLE_CONNECTION_STRING to override the default connection:

CHRONICLE_CONNECTION_STRING="chronicle://myserver:35000?apiKey=secret" mix run --no-halt

The Cratis ecosystem

This project is part of Cratis — free, MIT-licensed tools for building event-sourced and CQRS applications.

Everything Cratis publishes today is MIT licensed and free to use.

About

Event sourcing for Elixir — the idiomatic client for Cratis Chronicle (cratis_chronicle on Hex).

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages