MAIF/thoth
42.4
Weak · 21 September 2026
14.3k
lines of production code
Java
primary language
4
measurements over time
What this system is
Features
Add Paradox template for documentation styling and layout
Added new template files for the Thoth documentation site, including a CSS stylesheet (page.css) that defines typography, header, and link styles, and HTML templates (page.st, title.st) that structure the page layout with a sidebar, main content area, and footer.
_thoth-documentation, thoth-documentation/src/main/paradox/\template · high confidence
Add Thoth-based bank demo with event sourcing and Kafka integration
Added two new demo applications (blocking and reactive) that implement a bank account system using the Thoth event sourcing library. The blocking demo (demo-postgres-kafka) uses a standard Java executor for event processing, while the reactive demo (demo-postgres-kafka-reactive) leverages Project Reactor for non-blocking operations. Both demos feature an Account aggregate with commands for opening, depositing, withdrawing, and closing accounts, along with projections to track withdrawal statistics. The reactive demo specifically removes the previous Reactor Kafka dependency in favor of the new Thoth integration.
thoth-demo/demo-postgres-kafka, thoth-demo/demo-postgres-kafka-reactive, thoth-sample · high confidence
Add in-memory event sourcing demo implementations
Added two new demo applications, 'demo-in-memory' and 'demo-in-memory-vanilla', which implement a simple bank account system using an in-memory event store. Both demos provide the same domain logic (create, withdraw, deposit, close accounts) but differ in their reactive programming approach: the 'vanilla' variant uses Java's CompletionStage for asynchronous processing, while the standard variant uses Vavr's Either and Option types for error handling and state management.
thoth-demo/demo-in-memory, thoth-demo/demo-in-memory-vanilla · high confidence
Add reactive event sourcing implementation for PostgreSQL and Kafka
Introduces a new reactive implementation of the event sourcing API using the Reactor library, enabling asynchronous processing of commands and events. The change adds core components including \DefaultReactorAggregateStore\, \DefaultReactorEventStore\, and \DefaultReactorEventProcessor\ which wrap existing synchronous event sourcing interfaces with reactive \Mono\ and \Flux\ return types. It also provides a builder (\ReactivePostgresKafkaEventProcessorBuilder\) to wire together a PostgreSQL-backed event store with a Kafka event publisher, allowing users to construct a fully reactive event processing pipeline.
thoth-jooq-reactor · high confidence
Added new utility types and enhanced Event interface
The thoth-commons-events module introduces three new utility classes: Lazy for lazy evaluation wrapping io.vavr.Lazy, Result as a sealed interface for success/error handling with map/flatMap/onError/onSuccess/fold operations, and Unit as a singleton placeholder type. The Event interface gains Javadoc comments and default hash() and entityId() methods, while the Type interface adds match() convenience methods and an equals() implementation for value-based comparison.
thoth-commons-events · high confidence
Introduce in-memory event store and default aggregate store implementations
Adds new in-memory implementations of the event sourcing core: DefaultAggregateStore and InMemoryEventStore. The InMemoryEventStore provides a thread-safe, in-memory storage for event envelopes, supporting transactional commit/rollback, sequence generation, and event publishing. The DefaultAggregateStore implements the aggregate store interface, enabling the framework to operate with an in-memory event store for testing or lightweight scenarios.
thoth-core-reactor/src/main/java/fr/maif/reactor/eventsourcing/vanilla · high confidence
Introduce new Kafka sender and receiver abstractions
Added new classes to the \thoth-core-reactor\ module to provide a Reactor-based interface for Kafka communication. This includes \KafkaSender\ and \KafkaSettings\ for producing messages, alongside \SenderOptions\, \ReceiverOptions\, \SenderRecord\, and \SenderResult\ to configure and manage the flow of data. The implementation leverages the Apache Kafka client libraries directly rather than the previous Reactor Kafka integration, offering a fresh API for sending and receiving Kafka messages within the reactor pipeline.
thoth-core-reactor/src/main/java/fr/maif/reactor/kafka · high confidence
Introduce new eventsourcing core with Vavr and Java 8+ APIs
The thoth-core module now provides a complete eventsourcing foundation, introducing a new concurrent utility class (CompletionStages) and a full set of eventsourcing interfaces and implementations (AbstractState, AggregateStore, CommandHandler, EventProcessor, Projection, etc.). This adds support for handling commands, processing events, and managing aggregate state using Java's CompletableFuture and Vavr's Option/Either types, enabling both standard Java and Vavr-based implementations.
thoth-core · high confidence
Introduce resilient Kafka consumer and event-sourcing projection with lifecycle hooks
Added a new \ResilientKafkaConsumer\ class that wraps the Reactor Kafka consumer with automatic restart capabilities, configurable backoff strategies, and explicit lifecycle hooks (starting, started, stopping, stopped, failed). This is extended by \EventuallyConsistentProjection\, a base class for building event-sourcing projections that consume from Kafka topics. The change also includes a \Status\ enum to track consumer states and test helpers to validate the new consumer and projection behavior.
thoth-kafka-consumer-reactor · high confidence
New Reactor-based event sourcing implementation
Added new classes for the Reactor-based event sourcing core: DefaultAggregateStore, InMemoryEventStore, and ReactorKafkaEventPublisher. These provide an in-memory event store for testing and a Kafka-based publisher for production, enabling reactive event handling and publishing.
thoth-core-reactor/src/main/java/fr/maif/reactor/eventsourcing · high confidence
Removals
Removal of core event-sourcing components
The \eventsourcing-core\ module has removed several key classes: \ExecutionContextBridge\, \AggregateStore\ interface, \EventProcessor\, \Projection\ interface, \DefaultAggregateStore\, \InMemoryEventStore\, and \JdbcTransactionManager\. This eliminates the in-memory event store implementation, the JDBC-based transaction manager, and the core event processing logic, effectively removing the ability to process commands and store snapshots using these specific implementations.
eventsourcing-core · high confidence
Architecture
Removed SBT build configuration files
The project's SBT build configuration has been removed, including the central dependency definitions (Akka, Jackson, Vavr, jOOQ, etc.), the publishing plugin settings, the SBT version specification, and the list of SBT plugins (such as sbt-bintray, sbt-git, sbt-release, and sbt-updates). This indicates a significant shift in the project's build system or structure, removing the previous SBT-based build setup entirely.
project · high confidence
Behavioural changes
Added script to build documentation
A new shell script, scripts/build-documentation.sh, has been added to automate the documentation build process. This script changes directory to thoth-documentation and executes the sbt generateDoc command, streamlining the workflow for generating project documentation.
scripts · high confidence
Migrate event processing from Akka to Pekko and Reactor
The Thoth Jooq module has been refactored to replace Akka-based concurrency and execution models with Apache Pekko and Project Reactor. This includes updating the \PostgresKafkaEventProcessor\ and \PostgresEventStore\ to use \Executor\ and \SenderOptions\ instead of \ActorSystem\ and \ProducerSettings\, and switching from \Future\-based async handling to \CompletionStage\ and \Mono\/\Flux\ reactive streams. The test suite has also been updated to use JUnit 5 and Testcontainers for database and Kafka integration tests.
thoth-jooq · high confidence
Migration from SBT to Gradle build system
The project has migrated its build system from SBT to Gradle, introducing the Gradle wrapper scripts (gradlew, gradlew.bat) and build configuration files. This change replaces the previous SBT-based build process, updating the build tooling and associated configuration files such as .gitignore and docker-compose files to support the new Gradle environment.
(repo-wide) · high confidence
Migration to Apache Pekko and removal of Reactor Kafka
The Thoth library has been migrated to use Apache Pekko as the underlying actor and stream processing framework, replacing the previous Akka-based implementation. This change introduces new core components such as \ExecutionContextBridge\, \DefaultAggregateStore\, and \InMemoryEventStore\ within the \thoth-core-pekko\ module, alongside a new \ResilientKafkaConsumer\ in \thoth-kafka-conkko\. The legacy Reactor Kafka integration has been removed entirely. Users should expect updated dependencies and potentially different configuration patterns for setting up event sourcing and Kafka consumers.
thoth-core-pekko, thoth-jooq-pekko, thoth-kafka-consumer-pekko · medium confidence
Upgraded Gradle wrapper to version 8.14.2
The Gradle wrapper has been updated to version 8.14.2. This change ensures that the project uses a specific, locked version of the Gradle build tool, which helps maintain consistency across different development environments and prevents unexpected behavior from upstream Gradle updates.
gradle · high confidence
Test coverage
Added datastore verification tests for event sourcing; Added in-memory data store test suite for Thoth TCK; Added test infrastructure and unit tests for event sourcing and Kafka integration.
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 54 → 42 (-11.9)
- Rubric changed (rubric-2026.08.18 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 89 → 90 (+1.1)
- Architecture 100 → 99 (-1.0)
- Maturity 60 → 54 (-5.6)
- Readiness 43 → 44 (+0.6)
- Security 53 → 61 (+7.8)
- Accessibility 28 (new)
Resolved (40)
- Build action pinned to a mutable branch
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- Duplicated block (10 lines × 2) (thoth-core-pekko/src/main/java/fr/maif/pekko/projections/EventuallyConsistentProjection.java)
- Duplicated block (10 lines × 2) (thoth-kafka-consumer-pekko/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java)
- Duplicated block (10 lines × 2) (thoth-kafka-consumer-pekko/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java)
- Duplicated block (11 lines × 16) (thoth-commons-events/src/main/java/fr/maif/eventsourcing/EventEnvelope.java)
- Duplicated block (11 lines × 2) (thoth-core-pekko/src/main/java/fr/maif/pekko/kafka/KafkaSettings.java)
- Duplicated block (11 lines × 2) (thoth-kafka-consumer-pekko/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java)
- Duplicated block (11 lines × 2) (thoth-kafka-consumer-reactor/src/main/java/fr/maif/kafka/reactor/consumer/ResilientKafkaConsumer.java)
- Duplicated block (12 lines × 3) (thoth-core/src/main/java/fr/maif/eventsourcing/impl/AbstractDefaultAggregateStore.java)
- Duplicated block (14 lines × 2) (thoth-core-pekko/src/main/java/fr/maif/pekko/eventsourcing/InMemoryEventStore.java)
- Duplicated block (14 lines × 2) (thoth-core-pekko/src/main/java/fr/maif/pekko/jdbc/stream/source/UpdateQuerySource.java)
- Duplicated block (14 lines × 3) (thoth-core-pekko/src/main/java/fr/maif/pekko/jdbc/stream/source/SelectQuerySource.java)
- Duplicated block (16 lines × 2) (thoth-core-pekko/src/main/java/fr/maif/pekko/jdbc/stream/source/UpdateQuerySource.java)
- Duplicated block (19 lines × 2) (thoth-jooq-reactor/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java)
- Duplicated block (5 lines × 2) (thoth-core/src/main/java/fr/maif/eventsourcing/vanilla/Events.java)
- Duplicated block (5 lines × 2) (thoth-jooq-reactor/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java)
- Duplicated block (5 lines × 2) (thoth-jooq/src/main/java/fr/maif/eventsourcing/impl/PostgresEventStore.java)
- Duplicated block (6 lines × 2) (thoth-core/src/main/java/fr/maif/eventsourcing/vanilla/ProcessingSuccess.java)
- …and 20 more
New (125)
- ClassTooLong: PostgresKafkaEventProcessorBuilder (thoth-jooq/src/main/java/fr/maif/eventsourcing/PostgresKafkaEventProcessorBuilder.java)
- ClassTooLong: ReactivePostgresKafkaEventProcessorBuilder (thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessorBuilder.java)
- ClassTooLong: ReactivePostgresKafkaEventProcessorBuilder (thoth-jooq-reactor/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessorBuilder.java)
- ClassTooLong: ReactorPostgresKafkaEventProcessorBuilder (thoth-jooq-reactor/src/main/java/fr/maif/eventsourcing/ReactorPostgresKafkaEventProcessorBuilder.java)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no installation or build instructions (README.md)
- Documentation: no installation or build instructions (docs/manual/getting-started.html)
- Documentation: no usage examples (README.md)
- Documentation: no usage examples (docs/manual/getting-started.html)
- Documentation: written for insiders
- Duplicated block (10 lines × 2) (thoth-core-pekko/src/main/java/fr/maif/pekko/projections/EventuallyConsistentProjection.java)
- Duplicated block (10 lines × 2) (thoth-core-pekko/src/main/java/fr/maif/pekko/projections/EventuallyConsistentProjection.java)
- Duplicated block (10 lines × 2) (thoth-core-reactor/src/main/java/fr/maif/reactor/eventsourcing/InMemoryEventStore.java)
- Duplicated block (10 lines × 2) (thoth-core-reactor/src/main/java/fr/maif/reactor/eventsourcing/InMemoryEventStore.java)
- Duplicated block (10 lines × 2) (thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java)
- Duplicated block (10 lines × 2) (thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessor.java)
- Duplicated block (10 lines × 2) (thoth-jooq/src/main/java/fr/maif/eventsourcing/PostgresKafkaEventProcessorBuilder.java)
- Duplicated block (10 lines × 2) (thoth-kafka-consumer-pekko/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java)
- Duplicated block (10 lines × 2) (thoth-kafka-consumer-pekko/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java)
- Duplicated block (10 lines × 2) (thoth-kafka-consumer-reactor/src/main/java/fr/maif/kafka/reactor/consumer/ResilientKafkaConsumer.java)
- …and 105 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
MAIF/thoth 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 0d3c88a41e63519990287ffa18b2a0462c31b568 — 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-28e75b8e3254.