Skip to content
CAI
Software that uses CAICheck a score

amitayh/event-sourcing-kafka-streams

38.4

Weak · 20 September 2026

974

lines of production code

Scala

with JavaScript

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a Kafka-based invoice management service that processes commands and events to maintain a consistent state of invoice data. It features a React frontend for creating, viewing, and managing invoices, which communicates with a backend API to execute operations and receive real-time updates. The architecture utilizes Java and Scala components, including a command handler and a list projector, to persist invoice records directly to MySQL while leveraging Kafka for event streaming and serialization.

Features

Added shell scripts to launch Java services with externalized configuration

New shell scripts in the bin directory (commandhandler, projector, setup, web) now allow users to start the respective Java applications by sourcing a shared config utility. These scripts read connection details (such as bootstrap servers and database credentials) from a properties file, enabling easier local deployment and configuration management without hardcoding values in the launch commands.

bin, config · high confidence

Initial client-side invoice management UI

Adds a React-based single-page application for managing invoices, featuring a list view with pay/delete actions, a creation form for new invoices, and real-time status updates via Server-Sent Events. The client communicates with a backend API at localhost:8080 to execute commands (create, pay, delete) and listen for state changes, using a simple local state management pattern.

client · high confidence

Initial web application release with Docker support

The web module is introduced as a new component, providing a React-based frontend for the Kafka Streams Demo. The application is packaged into a JAR and served via a new Dockerfile based on Java 8, exposing port 8080. The frontend includes static assets (HTML, CSS, JS) that utilize Bootstrap 3.3.7 for styling and implement a state management system for handling invoice creation, updates, and deletion, communicating with the backend via HTTP requests.

web · high confidence

Behavioural changes

Invoice listing now filters for active invoices and DAO uses dependency injection

The invoice list query now explicitly filters for invoices with 'New' or 'Paid' status, excluding other states like 'Deleted' from the default view. Additionally, the data access layer has been refactored to use dependency injection: the MySQL DAO now accepts a transactor via its constructor and provides a Resource for setup, replacing the previous hardcoded environment-variable-based initialization in the companion object.

commandhandler, listdao · high confidence

List projector switches from Pusher webhooks to direct MySQL persistence

The list projector no longer pushes invoice updates and command results to external Pusher channels; instead, it saves invoice records directly to MySQL via a new \MySqlInvoiceList\ dependency. This change removes the Pusher integration code and replaces the previous multi-step processing (pushing updates and results) with a single step that persists invoice data locally, simplifying the architecture by removing the external real-time notification dependency for this component.

listprojector · high confidence

Refactored Kafka topic configuration and domain model serialization

The common module now uses generic, type-safe Kafka topic definitions that explicitly specify key and value serializers (Avro and UUID) for events, commands, results, and snapshots, replacing the previous string-only topic configuration. This change moves serialization logic into the topic definitions and simplifies the topic creation process. Additionally, the domain model was refactored: the \CommandResult\ class was moved to its own file, and the \Command\ and \Event\ payload traits were updated to use explicit \apply\ methods instead of extending function types, improving type clarity and separation of concerns.

common · high confidence

Dependencies

Upgrade Scala dependencies and remove Pusher client

The project updates several core Scala libraries, including http4s (0.18.14 to 0.20.0-M7), circe (0.9.3 to 0.10.0), and doobie (0.5.3 to 0.6.0), while adding cats-retry for retry logic. The Pusher dependency is removed from the backend, and the client-side React application is initialized with React 16.2.0 and related tooling.

(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 38 → 38 (+0.2)
  • Rubric changed (rubric-2026.08.17 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 64 → 67 (+3.4)
  • Architecture 69 → 69 (+0.0)
  • Maturity 45 → 51 (+5.7)
  • Readiness 14 → 14 (+0.0)
  • Security 89 → 93 (+4.3)
  • Domain Modelling 100 → 100 (+0.0)
  • Accessibility 57 (new)

Resolved (14)

  • Dependency hygiene not measured — no supported dependency manifest was read
  • Low IaC: DS-0026 (commandhandler/Dockerfile)
  • Low IaC: DS-0026 (listprojector/Dockerfile)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • No exposed public API
  • Rotate the exposed credentials — git history can't be un-committed
  • Scanner failed to run — not a clean result
  • complexity unreadable for .scala — churn × complexity hotspots could not be measured
  • early-stage repository — too little history to judge knowledge freshness
  • git history depth insufficient
  • single-maintainer — knowledge-concentration (bus factor) risk

New (13)

  • Dependency hygiene PARTLY measured — npm pinning read, dependency currency not (no committed lockfile, so no resolved version to grade)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no licence statement (README.md)
  • Documentation: no usage examples (README.md)
  • High IaC: WD-COMPOSE-0001 (docker-compose.yml)
  • High IaC: WD-COMPOSE-0002 (docker-compose.yml)
  • High IaC: WD-COMPOSE-0002 (docker-compose.yml)
  • High IaC: WD-COMPOSE-0002 (docker-compose.yml)
  • Medium IaC: WD-DOCKER-0003 (commandhandler/Dockerfile)
  • Medium IaC: WD-DOCKER-0003 (listprojector/Dockerfile)
  • Medium IaC: WD-DOCKER-0003 (web/Dockerfile)
  • Scanner failed to run — not a clean result
  • Scanner failed to run — not a clean result

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

Survey your own repository

amitayh/event-sourcing-kafka-streams 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 20 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 85aca484cdebf32298a06c4215c187cfaef11083 — 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.