Multi-Tenant Task Manager

A scalable SaaS built with ASP.NET Core, EF Core, Angular, and Azure — designed for reliability and tenant isolation.

The Multi-Tenant Task Manager is a real-world enterprise application I built to demonstrate how modern .NET projects can be structured using Clean Architecture and deployed on Microsoft Azure for scale and maintainability.

It serves as both a learning blueprint and a production-ready reference for organizations managing multiple clients, teams, or departments under one platform.

Objective

To design a multi-tenant task management system where each tenant (organization) has isolated data, secure authentication, and dedicated project/task visibility — without duplicating code or infrastructure.

Architecture Overview

  • Pattern: Clean Architecture with vertical feature slices
  • Core Projects:
    • TaskManager.Domain — Entities, Value Objects, Aggregates, and Domain Events
    • TaskManager.Application — CQRS handlers, validators, and business logic
    • TaskManager.Infrastructure — EF Core persistence, Identity, and Azure integrations
    • TaskManager.Api — REST endpoints secured with JWT
  • Technology Stack:
    • ASP.NET Core 8 (Web API)
    • EF Core 8 with SQL Server
    • ASP.NET Core Identity + JWT for auth
    • Angular 18 (stand-alone components)
    • Azure App Service, Azure SQL, Azure Storage
    • GitHub Actions (CI/CD)

Multi-Tenancy Strategy

Implemented schema-per-tenant model using Finbuckle.MultiTenant.

  • Tenant resolution via host header or JWT claim.
  • Automatic DB context switching per request.
  • Shared application code, isolated tenant data.

Core Features

  • Project & Task CRUD with status, priority, and due dates
  • Role-based access (Admin, User)
  • JWT-based login, logout, and refresh tokens
  • Real-time reminders & notifications
  • Dashboard with summary metrics (tasks, projects, activity logs)
  • Soft-delete & audit trail for compliance
  • Responsive Angular UI with loading states & guards

Cloud Deployment

  • Deployed to Azure App Service with continuous deployment from GitHub Actions.
  • Connected to Azure SQL (elastic pool).
  • File storage via Azure Blob Storage.
  • Telemetry & diagnostics through Azure App Insights.
  • Secrets managed with Azure Key Vault.

Code Quality & Testing

  • Unit Tests (xUnit + Moq) for application layer.
  • Integration Tests using EFCore.InMemory.
  • Static analysis via .NET Analyzers & SonarLint.
  • CI pipeline enforcing code coverage threshold (≥ 75%).

Outcomes

  • Achieved tenant isolation with shared codebase → 90 % less duplication.
  • CI/CD reduced deployment time from minutes to seconds.
  • Modular design simplified feature rollout and maintenance.
  • Successfully scaled to simulate 1000 + concurrent users on Azure load tests.

Key Learnings

  • Clean Architecture + CQRS keeps logic testable and independent of frameworks.
  • Multi-tenant design is most maintainable when tenant resolution happens early in middleware.
  • Azure services + GitHub Actions provide a frictionless DevOps workflow.
  • Observability (App Insights) is crucial for diagnosing tenant-specific issues.

The Task Manager project demonstrates how a disciplined architecture, thoughtful domain design, and modern cloud tools can work together to deliver a secure, scalable, and maintainable SaaS.

It’s part of my ongoing effort to build real-world .NET solutions that reflect enterprise development standards.

Tech Stack: ASP.NET Core 8 · EF Core 8 · Angular 18 · Azure App Service · Azure SQL