Task Management System is a full stack portfolio project that demonstrates a production-oriented approach to building a business application with React, TypeScript, ASP.NET Core 8, SQL Server, Docker, automated tests, and GitHub Actions.
The project is intentionally built as an interview-ready codebase: the goal is not only to implement task management features, but to show maintainable architecture, clean layering, secure authentication, automated quality gates, and professional documentation.
- Build a realistic enterprise-style task management application.
- Keep frontend and backend responsibilities clearly separated.
- Use DTOs, services, repositories, dependency injection, validation, and structured error handling.
- Protect task data with JWT authentication and user ownership rules.
- Run automated tests and coverage reports in CI for every push and pull request.
- Provide clear documentation for technical interviews and open source review.
- User registration with validation and duplicate email protection.
- Login with JWT authentication.
- Authenticated frontend session handling.
- Protected frontend routes.
- Task CRUD for authenticated users.
- User ownership enforcement for task operations.
- Dashboard summary query on the backend application layer.
- Swagger/OpenAPI support for backend endpoints.
- Docker Compose environment with frontend, backend, and SQL Server.
- Integration tests for backend HTTP contracts.
- Frontend component, hook, API, and route tests.
- CI pipeline with build, lint, test, coverage, and artifacts.
- Dependabot configuration for npm, NuGet, and GitHub Actions.
- React
- TypeScript
- Vite
- React Router
- TanStack Query
- React Hook Form
- Zod
- Tailwind CSS
- ESLint
- Prettier
- Vitest
- React Testing Library
- ASP.NET Core 8 Web API
- Entity Framework Core
- SQL Server
- JWT Bearer Authentication
- Swagger/OpenAPI
- xUnit
- FluentAssertions
- coverlet.collector
- Docker
- Docker Compose
- SQL Server 2022 container
- Environment-based configuration
- Health checks
- Persistent SQL Server volume
- GitHub Actions
- Dependabot
- CI artifacts
- Coverage reports
- EditorConfig
The repository is organized as a monorepo with separate frontend, backend, and test areas.
src/
frontend/
backend/
TaskManagementSystem.Api/
TaskManagementSystem.Application/
TaskManagementSystem.Domain/
TaskManagementSystem.Infrastructure/
tests/
backend/
docs/
The frontend uses a feature-based React structure. Authentication and tasks are grouped by feature, with local API clients, hooks, pages, components, and types.
Key responsibilities:
- Render user-facing workflows.
- Manage authenticated session state.
- Protect routes that require a logged-in user.
- Call backend APIs through typed service functions.
- Validate forms before sending requests.
The backend follows a layered structure:
Controller -> Service -> Repository -> Database
Controllers expose HTTP contracts, services contain business rules, repositories isolate data access, and DTOs prevent EF entities from leaking directly through the API.
SQL Server is used for persistent storage. Entity Framework Core manages entity mapping, migrations, relationships, and database initialization.
Main entities:
UserTaskItem
Docker Compose runs the complete local environment:
frontend: Vite application on port5173backend: ASP.NET Core API on port8080sqlserver: SQL Server on port1433
The backend waits for SQL Server health checks before starting, and SQL Server data is persisted in a named Docker volume.
GitHub Actions runs on every push and pull_request.
The CI workflow:
- Checks out the repository.
- Installs Node.js.
- Installs .NET 8.
- Restores frontend dependencies.
- Restores backend dependencies.
- Runs frontend lint.
- Runs frontend Prettier check.
- Builds the frontend.
- Runs frontend tests.
- Generates frontend coverage.
- Builds the backend.
- Runs backend tests.
- Generates backend coverage.
- Publishes coverage and test result artifacts.
The pipeline fails fast if lint, format, build, or tests fail.
The following screenshots should be added before publishing the repository on LinkedIn or using it in interviews.
| Area | Preview |
|---|---|
| Login | docs/screenshots/login.png |
| Registration | docs/screenshots/register.png |
| Dashboard | docs/screenshots/dashboard.png |
| Task list | docs/screenshots/tasks.png |
| Swagger | docs/screenshots/swagger.png |
- Node.js 22+
- .NET SDK 8
- Docker Desktop
- SQL Server only if running the backend outside Docker with SQL Server enabled
cd src/frontend
npm install
npm run devFrontend URL:
http://localhost:5173
dotnet restore TaskManagementSystem.sln
dotnet run --project src/backend/TaskManagementSystem.ApiBackend URL:
http://localhost:8080
Swagger URL:
http://localhost:8080/swagger
In Development, the API can use an in-memory database. For SQL Server scenarios, configure the connection string through environment variables or user secrets.
Create a local environment file:
cp .env.example .envUpdate .env with local values. Do not commit .env.
Start the full stack:
docker compose up --buildStop the stack:
docker compose downStop the stack and remove the SQL Server volume:
docker compose down -vThe Docker environment is configured through .env.
Important variables:
ASPNETCORE_ENVIRONMENTFRONTEND_PORTBACKEND_PORTSQLSERVER_PORTSQLSERVER_DATABASEMSSQL_SA_PASSWORDMSSQL_PIDADMIN_USER_SEED_ENABLEDADMIN_USER_SEED_EMAILADMIN_USER_SEED_PASSWORDJWT_ISSUERJWT_AUDIENCEJWT_SECRET_KEYJWT_EXPIRATION_MINUTES
Security notes:
.envis ignored by Git.appsettings.jsondoes not contain production secrets.- Replace all example passwords and JWT keys before running outside local development.
- Keep admin seeding disabled unless a strong password is explicitly configured.
cd src/frontend
npm run lint
npm run format
npm run build
npm run test
npm run test:coverageFrontend coverage output:
src/frontend/coverage
Current frontend coverage:
- Statements: 89.32%
- Branches: 80.12%
- Functions: 95.00%
- Lines: 89.26%
dotnet restore TaskManagementSystem.sln
dotnet build TaskManagementSystem.sln --configuration Release
dotnet test TaskManagementSystem.sln --configuration ReleaseBackend coverage:
dotnet test TaskManagementSystem.sln \
--configuration Release \
--collect:"XPlat Code Coverage" \
--settings tests/backend/coverage.runsettings \
--results-directory TestResults/backend-coverageBackend coverage output:
TestResults/backend-coverage/**/coverage.cobertura.xml
Current backend coverage:
- Lines: 83%+
- Monorepo project structure.
- React + TypeScript frontend.
- ASP.NET Core 8 backend.
- SQL Server persistence.
- Docker Compose environment.
- Registration and login.
- JWT authentication.
- Protected frontend routes.
- Task CRUD.
- Backend integration tests.
- Frontend tests.
- Coverage reporting.
- GitHub Actions CI.
- Dependabot.
- Professional documentation baseline.
- External coverage badge integration.
- End-to-end tests with Playwright.
- Task filters, pagination, and sorting.
- Rich dashboard analytics.
- Role-based administration UI.
- Refresh token flow.
- Production deployment pipeline.
- Observability with structured logs and metrics.
- Cloud deployment reference architecture.
This project is licensed under the MIT License.