Skip to content
CAI
Software that uses CAICheck a score

buildersoftio/andyx

29.4

Weak · 21 September 2026

13.6k

lines of production code

C#

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Andy X is a distributed messaging platform that manages the lifecycle of tenants, products, components, topics, and subscriptions through a comprehensive REST API. It facilitates real-time message delivery to consumers and handles producer connections via WebSocket hubs, while maintaining cluster state synchronization across nodes. The system persists configuration and message data to local storage and supports distributed clustering with configurable shard distribution.

How it got here

2020–2021 — Distributed cluster and model layer expansion

20 changes.

This period focused on modernizing the application's infrastructure by introducing Docker support and upgrading to .NET 7. Significant effort was dedicated to building the core domain models for tenants, products, components, and topics, alongside implementing the distributed cluster synchronization and hub abstractions required for multi-node operation.

2022 — REST API and distributed cluster support

22 changes.

This period focused on exposing a comprehensive REST API for managing core resources and implementing the foundational models and services for distributed cluster communication. The work introduced new entity models, in-memory repositories, and hub services to handle node connections, event broadcasting, and subscription routing across the cluster.

Features

Add ConsumerHub to handle WebSocket connections for message consumption

A new ConsumerHub class has been added to manage the lifecycle of consumer connections. It handles connection initialization, validates tenant, product, and component authorization tokens, and manages subscription registration. This introduces the core infrastructure for consumers to connect and receive messages via the router's hub system.

src/Andy.X.Router/Hubs/Consumers · high confidence

Add REST API endpoints for managing tenants, products, components, topics, producers, subscriptions, clusters, activities, and node status

The application now exposes a comprehensive set of REST API endpoints under the /api/v3/ route prefix, enabling programmatic management of core resources. Users can now create, read, update, and delete tenants, products, components, topics, producers, and subscriptions via dedicated controllers (TenantsController, ProductsController, ComponentsController, TopicsController, ProducersController, SubscriptionsController). Additionally, new endpoints allow querying cluster nodes, retrieving activity counts for all major entities, and fetching active subscription/producer lists. All endpoints require admin or readonly role authorization, ensuring secure access to administrative operations.

src/Andy.X.App/Controllers · high confidence

Add SubscriptionHubService to route messages to connected consumers

A new SubscriptionHubService class has been introduced to manage the delivery of messages to connected consumers. The service handles both unique and shared subscription types, ensuring that messages are transmitted to the appropriate consumer connections via the SignalR hub context.

src/Andy.X.Router/Services/Subscriptions · high confidence

Add cryptographic utilities for hashing and secret generation

The utility library now includes new helper classes for security operations. CryptographyExtensions provides a ToHashString method that generates a SHA-512 hash of a string with an optional salt. KeyGenerators provides a method to generate a random 64-byte API secret encoded in Base64. These additions support the implementation of an authorization store with hashed secrets.

src/Andy.X.Utility/Generators · high confidence

Added ClusterChangeLog entity for cluster change tracking

A new ClusterChangeLog entity has been introduced to track cluster changes, including fields for entry, tenant, product, component, topic, headers, ID, payload, and sent date. This supports the implementation of distributed async clustering by providing a structured model for change log entries.

src/Andy.X.Model/Entities/Clusters · medium confidence

Added ClusterHub to manage node connections and disconnections

A new ClusterHub class has been introduced in the router to handle the lifecycle of distributed cluster nodes. It registers nodes upon connection, validates headers for node ID, cluster ID, and shard ID, and manages the state of connected replicas. On disconnect, it cleans up node references and stops outbound message services, ensuring proper cleanup of cluster topology.

src/Andy.X.Router/Hubs/Clusters · medium confidence

Added ClusterHubRepository for managing node connections

A new ClusterHubRepository class has been introduced to manage the lifecycle of node clients within a cluster. This repository maintains a concurrent dictionary of active node connections, allowing the system to track which nodes are currently connected or disconnected. It provides methods to add, remove, and retrieve node clients by connection ID or node ID, and updates the connection status of replicas in the underlying cluster repository when nodes connect or disconnect.

src/Andy.X.Router/Repositories/Clusters · high confidence

Added JSON serialization and deserialization extensions

A new JsonExtensions class was added to the Andy.X.Utility library, providing helper methods for converting objects to and from JSON strings. Specifically, it adds a JsonToObject method to deserialize JSON into a specified class, and ToPrettyJson and ToJson methods to serialize objects into formatted or compact JSON strings using the Newtonsoft.Json library.

src/Andy.X.Utility/Extensions/Json · high confidence

Added TenantIOReader for configuration loading

A new static class, TenantIOReader, was added to the Readers directory. It provides a method, ReadTenantsFromConfigFile, which reads tenant configurations from a file located via ConfigurationLocations. The implementation includes a retry loop that sleeps for 100ms on failure, ensuring robust access to the configuration file.

src/Andy.X.IO/Readers · high confidence

Added TenantIOWriter for configuration persistence

A new TenantIOWriter class has been introduced in the IO layer to handle the serialization and file-based storage of system configurations. This component provides static methods to persist tenant, storage, transport, and cluster configurations as JSON files, enabling the system to manage its own state on disk.

src/Andy.X.IO/Writers · high confidence

Added basic authentication handler for REST endpoints

A new BasicAuthenticationHandler has been introduced to enforce basic authorization on REST endpoints. This handler validates incoming requests against configured credentials and assigns user roles, enabling secure access to the API.

src/Andy.X.App/Handlers · high confidence

Added event argument classes for cluster components

New event argument classes have been added to the \Andy.X.Model\ layer to support distributed cluster operations. These include \ComponentEvents\, \ConsumerEvents\, \NodeEvents\, \ProducerEvents\, \ProductEvents\, \SubscriptionEvents\, \TenantEvents\, and \TopicEvents\. Each file defines specific argument classes (e.g., \ComponentCreatedArgs\, \NodeConnectedArgs\) that carry metadata such as tenant, product, component, and state information, enabling the system to track and process cluster-related lifecycle events.

src/Andy.X.Model/Clusters/Events · high confidence

Added file-based logging sink for synchronizers

A new LoggerSink class has been introduced in the Synchronizers utility to enable writing logs to a specified file path. This change allows the Synchronizers component to persist log output to disk, supplementing the existing console tracing with file-based auditing.

src/Andy.X.Utility/Synchronizers · high confidence

Added in-memory subscription hub repository for managing subscriptions and consumers

A new in-memory implementation of the subscription hub repository has been added to manage subscription states and connected consumers. This component maintains a concurrent dictionary of subscriptions, allowing for the addition and removal of both internal and external consumers, as well as querying subscription activities and positions. The implementation initializes subscription positions based on the configured initial position (earliest or latest) and ensures the underlying database context is created.

src/Andy.X.Router/Repositories/Subscriptions · high confidence

Introduce Component model for managing topics and settings

A new Component class has been added to the application model, providing a structure to manage a collection of Topics and associated ComponentSettings. This introduces a new entity for representing components within the system, each capable of holding a dictionary of topics and configuration settings.

src/Andy.X.Model/App/Components · high confidence

Introduce Consumer model for managing client connections

A new Consumer model has been added to represent a client connection, containing properties for subscription, unique identifier, name, and connection details such as client and server IP addresses. This model serves as the foundational data structure for tracking active consumer instances and their network endpoints.

src/Andy.X.Model/Consumers · high confidence

Introduce Docker support and .NET 7 runtime for the Andy X application

Users can now build and run Andy X as a Docker container using a new Dockerfile that targets the .NET 7 runtime. The application's startup configuration has been updated to map environment variables (such as ANDYX\_ENVIRONMENT and ANDYX\_URLS) to ASP.NET Core settings, and the entry point is configured to run the application via the Docker image.

src/Andy.X.App · high confidence

Introduce OrchestratorService for centralized topic and cluster data management

A new OrchestratorService has been added to the router's orchestrator layer. This service acts as a central registry for topic and subscription data services, managing concurrent dictionaries for read/write and read-only access to topic data, unacknowledged messages, and cluster change logs. It initializes and retrieves specific data service implementations (such as TopicRocksDbDataService and ClusterRocksDbDataService) based on tenant, product, component, and topic identifiers, effectively abstracting the creation and lookup of these data access components.

src/Andy.X.Router/Services/Orchestrators · high confidence

Introduce ProducerHubRepository for managing producer connections

A new repository class, ProducerHubRepository, has been added to handle the lifecycle of producer connections. It maintains an in-memory store of active producers, allowing the system to add, retrieve, and remove producer instances by connection ID or by filtering on tenant, product, component, and topic. It also aggregates producer activity metrics, enabling the platform to track the status and count of active producer instances.

src/Andy.X.Router/Repositories/Producers · high confidence

Introduce ProducerHubService for producer notification handling

A new ProducerHubService class has been added to the router's producer services. It implements IProducerHubService and provides methods to notify about producer message arrival, failure, and sending status. The implementation currently throws NotImplementedException, indicating it is a structural addition awaiting full logic implementation.

src/Andy.X.Router/Services/Producers · medium confidence

Introduce Product model with component tracking

A new Product model class has been added to the application, defining a product entity with a name, description, and a concurrent dictionary of components. This change establishes the data structure for managing product information and its associated components within the application's model layer.

src/Andy.X.Model/App/Products · high confidence

Introduce Topic and TopicStates models

Added new domain models for topic management: a \Topic\ class representing a topic's name, description, and state, and a \TopicStates\ class tracking the latest entry ID and mark-delete position. This establishes the core data structures for topic configuration and state tracking within the application.

src/Andy.X.Model/App/Topics · high confidence

Introduce centralized location resolution for tenant, cluster, and configuration paths

The system now uses dedicated static helper classes to resolve file and directory paths for tenants, producers, and cluster nodes. A new \ConfigurationLocations\ class defines paths for active and initial configuration files (e.g., \tenants.json\, \storage\_config.json\), logging directories, and temporary storage roots. \TenantLocations\ provides a hierarchical path structure for tenants, products, components, topics, subscriptions, and consumers, including specific directories for logs, tokens, and unacknowledged messages. \ClusterLocations\ and \ProducerLocations\ similarly abstract paths for cluster state, message directories, and producer-specific logs. This change standardizes how the application locates and organizes its data, logs, and configuration files on the filesystem.

src/Andy.X.IO/Locations · high confidence

Introduce core message and acknowledgement data models

The system now defines the fundamental data structures for message handling. A new \Message\ class encapsulates message metadata including tenant, product, component, topic, headers, and payload, alongside a \MessageAcknowledgement\ enum to track delivery status. Additionally, a \MessageAcknowledgementFileContent\ class is introduced to persist acknowledgement state for subscriptions, enabling the system to track which messages have been processed or skipped.

src/Andy.X.Model/App/Messages · high confidence

Introduce subscription model and activity tracking

Added new domain models for managing subscriptions and their associated activities. The \Subscription\ class now tracks tenant, product, component, and topic details, along with subscription type (Unique, Failover, Shared), mode (Resilient/NonResilient), and initial position (Earliest/Latest). It also maintains concurrent dictionaries of connected consumers and external consumers, alongside a database context for position tracking. Additionally, a \SubscriptionActivity\ class was introduced to track the name, location, and active status of subscription activities.

src/Andy.X.Model/Subscriptions · high confidence

Introduce tenant model and logging configuration

Added the Tenant class to represent a tenant's identity, including a collection of products and tenant-specific settings. Additionally, introduced a TenantLogging enum to define logging severity levels (ALL, INFORMATION\_ONLY, WARNING\_ONLY, ERROR\_ONLY) for tenant-level operations.

src/Andy.X.Model/App/Tenants · medium confidence

Introduces ProducerHub for managing producer connections

A new ProducerHub class has been added to handle the lifecycle of producer connections. It validates tenant, product, and component authorization tokens via HTTP headers, enforces unique producer names for single-instance producers, and supports automatic creation of tenants, products, components, and topics based on specific settings (e.g., IsTopicAutomaticCreationAllowed).

src/Andy.X.Router/Hubs/Producers · high confidence

Introduces distributed cluster synchronization and hub abstractions

The core library now includes a comprehensive set of interfaces and implementations to support distributed clustering and real-time communication. New abstractions for cluster hubs (IClusterHub, IConsumerHub, IProducerHub) and cluster services (IClusterHubService, IDistributedAsyncClusterService, IDistributedSyncClusterService) enable nodes to synchronize metadata and state across the cluster. The NodeConnectionProvider establishes secure (SSL/TLS) or non-secure connections between cluster nodes using SignalR, while event handlers (e.g., ComponentEventHandler) process cluster-wide events to keep local state consistent with the cluster's current state.

src/Andy.X.Core · high confidence

New consumer lifecycle and message tracking events

Added new event models to track consumer connectivity and message delivery details. ConsumerConnectedDetails and ConsumerDisconnectedDetails now capture tenant, product, component, topic, subscription, and connection identifiers to monitor consumer sessions. MessageSentDetails and MessageAcknowledgedDetails provide structured data for message delivery, including headers, message IDs, payloads, sent dates, and acknowledgement states.

src/Andy.X.Model/Consumers/Events · high confidence

New file and directory management services for tenant, topic, and cluster storage

Three new static service classes—ClusterIOService, MessageIOService, and TenantIOService—have been added to the IO layer. These services handle the creation of hierarchical directory structures for tenants, products, components, topics, subscriptions, and consumers, as well as the serialization and deserialization of message and acknowledgement data using MessagePack. This introduces new capabilities for managing local storage paths and persisting message data to temporary files.

src/Andy.X.IO/Services · medium confidence

New model classes for Producers and Application details

Added new model classes to the system: ApplicationDetails in the App namespace, and Producer, ProducerActivity in the Producers namespace. These classes define the data structures for application metadata and producer configurations, including properties for tenant, product, component, topic, and activity status.

src/Andy.X.Model/Producers · medium confidence

New producer lifecycle and message acceptance events

Added three new event detail classes to the model layer: MessageAcceptedDetails, ProducerConnectedDetails, and ProducerDisconnectedDetails. These classes define the structure for tracking when a producer connects or disconnects from a topic, as well as the details of accepted messages, enabling the system to monitor producer lifecycle and message flow.

src/Andy.X.Model/Producers/Events · high confidence

New storage entity models for message tracking

Added five new entity classes to the storage layer: AcknowledgedMessage, Message, SkippedMessage, TopicEntryPosition, and UnacknowledgedMessage. These models define the data structures used to track message states, headers, payloads, and entry positions within the distributed sync cluster.

src/Andy.X.Model/Entities/Storages · high confidence

New utility helpers for ID generation and serialization

Added ConnectorHelper to generate and parse structured keys for tenants, products, components, topics, and subscriptions, and added MessagePackExtensions to serialize and deserialize objects using MessagePack.

src/Andy.X.Utility/Extensions/Helpers · medium confidence

Behavioural changes

Add ClusterHubService for cluster-wide event broadcasting

A new \ClusterHubService\ has been introduced in the router's cluster services to handle the broadcasting of cluster-wide events (such as tenant, product, component, and subscription lifecycle changes) to all connected nodes via SignalR. This service acts as the central dispatcher for cluster synchronization, ensuring that all nodes in the distributed system are notified of metadata changes and connection states.

src/Andy.X.Router/Services/Clusters · high confidence

Added SubscriptionPosition entity for tracking subscription state

A new SubscriptionPosition entity has been introduced to track subscription state, including properties for read and delete entry positions, connection status, and timestamps. This supports the implementation of unique message consumption and RocksDB-based storage for subscriptions.

src/Andy.X.Model/Entities/Subscriptions · medium confidence

Centralized dependency injection configuration for core services

The application's startup process now explicitly registers and wires up the core infrastructure services through dedicated extension methods. This includes configuring the application, cluster, configuration, consumer, producer, and tenant state services, as well as setting up logging with Serilog and initializing core repositories. This change consolidates the service registration logic, ensuring that all essential components like the InboundMessageService, OutboundMessageService, and various repositories are properly initialized at startup.

src/Andy.X.App/Extensions/DependencyInjection · high confidence

Introduce distributed cluster model for data distribution

The system now supports distributed clustering with configurable shard distribution types (Async or Sync) and replica management. Users can define cluster configurations including throughput metrics, shard states, and replica types (Main, Worker, BackupReplica) to manage data distribution across nodes.

src/Andy.X.Model/Clusters · high confidence

New configuration models for cluster, storage, tenant, and transport settings

The system introduces a new set of configuration classes to manage runtime and infrastructure settings. These include ClusterConfiguration for shard distribution and node identity, StorageConfiguration for tuning write buffers, background threads, and retention intervals, TenantConfiguration for organizing tenants, products, components, and subscriptions, ThreadsConfiguration for thread pool limits, TransportConfiguration for client timeouts, keep-alive intervals, and message size limits, and CredentialsConfiguration for authentication details. These models provide the structural foundation for configuring the application's behavior and performance characteristics.

src/Andy.X.Model/Configurations · high confidence

New entity models for core domain objects

Added new C\# entity classes for the core domain, including Component, Product, Tenant, Topic, and Subscription, along with their associated settings, retention, and token models. This introduces the data structures required to support the new REST endpoints for these resources.

src/Andy.X.Model/Entities/Core · high confidence

Updated project structure and documentation

The solution file (Buildersoft.Andy.X.sln) now references the renamed Andy.X.IO project and the new src directory structure. The README has been updated with a new logo, a corrected getting started link, an updated security reporting email, and links to the new Andy X Portal and CLI repositories.

(repo-wide) · high confidence

Dependencies

Upgrade to .NET 7 and update core dependencies

The project files have been updated to target .NET 7.0, with several libraries upgraded to their .NET 7 compatible versions (e.g., Microsoft.AspNetCore.SignalR.Client 7.0.0, Microsoft.Extensions.\* 7.0.0). Additionally, the RocksDB package was updated to version 7.7.3.33461, and Serilog packages were added to the application project.

(dependencies) · medium 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 33 → 29 (-4.1)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 38 → 25 (-13.3)
  • Architecture 75 → 76 (+0.2)
  • Maturity 41 → 41 (-0.0)
  • Readiness 18 → 18 (+0.0)
  • Security 77 → 60 (-17.4)
  • Performance 60 → 60 (+0.0)

Resolved (40)

  • Boundary-crossing change coupling: TenantsController.cs ↔ CoreRepository.cs (src/Andy.X.App/Controllers/TenantsController.cs)
  • Bounded contexts not declared
  • Change coupling: ComponentsController.cs ↔ ProductsController.cs (src/Andy.X.App/Controllers/ComponentsController.cs)
  • Change coupling: ComponentsController.cs ↔ TenantsController.cs (src/Andy.X.App/Controllers/ComponentsController.cs)
  • Change coupling: ComponentsController.cs ↔ TopicsController.cs (src/Andy.X.App/Controllers/ComponentsController.cs)
  • Change coupling: CoreRepository.cs ↔ CoreService.cs (src/Andy.X.Core/Repositories/CoreState/CoreRepository.cs)
  • Change coupling: ITenantStateService.cs ↔ TenantFactory.cs (src/Andy.X.Core/Abstractions/Services/ITenantStateService.cs)
  • Change coupling: ProductsController.cs ↔ TenantsController.cs (src/Andy.X.App/Controllers/ProductsController.cs)
  • Change coupling: ProductsController.cs ↔ TopicsController.cs (src/Andy.X.App/Controllers/ProductsController.cs)
  • Change coupling: TenantFactory.cs ↔ TenantStateService.cs (src/Andy.X.Core/Factories/Tenants/TenantFactory.cs)
  • Duplicated block (10 lines × 2) (src/Andy.X.App/Controllers/ComponentsController.cs)
  • Duplicated block (10 lines × 2) (src/Andy.X.App/Controllers/ProducersController.cs)
  • Duplicated block (10 lines × 3) (src/Andy.X.App/Controllers/ProducersController.cs)
  • Duplicated block (12 lines × 2) (src/Andy.X.Core/Services/CoreState/CoreService.cs)
  • Duplicated block (12 lines × 2) (src/Andy.X.Core/Services/CoreState/CoreService.cs)
  • Duplicated block (13 lines × 2) (src/Andy.X.Core/Services/CoreState/CoreService.cs)
  • Duplicated block (13 lines × 2) (src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs)
  • Duplicated block (14 lines × 2) (src/Andy.X.Core/Services/Outbound/OutboundMessageService.cs)
  • Duplicated block (22 lines × 2) (src/Andy.X.Core/Services/Data/SubscriptionUnackedDataService.cs)
  • Duplicated block (6 lines × 2) (src/Andy.X.Router/Hubs/Consumers/ConsumerHub.cs)
  • …and 20 more

New (130)

  • Change coupling: InboundMessageService.cs ↔ OutboundMessageService.cs (src/Andy.X.Core/Services/Inbound/InboundMessageService.cs)
  • Change coupling: TenantStateService.cs ↔ InboundMessageService.cs (src/Andy.X.Core/Services/App/TenantStateService.cs)
  • CommentedOutCode (src/Andy.X.App/Extensions/DependencyInjection/LoggingDependencyInjectionExtensions.cs)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (10 lines × 2) (src/Andy.X.Core/Services/App/TenantStateService.cs)
  • Duplicated block (10 lines × 2) (src/Andy.X.Model/Entities/Core/Components/Component.cs)
  • Duplicated block (10 lines × 2) (src/Andy.X.Model/Entities/Core/Products/ProductToken.cs)
  • Duplicated block (10 lines × 21) (src/Andy.X.Core/Services/CoreState/CoreService.cs)
  • Duplicated block (10 lines × 3) (src/Andy.X.Model/Clusters/Events/SubscriptionEvents.cs)
  • Duplicated block (10 lines × 40) (src/Andy.X.App/Controllers/ComponentsController.cs)
  • Duplicated block (12 lines × 3) (src/Andy.X.App/Controllers/ProductsController.cs)
  • Duplicated block (12 lines × 5) (src/Andy.X.Model/App/Messages/MessageAcknowledgementFileContent.cs)
  • Duplicated block (12–14 lines × 5) (src/Andy.X.Core/Services/CoreState/CoreService.cs)
  • Duplicated block (13 lines × 2) (src/Andy.X.Core/Services/CoreState/CoreService.cs)
  • Duplicated block (13 lines × 2) (src/Andy.X.Core/Services/CoreState/CoreService.cs)
  • Duplicated block (13 lines × 2) (src/Andy.X.Model/App/Messages/MessageAcknowledgementFileContent.cs)
  • Duplicated block (13 lines × 8) (src/Andy.X.Core/Services/CoreState/CoreService.cs)
  • Duplicated block (14 lines × 2) (src/Andy.X.App/Controllers/ComponentsController.cs)
  • Duplicated block (14–15 lines × 3) (src/Andy.X.Model/Entities/Core/Components/ComponentRetention.cs)
  • …and 110 more

API surface

  • Unchanged — 73 HTTP endpoints

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

Survey your own repository

buildersoftio/andyx 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 b1c6200235277a73a315cbae2da5885d54d5c734 — 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.