Skip to content
Shiny.NET

Getting Started

Zero-friction integration between .NET Aspire and Microsoft Orleans for ADO.NET storage backends. Automatically provisions Orleans database schemas and wires up clustering, grain persistence, and reminders from Aspire configuration — no manual SQL scripts or connection string plumbing required.

GitHub GitHub stars for shinyorg/aspire
Downloads NuGet downloads for Shiny.Aspire.Orleans.Hosting
Aspire AppHost NuGet downloads for Shiny.Aspire.Orleans.Hosting
Orleans Silo NuGet downloads for Shiny.Aspire.Orleans.Server
Orleans Client NuGet downloads for Shiny.Aspire.Orleans.Client
Frameworks
.NET
Feature Description
Automatic schema provisioning Orleans clustering, persistence, and reminder tables are created automatically when the database becomes ready
Zero connection string plumbing connection strings and ADO.NET invariants are resolved from Aspire configuration
Multi-database support PostgreSQL, SQL Server, and MySQL are auto-detected from the Aspire resource
Feature selection choose which Orleans features to provision (clustering, persistence, reminders) via flags
Multiple grain storage providers configure named grain storage providers pointing to different databases
Database Provider
PostgreSQL Npgsql
SQL Server Microsoft.Data.SqlClient
MySQL MySqlConnector
  1. Install packages into your projects

    • AppHost: NuGet package Shiny.Aspire.Orleans.Hosting
    • Silo: NuGet package Shiny.Aspire.Orleans.Server
    • Client: NuGet package Shiny.Aspire.Orleans.Client
  2. Configure the Aspire AppHost

    using Shiny.Aspire.Orleans.Hosting;
    var builder = DistributedApplication.CreateBuilder(args);
    var db = builder.AddPostgres("pg")
    .AddDatabase("orleans-db");
    var orleans = builder.AddOrleans("cluster")
    .WithClustering(db)
    .WithGrainStorage("Default", db)
    .WithReminders(db)
    .WithDatabaseSetup(db); // creates all Orleans tables automatically
    builder.AddProject<Projects.MySilo>("silo")
    .WithReference(orleans)
    .WaitFor(db);
    builder.AddProject<Projects.MyApi>("api")
    .WithReference(orleans.AsClient())
    .WaitFor(db);
    builder.Build().Run();
  3. Configure the Orleans Silo

    using Shiny.Aspire.Orleans.Server;
    var builder = WebApplication.CreateBuilder(args);
    builder.UseOrleans(silo =>
    {
    silo.UseAdoNet();
    });
    var app = builder.Build();
    app.Run();
  4. Configure the Orleans Client

    using Shiny.Aspire.Orleans.Client;
    var builder = WebApplication.CreateBuilder(args);
    builder.UseOrleansClient(client =>
    {
    client.UseAdoNetClient();
    });
    var app = builder.Build();
    app.MapGet("/counter/{name}", async (string name, IClusterClient client) =>
    {
    var grain = client.GetGrain<ICounterGrain>(name);
    var count = await grain.GetCount();
    return Results.Ok(new { name, count });
    });
    app.Run();
claude plugin marketplace add shinyorg/skills
claude plugin install shiny@shiny

One plugin installs all 48 Shiny skills. Your agent loads only the skill relevant to what you're building, so there's no cost to having them all available.

copilot plugin marketplace add https://github.com/shinyorg/skills
copilot plugin install shiny@shiny

One plugin installs all 48 Shiny skills. Your agent loads only the skill relevant to what you're building, so there's no cost to having them all available.

View shiny-aspire-orleans Skill
  • .NET 10
  • .NET Aspire 13.1+
  • Microsoft Orleans 10.0+