Skip to content
CAI
Software that uses CAICheck a score

notxcain/aecor

51.7

Adequate · 21 September 2026

5.3k

lines of production code

Scala

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a library for building event-sourced, distributed applications using functional programming abstractions. It provides a modular runtime that supports both Akka Cluster Sharding and Kafka-based distributed processing for managing state and long-running processes. The codebase includes utilities for serialization, scheduling, and in-memory testing, enabling developers to implement reliable, scalable event-driven architectures.

How it got here

2016 — legacy architecture removal

13 changes.

This period focused on stripping out the entire legacy Akka-based event sourcing and actor model, including associated configuration files, serialization logic, and example domain implementations. The codebase was refactored to remove these obsolete components, likely to support a new architectural approach using modern Scala libraries like Cats and Fs2.

2018–2019 — Event-sourcing and distributed processing foundations

15 changes.

This period focused on establishing the core abstractions for event sourcing and distributed processing within the Aecor library. Key developments included introducing generic Akka runtimes, Cassandra-backed persistence, and Kafka-based cluster-wide task distribution, alongside the necessary serialization and testing infrastructure to support these new capabilities.

Features

Add Akka Persistence runtime with Cassandra support

The \akka-persistence-runtime\ module introduces a new runtime implementation for Akka Persistence, enabling event sourcing with Akka Cluster Sharding. This includes the \AkkaPersistenceRuntime\ for deploying entities, a \CassandraJournalAdapter\ for persistence, and read-side query support via \AkkaPersistenceEventJournalQuery\ and \CassandraOffsetStore\ for tracking consumer offsets. The module also provides serialization support through \MessageSerializer\ and \PersistentReprSerializer\, along with configuration in \reference.conf\ for Cassandra journal and snapshot store plugins.

modules/akka-persistence-runtime · high confidence

Add Boopickle-based wire protocol implementation

Introduces a new BoopickleWireProtocol implementation that enables serialization and deserialization of wire messages using the Boopickle library. This adds support for encoding and decoding algebraic data types via macro-generated codecs, allowing users to serialize their domain models into binary formats for network transmission.

modules/boopickle-wire-protocol · high confidence

Add in-memory test kit for end-to-end testing

Added a new test-kit module providing in-memory implementations of core runtime components to facilitate end-to-end testing. This includes a StateEventJournal for in-memory event storage, a StateKeyValueStore for in-memory key-value storage, a StateClock for time manipulation, and E2eSupport utilities to wire processes and manage state. These components allow developers to run integration tests against a fully functional, stateful runtime without external dependencies.

modules/test-kit · high confidence

Added Cassandra and Akka configuration for the example module

The example module now includes a new application.conf file that configures HTTP, cluster, and Cassandra-based persistence (journal, snapshot store, and query journal) for the Aecor example. Additionally, the logback.xml file was moved to the new module path and updated to suppress specific loggers, including adding OFF-level logging for Akka persistence components and Aecor aggregate actors to reduce noise.

modules/example/src/main/resources · high confidence

Initial project scaffolding and version bump to 0.20.0-SNAPSHOT

The repository was initialized with essential build and configuration files, including .sbtopts for JVM memory settings, .scala-steward.conf to exclude specific Akka dependencies from automated updates, .scalafmt.conf for code formatting, and .travis.yml for CI. The project's version was updated from 0.1.0-SNAPSHOT to 0.20.0-SNAPSHOT.

(repo-wide) · high confidence

Introduce Cassandra-backed schedule entry storage

Added a new \CassandraScheduleEntryRepository\ implementation that persists scheduled entries to a Cassandra database, enabling durable, high-throughput storage of schedule state. This change introduces a new protobuf schema (\ScheduleEvents.proto\) and a corresponding Akka serializer (\ScheduleEventSerializer\ with ID 120) to handle serialization of schedule events, ensuring compatibility with existing systems while supporting the new storage backend.

modules/schedule · high confidence

Introduce Generic Akka Runtime for cluster-sharded entity actors

Added a new \GenericAkkaRuntime\ implementation that enables running generic Akka Cluster Sharding actors. This includes the core runtime class, an actor implementation, settings configuration, and a Protobuf-based serialization layer (\MessageSerializer\) to handle message encoding and decoding across the cluster.

modules/akka-cluster-runtime/src/main · high confidence

Introduce Kafka-based distributed processing for cluster-wide task distribution

A new module, Kafka-based Distributed Processing (KDP), is now available to distribute a list of processes across a cluster of nodes using Kafka's partition assignment machinery. Each application node receives a slice of the process list based on assigned partitions, ensuring that each process runs on only one node at a time and is automatically migrated if a node fails or is added. The module includes a \DistributedProcessing\ API to start processes, a \Supervision\ object for implementing restart strategies, and internal components for managing Kafka consumer rebalance events and channel-based coordination.

modules/kafka-distributed-processing · high confidence

Introduce core data types and runtime abstractions for event sourcing

The \aecor.data\ and \aecor.runtime\ packages now include foundational types for building event-sourced applications. This includes \ActionT\ for modeling stateful actions, \EventsourcedBehavior\ for defining entity behavior, and \Fold\ for processing events. The runtime layer introduces \EventJournal\ and \KeyValueStore\ traits to abstract persistence, along with \Snapshotting\ strategies and a \NoopKeyValueStore\ for testing. These components enable users to define and run event-sourced actors with support for snapshots and event replay.

modules/core/src/main/scala/aecor/data · high confidence

Introduce distributed processing capabilities via Akka Cluster Sharding

A new \distributed-processing\ module has been added, providing a \DistributedProcessing\ API that starts and manages long-running processes across an Akka cluster using Cluster Sharding. The implementation includes a \DistributedProcessingSupervisor\ to coordinate workers, a \DistributedProcessingWorker\ to execute individual process instances, and a \MessageSerializer\ for serializing \KeepRunning\ messages via Protobuf. Configuration for the Akka serialization bindings is also provided in \reference.conf\.

modules/distributed-processing · high confidence

Introduce example application with account and transaction domains

Added a new example application in the \modules/example\ directory, featuring an \App\ entry point that wires up HTTP routes for account and transaction management. The change introduces domain models for accounts and transactions, including event-sourced algebras, repositories, and HTTP endpoints. It also includes supporting files for serialization, process management, and distributed processing.

modules/example/src/main/scala · high confidence

New encoding and wire protocol abstractions

The core module introduces new type classes and protocols for encoding and decoding keys and wire data. This includes \KeyDecoder\ and \KeyEncoder\ type classes with instances for common types like String, Int, Long, and UUID, as well as support for AnyVal types. A new \WireProtocol\ trait and associated \Invocation\ type are added to define how data is encoded and decoded at the wire level, along with syntax helpers for lifting scodec \Attempt\ into effect types.

modules/core/src/main/scala/aecor/encoding · medium confidence

New type-class abstractions for effectful state and action handling

The core library introduces \Has\ and \MonadAction\ type classes to provide a structured way to access shared context (\Has\[T, A\]\ allows extracting a value of type \A\ from a context \T\) and to manage side-effecting actions that interact with state and events (\MonadAction\ provides \read\, \append\, and \reset\ operations). These abstractions enable more composable and testable implementations for event-sourced aggregates and generic runtimes by decoupling the effectful logic from specific runtime implementations.

modules/core/src/main/scala/aecor · high confidence

New utility modules for time and effect handling

The core module now includes new utilities: a \Clock\ trait and \JavaTimeClock\ implementation for abstracting time operations, a \FunctionBuilder\ for generic function construction, and an \effect\ object providing an \unsafeToIO\ conversion for \F\[A\]\ to \IO\[A\]\.

modules/core/src/main/scala/aecor/util · high confidence

Removals

Removal of generic FunctionBuilder utility

The generic FunctionBuilder utility in the aecor.util package has been removed. This component previously provided a type-safe way to construct functions from handlers using Shapeless, but it is no longer part of the library.

core/src/main/scala/aecor/util · high confidence

Removed example domain entities and process definitions

The example domain files for Account, CardAuthorization, CardAuthorizationProcess, and Counter have been deleted. This removes the previous implementations of these domain entities and their associated process logic from the example application.

example/src/main/scala/aecor/example/domain · high confidence

Removed legacy entity model and concurrent primitives

Removed the legacy Akka-based entity implementation, including the \EntityActor\ and \EntityRef\ abstractions, along with supporting types like \CommandHandler\, \CommandContract\, \EventProjector\, and \Deferred\. This eliminates the previous command/event processing and state management API in favor of a new model.

core/src/main/scala/aecor/core/entity · high confidence

Removed legacy process actor infrastructure

The legacy process actor implementation has been removed from the core library. Specifically, the \ProcessActor\ class, which handled persistent actor logic, command delivery, and state transitions, has been deleted along with its associated support classes: \ProcessActorRegion\ for cluster sharding, \ProcessEventAdapter\ for Kafka message forwarding, and \CompoundConsumerSettings\ for topic schema composition. This change eliminates the old behavioral model in favor of a new architecture.

core/src/main/scala/aecor/core/process · high confidence

Removed unused delivery and event bus implementations

The \CallerDeliveryIdAtLeastOnceDelivery\, \EventBus\, and \OrderedAtLeastOnceDelivery\ classes have been removed from the core module. These components previously handled at-least-once delivery and event publishing via Akka actors and Kafka, but are no longer part of the codebase.

core/src/main/scala/aecor/core · high confidence

Behavioural changes

Removal of core reference configuration

The default configuration file (reference.conf) has been removed from the core module. This eliminates the previous default settings, meaning users must now explicitly provide their own configuration or rely on other mechanisms to define system behavior.

core/src/main/resources · high confidence

Removal of legacy Akka and Cassandra configuration files

The example application's configuration and protocol definitions have been removed. Specifically, the \Account.proto\ file defining the event schema and the \application.conf\ file containing Akka cluster, persistence (Cassandra journal), and serialization settings have been deleted. This indicates a shift away from the previous event-sourcing and cluster-based architecture, likely in favor of a different runtime or library (such as the mentioned Aecor/Free DSL approach) that does not rely on these specific Akka/Cassandra configurations.

example/src/main/resources · medium confidence

Removed App.scala and associated actor-based wiring

The main application entry point (App.scala) and its associated actor-based wiring have been removed. This includes the RootActor, the EventBus publisher, the EntityActorRegions for CardAuthorization and Account, and the ProcessActorRegion setup. The change eliminates the previous imperative setup of Kafka producers, Cassandra read journals, and process streams, indicating a shift away from the old actor-based initialization and event processing pipeline.

example/src/main/scala/aecor/example · medium confidence

Removed core message and correlation abstractions

The \Correlation\, \Deduplication\, \Message\, and \Passivation\ modules in the core message package have been removed. This eliminates the previous message envelope structure, correlation ID extraction logic, message deduplication tracking, and actor passivation handling, indicating a significant refactoring of how messages are defined and processed within the system.

core/src/main/scala/aecor/core/message · medium confidence

Removed generic serialization encoder

The generic serialization encoder trait and its Circe-based implementation have been removed from the core serialization module. This eliminates the previous mechanism for encoding arbitrary types into ByteBuffers, likely as part of a broader shift towards type-safe publishing and the adoption of eventsByTag for event persistence.

core/src/main/scala/aecor/core/serialization · medium confidence

Removed legacy protobuf message definitions

The file core/src/main/protobuf/Messages.proto, which defined the DomainEvent and Timestamp protobuf messages, has been removed. This eliminates the legacy message structure in favor of the new event model.

core/src/main/protobuf · medium confidence

Test coverage

Added end-to-end test suite for the library; Added test infrastructure for Akka cluster runtime.

Dependencies

Major dependency and Scala version upgrades

The project has been upgraded to support Scala 2.12.15 and 2.13.6, replacing the previous 2.11.8 target. Key libraries have been significantly updated: Cats is upgraded to 2.6.1 and Cats Effect to 3.2.9, while Fs2 is updated to 3.1.3. Other dependencies such as Circe (0.14.1), Http4s (0.23.4), and Akka (2.5.26) have also been bumped to newer versions.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 58 → 52 (-5.9)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 98 (-1.7)
  • Architecture 100 → 92 (-7.9)
  • Maturity 39 → 55 (+16.7)
  • Readiness 45 → 28 (-16.4)
  • Security 100 → 78 (-22.2)
  • Domain Modelling 100 → 100 (+0.0)

Resolved (6)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • No exposed public API
  • Test reliability not included
  • complexity unreadable for .scala — churn × complexity hotspots could not be measured
  • dormant codebase — no living knowledge left to concentrate

New (8)

  • Duplicated block (21 lines × 2) (modules/akka-cluster-runtime/src/main/scala/aecor/runtime/akkageneric/GenericAkkaRuntime.scala)
  • Duplicated block (5 lines × 2) (modules/core/src/main/scala/aecor/MonadAction.scala)
  • Duplicated block (9 lines × 2) (modules/example/src/main/scala/aecor/example/account/deployment.scala)
  • No ADRs found
  • No SBOM
  • No build provenance
  • ScheduleProcess.apply (cognitive 33) (modules/schedule/src/main/scala/aecor/schedule/process/ScheduleProcess.scala)
  • TodoComment (modules/boopickle-wire-protocol/src/main/scala/aecor/macros/boopickle/DeriveMacros.scala)

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

notxcain/aecor was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 1293c6b01d5a102ea6d5d90726cb72ada8aba143 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-cb02f2da8b24.