ModelingEvolution.Chat
1.0.0-preview.3
See the version list below for details.
dotnet add package ModelingEvolution.Chat --version 1.0.0-preview.3
NuGet\Install-Package ModelingEvolution.Chat -Version 1.0.0-preview.3
<PackageReference Include="ModelingEvolution.Chat" Version="1.0.0-preview.3" />
<PackageVersion Include="ModelingEvolution.Chat" Version="1.0.0-preview.3" />
<PackageReference Include="ModelingEvolution.Chat" />
paket add ModelingEvolution.Chat --version 1.0.0-preview.3
#r "nuget: ModelingEvolution.Chat, 1.0.0-preview.3"
#:package ModelingEvolution.Chat@1.0.0-preview.3
#addin nuget:?package=ModelingEvolution.Chat&version=1.0.0-preview.3&prerelease
#tool nuget:?package=ModelingEvolution.Chat&version=1.0.0-preview.3&prerelease
ModelingEvolution.Chat
Event-sourced chat — workspaces → channels → participants — with MudBlazor 9 Blazor components:
ConversationList, ConversationView, ChatWidget, ChatInput, ChatMessageView (Markdown messages).
Server-side command handlers and read models over MicroPlumberd 1.2.x / KurrentDB.
The published language (identifiers, commands, events) is ModelingEvolution.Chat.Types, a dependency of this package.
What a host needs — nothing else
This is the whole composition. A fresh Blazor Server host with only these lines renders a working
multi-channel conversation (that claim is tested: testing/FreshChatHost in the source repository is
exactly this and nothing more).
<PackageReference Include="ModelingEvolution.Chat" Version="X.Y.Z" />
Program.cs
using KurrentDB.Client;
using MicroPlumberd.Services;
using ModelingEvolution.Chat;
using MudBlazor.Services;
builder.Services.AddRazorComponents().AddInteractiveServerComponents();
builder.Services.AddMudServices(); // MudBlazor
builder.Services.AddMudMarkdownServices(); // MudBlazor.Markdown — message bodies render as Markdown
builder.Services.AddPlumberd(KurrentDBClientSettings.Create(builder.Configuration["KurrentDB"]!));
builder.Services.AddChatServer(); // command handlers + read models (AddChatClient() = read models only)
builder.Services.AddHealthChecks().AddPlumberdHealthChecks(); // readiness — see "Before you send" below
…and map it: app.MapHealthChecks("/health", …) with a response writer that names each check (the default prints only the status word) — see testing/FreshChatHost/Program.cs.
App.razor (or your layout's <head> / <body>)
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet" />
<link href="_content/MudBlazor.Markdown/MudBlazor.Markdown.min.css" rel="stylesheet" />
…
<script src="_content/MudBlazor/MudBlazor.min.js"></script>
<script src="_content/MudBlazor.Markdown/MudBlazor.Markdown.min.js"></script>
<script src="_framework/blazor.web.js"></script>
Layout — MudBlazor's providers, once:
<MudThemeProvider />
<MudPopoverProvider />
<MudDialogProvider />
<MudSnackbarProvider />
_Imports.razor
@using MudBlazor
@using ModelingEvolution.Chat
@using ModelingEvolution.Chat.Components
@using ModelingEvolution.Chat.ReadModels
A page (interactive — the components bind input events and take EventCallbacks; static SSR will not run them):
@page "/chat"
@rendermode InteractiveServer
<ConversationList WorkspaceId="@Workspace" @bind-SelectedChannelId="_channel" />
<ConversationView ChannelId="@_channel" SenderId="@Me" />
Seeding a conversation
Everything goes through ICommandBus (MicroPlumberd) with the commands from ModelingEvolution.Chat.Types:
await bus.SendAsync(workspaceId, new DefineWorkspace { Name = "Support" });
await bus.SendAsync(channelId, new DefineChannel { WorkspaceId = workspaceId, Name = "general" });
await bus.SendAsync(participantId, new RegisterParticipant { Email = "alice@example.com", Name = "Alice" });
await bus.SendAsync(channelId, new SendMessage { ChannelId = channelId, SenderId = participantId, Content = "**hello**" });
Before you send. MicroPlumberd's command handlers subscribe from the end of the app command stream once the host
is running; a command sent before they are ready is never answered (a 2-minute timeout, not an error). Wait for
/health to report Healthy (or for AddPlumberdHealthChecks's check) before the first SendAsync — on startup, and
in any test that boots the host and seeds it.
Stream naming: Workspace-{WorkspaceId}, Channel-{ChannelId}, Participant-{ParticipantId}; the read models
subscribe by event type and need KurrentDB's standard projections running ($by_event_type).
What is in the contract (frozen at 1.0.0)
- The components'
[Parameter]s andEventCallbacks — see each.razor— not their pixels. - Workspaces / channels / participants; the multi-channel surface; send + live update; Markdown; participant name resolution.
- Not in the contract: typing indicators (do not exist), notification hooks (deleted), read receipts (half-built — not asserted).
Latest is a standing constraint
The components are built on MudBlazor 9's supported primitives (MudPaper, MudStack, MudText, MudMarkdown) — never on
a MudBlazor "chat" component. In the source repository Directory.Build.props makes a Razor element that resolves to no
component (RZ10012) a build error, so a future MudBlazor deletion cannot ship as inert markup.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Markdig (>= 0.45.0)
- MicroPlumberd (>= 1.2.2)
- MicroPlumberd.Services (>= 1.2.2)
- MicroPlumberd.SourceGenerators (>= 1.2.2)
- ModelingEvolution.Chat.Types (>= 1.0.0-preview.3)
- ModelingEvolution.Observable.Blazor (>= 0.0.12)
- MudBlazor (>= 9.7.0)
- MudBlazor.Markdown (>= 9.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0-preview.11 | 0 | 8/19/2026 |
| 1.0.0-preview.10 | 0 | 8/19/2026 |
| 1.0.0-preview.9 | 0 | 8/19/2026 |
| 1.0.0-preview.8 | 58 | 8/17/2026 |
| 1.0.0-preview.7 | 47 | 8/17/2026 |
| 1.0.0-preview.6 | 43 | 8/17/2026 |
| 1.0.0-preview.5 | 43 | 8/17/2026 |
| 1.0.0-preview.4 | 49 | 8/17/2026 |
| 1.0.0-preview.3 | 52 | 8/17/2026 |
| 1.0.0-preview.2 | 56 | 8/17/2026 |
| 1.0.0-preview.1 | 52 | 8/17/2026 |