Skip to content
CAI
Software that uses CAICheck a score

EdwinVW/pitstop

45.2

Weak · 21 September 2026

4.7k

lines of production code

C#

with JavaScript

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a workshop management application designed to handle customer and vehicle registration, maintenance job scheduling, and invoicing. It operates as a distributed microservices architecture where a web frontend orchestrates workflows by communicating with dedicated APIs for customers, vehicles, and workshop operations. Background services process domain events via RabbitMQ to automate notifications, invoice generation, and data synchronization across SQL Server databases.

How it got here

2017 — Initial project scaffolding and service implementation

20 changes.

This period established the foundational architecture of the Pitstop application, introducing core microservices for customer, vehicle, and workshop management alongside the main WebApp. It involved configuring the .NET 10 infrastructure, implementing domain-driven event handling via RabbitMQ, and building the initial user interface for maintenance scheduling and registration workflows.

2018–2026 — Infrastructure modernization and test consolidation

12 changes.

This period focused on modernizing the project's infrastructure by migrating UI tests to Playwright, restructuring RabbitMQ messaging for better reliability, and introducing comprehensive Kubernetes and Docker operational scripts. Simultaneously, the team consolidated the testing framework to MSTest and significantly expanded unit test coverage across the Workshop, Invoice, and Notification domains using centralized test data utilities.

Features

Added REST clients for customer, vehicle, and workshop management

New REST client implementations have been added for Customer, Vehicle, and Workshop management services. These clients use Refit with Newtonsoft.Json serialization to communicate with backend APIs, reading service endpoints from configuration and handling HTTP 404 responses gracefully by returning null.

src/WebApp/RESTClients · high confidence

Added Workshop Management views for scheduling and completing maintenance jobs

The application now includes a new set of Razor views for the Workshop Management module, enabling users to schedule, view, and complete maintenance jobs. The Index view provides a daily planning overview with navigation to previous and next days, while the New view allows users to register new maintenance jobs by specifying start/end times, descriptions, and selecting a vehicle. The Details view displays job status and vehicle/customer information, conditionally showing actual times and mechanic notes for non-planned jobs. The Finish view provides a form to record actual start/end times and notes when completing a job. An Offline view is also included to handle cases where the module is unavailable.

src/WebApp/Views/WorkshopManagement · high confidence

Added maintenance and registration command models

New command classes have been introduced in the WebApp to support maintenance scheduling and customer/vehicle registration workflows. Specifically, the system now includes \PlanMaintenanceJob\ and \FinishMaintenanceJob\ to handle the start and completion of maintenance tasks, alongside \RegisterCustomer\, \RegisterVehicle\, and \RegisterPlanning\ to capture initial registration data for customers, vehicles, and planning dates.

src/WebApp/Commands · high confidence

Added view models for customer, vehicle, and workshop management

New view models have been introduced to support the customer, vehicle, and workshop management features. These include list views for customers and vehicles, detail views for specific records, and new-entry forms for vehicles and workshop jobs that include validation attributes (such as required fields for vehicle selection and job times). Offline placeholder models are also provided for each management area.

src/WebApp/ViewModels · high confidence

Centralized test data generation utilities added

A new TestUtils library has been introduced containing centralized primitives for generating random test data, including realistic Dutch names, addresses, postal codes, phone numbers, email addresses, and vehicle details. This includes specific support for generating valid Dutch license plate numbers and business-hours timeslots, allowing test projects to replace hardcoded defaults with these reusable generators.

src/TestUtils · high confidence

Initial customer and vehicle management views

The application now includes the core user interface pages for managing customers and vehicles. Users can view an overview of customers and vehicles, click through to detailed views (with customer loyalty levels displayed where applicable), and register new entries via forms that include client-side validation. An offline status page is also provided for each module if the service is unavailable.

src/WebApp/Views/CustomerManagement · high confidence

Initial project scaffolding and infrastructure configuration

This change introduces the foundational structure for the Pitstop application, including the solution file, Docker base images targeting .NET 10.0, and a global.json specifying SDK version 10.0.0. It adds the NotificationService with an email notification interface and SMTP implementation, along with the WebApp's basic assets, mappers, and view imports. Infrastructure is configured via docker-compose files defining services for RabbitMQ, SQL Server 2022, MailDev, and Seq, alongside specific configurations for RabbitMQ credentials and a .dockerignore file to streamline builds.

src · high confidence

Initial release of Vehicle Management API

The Vehicle Management API is introduced, providing endpoints to register vehicles and retrieve them by license number. The service persists vehicle data in a SQL Server database using Entity Framework Core with automatic migrations, and publishes a VehicleRegistered event via RabbitMQ upon successful registration. It includes a health check endpoint, Swagger UI for API documentation, and is configured to run on port 5000 with Serilog logging to Seq.

src/VehicleManagementAPI · high confidence

Initial release of the Customer Management API

This change introduces the Customer Management API, a new service that allows users to register and retrieve customer details via REST endpoints. The API persists customer data in a SQL Server database using Entity Framework Core with automatic migrations, and publishes a 'CustomerRegistered' event to RabbitMQ upon successful registration. It includes Swagger UI for API documentation, health checks, and structured logging via Serilog.

src/CustomerManagementAPI · high confidence

Introduce Workshop Management Event Handler for vehicle and customer data synchronization

A new background service has been added to listen for RabbitMQ messages and persist workshop-related data into a SQL Server database. The handler processes events for customer registration, vehicle registration, and maintenance job planning/finishing, automatically creating or updating records for Customers, Vehicles, and MaintenanceJobs. It uses Entity Framework Core migrations to initialize the database schema and includes retry logic for database connectivity. The service is configured via appsettings for both Development and Production environments, supporting Serilog console and Seq logging.

src/WorkshopManagementEventHandler · high confidence

New Kubernetes deployment and load-testing scripts

Added shell and PowerShell scripts to manage the Pitstop application lifecycle in Kubernetes. The start-all scripts now support starting the solution with Istio, Linkerd, or no service mesh, applying the corresponding YAML manifests. New scripts allow starting and stopping infrastructure components independently, and a new load-test utility runs continuous requests against defined URIs to simulate traffic.

src/k8s/scripts · high confidence

New domain events added for customer registration and maintenance scheduling

The NotificationService and TimeService now include new event classes to support specific business workflows. In the NotificationService, \CustomerRegistered\ carries customer details (ID, name, phone, email), while \MaintenanceJobPlanned\ includes job timing, customer info, vehicle details, and description. \MaintenanceJobFinished\ signals job completion with a job ID, and \DayHasPassed\ is added to both services to trigger daily processing. These events enable the services to react to key lifecycle moments in customer onboarding and maintenance operations.

src/NotificationService/Events, src/TimeService/Events · high confidence

New operational scripts for Docker lifecycle management

A new set of PowerShell and Bash scripts has been added to the \src/scripts\ directory to streamline local development and deployment workflows. These scripts provide standardized commands for rebuilding Docker images (including .NET base images), starting the solution with or without local API exposure, clearing database data across multiple services (CustomerManagement, Invoicing, Notification, VehicleManagement, WorkshopManagement), stopping and removing all containers, cleaning up unused Docker images, and pushing service images to a registry.

src/scripts · high confidence

Workshop Management API introduces command-driven maintenance job planning and completion

The WorkshopManagementAPI now exposes endpoints to plan and finish maintenance jobs using a command-based architecture. Users can schedule jobs via POST /api/WorkshopPlanning/{planningDate}/jobs and mark them complete via PUT /api/WorkshopPlanning/{planningDate}/jobs/{jobId}/finish. The system enforces business rules, such as limiting parallel jobs to three workstations and ensuring jobs stay within a single business day, returning a 409 Conflict if constraints are violated. It also provides reference data endpoints for customers and vehicles, and includes a health check at /hc.

src/WorkshopManagementAPI · high confidence

Behavioural changes

AuditlogService now uses .NET Generic Host with Serilog and Seq integration

The AuditlogService has been migrated to the .NET Generic Host pattern, replacing the previous execution model with a background worker service (AuditLogWorker) that runs via IHostedService. This change introduces structured logging via Serilog, which now writes to both the console and a Seq server (configured in appsettings), and updates the service to read its log file path from the 'Auditlog' configuration section. The service also now uses a dedicated AuditlogWorkerConfig class for dependency injection and includes a .dockerignore file to optimize Docker builds.

src/AuditlogService · high confidence

Introduce resilient API communication in WebApp controllers

The controllers in src/WebApp/Controllers (CustomerManagement, VehicleManagement, WorkshopManagement, and Home) now wrap all external API calls in a ResiliencyHelper that uses Polly to retry failed requests up to five times and falls back to an offline view if retries are exhausted. This ensures that transient network or service issues do not crash the UI; instead, users see a graceful offline state. The WorkshopManagementController also handles business-rule violations (e.g., conflict status) by returning user-friendly error messages rather than exposing raw exception details.

src/WebApp/Controllers · high confidence

Introduced async SQL Server repository for notifications

The NotificationService now uses a new SqlServerNotificationRepository that implements fully asynchronous database operations for managing customers and maintenance jobs. This change replaces previous synchronous or mixed patterns, ensuring that database calls (such as registering customers, fetching today's maintenance jobs, and removing jobs) do not block threads. The repository also includes logic to automatically initialize the SQL Server database and required tables on startup, with retry policies for connection resilience.

src/NotificationService/Repositories · high confidence

Introduction of domain models with validation and error handling

The application now includes core domain models (Customer, Vehicle, MaintenanceJob, WorkshopPlanning) that enforce data integrity through built-in validation attributes, such as required fields for customer details, email format checking, and a regular expression for license numbers. Additionally, a new BusinessRuleViolation model has been added to structure error responses, allowing the API to return specific business-rule violation messages to the client instead of generic exception details.

src/WebApp/Models · high confidence

InvoiceService now runs as a background worker with automated database initialization

The InvoiceService has been refactored to operate as a .NET Generic Host background service (IHostedService) rather than a traditional web application. It now listens for RabbitMQ events (CustomerRegistered, MaintenanceJobPlanned, MaintenanceJobFinished, DayHasPassed) to drive invoice generation and customer/job management. A key behavioral change is the introduction of automatic database initialization: on startup, the SqlServerInvoiceRepository now attempts to create the 'Invoicing' database and its tables (Customer, MaintenanceJob, Invoice) if they do not exist, using retry policies for connection resilience. The service also includes SMTP email configuration for sending invoices and Serilog integration for structured logging to Console and Seq.

src/InvoiceService · high confidence

Istio management scripts now read version from istio-version.txt

The Istio installation, uninstallation, and dashboard management scripts in src/k8s/istio have been updated to read the target Istio version from a new istio-version.txt file (currently set to 1.28) instead of hardcoding it. This centralizes version management, ensuring that install, uninstall, and addon deployment operations consistently use the specified version. Additionally, new scripts were added to disable default Istio sidecar injection, allowing injection to be enabled explicitly only on specific deployments within the pitstop namespace.

src/k8s/istio · high confidence

Migrate UI tests from Selenium to Playwright and XUnit to MSTest

The UI test suite has been rewritten to use the Playwright browser automation library instead of Selenium, and the test framework has been switched from XUnit to MSTest. This change introduces a new DatabaseCleaner component to reset the application's SQL databases before each test run, ensuring a clean state for scenarios like the full maintenance job process. The tests now rely on centralized test data primitives for generating random customer and vehicle information, and utilize Page Model classes to interact with the Customer, Vehicle, and Workshop management interfaces.

src/UITest · high confidence

Migrate UI tests to Playwright with new Page Model

The UI test infrastructure in src/UITest/PageModel has been migrated from Selenium to Playwright. This introduces a new Page Model architecture featuring a central PitstopApp class that manages the Playwright browser instance (launching Microsoft Edge) and provides a MainMenu entry point. New page model classes have been added for the Home, About, Customer Management, Vehicle Management, and Workshop Management sections, enabling structured interactions such as filling forms, selecting items from lists, and navigating between pages using Playwright's async API.

src/UITest/PageModel · high confidence

RabbitMQ messaging infrastructure restructured with new configuration and connection handling

The messaging infrastructure has been refactored to improve reliability and ease of use. The publisher now maintains a persistent connection to RabbitMQ instead of recreating it for every message, and both the publisher and handler have been updated to use the modern IChannel interface. A new static Configuration class provides extension methods for dependency injection, allowing services to be registered directly from configuration sections. Additionally, the library now supports specifying a custom RabbitMQ port and allows connecting to multiple hosts for cluster support.

src/Infrastructure.Messaging · high confidence

Updated shared layout and error views with new script loading strategy

The shared layout (\_Layout.cshtml) and error page (Error.cshtml) have been updated to reflect the migration from Gulp to Vite. The layout now references bundled assets from the new dist folder (\~/dist/css/main.min.css and \~/dist/js/main.min.js) instead of individual library files, and includes integrity hashes and fallback sources for CDN-hosted jQuery and Bootstrap scripts. A new \_ValidationScriptsPartial.cshtml view was added to conditionally load jQuery validation scripts based on the environment, using CDNs in production/staging and local files in development.

src/WebApp/Views/Shared · high confidence

WebApp modernized with .NET 6, Vite frontend build, and Docker containerization

The WebApp has been upgraded to .NET 6 (C\# 11) and restructured to use the minimal hosting model in Program.cs, including Serilog integration with Seq for logging and health checks at /hc. The frontend build system has migrated from Gulp to Vite, with configuration in vite.config.js and updated documentation in README.md. A new Dockerfile and .dockerignore file enable containerized builds using Node.js 22.x and pnpm 10, exposing the app on port 7005. GlobalUsings.cs consolidates namespace imports, and appsettings files configure service locations and logging for development and production environments.

src/WebApp · high confidence

Test coverage

Added test data builders for Workshop Management domain entities and commands; Added unit tests for Invoice and Notification services; Added unit tests for Workshop Management domain logic; Added unit tests for maintenance job command handlers; Migrate unit tests to MSTest and consolidate test utilities.

Dependencies

Updated Bootstrap to version 4.1.3

The frontend library Bootstrap has been upgraded to version 4.1.3. This update brings the latest CSS and JavaScript components, bug fixes, and features from the Bootstrap 4.1.3 release to the application's user interface.

src/WebApp/wwwroot · high confidence

Upgrade to .NET 10 and centralize dependency management

The application has been upgraded to target .NET 10.0 across all services, APIs, and test projects. To simplify maintenance, package versions are now centrally managed via a new \Directory.Packages.props\ file, which defines specific versions for key libraries including Entity Framework Core 10.0.9, Serilog 4.3.1, and the internal \Pitstop.Infrastructure.Messaging\ package version 5.5.0. This change also updates the WebApp's frontend build tool to Vite 8.0.16 and the UI test suite to use Microsoft Playwright 1.60.0.

(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

Score

  • CAI 46 → 45 (-0.4)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 48 → 46 (-1.7)
  • Architecture 88 → 88 (+0.7)
  • Maturity 75 → 84 (+9.5)
  • Readiness 62 → 61 (-1.3)
  • Security 61 → 63 (+1.4)
  • Domain Modelling 68 (new)
  • Accessibility 32 → 32 (-0.2)

Resolved (101)

  • Bounded contexts not declared
  • Change coupling: RabbitMQMessageHandler.cs ↔ RabbitMQMessagePublisher.cs (src/Infrastructure.Messaging/RabbitMQMessageHandler.cs)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/Gemfile.lock)
  • Critical vulnerability: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/Gemfile.lock)
  • Duplicated block (11 lines × 2) (src/InvoiceService/Repositories/SqlServerInvoiceRepository.cs)
  • Duplicated block (14 lines × 2) (src/InvoiceService/InvoiceWorker.cs)
  • High CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • High CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • High CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • High CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • High CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • High CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • …and 81 more

New (557)

  • CommentedOutCode (src/CustomerManagementAPI/Model/Customer.cs)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/package-lock.json)
  • Critical CVE: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/Gemfile.lock)
  • Critical vulnerability: [GHSA redacted] (src/WebApp/wwwroot/lib/bootstrap/Gemfile.lock)
  • Documentation: no installation or build instructions (README.md)
  • Duplicated block (12 lines × 2) (src/InvoiceService/Repositories/SqlServerInvoiceRepository.cs)
  • Duplicated block (16 lines × 2) (src/WorkshopManagementAPI/CommandHandlers/FinishMaintenanceJobCommandHandler.cs)
  • Duplicated block (17 lines × 2) (src/WebApp/RESTClients/CustomerManagementAPI.cs)
  • Duplicated block (17 lines × 2) (src/WebApp/RESTClients/VehicleManagementAPI.cs)
  • Duplicated block (18 lines × 2) (src/InvoiceService/InvoiceWorker.cs)
  • Duplicated block (6 lines × 2) (src/CustomerManagementAPI/DataAccess/CustomerManagementDBContext.cs)
  • Duplicated block (6 lines × 2) (src/Infrastructure.Messaging/RabbitMQMessageHandler.cs)
  • Duplicated block (7 lines × 2) (src/InvoiceService/CommunicationChannels/SMTPEmailCommunicator.cs)
  • …and 537 more

Changes since last survey

  • 5 commits — 5 feature/other, 0 fixes

By area

  • src/WebApp — 5 commits

Notable commits

  • change: Bump brace-expansion in WebApp/wwwroot/lib/bootstrap (#219)
  • change: Bump browserslist and eslint-plugin-compat (#216)
  • change: Bump js-yaml in WebApp/wwwroot/lib/bootstrap (#218)
  • change: Bump postcss from 8.5.15 to 8.5.25 in WebApp (#215)
  • change: Bump socket.io-parser in WebApp/wwwroot/lib/bootstrap (#214)

API surface

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

EdwinVW/pitstop 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 162f7d9f4051e4298e6091f4d9dc6cbadf158843 — 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-fa71c66cabd8.