v10.0.0 is Released! 🥳 #1306
iammukeshm
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
FullStackHero .NET Starter Kit — v10.0.0 (GA)
Release date: 2026-06-20
Status: General Availability
Packages:
FullStackHero.CLI·FullStackHero.NET.StarterKitDocs: fullstackhero.net · Source: github.com/fullstackhero/dotnet-starter-kit
TL;DR
v10 is the first General Availability release of the FullStackHero .NET Starter Kit on .NET 10, and the first to ship as public NuGet packages: a global
fshCLI and adotnet newtemplate. It is a production-ready modular monolith (Vertical Slice Architecture, CQRS) backend with two React 19 front-ends, ten first-class business modules, multitenancy, real-time, billing, and one-command local orchestration via .NET Aspire — all delivered as fully-owned, detached source with no runtime framework NuGet dependencies.Scaffold in two commands:
Headlines
fshCLI (new/doctor/info/update) plus adotnet new fshtemplate. GitHub "Use this template" remains as a discovery funnel.dotnet packof the solution emits only the CLI (and the template pack). You own and can change every BuildingBlock, Module, and Host project.clients/admin(operator console) andclients/dashboard(tenant app), both Vite 7 + Tailwind v4, with real-time SignalR/SSE.dotnet runthe Aspire AppHost brings up Postgres, Valkey, MinIO, pgAdmin, RedisInsight, the migrator, demo seeder, the API, and both React apps.Installation & getting started
Option 1 — the
fshCLI (recommended)CLI flags for
fsh new:--no-frontendclients/)--no-aspire--no-aspire --no-frontend--skip-installnpm installfor the React apps--non-interactive-o, --output <dir>./<name>)Option 2 — the
dotnet newtemplateOption 3 — clone the repository
Prerequisites: .NET 10 SDK · Docker (Postgres / Valkey / MinIO via Aspire) · Node.js 20+ (React apps). No
aspireworkload is required on .NET 10 — Aspire ships as NuGet packages.Default URLs & credentials (local dev via Aspire)
https://localhost:15888https://localhost:7030/scalarhttp://localhost:5173http://localhost:5174http://localhost:5050http://localhost:9001http://localhost:5540Sign in with a seeded account. Under Aspire the demo seeder runs, so every seeded account (including the root admin) uses the password
Password123!:admin@root.com/Password123!(tenantroot, admin app)admin@acme.com,admin@globex.com/Password123!alice@acme.com/Password123!Architecture
.Contractsproject that is its only public surface. Cross-module references go through.Contractsonly — enforced byArchitecture.Tests(NetArchTest).public sealed, returnValueTask<T>, and propagateCancellationTokenthroughout.FSH.Starter.Api; modules self-register through anIModulecontract with assembly-level ordering metadata.DbMigratorhost applies migrations and seeds (the API waits for it under Aspire).BaseDbContextapplies the tenant filter automatically; opt out only viaIGlobalEntity.Cross-cutting platform (BuildingBlocks)
The shared framework libraries under
src/BuildingBlocks— yours to modify — provide:DbContextbase, soft-delete + audit interceptors, domain events, and the specification pattern.ProblemDetails, API versioning (Asp.Versioning10), the SignalRAppHubreal-time hub, and security middleware.Microsoft.Extensions.Caching.Hybrid10.6) backed by Valkey (a BSD-licensed Redis fork), with stampede protection and structured cache keys.Microsoft.Extensions.Http.Resilience(Polly v8 pipelines)./health/live+/health/readyprobes.Modules
Ten bounded contexts ship wired, migrated, seeded, and tested. ~171 HTTP endpoints across the API.
Identity
JWT issuance & refresh on ASP.NET Identity; roles with fine-grained permissions; group-based role assignment (roles conferred via user groups grant permissions, not just JWT role claims); per-user permission caching with mutation-driven invalidation; rate-limited auth endpoints; password policies; user sessions; impersonation; self-registration and email confirmation; forgot/reset password with anti-enumeration responses; and a
GET /identity/permissionsendpoint that returns the caller's effective permission set for SPA gating.Multitenancy
Tenant resolution via Finbuckle 10 (JWT claim, with a root-operator header override applied post-authentication); full tenant provisioning lifecycle (Running/Completed/Failed) with per-tenant migrations and seeding; tenant
IsActive/ValidUptoenforcement; per-tenant themes; and a tenant billing lifecycle (plan-driven subscriptions and invoices on create + renew, grace-windowed expiry).Billing
Plan-driven subscriptions and invoices, generated on tenant create and renewal; grace windows on expiry; root-operator cross-tenant administration with explicit tenant scoping on every handler (no cross-tenant leakage).
Catalog
Reference commerce domain — products with multiple images, brands, and a category tree — demonstrating the full slice (contracts → handler → validator → endpoint → EF config → tests) and presigned image uploads.
Tickets
Support ticketing with comments and a status lifecycle (open / update / close / delete), tenant-scoped and permission-gated.
Chat
Real-time chat: named channels and direct messages (1:1 and group); messages with threaded replies, emoji reactions, @mentions (which raise notifications), edit/delete, and read markers; full-text search over Postgres
tsvector; typing indicators; and file attachments governed by a channel-scoped file-access policy. Broadcast over SignalR with a Valkey backplane.Files
Presigned S3 / MinIO uploads with a request → finalize flow; soft-delete + restore (trash); public/private visibility control; pluggable per-owner-type file-access policies (e.g. product images, chat attachments); schema-per-tenant isolation.
Webhooks
Outbound webhook subscriptions with HMAC-signed deliveries, fanout to subscribers, delivery tracking, test-send, and encrypted subscription secrets.
Auditing
Append-only audit trail with dedicated security, general, and exception audit streams;
jsonbpayloads with filtered queries.Notifications
In-app notification inbox with unread counts, single and bulk mark-read (set-based
ExecuteUpdateAsync), and SignalR push touser:{id}— the backbone for chat mentions and system alerts.Front-ends
Two independent React 19 SPAs, each with runtime configuration (
public/config.json, no rebuild per environment), a hand-written typedapiFetchclient (no codegen), and Playwright E2E suites.clients/admin— operator consoleReact 19 · Vite 7 · TypeScript 5.7 · TanStack Query v5 · React Router 7 · Radix + Tailwind v4 (shadcn-style) ·
react-hook-form+zodforms · SignalR. Per-route permission gating viaRouteGuardmirrored against a permission catalog.clients/dashboard— tenant appReact 19 · Vite 7 · Tailwind v4 · TanStack Query v5 · SignalR + SSE live feed. Controlled-input forms (no RHF/zod). Permissions are fetched from
GET /api/v1/identity/permissions(not read from the JWT, which carries only role names), cached with apermissionsHydratedflag; nav entries gate viaperm/anyPerm. Includes the full real-time chat and notifications surfaces, an idle auto-logout, and a demo-account picker.Both apps: idle → warning → auto sign-out, sonner toasts, React error boundaries on every route, and code-split lazy routes.
Cloud-native & DevOps
AddJavaScriptApp).deploy/docker(fsh newpre-generates a.envwith strong secrets).deploy/terraform(ECS Fargate, RDS, ElastiCache, S3/CloudFront).src/**) and Frontend (clients/**) pipelines; the two roll-up gate checks are the only required status checks.Testing & quality
dotnet test src/FSH.Starter.slnx(integration tests require Docker).cd clients/<app> && npm run test:e2e.TreatWarningsAsErrors. Every command handler and paginated query has a validator (architecture-enforced).Dependency manifest (headline versions)
net10.0Distribution & ownership model
FSH.Framework.*andFSH.Modules.*namespaces stay fixed; only the product identity (FSH.Starter.*, brand strings, contact metadata) is renamed at scaffold time.IsPackable=falseis the default across the solution; only the CLI (and, separately, the template content pack) are produced bydotnet pack.Notes for this release
https://localhost:15888(matches the CLI "Next Steps",fsh doctor, and the docs).git ls-filesallowlist), so no local artifacts (bin/obj,node_modules,.terraform,*.tfstate, IDE/AI tool state) can leak into a scaffold.Chat/RealtimeEventsTests.SendingMessage_Should_Fire_ChatMessageCreated_To_Channel_Members) is timing-sensitive under parallel load and passes on isolated rerun.Upgrade & migration
This is the inaugural public NuGet GA. Because scaffolded output is detached, owned source, updates are not a
dotnet pull:src/BuildingBlocks) and modules, whoseFSH.Framework.*/FSH.Modules.*namespaces are stable across scaffolds — apply upstream changes by diffing against the corresponding release tag.dotnet run --project src/Host/<App>.DbMigrator -- apply(add--seedto seed;seed-demoprovisions demo tenants in Development only).Links
Built and maintained by Mukesh Murugan and the FullStackHero community — for teams that want to ship fast without sacrificing architectural discipline.
This discussion was created from the release 10.0.0.
Beta Was this translation helpful? Give feedback.
All reactions