TimeWarp.State
12.0.0-beta.15
Prefix Reserved
dotnet add package TimeWarp.State --version 12.0.0-beta.15
NuGet\Install-Package TimeWarp.State -Version 12.0.0-beta.15
<PackageReference Include="TimeWarp.State" Version="12.0.0-beta.15" />
<PackageVersion Include="TimeWarp.State" Version="12.0.0-beta.15" />
<PackageReference Include="TimeWarp.State" />
paket add TimeWarp.State --version 12.0.0-beta.15
#r "nuget: TimeWarp.State, 12.0.0-beta.15"
#:package TimeWarp.State@12.0.0-beta.15
#addin nuget:?package=TimeWarp.State&version=12.0.0-beta.15&prerelease
#tool nuget:?package=TimeWarp.State&version=12.0.0-beta.15&prerelease
<img src="https://raw.githubusercontent.com/TimeWarpEngineering/timewarpengineering.github.io/refs/heads/master/images/LogoNoMarginNoShadow.svg" alt="logo" height="120" style="float: right" />
TimeWarp.State
TimeWarp.State (previously known as Blazor-State) is a fully asynchronous state management library. The core package has no Blazor dependency, so console and other non-UI hosts can dispatch actions through the same store. Blazor components, JavaScript interop, and render subscriptions are in TimeWarp.State.Blazor. It handles both Reducers and Effects consistently using async Handlers.
By utilizing the TimeWarp.Mediator pipeline, TimeWarp.State enables a flexible, middleware-driven architecture for managing state, similar to the request-processing pipeline in ASP.NET. This approach allows developers to inject custom behaviors, such as logging, validation, and caching, directly into the state management flow.
Hosts consume TimeWarp.Mediator 14-beta via generated AddGeneratedMediator<ClientPipeline>() / named pipelines — not MediatR and not reflection AddMediator().
In addition to the core library, we offer TimeWarp.State.Blazor (components, JavaScript interop, render subscriptions), TimeWarp.State.Plus (routing, persistence, action tracking; depends on TimeWarp.State.Blazor; package id unchanged), and TimeWarp.State.Telemetry (OpenTelemetry action spans for the Aspire dashboard or any OTel backend). TimeWarp.State DevTools is a dev-only Blazor inspector (AddTimeWarpStateDevTools()) on top of those spans. It is the action log, state tree, and diff. It is not a production dependency. The console sample dispatches an action without Blazor. The persistence sample shows session storage and local storage with [PersistentState]. The render control sample shows ShouldRender, parameter checks, and RegisterRenderTrigger. The telemetry sample wires the DevTools app into Aspire, including the WebAssembly counter.
Give a Star! ⭐
If you find this project useful, please give it a star. Thanks!
Getting Started
I recommend the state and action handler sample for a step-by-step guide to building a Blazor app with TimeWarp.State. The published docs are at timewarpengineering.github.io/timewarp-state.
See full documentation.
<img src="https://raw.githubusercontent.com/TimeWarpEngineering/timewarp-state/refs/heads/master/documentation/images/time-warp-state-one-way-flow.drawio.svg" alt="logo" height="400" style="" />
Installation
dotnet add package TimeWarp.State
dotnet add package TimeWarp.State.Blazor
dotnet add package TimeWarp.State.Plus
dotnet add package TimeWarp.State.Telemetry
Blazor hosts call AddTimeWarpState and AddTimeWarpStateBlazor. Console hosts call AddTimeWarpState only. See Migrate to 12.0.0-beta.10.
Check out the latest NuGet packages on the TimeWarp Enterprises NuGet page.
JavaScript dispatch
JavaScript can dispatch actions with timeWarpState.DispatchRequest(name, request). It is opt-in: allow each action explicitly, everything else is rejected.
builder.Services.AddJavaScriptDispatch(b => b.Allow<CounterState.IncrementCountActionSet.Action>());
See Enable JavaScript interop.
Action catalog
Mark user-facing actions with [CatalogAction] to enumerate and execute them at runtime, for example from a Ctrl-K command palette or as agent tools:
public static class AddPasskeyActionSet
{
[CatalogAction(Description = "Add a passkey to the signed-in account.", Permissions = ["credentials.write"])]
public sealed class Action : IAction
{
public Action(string label) { Label = label; }
public string Label { get; }
}
}
builder.Services.AddActionCatalog(typeof(AssemblyMarker).Assembly);
ActionCatalogEntry entry = actionCatalog.Find("Credentials.AddPasskey")!;
await entry.Execute(store, ["Laptop"]);
The source generator emits a per-assembly registry with name, description, permissions, visibility, parameters and input schema, plus a reflection-free Execute. It is opt-in: unmarked actions are never cataloged. Permissions are opaque ids that the consumer enforces; [TrackAction] (busy indicator) is unrelated. See Action catalog.
Releases
View the Release Notes for detailed information on each release.
Unlicense
This project is licensed under the Unlicense.
Contributing
Your contributions are welcome! Before starting any work, please open a discussion.
Help with the documentation is also greatly appreciated.
Contact
If you have an issue and don't receive a timely response, feel free to reach out on our Discord server.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net11.0 is compatible. |
-
net11.0
- TimeWarp.Mediator.Contracts (>= 14.0.0-beta.5)
NuGet packages (4)
Showing the top 4 NuGet packages that depend on TimeWarp.State:
| Package | Downloads |
|---|---|
|
TimeWarp.State.Plus
TimeWarp.State.Plus extends TimeWarp.State and TimeWarp.State.Blazor with routing, persistence, and action tracking. |
|
|
TimeWarp.State.Policies
Policies for TimeWarp State management library |
|
|
TimeWarp.State.Blazor
Blazor components, JavaScript interop, and render subscriptions for TimeWarp.State. |
|
|
TimeWarp.State.Telemetry
OpenTelemetry instrumentation for the TimeWarp.State mediator pipeline: action spans, timing, and opt-in AOT-safe state snapshots. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 12.0.0-beta.15 | 101 | 10/16/2026 |
| 12.0.0-beta.14 | 74 | 10/16/2026 |
| 12.0.0-beta.13 | 215 | 10/13/2026 |
| 12.0.0-beta.12 | 64 | 10/12/2026 |
| 12.0.0-beta.11 | 64 | 10/12/2026 |
| 12.0.0-beta.10 | 176 | 10/9/2026 |
| 12.0.0-beta.9 | 112 | 10/9/2026 |
| 12.0.0-beta.8 | 168 | 10/5/2026 |
| 12.0.0-beta.7 | 92 | 10/1/2026 |
| 12.0.0-beta.6 | 108 | 9/30/2026 |
| 12.0.0-beta.5 | 78 | 9/24/2026 |
| 12.0.0-beta.3 | 197 | 9/17/2026 |
| 12.0.0-beta.1 | 2,290 | 8/20/2025 |
| 11.0.3 | 17,393 | 6/20/2025 |
| 11.0.2 | 282 | 6/20/2025 |
| 11.0.1 | 260 | 6/20/2025 |
| 11.0.0 | 4,286 | 12/10/2024 |
| 11.0.0-beta.96 | 126 | 12/5/2024 |
| 11.0.0-beta.95 | 140 | 12/3/2024 |
| 11.0.0-beta.94 | 149 | 12/3/2024 |