A production-ready, modular .NET 10 monolith + two React 19 apps — the fastest way to ship a multi-tenant SaaS.
Identity, multitenancy, billing, auditing, webhooks, files, chat, real-time, caching, jobs, storage, OpenAPI and OpenTelemetry — already wired, fully tested, and 100% yours as source (no black-box packages).
Most starter kits give you a login page and a TODO list. This one gives you the boring, hard parts already done right — multitenancy, auth, billing, auditing, background jobs, real-time, file storage, observability — across a clean Vertical Slice backend and two polished React 19 front-ends, orchestrated locally with one command via .NET Aspire, and deployable to Docker or AWS.
You scaffold with the fsh CLI and get the complete, detached source — every BuildingBlock, Module, and Host project with real project references. No hidden NuGet runtime, nothing to "eject" later. Own it, read it, change it.
dotnet tool install -g FullStackHero.CLI
fsh new MyApp
cd MyApp
dotnet run --project src/Host/MyApp.AppHost # 🎉 whole stack up: API + 2 React apps + Postgres + Valkey + MinIOThen open the Aspire dashboard at
https://localhost:15888, the API + Scalar docs athttps://localhost:7030/scalar, the admin app athttp://localhost:5173, and the dashboard app athttp://localhost:5174. Sign in with a seeded demo account (e.g.admin@acme.com/Password123!).
- .NET 10 · C# latest · Minimal APIs · Mediator (source-generated CQRS) · FluentValidation
- EF Core 10 on PostgreSQL (Npgsql), with domain events, the specification pattern, soft-delete + audit interceptors, and tenant-isolated
DbContexts. - JWT auth + ASP.NET Identity — issuance/refresh, roles & fine-grained permissions, rate-limited auth, password policies, sessions, impersonation.
- Multitenancy via Finbuckle — tenant resolution, provisioning, per-tenant migrations & seeding, isolation enforced by default.
- Cross-cutting: HybridCache on Valkey (Redis-compatible), Hangfire jobs, presigned S3/MinIO storage, mailing, idempotency, quotas, rate limiting, API versioning, RFC 9457
ProblemDetails. - Observability: Serilog structured logging + OpenTelemetry traces/metrics/logs, health probes, security/exception auditing.
- Docs: OpenAPI + the Scalar API reference UI.
clients/admin(operator console) andclients/dashboard(tenant app): React 19 + Vite 7 + TypeScript, TanStack Query v5, React Router 7, Radix + Tailwind v4 (shadcn-style), real-time via SignalR/SSE.- Runtime config (
/config.json, no rebuild per environment), hand-written typed API client, and Playwright E2E suites.
Identity · Multitenancy · Billing · Catalog · Tickets · Chat · Files · Webhooks · Auditing · Notifications — each a runtime project plus a .Contracts project (its only public surface), boundaries enforced by architecture tests.
- .NET Aspire orchestrates the entire stack locally with one command (Postgres + pgAdmin, Valkey + RedisInsight, MinIO, migrator, demo-seeder, API, and both React apps).
- Docker Compose production stack (
deploy/docker) and Terraform for AWS (deploy/terraform); API image published to GHCR. - A one-shot DbMigrator (migrations are never run at API startup), and the
fshCLI +dotnet newtemplate for distribution.
1,600+ backend tests (xUnit, Shouldly, NSubstitute, AutoFixture, NetArchTest boundaries, Testcontainers integration) and 200+ front-end E2E tests (Playwright). Path-scoped CI for backend and frontend; warnings-as-errors.
dotnet tool install -g FullStackHero.CLI
fsh doctor # verify your environment (SDK, Docker, Aspire, ports)
fsh new MyApp # interactive wizardThe wizard asks what to include (Aspire AppHost, the React apps). Non-interactive:
fsh new MyApp --non-interactive # full stack, Postgres
fsh new MyApp --no-frontend # backend-only
fsh new MyApp --no-aspire --no-frontend # minimal API + migratordotnet new install FullStackHero.NET.StarterKit
dotnet new fsh -n MyAppgit clone https://github.com/fullstackhero/dotnet-starter-kit.git MyApp && cd MyApp
dotnet run --project src/Host/FSH.Starter.AppHostPrerequisites: .NET 10 SDK · Docker (Postgres/Valkey/MinIO via Aspire) · Node 20+ (for the React apps).
fsh commands: new · doctor · info · update · --version. Full reference → fullstackhero.net/docs/cli.
| Backend | Frontend | ||
|---|---|---|---|
| Runtime | .NET 10 / C# latest | Framework | React 19 + Vite 7 + TS 5 |
| API | Minimal APIs + Mediator (CQRS) | Data | TanStack Query v5 |
| Validation | FluentValidation | Routing | React Router 7 |
| ORM / DB | EF Core 10 / PostgreSQL | UI | Radix + Tailwind v4 (shadcn) |
| Auth | JWT + ASP.NET Identity | Realtime | SignalR · SSE |
| Multitenancy | Finbuckle 10 | Tests | Playwright |
| Cache / Jobs | Valkey · Hangfire | ||
| Storage | S3 / MinIO (presigned) | Infra | |
| Docs | OpenAPI + Scalar | Orchestration | .NET Aspire |
| Observability | Serilog + OpenTelemetry | Deploy | Docker Compose · Terraform |
| Testing | xUnit · Testcontainers · NetArchTest |
| Path | What |
|---|---|
src/BuildingBlocks/ |
Shared framework libraries (Core, Persistence, Web, Caching, Eventing, Storage, Quota…) |
src/Modules/{Name}/ |
Bounded contexts — each with a runtime project + a .Contracts project (its public API) |
src/Host/FSH.Starter.Api |
Composition-root Web API host |
src/Host/FSH.Starter.AppHost |
.NET Aspire orchestrator (Postgres, Valkey, MinIO, migrator, API, both React apps) |
src/Host/FSH.Starter.DbMigrator |
One-shot migrate/seed runner (DB is not migrated at API startup) |
src/Tools/CLI |
The fsh CLI (Spectre.Console) |
clients/admin, clients/dashboard |
The two React apps |
deploy/ |
Docker Compose, Terraform (AWS), Dokploy |
src/Tests/ |
Unit, Architecture (NetArchTest), Integration (Testcontainers) |
Architecture deep-dive → fullstackhero.net/docs/architecture.
Single-host via Docker Compose:
cd deploy/docker
cp .env.example .env # fsh new pre-generates this with strong secrets
docker compose up -d --buildAWS via Terraform (ECS Fargate + RDS + ElastiCache + S3/CloudFront) lives in deploy/terraform.
Guides → Local orchestration · Docker · AWS / Terraform · Database migrations.
dotnet test src/FSH.Starter.slnx # backend: unit + architecture + Testcontainers integration
cd clients/admin && npm run test:e2e # Playwright (operator app)
cd clients/dashboard && npm run test:e2e # Playwright (tenant app)Integration tests require Docker (Testcontainers spins real Postgres). Architecture tests enforce module boundaries.
Full guides, module references, and architecture decisions live at fullstackhero.net:
- Getting started — scaffold, run, and the default credentials
- Architecture — modular monolith + vertical slices, multitenancy deep-dive
- Modules — Identity, Catalog, Tickets, Chat, and more
- Local orchestration with Aspire
- CLI reference · Changelog
Issues and PRs are welcome — see CONTRIBUTING.md. Branch from and target main; CI runs path-scoped backend + frontend pipelines, and stable releases are cut from v* tags.
MIT — see LICENSE. Built and maintained by Mukesh Murugan and the FullStackHero community, for teams that want to ship fast without sacrificing architectural discipline.
⭐ Star us on GitHub if this saves you time — it genuinely helps.