Skip to content
Shiny Controls v1.0 - The Ultra Control Suite for .NET MAUI & BlazorO...M...G!

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
  • 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 35 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 35 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 Skills Repository
  • .NET 10
  • .NET Aspire 13.1+
  • Microsoft Orleans 10.0+