Komento.OpenFeature
0.3.0-alpha
dotnet add package Komento.OpenFeature --version 0.3.0-alpha
NuGet\Install-Package Komento.OpenFeature -Version 0.3.0-alpha
<PackageReference Include="Komento.OpenFeature" Version="0.3.0-alpha" />
<PackageVersion Include="Komento.OpenFeature" Version="0.3.0-alpha" />
<PackageReference Include="Komento.OpenFeature" />
paket add Komento.OpenFeature --version 0.3.0-alpha
#r "nuget: Komento.OpenFeature, 0.3.0-alpha"
#:package Komento.OpenFeature@0.3.0-alpha
#addin nuget:?package=Komento.OpenFeature&version=0.3.0-alpha&prerelease
#tool nuget:?package=Komento.OpenFeature&version=0.3.0-alpha&prerelease
Komento
A storage-agnostic experimentation and feature flag engine for .NET. Its primary operation is the experiment check: given a flag key and a subject, deterministically return which variant they belong to.
var result = await client.GetVariantAsync("checkout-flow", userId, ctx);
if (result == "treatment")
return NewCheckout();
Design goals
- Zero I/O in the hot path: all evaluation is in-memory.
- Near-zero allocations:
ValueTask,Span<T>,FrozenDictionary,ArrayPool<T>. - Pluggable at every seam: swap in your own config source, segment store, subject resolver, or context enricher.
- Exposure and conversion data you can send anywhere, plus metrics and traces out of the box.
- OpenFeature support via the
Komento.OpenFeatureprovider package.
Packages
Quick start
1. Define an experiment in appsettings.json:
{
"Komento": {
"Experiments": [
{
"id": "checkout-flow",
"subjectType": "user",
"variants": [
{ "name": "control", "allocation": 0.5 },
{ "name": "treatment", "allocation": 0.5 }
]
}
]
}
}
2. Register Komento and load the configs before accepting traffic:
builder.Services
.AddKomento()
.AddSource<AppSettingsExperimentSource>(); // reads the "Komento" section
var app = builder.Build();
await app.Services.InitializeKomentoAsync();
await app.RunAsync();
3. Evaluate. Inject IExperimentClient anywhere:
public class CheckoutService(IExperimentClient experiments)
{
public async Task<string> Checkout(string userId)
{
var ctx = EvaluationContext.Create().Set("platform", "web").Build();
var variant = await experiments.GetVariantAsync("checkout-flow", userId, ctx);
return variant == "treatment" ? "new flow" : "legacy flow";
}
}
The same subject always gets the same variant. From here, add what you need:
- gate endpoints on a variant: ASP.NET Core
- keep using the OpenFeature SDK: OpenFeature
- find out who saw what and what they did next: Exposures and conversions
Documentation
| Page | Covers |
|---|---|
| Concepts | How assignment works, the result type, evaluation context, static context |
| Configuration | Experiment format, sources, hot reload, segments, typed ids |
| ASP.NET Core | [RequireVariant], subject providers, enrichers |
| OpenFeature | The provider: lifecycle, context, details, change events, tracking |
| Exposures and conversions | The data an experiment produces and how to measure results |
| Sinks | Delivering exposures and conversions to a destination |
| Metrics and traces | The Komento meter and feature_flag.evaluation events |
| Extension points | Reference for every public interface |
| Performance | Allocation behavior and benchmarks |
| Sample | A runnable e-commerce API using all of the above |
| Contributing | Build, test, benchmark |
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. 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. |
-
net8.0
- Komento (>= 0.3.0-alpha)
- OpenFeature (>= 2.9.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Komento.OpenFeature:
| Package | Downloads |
|---|---|
|
Komento.OpenFeature.AspNetCore
Per-request OpenFeature transaction context built from Komento's ASP.NET Core enrichers. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.3.0-alpha | 40 | 10/7/2026 |
| 0.2.0-alpha | 88 | 6/10/2026 |
| 0.1.1-alpha | 70 | 5/7/2026 |
| 0.1.0-alpha | 68 | 5/1/2026 |
## Highlights
- **Exposures and conversions you can send anywhere.** Exposures (who saw which variant) and conversions (what they did next) flow through opt-in streams into batched, isolated sinks (), with drop counters for every stage.
- **Metrics and traces out of the box.** A meter ( by experiment, variant and outcome) and events on the active trace, following the OpenTelemetry convention.
- **A complete OpenFeature provider.** Lifecycle, events, accurate resolution details (, , , , error messages, flag metadata), , and a new package that builds the evaluation context once per request.
- **Analysis-ready exposures.** Each exposure carries (a fingerprint of the experiment's definition) and, per experiment, the context attributes listed under .
- **Restructured documentation.** The README is a front page; the detail lives in topic pages under .
## New
- , , , and for conversions, natively and through OpenFeature.
- , , (with , , ).
- : one notification per update with the ids that really changed.
- and ; .
- is public.
- is public; .
- ( in JSON and appsettings).
## Breaking changes
- is now ; the sink pipeline is generic over the event type.
- and are gone; use and the overloads.
- OpenFeature reasons: hashed assignment is (was ) and a wrong value type is (was ).
- has new optional constructor arguments.
- , and have new members.
## Fixes
- is now applied to every evaluation.
- Exposure timestamps come from the registered .
## Maintenance
- Aspire samples and tests upgraded to 13.6.1, which no longer pulls the vulnerable 2.5.192.