Skip to content
CAI
Software that uses CAICheck a score

cloudnative-netcore/netcorekit

44.7

Weak · 21 September 2026

9.8k

lines of production code

C#

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a comprehensive .NET Core infrastructure kit that provides reusable building blocks for building cloud-native microservices. It offers a standardized approach to implementing Domain-Driven Design, including domain abstractions, repository patterns for SQL and NoSQL databases, and an event bus supporting Kafka and Redis. Additionally, it supplies ASP.NET Core middleware for authentication, error handling, and API documentation, alongside gRPC and SignalR templates for real-time communication and service-to-service interactions.

How it got here

2018 — Initial infrastructure and sample applications

34 changes.

This period established the foundational architecture for the NetCoreKit library, introducing core infrastructure modules for ASP.NET Core, Entity Framework Core, and distributed event buses. The team also built out a comprehensive set of sample applications, including gRPC services, SignalR real-time notifications, and Kubernetes deployment scripts to demonstrate the framework's capabilities.

2019 — Domain-driven design and gRPC infrastructure

5 changes.

This period focused on establishing foundational architectural patterns, introducing domain-driven design abstractions and gRPC service scaffolding. The work standardized the build system, implemented authentication interceptors, and created templates for rapid application development.

Features

Add AutoMapper extension methods for simplified mapping

A new static class, AutoMapperProfileExtension, was added to the Mappers folder. It provides extension methods for the AutoMapper Profile class, including MapMySelf, MapTo, and MapToNotification, which simplify the configuration of type mappings and notifications within the application's infrastructure layer.

src/NetCoreKit.Infrastructure/Mappers · high confidence

Add CreateProject use-case implementation

The sample application now includes a new CreateProject use-case, introducing a MediatR-based request handler and associated payload classes. Users can now create projects via the API, with the handler managing the unit of work and repository interactions to persist new project entities.

samples/TodoApi/v1/UseCases/CreateProject · medium confidence

Add Dockerfile and configuration for the BiMonetaryApi sample

The BiMonetaryApi sample now includes a Dockerfile and .dockerignore to support containerized builds, configuring the .NET 2.2 runtime and SDK for multi-stage builds. The sample's startup is configured to use MongoDB via NetCoreKit.RestTemplate.MongoDb, and it connects to an external gRPC service (ExchangeService) for RPC communication. Configuration files (appsettings.json) define API versions, feature toggles (Mongo, OpenApi, AuthN, ResponseCompression), and logging settings, while Program.cs sets up the ASP.NET Core web host with console and debug logging.

samples/BiMonetaryApi · high confidence

Add ExchangeService sample with Docker and gRPC hosting

A new sample project for the ExchangeService is introduced, providing a complete, runnable gRPC service implementation. The update includes a Dockerfile for containerization, a .dockerignore file, and configuration files (appsettings.json, hostsettings.json) to support local and containerized deployment. The service is configured to listen on localhost:5000 in development, exposing the BiMonetaryApi.Rpc.ExchangeService and health check endpoints.

samples/ExchangeService · high confidence

Add Kafka-based event bus implementation

The library now includes a new \DispatchedEventBus\ implementation for the Kafka message broker, enabling asynchronous event publishing and subscription via the \Confluent.Kafka\ client. This change introduces Protobuf serialization for message contracts, allowing services to publish and subscribe to Kafka topics using the \AddKafkaEventBus\ extension method. The implementation supports automatic MediatR notification dispatching for consumed events, providing a scalable, distributed eventing mechanism alongside existing in-memory and Redis bus options.

src/NetCoreKit.Infrastructure.Bus.Kafka · high confidence

Add MongoDB repository implementation

Users can now persist and query domain entities using MongoDB. The \NetCoreKit.Infrastructure.Mongo\ package introduces a full repository pattern implementation, including \Repository\, \UnitOfWorkAsync\, and \IMongoQueryRepository\ interfaces, along with extension methods for querying and a service collection extension (\AddMongoDb\) to register the necessary dependencies.

src/NetCoreKit.Infrastructure.Mongo · high confidence

Add MySQL provider for Entity Framework Core

The MySQL database provider for Entity Framework Core has been implemented, allowing users to configure and connect to MySQL databases. This includes a new \DbOptions\ configuration class, a \DbConnStringFactory\ to build connection strings from configuration, and a \DbContextOptionsBuilderFactory\ that configures MySQL-specific options such as server version, migrations assembly, and retry policies. The \ServiceCollectionExtensions\ registers these components via \AddEfCoreMySqlDb\, replacing default database connection string and options builder implementations with MySQL-specific ones.

src/NetCoreKit.Infrastructure.EfCore.MySql · high confidence

Add OpenAPI/Swagger integration for API documentation

The OpenApi infrastructure module now provides automatic Swagger documentation for ASP.NET Core APIs. It introduces operation filters that automatically add 401/403 responses and OAuth2 security requirements for endpoints marked with \[Authorize\]. It also includes filters to handle default parameter values and exclude properties marked with \[SwaggerExclude\] from the generated schema. The setup is configured via the 'Features:OpenApi' configuration section and conditionally enables security definitions when the 'AuthN' feature is active.

src/NetCoreKit.Infrastructure.AspNetCore.OpenApi · high confidence

Add Redis-based event bus infrastructure

The NetCoreKit infrastructure now includes a Redis-backed event bus. This adds a new \DispatchedEventBus\ implementation that publishes and subscribes to messages via Redis channels, using protobuf payloads. The change also introduces \RedisStore\ for managing Redis connections and a \ServiceCollectionExtensions.AddRedisBus\ method to register the bus and its dependencies in the DI container, configurable via the \Features:Redis\ configuration section.

src/NetCoreKit.Infrastructure.Bus.Redis · high confidence

Add SQL Server EF Core infrastructure

The SqlServer module now includes a new DbConnStringFactory that constructs connection strings by combining configuration values with environment variables for Kubernetes deployments, and a DbContextOptionsBuilderFactory that configures SQL Server-specific options including retry logic and sensitive data logging. These components are registered via a new AddEfCoreSqlServerDb extension method, which also wires up the DbOptions configuration section.

src/NetCoreKit.Infrastructure.EfCore.SqlServer · high confidence

Add SignalR notifier sample with Redis and Kafka support

A new sample project, SignalRNotifier, has been added to demonstrate real-time notifications using ASP.NET Core's SignalR. The sample configures a .NET Core 2.2 host with MediatR, AutoMapper, and a Redis-based message bus, while also including configuration for Kafka. It exposes a ProjectHub for SignalR communication and supports both development and production environments via Docker and appsettings files.

samples/SignalRNotifier · high confidence

Add WebNotifier sample with Blazor, SignalR, and Docker support

The WebNotifier sample project is introduced, providing a complete Blazor WebAssembly application that connects to a SignalR hub to display real-time project and task notifications. The sample includes the necessary C\# components and Razor pages to render the notification feed, alongside configuration files for development and production environments. To facilitate deployment, the change adds a multi-stage Dockerfile that builds the Blazor app and serves it via Nginx, along with Kubernetes deployment and service manifests for containerized orchestration.

samples/WebNotifier · high confidence

Add deployment and build scripts for Kubernetes and Docker

New PowerShell and shell scripts are introduced in the samples deployment directory to automate the build and Kubernetes deployment processes. The scripts handle building Docker images for the TodoApi, SignalRNotifier, and WebNotifier services, as well as applying and deleting Kubernetes manifests for these components.

_samples/\deploys/scripts · high confidence

Add template scaffolding for .NET Core gRPC and REST APIs

New template projects are introduced to provide pre-configured scaffolding for building .NET Core applications. For gRPC services, the \NetCoreKit.GrpcTemplate\ templates (EfCore, MongoDb, Standard) add \HostBuilderExtensions\ that configure default settings, dependency injection, and feature toggles. For REST APIs, the \NetCoreKit.RestTemplate\ templates (EfCore, MongoDb, Standard) add \AppBuilderExtensions\ and \ServiceCollectionExtensions\ that configure middleware, authentication, Swagger/OpenAPI, and other standard ASP.NET Core infrastructure. These templates streamline the initial setup for new projects.

templates · high confidence

Added BiMonetaryApi v1 sample with gRPC and REST controllers

Added the BiMonetaryApi v1 sample, which includes the gRPC service definitions and generated C\# code for the ExchangeService (including TokenRequest, TokenResponse, and PingResponse messages). The sample also introduces REST controllers (PingController and TickerController) that interact with the gRPC service to provide API endpoints for ping and ticker data.

samples/BiMonetaryApi/v1 · high confidence

Added ExchangeService v1 gRPC implementation with health checks

The ExchangeService v1 sample now includes a complete gRPC service implementation. This adds the generated protobuf classes for the BiMonetary API, the server-side implementation that returns mock cryptocurrency token data, and a health check endpoint to monitor service status.

samples/ExchangeService/v1 · high confidence

Added GetTasks and UpdateTask use cases for the Todo API sample

The sample project now includes the implementation for retrieving and updating tasks. The GetTasks use case allows fetching a project with its associated tasks, while the UpdateTask use case enables modifying task details such as title, order, and completion status. These additions provide a complete example of clean architecture patterns, including request/response models and handlers for these specific operations.

samples/TodoApi/v1/UseCases/UpdateTask · high confidence

Added SignalR-based real-time notification service

The sample application now includes a new background service that bridges event-driven messaging with real-time web sockets. This is achieved by introducing domain event classes (ProjectCreated, TaskCreated) and a HostedService that subscribes to an event bus. The service listens for specific messages (ProjectCreatedMsg, TaskCreatedMsg) and pushes them to all connected SignalR clients via a ProjectHub, enabling live updates for project and task creation events.

samples/SignalRNotifier/Services · high confidence

Added TodoApi sample with gRPC, Kafka, and Kubernetes support

Introduced a new TodoApi sample application that includes domain models (Project, Task), DTOs, and a gRPC contract layer (project.proto). The sample integrates with Kafka and Redis for event bus/pub-sub capabilities, and includes Kubernetes deployment manifests (Deployment, Service, Job) and a Dockerfile for containerized deployment.

samples/TodoApi · high confidence

Added auto-generated protobuf message classes for the TodoApi sample

The sample applications for the Notifier and SignalRNotifier now include the auto-generated C\# classes for the \project.proto\ file. These classes, including \ProjectCreatedMsg\ and \TaskCreatedMsg\, provide the data structures required for the gRPC and SignalR-based notification services to serialize and deserialize messages.

samples/Notifier/Rpc, samples/SignalRNotifier/Rpc · high confidence

Added build and code-generation scripts for gRPC samples

Added build and code-generation scripts for the BiMonetaryApi and ExchangeService samples. The new scripts automate the Docker image build process and the generation of C\# client code from the bimonetary.proto file using gRPC tools, enabling local development and containerized deployment of these gRPC services.

_samples/BiMonetaryApi/App\_Build, samples/ExchangeService/App\Build · high confidence

Added build, deployment, and configuration scripts for the SignalRNotifier sample

The sample project now includes shell scripts to build the application (build.sh, start.sh), generate gRPC C\# code from proto files (gen.sh), and build a Docker image (build\_image.sh). Additionally, Kubernetes manifests are provided to deploy the service, including a Deployment, Service (port 32502), and a Secret for Redis credentials, enabling the sample to be deployed to a Kubernetes cluster.

_samples/SignalRNotifier/App\Build · medium confidence

Added gRPC authentication interceptor and host builder extensions

The GrpcHost infrastructure now includes an AuthNInterceptor that validates JWT tokens from the 'authorization' header against an Identity Provider configuration, enforcing role-based access control via a new CheckPolicyAttribute. Additionally, HostBuilderExtensions provide a standardized setup for configuration, dependency injection, and logging for gRPC services.

src/NetCoreKit.Infrastructure.GrpcHost · medium confidence

Added task management use cases to the sample API

The sample Todo API now includes implementations for adding, clearing, and deleting tasks. The AddTask use case allows users to create new tasks within a project, while ClearTasks removes all tasks from a project, and DeleteTask removes a specific task. These new endpoints are implemented as request handlers that interact with the project repository to update the state of tasks.

samples/TodoApi/v1/UseCases/AddTask, samples/TodoApi/v1/UseCases/ClearTasks, samples/TodoApi/v1/UseCases/DeleteTask · high confidence

Adds ASP.NET Core infrastructure for error handling, API versioning, and system info

The \NetCoreKit.Infrastructure.AspNetCore.All\ package now includes a suite of ASP.NET Core infrastructure components. This includes an \AppBuilderExtensions\ for centralized exception handling that returns structured \ProblemDetails\ responses, and a \ServiceCollectionExtensions\ that registers services for AutoMapper, MediatR, REST clients, caching, API versioning, JWT authentication, CORS, header forwarding, and MiniProfiler. Additionally, new controllers are provided: \DbMigrationController\ for executing database migrations, \ErrorController\ for error pages, \HomeController\ for Swagger redirection, and \SysInfoController\ to expose runtime and environment details. The MVC builder is also configured to load full assemblies and set the compatibility version to 2.2.

src/NetCoreKit.Infrastructure.AspNetCore.All · high confidence

Adds EF Core extension methods for database migration, seeding, and repository queries

The \NetCoreKit.Infrastructure.EfCore\ library introduces several new extension methods to streamline database operations. \WebHostExtensions\ adds \MigrateDbContext\ and \RegisterDbContext\ to automatically apply pending EF Core migrations and execute seed data during application startup. \DbContextExtensions\ provides an \AllMigrationsApplied\ helper to check migration status. \RepositoryExtensions\ and \RepositoryWithTypeExtensions\ add generic query methods (\GetByIdAsync\, \FindOneAsync\, \ListAsync\, \QueryAsync\, \FindAllAsync\) that support eager loading, read-only tracking, and pagination. \UnitOfWorkExtensions\ adds helpers for executing raw SQL commands and managing command timeouts.

src/NetCoreKit.Infrastructure.EfCore/Extensions · high confidence

Initial project scaffolding and build infrastructure

The repository is initialized with a complete .NET Core solution structure, including a \netcorekit.sln\ file defining the project hierarchy. Build automation is introduced via a Cake-based \build.cake\ script and \build.ps1\ bootstrapper, supported by an \appveyor.yml\ CI configuration. Development standards are enforced through an \.editorconfig\ file and a \.dockerignore\ file. Additionally, a \global.json\ file pins the .NET SDK version to 2.2.100.

(repo-wide) · high confidence

Introduce DomainEventDispatcher and event bus infrastructure

The NetCoreKit.Infrastructure.Bus module now provides a new DomainEventDispatcher that wraps MediatR to publish domain events as INotification messages. A NotificationEnvelope and MessageEnvelope are added to wrap domain events and Protobuf messages respectively, supporting inter-communication via brokers like Redis or Kafka. The IDispatchedEventBus interface and ServiceCollectionExtensions for DI registration are also introduced.

src/NetCoreKit.Infrastructure.Bus · high confidence

Introduce EF Core DbContext and data seeding abstractions

The \NetCoreKit.Infrastructure.EfCore\ library now provides a foundational \AppDbContext\ that automatically registers entity types and dispatches domain events on save. This change introduces the core database context, along with supporting interfaces (\ICustomModelBuilder\, \IDbConnStringFactory\, \IExtendDbContextOptionsBuilder\) and data seeding abstractions (\ISeedData\, \SeedDataBase\) to standardize database initialization and data population.

src/NetCoreKit.Infrastructure.EfCore/Db · high confidence

Introduce Entity Framework Core repository and unit of work infrastructure

The \NetCoreKit.Infrastructure.EfCore\ package now provides a complete data access layer built on Entity Framework Core. This includes a \UnitOfWork\ implementation for managing database transactions and a \QueryRepositoryFactory\ that supplies typed repository instances for querying entities. The infrastructure also registers these services via \ServiceCollectionExtensions\, supporting both standard database contexts and in-memory databases for testing or lightweight scenarios.

src/NetCoreKit.Infrastructure.EfCore · high confidence

Introduces ASP.NET Core infrastructure for authentication, HATEOAS, and error handling

Adds new base controllers for CRUD operations, a centralized error-handling middleware, and HATEOAS link generation utilities. The update also introduces an \AuthAttribute\ for JWT-based authorization, configuration extensions for host and authentication settings, and validation result types to standardize API error responses.

src/NetCoreKit.Infrastructure.AspNetCore · high confidence

Introduces a new feature toggle system

A new feature toggle mechanism has been added to the infrastructure layer, allowing applications to enable or disable features via configuration. This includes a new \IFeature\ interface, a \Feature\ class that reads feature states from the \IConfiguration\ source, and extension methods to register the toggle service in the dependency injection container.

src/NetCoreKit.Infrastructure/Features · high confidence

Introduces a unit-of-work pipeline behavior for MediatR handlers

The library now provides a \UnitOfWorkBehavior\ that automatically wraps MediatR request handlers in a database transaction, ensuring that changes are committed or rolled back as a single unit. This is enabled by default when calling \AddCleanArch\ on the service collection. The change also introduces base classes (\RequestHandlerBase\ and \TxRequestHandlerBase\) and interfaces (\IEventHandler\, \ITxEventHandler\) to simplify the implementation of command handlers, with the transactional variant automatically managing the unit of work lifecycle.

src/NetCoreKit.Infrastructure.AspNetCore.CleanArch · high confidence

Introduces foundational domain-layer abstractions for DDD

The NetCoreKit.Domain package now includes core building blocks for domain-driven design: base classes and interfaces for Entities, Aggregate Roots, and Value Objects, alongside support for Domain Events and an in-memory event dispatcher. It also adds a generic Criterion class for handling pagination, sorting, and filtering, as well as specialized exception types (DomainException, ValidationException, etc.) and repository/Unit of Work interfaces to standardize data access patterns.

src/NetCoreKit.Domain · high confidence

New infrastructure utilities for configuration, ordering, and external system integration

The NetCoreKit.Infrastructure module introduces new foundational utilities to support application setup and data handling. A new ConfigurationExtensions class provides methods to load assemblies based on patterns defined in appsettings.json, alongside a ConfigurationHelper to manage configuration sources. Additionally, an OrderByExtensions class enables dynamic property-based sorting for Entity Framework queries, and a new IExternalSystem interface defines a standard for connecting to external systems.

src/NetCoreKit.Infrastructure · medium confidence

Behavioural changes

Added gRPC code generation script for the Notifier sample

A new shell script, gen.sh, has been added to the App\_Build directory to automate the generation of C\# code from the project's .proto files. The script configures the gRPC tools version 1.17.1 to compile the project's protocol buffer definitions into the Rpc output directory.

_samples/Notifier/App\Build · high confidence

Standardized build configuration and assembly signing

The build system now centralizes common properties and package metadata. A new 'common.props' file suppresses the CS1591 missing XML comment warning, while 'packages.props' defines shared assembly metadata (including author, repository, and license information) and enables strong-name signing via a key file. Additionally, the C\# language version is explicitly set to 7.3.

build · high confidence

Test coverage

Added unit tests for EF Core repository operations

Added new tests for the generic repository pattern in the EF Core infrastructure layer. The changes include a new test class, RepositoryTest, which verifies that commands and queries can be executed against both Guid and integer primary key types using an in-memory database. Additionally, an appsettings.json configuration file was added to support the test environment.

src/NetCoreKit.Infrastructure.EfCore.Tests · high confidence

Dependencies

Added .csproj files for NetCoreKit library and sample projects

Introduced .csproj project files for the core NetCoreKit libraries (Domain, Infrastructure, AspNetCore, EfCore, Mongo, Bus, GrpcHost) and their respective templates (Rest, Grpc, Standard) as well as sample applications (BiMonetaryApi, ExchangeService, Notifier, SignalRNotifier, TodoApi, WebNotifier). These files define dependencies on packages such as AutoMapper, MediatR, Grpc, Entity Framework Core, and various Microsoft.Extensions libraries, establishing the build structure for the cloud-native .NET Core kit.

(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 46 → 45 (-1.5)
  • Rubric changed (rubric-2026.08.18 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 66 → 66 (-0.8)
  • Architecture 89 → 89 (+0.0)
  • Maturity 66 → 66 (+0.0)
  • Readiness 37 → 35 (-2.0)
  • Security 48 → 46 (-2.9)
  • Domain Modelling 69 → 72 (+2.5)
  • Event-Driven 100 → 100 (+0.0)
  • Performance 47 → 47 (+0.0)

Resolved (40)

  • Bounded contexts not declared
  • Build did not complete in the analyzer
  • Duplicated block (40 lines × 3) (templates/NetCoreKit.RestTemplate.EfCore/AppBuilderExtensions.cs)
  • High CVE: MessagePack 1.7.3.4
  • High CVE: MessagePack 1.7.3.4
  • High CVE: Microsoft.NETCore.App 2.1.0
  • High CVE: Microsoft.NETCore.App 2.1.0
  • High CVE: Microsoft.NETCore.App 2.1.0
  • High CVE: Microsoft.NETCore.App 2.1.0
  • High CVE: Microsoft.NETCore.App 2.2.0
  • High CVE: Microsoft.NETCore.App 2.2.0
  • High CVE: System.Net.Security 4.0.0
  • High CVE: System.Net.Security 4.0.0
  • LLM evaluation failed
  • LLM evaluation failed
  • Medium CVE: IdentityServer4 2.3.2
  • Medium CVE: IdentityServer4 2.3.2
  • Medium CVE: MessagePack 1.7.3.4
  • Medium CVE: MessagePack 1.7.3.4
  • Medium CVE: MessagePack 1.7.3.4
  • …and 20 more

New (59)

  • CommentedOutCode (src/NetCoreKit.Infrastructure.AspNetCore/ControllerBase.cs)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (105 lines × 3) (templates/NetCoreKit.RestTemplate.EfCore/AppBuilderExtensions.cs)
  • Duplicated block (13 lines × 2) (templates/NetCoreKit.RestTemplate.EfCore/ServiceCollectionExtensions.cs)
  • Duplicated block (29–31 lines × 2) (src/NetCoreKit.Infrastructure.EfCore/Extensions/RepositoryExtensions.cs)
  • Duplicated block (56 lines × 2) (templates/NetCoreKit.RestTemplate.EfCore/ServiceCollectionExtensions.cs)
  • Duplicated block (8–10 lines × 3) (samples/TodoApi/v1/UseCases/ClearTasks/RequestHandler.cs)
  • End-of-life runtime: .NET netcoreapp2.1
  • End-of-life runtime: .NET netcoreapp2.2
  • High CVE: MessagePack 1.7.3.4
  • High CVE: Microsoft.NETCore.App 2.1.0
  • High CVE: Microsoft.NETCore.App 2.2.0
  • High CVE: System.Net.Security 4.0.0
  • High secret: WD-SECRET-0001 (build/netcorekit.snk)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Inconsistent spelling of 'Volume' in property names. 'Volumn24HUsd' uses a non-standard spelling ('Volumn' instead of 'Volume'), while 'TotalSupply' and 'AvailableSupply' correctly use 'Supply' for volume-related metrics. Additionally, 'Volumn24HUsd' mixes a misspelled noun with a currency code, whereas 'AvailableSupply' is a clean noun phrase.
  • Leaked secret: hardcoded-credential (samples/SignalRNotifier/App_Build/k8s/signalrnotifier-secrets.yaml)
  • Leaked secret: hardcoded-credential (samples/TodoApi/App_Build/k8s/todolist-secrets.yaml)
  • …and 39 more

API surface

  • Unchanged — 18 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

cloudnative-netcore/netcorekit 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 d07dc233cc82f78a44c03b346eaddf460a33da2c — 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.