open-cqrs/opencqrs
59.5
Adequate · 22 September 2026
9.1k
lines of production code
Java
primary language
7
measurements over time
What this system is
This system is an open-source CQRS and Event Sourcing framework built on Spring Boot 4 and Java 21, designed to manage command handling, state rebuilding, and event processing. It provides a client for EventStoreDB that supports EventQL queries and robust precondition-based concurrency control. The framework includes auto-configuration for seamless integration, a fluent API for testing, and tooling for publishing to Maven Central.
Features
Enable article brainstorming and writing capabilities
The .codex configuration now includes symlinks to the 'brainstorm-article' and 'write-article' skills, effectively activating blog-related functionality for article generation and ideation.
.codex · high confidence
EventQL query support and API simplification
The ESDB client now supports EventQL queries, introducing a new \eventql\ package with classes like \EventQuery\, \EventQueryBuilder\, and handlers for processing results and errors. The \EsdbClient\ class no longer implements the removed \Client\ interface, simplifying the API surface. Additionally, new preconditions \SubjectIsPopulated\ and \EventQlQueryIsTrue\ allow for more complex write operations, and the \ping\ and \authenticate\ methods now verify specific event types in responses for better compliance.
esdb-client/src/main/java/com/opencqrs/esdb/client · high confidence
Behavioural changes
Adopts Spring Boot 4 health APIs and JSpecify null-safety annotations
The Spring Boot auto-configuration module has been updated to align with Spring Boot 4, migrating health indicator implementations from the legacy \org.springframework.boot.actuate.health\ package to the new \org.springframework.boot.health\ API. This change also introduces JSpecify annotations (via \@NullMarked\) to improve null-safety across the client package, removes unnecessary validation constraints from configuration properties, and renames internal beans (such as the Jackson marshaller) to prevent naming clashes with other frameworks.
esdb-client-spring-boot-autoconfigure · high confidence
Documentation site overhaul: search, blog, and updated framework references
The documentation site now includes a search feature with improved tokenization for CamelCase identifiers, and a new blog section for news and articles. The site URL has changed to docs.opencqrs.com, and the framework version is updated to 2.0.0 with ESDB 1.2.0 and Spring Boot 4.1.0 references. New navigation items include 'Reliable Event Handling in a Distributed Environment' and 'Test Support', while 'Upcasting a Single Event' is renamed to 'Upcasting Events'. A custom macro in main.py now generates Javadoc links for Java classes, and social links are updated to include an email address and LinkedIn.
mkdocs · high confidence
Enhanced null safety and refined command subject precondition handling
The framework now adopts JSpecify annotations for improved null safety, replacing previous Jakarta validation constraints with explicit nullability markers across command handlers, state rebuilding, and event processing components. This change allows command handlers and state rebuilding operations to explicitly accept and return null instances, reflecting real-world state transitions. Additionally, command execution now supports passing explicit preconditions via new \publish\ and \publishRelative\ methods on \CommandEventPublisher\, enabling handlers to enforce additional subject conditions (such as \SubjectIsPristine\ or \SubjectIsPopulated\) beyond those implicitly applied by the router. A new \CommandSubjectConditionViolatedException\ abstract base class unifies subject-related violations, and the \EventHandlingProcessor\ now exposes an \isRunning()\ status check for better lifecycle monitoring.
framework/src/main · high confidence
Fluent test API refactored with JSpecify null safety and simplified generics
The command handling test fixture now uses a redesigned fluent API (GivenDsl, ExpectDsl, EventSpecifierDsl, EventAsserting) that replaces the previous methods like givenNothing() and expectSuccessfulExecution() with a chained style (given().nothing().succeeds()). The fixture class has been simplified by removing the generic result type parameter, reducing CommandHandlingTestFixture from three generics to one. JSpecify annotations (@Nullable, @NullMarked) have been introduced to improve null safety. Additionally, Spring Boot compatibility is updated by migrating type exclude filter imports to the new context filter package and renaming getKnownIncludes.
framework-test/src/main · high confidence
New developer tooling and documentation updates
This change introduces several new configuration files and updates existing documentation. A new \.mcp.json\ file configures the GitHub MCP server for local development, while \jreleaser.yml\ and \MAINTAINER.md\ establish the pipeline for publishing to Maven Central. The \flake.nix\ file is updated to include \jreleaser-cli\, \gh\, and \github-mcp-server\ in the Nix development environment. Documentation is enhanced with a new \CLAUDE.md\ defining article pipeline workflows and terminology, and \README.md\ is updated to include dynamic shields.io badges, corrected version placeholders (\{{version}}\), and a link to sample applications. Additionally, \.gitignore\ and \.envrc\ are refined to better handle local environment files and build artifacts.
(repo-wide) · high confidence
Rebrand example application to OpenCQRS and update configuration
The example application has been rebranded from 'dxfrontiers' to 'OpenCQRS', involving a package rename from \de.dxfrontiers.cqrs.example\ to \com.opencqrs.example\ across all Java sources, including the main entry point (now \LibraryApplication\), domain models, and REST controllers. This change is accompanied by a behavioral update to the Spring Boot configuration, where the application property prefix has been renamed from \cqrs\ to \opencqrs\. Additionally, the \JdbcProgressTracker\ bean now explicitly sets \setProceedTransactionally(true)\ to ensure transactional progress tracking, and the event type resolver has been updated to use the new \com.opencqrs.example\ namespace for event identifiers.
example-application/src/main · high confidence
Spring Boot auto-configuration overhaul: renamed beans, new property prefix, and null-safety
The Spring Boot auto-configuration layer has been refactored to improve compatibility and safety. All auto-configured beans (such as command routers, event handlers, and caches) are now prefixed with 'openCqrs' to prevent name clashes with other frameworks. The configuration property prefix has changed from 'cqrs' to 'opencqrs' (e.g., 'opencqrs.event-handling'). The framework now honors the Spring @Order annotation on @StateRebuilding and @EventHandling handlers, allowing users to control execution order. Additionally, the codebase has adopted JSpecify for improved null safety, and the default transactional behavior for event handlers using JdbcProgressTracker has been changed to non-transactional to avoid unintended side effects.
framework-spring-boot-autoconfigure/src/main · high confidence
Support for read subjects API and EventQL preconditions with improved null safety
The Jackson marshaller now supports the new read subjects API, adding methods to serialize base subject requests and deserialize subject response lines, as well as handling subject elements in response streams. It also introduces two new preconditions, isSubjectPopulated and isEventQLQueryTrue, allowing users to enforce subject presence and EventQL query conditions. Under the hood, the implementation migrates from the standard Jackson library to the tools.jackson variant, removes strict validation annotations (like @NotNull and @NotBlank) from event payload records in favor of JSpecify's @Nullable annotations, and marks the package as null-marked to improve overall null safety.
esdb-client/src/main/java/com/opencqrs/esdb/client/jackson · high confidence
Test coverage
Added tests for EventQL query preconditions and error handling; Added tests for Spring Boot auto-configuration ordering, property prefixes, and lifecycle fallbacks; Refactored command handling test fixtures and configuration; Updated example application tests to use fluent test API; Updated tests for Spring Boot 4, JSpecify null-safety, and command concurrency preconditions.
Dependencies
Gradle Wrapper upgraded to version 9.6.0
The Gradle wrapper has been updated to use Gradle 9.6.0 (previously 8.14). This change ensures that builds are executed with the new Gradle version, which may include performance improvements, bug fixes, and new features available in the 9.x release line.
gradle · high confidence
Upgrade to Spring Boot 4 and introduce null-safety checks
The project has upgraded its core dependency from Spring Boot 3.4.5 to version 4.1.0, which also updates the EventSourcingDB client to version 1.2.0. To support this major version jump, the build now targets Java 21 and replaces legacy starters (such as \spring-boot-starter-web\ and \spring-boot-starter-validation\) with their modern equivalents like \spring-boot-starter-webmvc\ and \spring-boot-starter-jackson\. Additionally, the build system now enforces null-safety using NullAway and JSpecify, and includes new Gradle tasks to generate documentation and dynamic shields.io badges for the project's versioning.
(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
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 52 → 59 (+7.4)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 89 → 92 (+2.6)
- Architecture 100 → 98 (-2.5)
- Maturity 74 → 74 (-0.0)
- Readiness 32 → 38 (+5.9)
- Security 54 → 74 (+20.1)
- Domain Modelling 100 → 89 (-11.5)
Resolved (29)
- CommandHandlingTestAutoConfiguration.fixtureBeanDefinitionRegistryPostProcessor (cognitive 23) (framework-test/src/main/java/com/opencqrs/framework/command/CommandHandlingTestAutoConfiguration.java)
- 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) (framework-test/src/main/java/com/opencqrs/framework/command/CommandHandlingTestFixture.java)
- Duplicated block (13 lines × 2) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (14 lines × 3) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (15 lines × 2) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (5 lines × 2) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (7 lines × 3) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (8 lines × 2) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/StateRebuildingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (8 lines × 2) (framework-test/src/main/java/com/opencqrs/framework/command/CommandHandlingTestFixture.java)
- FileTooLong: command/CommandHandlingTestFixture.java (framework-test/src/main/java/com/opencqrs/framework/command/CommandHandlingTestFixture.java)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- …and 9 more
New (57)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no architecture or design documentation (README.md)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (13 lines × 2) (framework-test/src/main/java/com/opencqrs/framework/command/CommandHandlingTestFixture.java)
- Duplicated block (19 lines × 3) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (19–20 lines × 2) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/StateRebuildingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (22 lines × 3) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (4–9 lines × 3) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (6 lines × 2) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (7 lines × 3) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- Duplicated block (8 lines × 2) (framework-test/src/main/java/com/opencqrs/framework/command/CommandHandlingTestFixture.java)
- Edited copy of a member (8 corresponding lines) (framework-spring-boot-autoconfigure/src/main/java/com/opencqrs/framework/command/CommandHandlingAnnotationProcessingAutoConfiguration.java)
- High IaC: WD-COMPOSE-0002 (example-application/docker-compose.yml)
- High IaC: WD-COMPOSE-0002 (example-application/docker-compose.yml)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- …and 37 more
Changes since last survey
- 13 commits — 13 feature/other, 0 fixes
By area
- mkdocs/docs — 12 commits
- mkdocs/mkdocs.yml — 1 commit
Notable commits
- change: blog: add blackbox testing article, rework lazy enrichment and drop retired refactor-article
- change: blog: address review feedback on blackbox testing article
- change: blog: align evolving-event-sourced-systems article with upstream main
- change: blog: enrich blackbox testing article with cross-links, admonitions and tooltips§
- change: blog: move lazy enrichment rework out of this branch (now on evolving-systems-lazy-enrichment-rework, PR #92)
- change: blog: remove changes in older article
- change: blog: restore evolving-event-sourced-systems article to main state
- change: blog: rework blackbox testing article
- change: blog: style pass on blackbox testing article
- change: blog: stylistic adjustments to test-the-business-rule-not-the-helper article
- change: blog: update release date
- change: doc: add black-box testing article
- change: docs: bump opencqrs framework version
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
open-cqrs/opencqrs 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 22 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 47ec4af0d6218b0f260f4dfc09f96f75c91db5ae — 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-90d5d2fe38ee.