Coworkee is a modular application framework for .NET 10. It gives a Blazor and ASP.NET Core application the parts every business app needs, so the app itself can stay about its domain: modules with dependencies, a request pipeline with validation, permissions and caching, EF Core with audit and outbox, an auth server with external sign-in, a Blazor shell with data tables and admin pages, and an Aspire app host that wires all of it.
What is in the box¶
| Area | You get |
|---|---|
| Modules | CoworkeeModule with [DependsOn], one call AddCoworkee<TRoot>() per host |
| Requests | IDispatcher with commands, queries, Result, FluentValidation, permission checks, caching, unit of work |
| Data | CoworkeeDbContext with tenants, soft delete, field level audit trail, transactional outbox, realtime change events |
| HTTP | Minimal API groups with problem details, application services with generated endpoints and Blazor clients, OData sets with facets for every entity, response filters |
| Identity | Users, roles, groups, tenants, permission grants down to single resources, setup wizard or seed |
| Sign-in | OpenIddict auth server, BFF for the Blazor client, Keycloak or any OpenID Connect provider as external login |
| Blazor | MudBlazor shell with navigation, admin pages, data table with facets, client entities queried in the browser, theming, replaceable components |
| Services | Settings, typed app configuration, mail templates, Hangfire jobs, blob storage, Elasticsearch, notifications, AI assistant with MCP |
| Hosting | AddCoworkeeApp for Aspire: Postgres (or SQL Server, SQLite), Redis, Mailpit, Elasticsearch and Keycloak wired from the packages each service uses |
A taste¶
[DependsOn(typeof(CoworkeeODataModule))]
public sealed class MyAppCatalogModule : CoworkeeModule, IWebModule
{
public override void ConfigureServices(ModuleServiceContext context)
{
context.Services.AddMessagingFromAssembly(typeof(MyAppCatalogModule).Assembly);
context.Services.AddSingleton<IModelContributor, CatalogModelContributor>();
context.Services.AddSingleton<IPermissionDefinitionContributor, CatalogPermissionDefinitions>();
context.Services.AddODataEntity<Product>("Products", CatalogPermissions.Products.View);
}
public void ConfigureApplication(WebApplication app) => app.MapProductEndpoints();
}
var app = builder.AddCoworkeeApp("myapp", options => options.UseKeycloak());
app.AddMigrations<Projects.MyApp_Migrations>();
app.AddAuthServer<Projects.MyApp_Auth>();
app.AddApi<Projects.MyApp_Api>();
app.AddWeb<Projects.MyApp_Web>();
Where Coworkee comes from¶
Coworkee started as my own project template: a Blazor base template with everything a business app needs, copied into every new app. Every app then carried its own copy of identity, permissions, settings, audit and admin pages, and every improvement had to be carried over by hand. So I turned the template into this library: the shared parts are NuGet packages now, and an app only holds its own domain.
The demo app is the former template rebuilt on the packages, and Sharemee, a digital asset management system, is the second app built on them. The UI relies on MudBlazor and MudBlazor.Extensions; facets, response filters and code generation come from Nextended.







