Skip to main content

Edomata

Event-driven automatons for Scala, Scala.js, and Scala Native

Get StartedLearn More
import edomata.core.*

// Define your domain events
enum AccountEvent:
case Opened(name: String)
case Deposited(amount: BigDecimal)
case Withdrawn(amount: BigDecimal)

// Define your state
case class Account(name: String, balance: BigDecimal)

// Build a pure decision
def withdraw(amount: BigDecimal): Decision[String, AccountEvent, Unit] =
for
state <- Decision.read[Account, String]
_ <- Decision.reject("Insufficient funds")
.whenA(state.balance < amount)
_ <- Decision.accept(AccountEvent.Withdrawn(amount))
yield ()

Why Edomata?

Simple primitives for complex event-driven systems

λPurely Functional

Fully referentially transparent. No exceptions, no runtime reflection. Built on Cats Effect for polymorphic effect handling.

⦿Event Sourcing & CQRS

First-class support for event-driven state machines, enabling true event-sourced systems with built-in CQRS patterns.

Cross-Platform

Run on JVM, Scala.js, or Scala Native. Your domain logic compiles everywhere, from servers to browsers to native binaries.

Lightweight & Simple

A few composable primitives, not a framework. Understand the entire API surface in an afternoon.

Type-Safe Decisions

The Decision monad captures accept/reject/indecisive outcomes at the type level. Impossible states are unrepresentable.

Production-Ready Backends

PostgreSQL backends via Skunk (async, cross-platform) or Doobie (JDBC). With migration support and Flyway integration.

Extensible

Swap serialization (Circe, Jsoniter, uPickle), backends, or build your own. Every component can be extended.

Principled Design

Based on battle-tested ideas from DDD, CQRS, and event sourcing pioneers. Simple concepts, powerful composition.

Add to Your Project in Seconds

Pick a module, drop it into your build, and start building event-driven systems

SBT (JVM)

// Core library
libraryDependencies += "io.github.beyond-scale-group" %% "edomata-core" % "0.12.20"

// With Skunk + Circe PostgreSQL backend (recommended)
libraryDependencies += "io.github.beyond-scale-group" %% "edomata-skunk-circe" % "0.12.20"

Scala.js / Scala Native

libraryDependencies += "io.github.beyond-scale-group" %%% "edomata-core" % "0.12.20"

Maven

<dependency>
<groupId>io.github.beyond-scale-group</groupId>
<artifactId>edomata-core_3</artifactId>
<version>0.12.20</version>
</dependency>

See All Modules

Built on Typelevel

Seamlessly integrates with the libraries you already use