Skip to content
CAI
Software that uses CAICheck a score

nitin27may/clean-architecture-docker-dotnet-angular

54.2

Adequate · 21 September 2026

8.6k

lines of production code

TypeScript

with C#

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a full-stack application starter kit built on .NET 10 and Angular 22, designed to provide a production-ready foundation with Clean Architecture and Role-Based Access Control. It implements core business logic for managing contacts, users, roles, and permissions, supported by an administrative dashboard for system monitoring and configuration. The platform includes comprehensive DevOps tooling via .NET Aspire and Nginx, ensuring robust local orchestration, health checks, and load balancing.

How it got here

2021 — Initial project scaffolding and core feature implementation

7 changes.

This period marks the initial release of a full-stack Clean Architecture starter kit, establishing the foundational technology stack with Angular 22, .NET 10, and PostgreSQL. The work focused on setting up the project structure, DevOps tooling, and authentication infrastructure, followed by the implementation of core user-facing features such as contact management and profile editing.

2022–2025 — Initial platform scaffolding and admin features

10 changes.

This period established the foundational infrastructure for the Contacts application, including the database schema, .NET Aspire orchestration, and Nginx load balancing. It focused on implementing a comprehensive admin dashboard with granular role-based access control, enabling the management of users, roles, permissions, operations, and pages alongside detailed activity logging.

Features

Admin activity log monitoring interface

Administrators can now view and monitor user activities through a new Activity Logs page in the admin area. This feature provides a paginated table displaying username, email, activity description, endpoint, and timestamp for each event. Users can filter logs by username or email using the dedicated filter form, perform quick client-side searches across all columns, and sort the data by any column header. The interface includes loading, empty, and error states to ensure a smooth experience while retrieving log data.

frontend/src/app/feature/admin/activity-log · high confidence

Admin dashboard with role-based access control and activity logging

The admin feature now provides a structured dashboard with a navigation sidebar linking to Pages, Operations, Permissions, Role Permissions, User Roles, and Users. Access to these sections is enforced via a PermissionGuard that checks specific read permissions (e.g., 'Users', 'ActivityLog', 'Pages') before rendering the corresponding components. The module also introduces an Activity Log view, secured by its own permission check, allowing administrators to monitor system activities.

frontend/src/app/feature/admin · high confidence

Frontend scaffolding with Angular 21, Material 3, and Tailwind 4

The frontend project has been initialized with a modern enterprise stack: Angular 21, Angular Material 19+, and Tailwind CSS 4. This includes a new Dockerfile (Node 22 builder, Nginx server), Nginx configuration for SPA routing, and proxy settings for the Aspire 13 backend. Core UI components have been added, including a confirm dialog, empty state, page header, and skeleton loaders, alongside a comprehensive validation library (error-tailor) and permission directives/guards to support role-based access control.

frontend · high confidence

Initial database schema, seed data, and API collection for the Contacts application

This change introduces the foundational structure for the Contacts API. It includes a PostgreSQL initialization script (\01-init-db.sh\) and a seed data script (\02-seed-data.sql\) that create the necessary database tables (Users, Roles, Permissions, Contacts, etc.), define foreign key constraints, and populate initial data such as default roles (Admin, Reader, Editor) and an admin user. Additionally, it adds a complete Bruno API collection (\api-collection/\) with pre-configured requests for all core endpoints, including user authentication, registration, role management, permission mapping, and contact CRUD operations, providing a ready-to-use testing suite for the new backend features.

(repo-wide) · high confidence

Initial release of the Clean Architecture full-stack starter kit

The repository is initialized with a production-ready full-stack application featuring an Angular 22 frontend, a .NET 10 backend API, and PostgreSQL 17. The project introduces a Clean Architecture structure with Role-Based Access Control (RBAC), JWT authentication, and TailwindCSS v4 styling. It includes comprehensive DevOps tooling such as Docker Compose configurations (with pre-built GHCR image support), .NET Aspire 13.4 for local orchestration, and NGINX load balancing. Essential developer resources are added, including \.env.example\, \CONTRIBUTING.md\, \SECURITY.md\, and a permissive MIT license, replacing the previous minimal setup.

(repo-wide) · high confidence

Introduce .NET Aspire application host and service defaults

The aspire location now includes a new AppHost configuration that orchestrates the local development environment by provisioning a PostgreSQL database with pgAdmin, a .NET Contact API, and an Angular frontend, while wiring them together with service discovery and health checks. Additionally, a ServiceDefaults library has been added to provide standardized OpenTelemetry instrumentation, resilience handlers, and health check endpoints for the services.

aspire · high confidence

Introduce Nginx-based load balancer for frontend and API routing

Added a new Nginx load balancer configuration that routes traffic to the Angular frontend on port 8080 and the API backend on port 8000. The setup includes specific proxy headers for SPA handling and caching control for the frontend, while also exposing the Swagger documentation under the /swagger/ path.

loadbalancer · high confidence

Introduce granular, role-based API authorization and activity logging

The backend now enforces fine-grained access control on all API endpoints (Contacts, Users, Roles, Pages, Operations) using a custom permission system. Controllers are secured with an AuthorizePermission attribute that validates specific page-operation policies (e.g., Contacts.Create) against the user's assigned roles. A new middleware pipeline captures detailed activity logs for every authorized request, recording the user, action, and endpoint. This replaces the previous generic authorization model with a structured, auditable permission framework.

backend · high confidence

New Operations and Pages management interfaces in the admin area

Administrators can now manage system operations and application pages directly through the frontend. This change introduces dedicated UI components and services for both areas: the Operations interface allows users to create, edit, and delete operations by name and description, while the Pages interface enables management of application pages by name and URL. Both interfaces provide a unified experience with inline forms, data tables for listing existing items, and real-time validation feedback.

frontend/src/app/feature/admin/operations, frontend/src/app/feature/admin/pages · high confidence

New Role Management interface in Admin panel

Administrators can now create, edit, and delete system roles via a new dedicated page. This change introduces the \RolesComponent\ and \RoleService\ in the admin roles feature area, providing a UI to manage role names and descriptions, with a table listing existing roles and a form for adding or updating them.

frontend/src/app/feature/admin/roles · high confidence

New User Management interface in the Admin area

The admin users feature now includes a dedicated UI for managing system users. Administrators can view a list of users with their first name, last name, username, email, and mobile number, and perform create, edit, and delete operations. The interface provides a form for adding or editing user details with validation, a data table for listing existing users, and confirmation dialogs for deletions, backed by the core UserService.

frontend/src/app/feature/admin/users · high confidence

New User Roles Management interface in Admin panel

Administrators can now assign and manage roles for system users via a new dedicated page. This change introduces a standalone Angular component featuring a form to select a user and assign multiple roles, alongside a details section that displays the user's current role assignments. The implementation includes a new service to handle the API calls for fetching and updating user roles, along with the necessary UI components for loading states and validation feedback.

frontend/src/app/feature/admin/user-roles · high confidence

New contact list view with role-based access and pagination

The contact list page now displays contacts in a sortable, filterable, and paginated table. Access to view, edit, and delete contacts is controlled by role-based permissions (Create, Read, Update, Delete) via the \*hasPermission directive. The interface includes a search bar to filter by name, email, or phone, and allows users to sort by name, email, phone, or city. Users can navigate through pages of results and perform actions like viewing details, editing, or deleting specific contacts, with appropriate feedback provided via notifications.

frontend/src/app/feature/contact/contact-list · high confidence

New home page with technology showcase and feature highlights

The user home page now displays a dedicated landing section that highlights the application's technology stack (including Angular 21, .NET 10, and PostgreSQL) and key features like contact management, secure authentication, and dark mode support. Users can now directly access the GitHub repository, view a demo video, or read documentation from this page, with the UI styled using Material Design components and TailwindCSS.

frontend/src/app/feature/user/home · high confidence

New standalone contact creation and editing form

The contact form has been replaced with a new standalone Angular component that provides a unified interface for both creating new contacts and editing existing ones. The form collects first name, last name, email, mobile number, date of birth, city, and postal code, utilizing Angular Material components for input fields and a date picker. It includes client-side validation for required fields and email format, handles submission loading states with a spinner, and displays success or error notifications upon completion. The component also features a reset function and navigation back to the contacts list.

frontend/src/app/feature/contact/contact-form · high confidence

New user profile management interface with tabbed editing and password change

A new standalone Profile component has been introduced for the user profile feature, providing a tabbed interface for managing account details. Users can now edit their first name, last name, email, and phone number through a form with validation, while their role is displayed as a read-only label. A separate tab allows users to change their password by entering their current password and a new password, with client-side validation ensuring fields are not empty and passwords match. The component uses Angular Material for UI elements and handles updates via the UserService, refreshing the local state and notifying the user of success or failure.

frontend/src/app/feature/user/profile · high confidence

Dependencies

Upgrade to .NET 10, Angular 22, and .NET Aspire 13.4.6

The project has upgraded its core technology stack to newer major versions. The backend now targets .NET 10.0 and utilizes .NET Aspire 13.4.6 for orchestration, including updated Service Defaults with .NET 10-compatible OpenTelemetry and resilience packages. The frontend has been upgraded to Angular 22.1.3 and Tailwind CSS 4.1.1. Additionally, the backend replaced AutoMapper with Mapperly for object mapping.

(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 49 → 54 (+5.6)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 75 → 74 (-0.5)
  • Architecture 85 → 86 (+0.5)
  • Maturity 65 → 83 (+18.5)
  • Readiness 31 → 37 (+5.8)
  • Security 58 → 65 (+6.6)
  • Accessibility 66 → 66 (+0.0)

Resolved (106)

  • Bounded contexts not declared
  • Change coupling: UsersController.cs ↔ admin.routes.ts (backend/Contact.Api/Controllers/UsersController.cs)
  • Coverage not included — suite not readable by the collector
  • Critical CVE: [GHSA redacted] (frontend/package-lock.json)
  • Critical CVE: [GHSA redacted] (frontend/package-lock.json)
  • Deprecated: Aspire.Dashboard.Sdk.linux-x64
  • Deprecated: Aspire.Hosting.AppHost
  • Deprecated: Aspire.Hosting.NodeJs
  • Deprecated: Aspire.Hosting.Orchestration.linux-x64
  • Deprecated: Aspire.Hosting.PostgreSQL
  • Duplicated block (12 lines × 3) (backend/Contact.Infrastructure/Persistence/Helper/DapperHelper.cs)
  • Duplicated block (5 lines × 2) (backend/Contact.Infrastructure/Persistence/Repositories/UserRepository.cs)
  • Further orphaned files (smaller)
  • High CVE: AutoMapper 15.1.0
  • High CVE: [GHSA redacted] (frontend/package-lock.json)
  • High CVE: [GHSA redacted] (frontend/package-lock.json)
  • High CVE: [GHSA redacted] (frontend/package-lock.json)
  • High CVE: [GHSA redacted] (frontend/package-lock.json)
  • High CVE: [GHSA redacted] (frontend/package-lock.json)
  • High CVE: [GHSA redacted] (frontend/package-lock.json)
  • …and 86 more

New (135)

  • CommentedOutCode (aspire/ServiceDefaults/Extensions.cs)
  • ControlErrorsDirective.ngOnInit (cognitive 21) (frontend/src/app/@core/components/validation/control-error.directive.ts)
  • ControlErrorsDirective.ngOnInit (cyclomatic 19) (frontend/src/app/@core/components/validation/control-error.directive.ts)
  • Coverage not measured — .NET and JavaScript/TypeScript suite
  • Documentation: no installation or build instructions (docs/backend.md)
  • Documentation: no usage examples (docs/backend.md)
  • Duplicated block (13 lines × 4) (backend/Contact.Infrastructure/Persistence/Helper/DapperHelper.cs)
  • Duplicated block (17 lines × 2) (backend/Contact.Application/UseCases/ContactPerson/CreateContactPersonValidator.cs)
  • Duplicated block (22 lines × 3) (backend/Contact.Infrastructure/Persistence/Helper/DapperHelper.cs)
  • Duplicated block (6 lines × 2) (backend/Contact.Infrastructure/Persistence/Repositories/UserRepository.cs)
  • Duplicated block (8 lines × 2) (backend/Contact.Application/UseCases/ContactPerson/CreateContactPerson.cs)
  • Duplicated block (8 lines × 2) (backend/Contact.Application/UseCases/Users/UserResponse.cs)
  • Duplicated block (8 lines × 2) (backend/Contact.Infrastructure/Persistence/Repositories/OperationRepository.cs)
  • Duplicated block (9–10 lines × 2) (backend/Contact.Application/UseCases/ContactPerson/ContactPersonResponse.cs)
  • High CVE: [GHSA redacted] (frontend/package-lock.json)
  • High CVE: [GHSA redacted] (frontend/package-lock.json)
  • High IaC: WD-COMPOSE-0002 (docker-compose.ghcr.yml)
  • High IaC: WD-COMPOSE-0002 (docker-compose.ghcr.yml)
  • High IaC: WD-COMPOSE-0002 (docker-compose.ghcr.yml)
  • High IaC: WD-COMPOSE-0002 (docker-compose.ghcr.yml)
  • …and 115 more

Changes since last survey

  • 22 commits — 20 feature/other, 2 fixes

By area

  • docs/_config.yml — 8 commits
  • (repo) — 4 commits
  • (root) — 2 commits
  • .github/social-preview.jpg — 1 commit
  • .github/workflows — 1 commit
  • aspire/AppHost — 1 commit
  • backend/Contact.Application — 1 commit
  • backend/Contact.Infrastructure — 1 commit
  • docs/_includes — 1 commit
  • docs/adr — 1 commit
  • frontend/src — 1 commit

Notable commits

  • fix: Fix broken links, add missing community files and badges (#48)
  • fix: Fix: register Dapper type handler for DateOnly (Contact creation was broken) (#36)
  • change: Add a GitHub profile link to the site footer
  • change: Add blog back-link and series deep link to the site-wide footer
  • change: Hyperlink the name instead of a separate domain link
  • change: Merge pull request #33 from nitin27may/feature/mapperly-migration
  • change: Merge pull request #49 from nitin27may/docs/sync-version-3.0.0
  • change: Merge pull request #57 from nitin27may/seo/footer-blog-backlink
  • change: Merge pull request #58 from nitin27may/header-star-count
  • change: Reduce the footer to the name link and the licence
  • change: Replace AutoMapper with Mapperly; add license policy, ADRs, Dependabot
  • change: Shorten the footer
  • change: Show the GitHub star count in the site header
  • change: Sync docs site version footer to v3.0.0
  • change: Update Angular version references in README and docs to 22
  • change: Upgrade .NET Aspire from 9.5.0 to 13.4.6 (#35)
  • change: Upgrade frontend to Angular 22
  • change: Use one identical footer across all four doc sites
  • change: chore: add social preview banner asset (#59)
  • change: docs: fix canonical URLs, add sitemap, migrate GA property (#54)
  • …and 2 more

API surface

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

nitin27may/clean-architecture-docker-dotnet-angular 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 95c2c8844e6d18c5a8fc0c898d2fb63bfea1be27 — 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-b84573e22831.