.NET 10
Minimal APIs, Mediator, and EF Core 10 on the latest LTS — C# 14, source-generated, fast.
fullstackhero is the free, MIT-licensed .NET 10 starter kit for teams shipping production SaaS — paired with a React + Vite admin and dashboard out of the box. Ten modules — identity, multitenancy, auditing, files, chat, notifications, webhooks, billing, catalog, tickets — wired through a modular monolith with Vertical Slice Architecture. A real codebase, not a tutorial. No vendor framework. No lock-in.
Live preview · 7 services orchestrated by Aspire 13
10
Identity · Multitenancy · Auditing · +7 more
12
EF · Valkey · Hangfire · OTel · Eventing · …
1,400 +
Unit · integration · E2E · all green
1
`dotnet run` boots the whole stack via Aspire 13
The unglamorous infrastructure every product needs — already chosen, already connected. Sensible, production-grade defaults, and nothing you can't swap.
Minimal APIs, Mediator, and EF Core 10 on the latest LTS — C# 14, source-generated, fast.
A Vite admin console and dashboard, fully wired to the API.
More UI frameworks coming soonNpgsql + EF Core out of the box. SQL Server provider included.
One command brings up Postgres, Valkey, storage, and the API.
A production compose file in the box — ship it anywhere.
Local disk in dev; any S3 provider (or MinIO) in production.
Finbuckle-powered tenant isolation across every module and DbContext — claim, header, or query-string resolution.
Each module is an isolated bounded context, talking to the others only through its contracts — never reaching into their internals. Inside a module, every feature is a vertical slice: endpoint, handler, validator, and tests in one folder.
Modular monolith
Cross-module calls go through *.Contracts only — enforced by architecture tests.
Vertical slice
Modules.Identity / Features / v1 / Users / RegisterUser
No jumping between five projects to add a button — one folder, one PR, one merge.
fullstackhero is MIT-licensed and always will be — no paid tier, no upsell. It runs on the people and companies who get value from it. Sponsorship is what keeps it actively maintained and moving forward.
Individuals & companies · cancel anytime · 100% transparent
Every contribution is public on Open Collective.
Authentication. Authorization. Migrations. Caching. Background jobs. Structured logging. Distributed tracing. Idempotency. Webhooks. You'd build all of it before your first real feature. Here it's already done — in opinionated, audited code you'd write yourself.
JWT bearer, refresh, role + permission gates with .RequirePermission().
Read the docsTenant isolation enforced via global query filters; opt out by interface.
Read the docsMigrations, value converters, soft delete, audit interceptors wired up.
Read the docsDistributed cache with tenant-scoped cache-busting on writes.
Read the docsBackground processing with tenant context preserved across queues.
Read the docsStructured logs to console + file + OTLP traces, metrics, and logs.
Read the docsVersioned APIs, OpenAPI 3.1 docs, interactive Scalar UI at /scalar/.
Read the docsIdempotency-Key header, HMAC-signed tenant webhooks, replay protection.
Read the docsLocal orchestration of API + DB + frontends + Valkey + Hangfire dashboard.
Read the docsHot Vite apps with auth flow, permission UI, audit log viewer.
Read the docsProbe endpoints, fixed-window limiter, server-sent events for live data.
Read the docsMicrosoft.FeatureManagement with tenant-scoped overrides.
Read the docsIdentity, multitenancy, and auditing are the architectural pillars — the three questions every B2B SaaS has to answer. Seven more modules ship alongside them, so on day one you're building what makes your product yours — not chat, not billing, not file uploads.
Auth that gets out of your way.
Isolation by default. Cross-tenant by opt-in.
A forensic record of every change.
Files
Tenant-scoped object storage on MinIO / S3
Chat
Realtime channels, DMs, @mentions, threads
Notifications
User inbox with real-time SignalR push
Webhooks
Tenant subscriptions, HMAC-signed payloads
Billing
Subscription plans and usage metering
Catalog
Products, categories, images
Tickets
Support tickets and conversations
No proprietary framework. No DSL. No magic. The same .NET 10, EF Core 10, Aspire 13, and OSS libraries your team already knows — chosen carefully and wired together so they actually compose.
.NET 10
C# latest · net10.0 LTS
Aspire
13.3 · orchestration
EF Core
10.0.8 · PostgreSQL 17
Mediator
3.0 · source generator
FluentValidation
12.1 · request validation
Hangfire
1.8 · background jobs
Valkey
8 · distributed cache
Serilog
4.x · structured logs
OpenTelemetry
1.15 · OTLP exporter
Scalar
2.14 · OpenAPI 3.1 browser
Finbuckle
10.0 · multitenancy
React + Vite
TS 5.7 · admin · dashboard
Nearly 1,700 automated tests ship green on every commit. Unit tests for the domain, integration tests that run against a real PostgreSQL in Docker via Testcontainers — not mocks, not in-memory fakes — and full browser end-to-end coverage of both React apps.
770+
Unit
Domain rules, validators, and handlers — pure, isolated, millisecond-fast.
660+
Integration
The full HTTP stack against a real PostgreSQL + Valkey in Docker, via Testcontainers. No mocks, no fakes.
214
End-to-end
Real browser flows across both React apps — admin and dashboard — in Playwright.
49
Architecture
Module boundaries and conventions enforced by NetArchTest — they can’t silently regress.
$ dotnet test
⟳ Testcontainers — postgres:17 · valkey ready
✓ unit ........................ 774 passed
✓ integration (real Postgres) . 661 passed
✓ architecture (NetArchTest) . 49 passed
Passed! 1,484 / 1,484 · 0 failed
$ npx playwright test
✓ e2e — admin + dashboard ..... 214 passed
all green ✓ Strong defaults mean strong opinions. Here's where fullstackhero is the right answer — and where it isn't. Better to know before you clone than three weeks in.
A great fit
Teams shipping multitenant SaaS on .NET
Tenant isolation is the default, not a bolt-on. Finbuckle + a global query filter + tenant-aware cache, jobs, and outbox are wired through every layer.
Teams that want Vertical Slice + sane defaults
One feature lives in one folder — endpoint, handler, validator, tests. No layered ceremony, no jumping between five projects to add a button.
Indie devs and small teams shipping B2B apps
Auth, observability, background jobs, distributed cache, and two React frontends are already wired up. Day one is feature work.
Founders who want to own their code
MIT licence; no runtime framework you can't walk away from. Standard ASP.NET Core, plain DI, and best-in-class OSS — everything your team already knows.
Reach for something else
Tiny CRUD apps with one entity and one user
Over-engineered for hello-world. If you don't need multitenancy or modules, a plain `dotnet new webapi` is a better start — there's less to delete.
Teams with a deep Clean-Architecture investment
fullstackhero is Vertical Slice inside each module, not the layered four-project structure. If your team is committed to that layout, a dedicated Clean Architecture template will feel more natural.
Microservices-from-day-one architectures
FSH is a modular monolith — modules can be extracted into services later, but they ship as one process. Need distributed services on day one? A microservices-oriented start fits better.
Teams who need paid vendor support
FSH is community-maintained — no SLA, no enterprise hotline. If you need contracts and named support, a commercially-backed framework with paid support will serve you better.
Honest answers to what we get asked the most. If your question isn't here, open a discussion on GitHub.
Yes. The whole repository is MIT-licensed end-to-end — backend, both React apps, all ten modules, all deployment templates. There is no paid tier, no premium module, no commercial license, and no telemetry phoning home. Use it for a hobby project or for a venture-backed company; the licence is the same.
The kit is at 10.0.0-rc.1 with around 1,500 [Fact]/[Theory] backend tests across unit, integration and architecture suites — the integration suite runs against a real PostgreSQL in Docker via Testcontainers — plus 200+ Playwright end-to-end tests across both React apps, all passing on every build. It uses only first-party Microsoft and best-in-class OSS libraries (EF Core 10, Hangfire 1.8, Finbuckle 10, Mediator 3, FluentValidation 12, OpenTelemetry 1.15) — no bespoke runtime framework you'd be locked into. v10 ships when the remaining release-candidate items are closed.
Read the testing strategyNo. Each module is its own project and registers itself through the IModule contract. Delete the ones you don't need from the moduleAssemblies array in Program.cs and remove the project from the solution — the rest of the kit keeps working. Cross-module communication only happens through *.Contracts assemblies, so removing a module never breaks another.
Module composition guideYes — multitenancy is the default, not an add-on. Tenant isolation is enforced on every entity through an EF Core global query filter; entities opt in by inheriting BaseEntity or marking IHasTenant. System-wide rows (plans, impersonation grants, outbox messages) opt out by implementing IGlobalEntity. Caching, background jobs, and the outbox pattern are all tenant-aware.
How multitenancy is wiredTwo paths. For development, .NET Aspire orchestrates everything with a single dotnet run command. For production, deploy/docker/docker-compose.yml ships a complete stack (PostgreSQL, Valkey, MinIO, API, Admin, Dashboard, DbMigrator) you can stand up on a single host. Each service is also a normal Docker image you can ship to Kubernetes, Azure App Service, AWS ECS, or anywhere else.
Deployment guidefullstackhero is a copy-and-own starter, not a runtime dependency. You take the snapshot you cloned and evolve it however you want. Pull individual fixes from upstream when you want to; cherry-pick patches; or freeze your fork and never look back. There is no upstream package you have to keep upgrading.
Browse the changelogIt scales the way a modular monolith scales. Each module is a separate project with its own DbContext and HTTP boundary, talking to the rest only through its Contracts assembly. When a module hits a true horizontal-scaling need, you extract it into its own service without rewriting the consumers — the contract is already the contract. Until then you ship one process, one deploy, one set of logs, which is faster for most teams than running ten services from day one.
Architecture deep-diveYes. The API, DbMigrator, admin and dashboard apps each ship as a normal Docker image — they don't depend on any orchestrator. deploy/docker/docker-compose.yml runs everything on a single VM; the same images run on Azure App Service, AWS ECS / App Runner, Google Cloud Run, or any Kubernetes cluster. PostgreSQL, Valkey, and MinIO are off-the-shelf — swap them for managed services (Azure Postgres, AWS ElastiCache, S3) when you're ready.
Cloud deployment recipesSkip the plumbing. Clone the repo, run one command, and start building the part of your app no one else can build for you.
$ clone the starter kit
≈ 5 min from clone to localhost