1. Project Overview & Quickstart (fullstackhero/dotnet-starter-kit)
File: README.md
Why FullStackHero?
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.[email protected]/Password123!).
β¨ What's inside
Backend β modular monolith, vertical slices
- .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.
Front-ends β two React 19 apps
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.
Modules (bounded contexts)
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.
Cloud-native & DevOps
- .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.
Quality
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.
π Getting started
Option 1 β the `fsh` CLI (recommended)
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 + migratorOption 2 β the `dotnet new` template
dotnet new install FullStackHero.NET.StarterKit
dotnet new fsh -n MyAppOption 3 β clone the repo
git 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.
π§± Tech stack
| 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 |
πΊοΈ Repository layout
| 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.
βοΈ Deploy
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.
π§ͺ Testing
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.
π Documentation
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
π€ Contributing
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.
π License
MIT β see LICENSE. Built and maintained by Mukesh Murugan and the FullStackHero community, for teams that want to ship fast without sacrificing architectural discipline.
File: README-template.md
FSH.Starter
Your application, generated from the FSH .NET Starter Kit β a production-ready modular
.NET 10 monolith with two React 19 apps, multitenancy, identity, background jobs, and
cloud-native deploy.
You own all of this source. There are no framework NuGet packages to track or upgrade β
the shared code lives in src/BuildingBlocks and is yours to change.
Prerequisites
- .NET 10 SDK
- Node.js 20+ β for the React apps
- Docker β Postgres, Redis, MinIO (orchestrated by Aspire)
Quick start
Everything at once (recommended) β .NET Aspire
dotnet run --project src/Host/FSH.Starter.AppHostAspire starts Postgres, Redis, and MinIO, runs database migrations, then launches the API
and both React apps.
| Surface | URL |
|---|---|
| Aspire dashboard | https://localhost:15888 |
| API + Scalar docs | https://localhost:7030/scalar |
| Admin console | http://localhost:5173 |
| Tenant dashboard | http://localhost:5174 |
Backend only
dotnet run --project src/Host/FSH.Starter.Api # needs external Postgres + RedisFrontend only (against a running API)
cd clients/admin && npm install && npm run dev # β http://localhost:5173
cd clients/dashboard && npm install && npm run dev # β http://localhost:5174The React apps read their API URL at runtime from public/config.json β no rebuild to repoint.
Project structure
src/
BuildingBlocks/ Shared framework libraries β yours to modify
Modules/ Bounded contexts: Identity, Multitenancy, Auditing, Billing,
Catalog, Chat, Files, Notifications, Tickets, Webhooks
Host/
FSH.Starter.Api/ API composition root
FSH.Starter.AppHost/ .NET Aspire orchestrator
FSH.Starter.DbMigrator/ One-shot migrate / seed runner
FSH.Starter.Migrations.PostgreSQL/ EF Core migrations
Tests/ Unit, integration (Testcontainers), and architecture tests
clients/
admin/ Operator console (React 19 + Vite + Tailwind)
dashboard/ Tenant app (React 19 + Vite + Tailwind, SSE live feed)
deploy/
docker/ Production docker-compose + .env
terraform/ AWS infrastructure (ECS, RDS, ElastiCache, S3)Database
Migrations run automatically under Aspire. To apply them yourself:
dotnet run --project src/Host/FSH.Starter.DbMigrator -- apply --seedMake it yours β first-run checklist
This project shipped with sensible defaults. Before production:
- Secrets β set strong values in
deploy/docker/.env(thefshCLI generates these
for you; otherwisecp deploy/docker/.env.example deploy/docker/.envand fill them in).
Never commit.env. - Logo β replace
clients/admin/public/logo-fullstackhero.pngandclients/dashboard/public/logo-fullstackhero.pngwith your own. - Mail β configure SMTP / SendGrid under
MailOptionsinsrc/Host/FSH.Starter.Api/appsettings.json. - OpenAPI contact β update
OpenApiOptions.Contactinappsettings.json. - Container registry & infra β set your registry and review bucket / database names
indeploy/terraform/apps/starter/**/variables.tfandterraform.tfvars.
Production (Docker Compose)
cd deploy/docker
# .env is generated for you by the fsh CLI; otherwise: cp .env.example .env && edit
docker compose up -d --buildSign in to the admin console as [email protected] using the SEED_ADMIN_PASSWORD from your.env, then rotate it from Settings β Security.
Adding a feature
- Contracts command/query in
src/Modules/{Module}.Contracts/v1/{Area}/{Feature}/ - Handler + FluentValidation validator in
src/Modules/{Module}/Features/... - Endpoint, wired into the module's
MapEndpoints() - Tests
Running tests
dotnet test src/FSH.Starter.slnx # integration tests require DockerLearn more
2. Official Technical Reference & Guides (fullstackhero/docs)
FullStackHero Docs
Documentation site for the FullStackHero .NET starter kit. Built with Astro 6 and Tailwind 4.
Local development
cd docs
npm install
npm run devThe site runs on http://localhost:4321. Edit MDX files under src/content/docs/ and the dev server hot-reloads. Note that pagefind search is built only by npm run build, so the search modal will report "index not available" during dev.
Build
npm run build # astro build && pagefind --site dist
npm run preview # serves dist/ on a local portDeploy
Cloudflare Pages, configured by wrangler.toml. Production branch: main. Build command for the Pages dashboard:
npm ci && npm run buildOutput directory: dist.
Content authoring
Add a new doc page by creating an MDX file under src/content/docs/<section>/. Frontmatter shape is defined by src/content.config.ts:
---
title: Page title
sidebar:
label: Optional override of title in sidebar
order: 10 # lower = higher in section
hidden: false # exclude from sidebar but still routable
pageType: guide # guide | reference | concept | recipe
---The sidebar tree is derived from file structure. Section labels and order live in src/content/docs/_sections.ts.
Design system
Tokens, prose styles, and code-block themes are forked verbatim from codewithmukesh/blog (see provenance comments in src/styles/*.css). Brand primary is #15803d (green-700); the user-facing brand green #16a34a lives in --primary-soft so it surfaces in accent text, tinted backgrounds, and the gradient mid-stop.
Search
Pagefind. Index is generated as a post-build step over the dist/ HTML. Only /docs/* pages are indexed (scoped via data-pagefind-body on the docs <article>). Trigger via Ctrl/Cmd+K.