Skip to main content
This guide will help you install and run the FullStackHero .NET Starter Kit using .NET Aspire for local development.

Prerequisites

Before you begin, ensure you have the following installed:

.NET 10 SDK

Download from dotnet.microsoft.com

Docker Desktop

Required for Postgres and Redis containers

.NET Aspire Workload

Install via dotnet workload install aspire

IDE

Visual Studio 2025+, VS Code, or Rider
The starter kit targets net10.0 and requires the latest C# language features. Make sure your SDK is up to date.

Installation Steps

1

Verify .NET 10 SDK

Confirm you have .NET 10 installed:
dotnet --version
You should see output like 10.0.0 or higher.
2

Install Aspire Workload

Install the .NET Aspire workload for orchestration:
dotnet workload install aspire
Verify the installation:
dotnet workload list
3

Clone the Repository

Clone the starter kit from GitHub:
git clone https://github.com/fullstackhero/dotnet-starter-kit.git
cd dotnet-starter-kit
4

Restore Dependencies

Restore NuGet packages for the entire solution:
dotnet restore src/FSH.Framework.slnx
This will restore all dependencies defined in Directory.Packages.props including:
  • Entity Framework Core 10.0.2
  • Finbuckle.MultiTenant 10.0.2
  • Hangfire 1.8.23
  • Mediator 3.0.1
  • OpenTelemetry packages
5

Build the Solution

Build the entire solution to ensure everything compiles:
dotnet build src/FSH.Framework.slnx
The project is configured with TreatWarningsAsErrors=false in development, but you should aim for zero warnings in production builds.
6

Start Docker Desktop

Ensure Docker Desktop is running. Aspire will use it to spin up:
  • PostgreSQL container (with persistent volume fsh-postgres-data)
  • Redis container (with persistent volume fsh-redis-data)
7

Run with Aspire

Launch the entire application stack using Aspire:
dotnet run --project src/Playground/FSH.Playground.AppHost
Aspire will:
  1. Start PostgreSQL and Redis containers
  2. Apply database migrations automatically
  3. Launch the Playground API at https://localhost:5285
  4. Launch the Blazor UI at https://localhost:7140
  5. Enable OpenTelemetry export to http://localhost:4317
First run may take a few minutes while Docker pulls images and applies migrations.
8

Verify Installation

Open your browser and verify the following endpoints:
curl https://localhost:5285/health
You should see:
  • Health endpoint returning Healthy status
  • Interactive API docs via Scalar
  • Blazor UI login screen

Verification Commands

After installation, verify your setup:
Check running containers
docker ps
You should see containers for:
  • postgres (port 5432)
  • redis (port 6379)
Check API endpoint
curl https://localhost:5285 -k
Expected response:
{
  "message": "hello world!"
}
Run tests
dotnet test src/FSH.Framework.slnx
All architecture and unit tests should pass.

Running Without Aspire

If you prefer to run the API standalone without Aspire:
1

Set up Infrastructure

Manually start PostgreSQL and Redis:
docker run -d --name fsh-postgres -p 5432:5432 \
  -e POSTGRES_PASSWORD=password \
  -e POSTGRES_DB=fsh \
  postgres:17

docker run -d --name fsh-redis -p 6379:6379 redis:7
2

Configure Connection Strings

Update src/Playground/Playground.Api/appsettings.json or set environment variables:
export DatabaseOptions__Provider=POSTGRESQL
export DatabaseOptions__ConnectionString="Server=localhost;Database=fsh;User Id=postgres;Password=password"
export DatabaseOptions__MigrationsAssembly="FSH.Playground.Migrations.PostgreSQL"
export CachingOptions__Redis="localhost:6379"
3

Run the API

dotnet run --project src/Playground/Playground.Api
The API will start at https://localhost:5285.

Next Steps

Aspire Setup

Learn how Aspire orchestrates your application

Configuration

Understand all configuration options

Project Structure

Explore the codebase organization

Architecture

Deep dive into the architecture

Troubleshooting

Ensure Docker Desktop is running and you have sufficient resources allocated:
  • Memory: At least 4GB
  • CPU: At least 2 cores
Check Docker logs:
docker logs fsh-postgres
docker logs fsh-redis
The API automatically applies migrations on startup via UseHeroMultiTenantDatabases(). If migrations fail:
  1. Check database connectivity
  2. Verify the connection string in appsettings.json
  3. Ensure the MigrationsAssembly matches your database provider
Manual migration:
dotnet ef database update --project src/Playground/Migrations.PostgreSQL
If default ports are in use, modify launchSettings.json or Aspire configuration:
  • API: 5285 (HTTPS)
  • Blazor: 7140 (HTTPS)
  • PostgreSQL: 5432
  • Redis: 6379
Trust the development certificate:
dotnet dev-certs https --trust

Build docs developers (and LLMs) love