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 EventsTaskManager.Application
— CQRS handlers, validators, and business logicTaskManager.Infrastructure
— EF Core persistence, Identity, and Azure integrationsTaskManager.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