Skip to content
CAI
Software that uses CAICheck a score

NextGenTel/akka-tools

55.0

Adequate · 21 September 2026

4.2k

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 Scala library for building distributed, event-sourced applications using the Akka framework. It provides a comprehensive persistence layer that supports JDBC-based event and snapshot storage, alongside cluster coordination utilities for managing node states. The library also offers a structured aggregate pattern for managing domain state transitions and durable messaging within actors.

Features

Added Trust Account Creation System example

A new example demonstrating a Trust Account Creation System has been added to the Akka Tools library. This includes the core aggregate logic, command and event definitions, and a starter configuration that wires together email, e-signing, and trust account processing systems. The example illustrates how to use the \AggregateStarter\ for bootstrapping and how the aggregate coordinates with external actors to complete a multi-step business process.

examples/aggregates/src/main/scala/no/nextgentel/oss/akkatools/example2 · high confidence

Adds SQL schema files for MySQL and PostgreSQL and updates configuration

The Akka JDBC journal now includes database-specific Liquibase SQL scripts for MySQL and PostgreSQL, enabling users to initialize the required schema for those databases. The configuration has been updated to support the new read journal provider and reflects the package rename from 'no.ngt' to 'no.nextgentel'.

akka-tools-jdbc-journal/src/main/resources · high confidence

Introduced new aggregate architecture with improved usability and functional DM generation

The library has been refactored to introduce a new, more usable aggregate structure. This includes a new \AggregateStarter\ for bootstrapping aggregates, a \StateTransition\ model that allows state transitions to return new or extra events, and a \GeneralAggregateV3\ that supports functional durable message generation via \eventToDMFunc\. Additionally, \ActorWithDMSupport\ and \ActorWithDMSupportFuture\ were added to simplify implementing regular actors that interact with durable messages, and \AggregateStateGetter\ was added to facilitate testing by allowing retrieval of an aggregate's current state.

akka-tools-persistence/src/main · high confidence

New booking example demonstrating aggregate patterns

Added a new example application in the aggregates module that demonstrates an Akka-based booking system. The example includes a BookingAggregate implementing the GeneralAggregateDMViaEvent pattern, handling commands like OpenBookingCmd, ReserveSeatCmd, and CancelSeatCmd, with corresponding events and state management. The demo app uses AggregateStarter for bootstrapping and includes utility classes for data source management and a state machine for booking lifecycle management.

examples/aggregates/src/main/scala/no/nextgentel/oss/akkatools/example · high confidence

Removals

Removal of Akka cluster singleton and JDBC persistence components

The \ClusterSingletonHelper\ and \NgtSeedNodesListOrderingResolver\ classes in the Akka cluster module have been removed, eliminating the ability to manage cluster singletons and resolve seed node ordering. Additionally, the \JdbcJournal\ and \StorageRepo\ components in the JDBC journal module have been deleted, removing the implementation for storing and retrieving persistent actor state and snapshots via a relational database. These changes indicate a significant reduction in the framework's built-in support for cluster coordination and JDBC-based persistence.

akka-tools-cluster/src/main/scala/no/ngt, akka-tools-jdbc-journal/src/main/scala/no/ngt · high confidence

Behavioural changes

Added configuration files for the aggregates example

New configuration files were added to the aggregates example to support the application's runtime environment. An application.conf file was introduced to configure Akka cluster settings, including remote transport, seed nodes, and logging filters, while also including external Akka tools for sharding and JDBC journaling. Additionally, a logback.xml file was added to define console and rolling file appenders for structured logging, with specific patterns for Akka sources and recovery states.

examples/aggregates/src/main/resources · high confidence

Improved cluster error detection and startup logic

The cluster listener now prevents false-positive error detection during startup by checking if the node has actually joined the cluster before evaluating other nodes' status. It also handles application shutdown gracefully by stopping error detection when the JVM is shutting down, preventing spurious restart triggers. Additionally, the code was renamed from 'ngt' to 'nextgentel' and refactored to use a new 'AkkaClusterConfig' class with a Java API.

akka-tools-cluster/src/main/scala/no/nextgentel · high confidence

JDBC journal and read journal implementations rewritten for Akka 2.4/2.5 compatibility

The JDBC journal and read journal implementations have been completely rewritten to support Akka 2.4 and 2.5. The write journal now publishes events via Distributed PubSub for instant delivery to the read journal, and the read journal uses a GraphStage-based source for event streams. The implementation now supports Oracle, MySQL, and PostgreSQL databases, and includes a new \EventWithInjectableTimestamp\ trait to inject database timestamps into events. Configuration has been simplified with a new \jdbcJournalRuntimeDataFactory\ parameter to support multiple journals with different configurations.

akka-tools-jdbc-journal/src/main/scala/no/nextgentel · high confidence

New serialization trait and updated cluster node repository interface

Added a new \JacksonJsonSerializableButNotDeserializable\ trait alongside the existing \JacksonJsonSerializable\ in the \akka-tools-common\ module. Additionally, the \ClusterNodeRepo\ interface was moved to \akka-tools-common\ and updated to include a \joined\ boolean parameter in its \writeClusterNodeAlive\ and \findAliveClusterNodes\ methods, allowing callers to filter or record node status based on whether the node has joined the cluster.

akka-tools-common · high confidence

Renamed JSON serializer from NgtJsonSerializer to JacksonJsonSerializer

The JSON serialization component has been renamed from NgtJsonSerializer to JacksonJsonSerializer, with corresponding updates to the package name (no.ngt.oss to no.nextgentel.oss) and configuration keys (ngt-json-serializer to jackson-json-serializer). The serializer now uses a pre-configured ObjectMapper via setObjectMapper() instead of init(), and exceptions thrown during serialization no longer cause Akka remoting connections to drop.

akka-tools-json-serializing/src · high confidence

Test coverage

Added test configuration and logging setup for JDBC journal tests; Added test configuration files for Akka persistence tests; Added test configuration for Akka 2.4.0-RC3; Added test fixtures for the Booking aggregate; Added tests for ClusterSingletonHelper and SeedNodesListOrderingResolver; Added tests for DurableMessage support in actors; Added tests for JDBC journal and snapshot store; Added tests for aggregate behavior and event generation; Added tests for aggregate state management and snapshot handling; Added tests for the Trust Account Creation system; Added tests for the booking aggregate example; Added tests for the new V2 aggregate implementation.

Dependencies

Upgrade to Akka 2.5 and Scala 2.12

The project has been upgraded to Akka 2.5.16 and Scala 2.12.6, replacing the previous Akka 2.3/2.4 and Scala 2.11 versions. This update includes new dependencies for Akka Cluster, Cluster Sharding, and Persistence Query, while removing the experimental persistence module. The build configuration now supports cross-compilation for Scala 2.11.8 and 2.12.6, and test dependencies have been updated to include Akka Testkit and Awaitility.

(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 57 → 55 (-1.9)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 96 → 94 (-1.5)
  • Architecture 100 → 68 (-31.9)
  • Maturity 40 → 54 (+13.9)
  • Readiness 46 → 44 (-1.4)
  • Security 100 → 78 (-22.2)

Resolved (7)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • LLM evaluation failed
  • 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 (26)

  • Documentation: no installation or build instructions (README.md)
  • Documentation: written for insiders (README.md)
  • Duplicated block (13 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (17 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (21 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (23 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (26 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (37 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (40 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (7 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (8 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (9 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (9 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (9 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • Duplicated block (9 lines × 3) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/StorageRepoImpl.scala)
  • EnhancedPersistentView.receive (cognitive 17) (akka-tools-persistence/src/main/scala/no/nextgentel/oss/akkatools/persistence/EnhancedPersistentActor.scala)
  • EnhancedPersistentView.receive (cyclomatic 16) (akka-tools-persistence/src/main/scala/no/nextgentel/oss/akkatools/persistence/EnhancedPersistentActor.scala)
  • GeneralAggregateBase.tryCommand (cognitive 39) (akka-tools-persistence/src/main/scala/no/nextgentel/oss/akkatools/aggregate/GeneralAggregateBase.scala)
  • JdbcAsyncWriteJournal.asyncReplayMessages (cognitive 16) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/JdbcAsyncWriteJournal.scala)
  • JdbcEventsByPersistenceIdSource.createLogic (cognitive 23) (akka-tools-jdbc-journal/src/main/scala/no/nextgentel/oss/akkatools/persistence/jdbcjournal/JdbcEventsByPersistenceIdSource.scala)
  • …and 6 more

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

Survey your own repository

NextGenTel/akka-tools 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 a877a4db118dc5a06198cbfe88d9e589d4563238 — 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-fa71c66cabd8.