Help us improve
Share bugs, ideas, or general feedback.
From shiny-extensions
Generates and configures modular ASP.NET Core hosting via IWebModule for clean service registration and middleware setup. Breaks apart monolithic Program.cs into focused module classes.
npx claudepluginhub shinyorg/extensions --plugin shiny-extensionsHow this skill is triggered — by the user, by Claude, or both
Slash command
/shiny-extensions:shiny-web-hostingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an expert in Shiny Extensions Web Hosting, a .NET library providing modular ASP.NET Core application configuration via `IWebModule`.
Creates p5.js generative art with seeded randomness, noise fields, and interactive parameter exploration. Use for algorithmic art, flow fields, or particle systems.
Share bugs, ideas, or general feedback.
You are an expert in Shiny Extensions Web Hosting, a .NET library providing modular ASP.NET Core application configuration via IWebModule.
Invoke this skill when the user wants to:
IWebModuleProgram.cs into focused module classesDocumentation: https://shinylib.net/extensions/webhost/
Repository: https://github.com/shinyorg/Shiny.Extensions
Package: Shiny.Extensions.WebHosting
Namespace: Shiny
public interface IWebModule
{
void Add(WebApplicationBuilder builder); // Register services
void Use(WebApplication app); // Configure middleware
}
Each module implements IWebModule with two methods:
Add(WebApplicationBuilder builder) — register services, configuration, and anything before Build()Use(WebApplication app) — configure middleware, endpoints, and anything after Build()public class SwaggerModule : IWebModule
{
public void Add(WebApplicationBuilder builder)
{
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
}
public void Use(WebApplication app)
{
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
}
}
public class CorsModule : IWebModule
{
public void Add(WebApplicationBuilder builder)
{
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
});
}
public void Use(WebApplication app)
{
app.UseCors();
}
}
public class AuthModule : IWebModule
{
public void Add(WebApplicationBuilder builder)
{
builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();
}
public void Use(WebApplication app)
{
app.UseAuthentication();
app.UseAuthorization();
}
}
using Shiny;
var builder = WebApplication.CreateBuilder(args);
builder.AddInfrastructureModules(
new SwaggerModule(),
new CorsModule(),
new AuthModule()
);
var app = builder.Build();
app.UseInfrastructureModules();
app.Run();
public static class WebExtensions
{
// Register module instances and call Add() on each
public static WebApplicationBuilder AddInfrastructureModules(
this WebApplicationBuilder builder,
params IEnumerable<IWebModule> modules);
// Call Use() on each module to configure middleware
public static WebApplication UseInfrastructureModules(
this WebApplication app,
params IEnumerable<IWebModule> modules);
}
Add() for service registration and Use() for middleware configurationAddInfrastructureModules() — no assembly scanningUse() follows the order modules are registered