diff --git a/docs/reference/sdks/client/kotlin.mdx b/docs/reference/sdks/client/kotlin.mdx
index cdd3bd09c..d98caa74e 100644
--- a/docs/reference/sdks/client/kotlin.mdx
+++ b/docs/reference/sdks/client/kotlin.mdx
@@ -10,7 +10,7 @@ This content has been automatically generated from kotlin-sdk.
Edits should be made here: https://github.com/open-feature/kotlin-sdk
Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs
-Last updated at Mon Jun 08 2026 09:46:34 GMT+0000 (Coordinated Universal Time)
+Last updated at Wed Jul 01 2026 09:19:01 GMT+0000 (Coordinated Universal Time)
-->
import MCPInstall from '@site/src/partials/mcp-install';
diff --git a/docs/reference/sdks/client/swift.mdx b/docs/reference/sdks/client/swift.mdx
index a975bf295..fcaaa96af 100644
--- a/docs/reference/sdks/client/swift.mdx
+++ b/docs/reference/sdks/client/swift.mdx
@@ -10,7 +10,7 @@ This content has been automatically generated from swift-sdk.
Edits should be made here: https://github.com/open-feature/swift-sdk
Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs
-Last updated at Mon Jun 08 2026 09:46:35 GMT+0000 (Coordinated Universal Time)
+Last updated at Wed Jul 01 2026 09:19:01 GMT+0000 (Coordinated Universal Time)
-->
import MCPInstall from '@site/src/partials/mcp-install';
diff --git a/docs/reference/sdks/client/web/angular.mdx b/docs/reference/sdks/client/web/angular.mdx
index 9b0183c31..26abbca4e 100644
--- a/docs/reference/sdks/client/web/angular.mdx
+++ b/docs/reference/sdks/client/web/angular.mdx
@@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk.
Edits should be made here: https://github.com/open-feature/js-sdk
Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs
-Last updated at Mon Jun 08 2026 09:46:35 GMT+0000 (Coordinated Universal Time)
+Last updated at Wed Jul 01 2026 09:19:01 GMT+0000 (Coordinated Universal Time)
-->
@@ -18,8 +18,8 @@ Last updated at Mon Jun 08 2026 09:46:35 GMT+0000 (Coordinated Universal Time)
-
-
+
+
@@ -46,8 +46,8 @@ In addition to the features provided by the [web sdk](/docs/reference/sdks/clien
- [yarn](#yarn)
- [Required peer dependencies](#required-peer-dependencies)
- [Usage](#usage)
- - [Module](#module)
- - [Minimal Example](#minimal-example)
+ - [Standalone configuration (recommended)](#standalone-configuration-recommended)
+ - [NgModule configuration (deprecated)](#ngmodule-configuration-deprecated)
- [How to use](#how-to-use)
- [Structural Directives](#structural-directives)
- [Boolean Feature Flag](#boolean-feature-flag)
@@ -100,9 +100,44 @@ See the [package.json](https://github.com/open-feature/js-sdk/blob/main/packages
### Usage
-#### Module
+#### Standalone configuration (recommended)
-To configure OpenFeature for your application, import the `OpenFeatureModule` and call `forRoot` to register the provider(s) and optional evaluation context.
+For standalone / `bootstrapApplication`-based apps, pass `provideOpenFeature()` in the `providers` array of your `ApplicationConfig`:
+
+```typescript
+import { ApplicationConfig } from '@angular/core';
+import { provideOpenFeature } from '@openfeature/angular-sdk';
+
+export const appConfig: ApplicationConfig = {
+ providers: [
+ provideOpenFeature({
+ provider: yourFeatureProvider,
+ // domainBoundProviders are optional, mostly needed if more than one provider is used in the application.
+ domainBoundProviders: {
+ domain1: new YourOpenFeatureProvider(),
+ domain2: new YourOtherOpenFeatureProvider(),
+ },
+ }),
+ ],
+};
+```
+
+Then bootstrap your app with this config:
+
+```typescript
+import { bootstrapApplication } from '@angular/platform-browser';
+import { AppComponent } from './app/app.component';
+import { appConfig } from './app/app.config';
+
+bootstrapApplication(AppComponent, appConfig);
+```
+
+#### NgModule configuration (deprecated)
+
+> [!WARNING]
+> `OpenFeatureModule` and `forRoot()` are deprecated. Use [`provideOpenFeature()`](#standalone-configuration-recommended) instead.
+
+To configure OpenFeature for NgModule-based applications, import the `OpenFeatureModule` and call `forRoot` to register the provider(s) and optional evaluation context.
```typescript
import { NgModule } from '@angular/core';
@@ -358,20 +393,19 @@ const flag$ = this.flagService.getBooleanDetails('my-flag', false, 'my-domain',
##### Setting evaluation context
-To set the initial evaluation context, you can add the `context` parameter to the `OpenFeatureModule` configuration.
+To set the initial evaluation context, you can add the `context` parameter to the `provideOpenFeature()` configuration.
This context can be either an object or a factory function that returns an `EvaluationContext`.
> [!TIP]
> Updating the context can be done directly via the global OpenFeature API using `OpenFeature.setContext()`
-Here’s how you can define and use the initial client evaluation context:
+Here's how you can define and use the initial client evaluation context:
###### Using a static object
```typescript
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { OpenFeatureModule } from '@openfeature/angular-sdk';
+import { ApplicationConfig } from '@angular/core';
+import { provideOpenFeature } from '@openfeature/angular-sdk';
const initialContext = {
user: {
@@ -380,37 +414,32 @@ const initialContext = {
},
};
-@NgModule({
- imports: [
- CommonModule,
- OpenFeatureModule.forRoot({
+export const appConfig: ApplicationConfig = {
+ providers: [
+ provideOpenFeature({
provider: yourFeatureProvider,
context: initialContext,
}),
],
-})
-export class AppModule {}
+};
```
###### Using a factory function
```typescript
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { OpenFeatureModule, EvaluationContext } from '@openfeature/angular-sdk';
+import { ApplicationConfig } from '@angular/core';
+import { provideOpenFeature, EvaluationContext } from '@openfeature/angular-sdk';
const contextFactory = (): EvaluationContext => loadContextFromLocalStorage();
-@NgModule({
- imports: [
- CommonModule,
- OpenFeatureModule.forRoot({
+export const appConfig: ApplicationConfig = {
+ providers: [
+ provideOpenFeature({
provider: yourFeatureProvider,
context: contextFactory,
}),
],
-})
-export class AppModule {}
+};
```
##### Observability considerations
diff --git a/docs/reference/sdks/client/web/index.mdx b/docs/reference/sdks/client/web/index.mdx
index be199c58d..267dd1d79 100644
--- a/docs/reference/sdks/client/web/index.mdx
+++ b/docs/reference/sdks/client/web/index.mdx
@@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk.
Edits should be made here: https://github.com/open-feature/js-sdk
Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs
-Last updated at Mon Jun 08 2026 09:46:34 GMT+0000 (Coordinated Universal Time)
+Last updated at Wed Jul 01 2026 09:19:00 GMT+0000 (Coordinated Universal Time)
-->
import MCPInstall from '@site/src/partials/mcp-install';
@@ -20,8 +20,8 @@ import MCPInstall from '@site/src/partials/mcp-install';
-
-
+
+
diff --git a/docs/reference/sdks/client/web/react.mdx b/docs/reference/sdks/client/web/react.mdx
index 32c16bd41..3aaffa094 100644
--- a/docs/reference/sdks/client/web/react.mdx
+++ b/docs/reference/sdks/client/web/react.mdx
@@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk.
Edits should be made here: https://github.com/open-feature/js-sdk
Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs
-Last updated at Mon Jun 08 2026 09:46:34 GMT+0000 (Coordinated Universal Time)
+Last updated at Wed Jul 01 2026 09:19:01 GMT+0000 (Coordinated Universal Time)
-->
import MCPInstall from '@site/src/partials/mcp-install';
@@ -20,8 +20,8 @@ import MCPInstall from '@site/src/partials/mcp-install';
-
-
+
+
diff --git a/docs/reference/sdks/server/cpp.mdx b/docs/reference/sdks/server/cpp.mdx
index c15152f02..44ff8c815 100644
--- a/docs/reference/sdks/server/cpp.mdx
+++ b/docs/reference/sdks/server/cpp.mdx
@@ -9,7 +9,7 @@ This content has been automatically generated from cpp-sdk.
Edits should be made here: https://github.com/open-feature/cpp-sdk
Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs
-Last updated at Mon Jun 08 2026 09:46:36 GMT+0000 (Coordinated Universal Time)
+Last updated at Wed Jul 01 2026 09:19:02 GMT+0000 (Coordinated Universal Time)
-->
diff --git a/docs/reference/sdks/server/dart.mdx b/docs/reference/sdks/server/dart.mdx
index 22e51ac72..c203a0d4d 100644
--- a/docs/reference/sdks/server/dart.mdx
+++ b/docs/reference/sdks/server/dart.mdx
@@ -9,7 +9,7 @@ This content has been automatically generated from dart-server-sdk.
Edits should be made here: https://github.com/open-feature/dart-server-sdk
Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs
-Last updated at Mon Jun 08 2026 09:46:35 GMT+0000 (Coordinated Universal Time)
+Last updated at Wed Jul 01 2026 09:19:01 GMT+0000 (Coordinated Universal Time)
-->
diff --git a/docs/reference/sdks/server/dotnet.mdx b/docs/reference/sdks/server/dotnet.mdx
index acb6e8a18..024765b19 100644
--- a/docs/reference/sdks/server/dotnet.mdx
+++ b/docs/reference/sdks/server/dotnet.mdx
@@ -10,15 +10,15 @@ This content has been automatically generated from dotnet-sdk.
Edits should be made here: https://github.com/open-feature/dotnet-sdk
Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs
-Last updated at Mon Jun 08 2026 09:46:33 GMT+0000 (Coordinated Universal Time)
+Last updated at Wed Jul 01 2026 09:19:00 GMT+0000 (Coordinated Universal Time)
-->
import MCPInstall from '@site/src/partials/mcp-install';
[](https://github.com/open-feature/spec/releases/tag/v0.8.0)
[
-
-](https://github.com/open-feature/dotnet-sdk/releases/tag/v2.13.0)
+
+](https://github.com/open-feature/dotnet-sdk/releases/tag/v2.14.0)
[](https://cloud-native.slack.com/archives/C0344AANLA1)
[](https://codecov.io/gh/open-feature/dotnet-sdk)
@@ -643,6 +643,9 @@ services.AddOpenFeature(builder =>
### Trace Enricher Hook
+> [!WARNING]
+> As of v2.14, the OpenFeature SDK emits native OpenTelemetry spans for every flag evaluation without requiring any hooks. Use `TraceEnricherHook` when you want activities/spans **outside** of OpenFeature to be enriched with flag evaluation data. If you are already using `TraceEnricherHook`, you may see **new spans** appear in your observability platform after upgrading to v2.14.
+
The `TraceEnricherHook` enriches telemetry traces with additional information during the feature flag evaluation lifecycle. This hook adds relevant flag evaluation details as tags and events to the current `Activity` for tracing purposes.
For this hook to function correctly, an active span must be set in the current `Activity`, otherwise the hook will no-op.
@@ -662,6 +665,9 @@ Below are the tags added to the trace event:
| error.type | Describes a class of error the operation ended with | Evaluation details (if error) |
| error.message | A message explaining the nature of an error occurring during flag evaluation | Evaluation details (if error) |
+> [!NOTE]
+> To receive OpenTelemetry traces emitted natively by the OpenFeature SDK, add `.AddSource("OpenFeature")` to your `TracerProviderBuilder`. No hooks are required.
+
#### Example
The following example demonstrates the use of the `TraceEnricherHook` with the `OpenFeature dotnet-sdk`. The traces are sent to a `jaeger` OTLP collector running at `localhost:4317`.
@@ -682,6 +688,7 @@ namespace OpenFeatureTestApp
// set up the OpenTelemetry OTLP exporter
var tracerProvider = Sdk.CreateTracerProviderBuilder()
+ .AddSource("OpenFeature") // receive traces from OpenFeature SDK
.AddSource("my-tracer")
.ConfigureResource(r => r.AddService("jaeger-test"))
.AddOtlpExporter(o =>
diff --git a/docs/reference/sdks/server/go.mdx b/docs/reference/sdks/server/go.mdx
index 1a316a6e8..42e56b575 100644
--- a/docs/reference/sdks/server/go.mdx
+++ b/docs/reference/sdks/server/go.mdx
@@ -9,7 +9,7 @@ This content has been automatically generated from go-sdk.
Edits should be made here: https://github.com/open-feature/go-sdk
Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs
-Last updated at Mon Jun 08 2026 09:46:33 GMT+0000 (Coordinated Universal Time)
+Last updated at Wed Jul 01 2026 09:19:00 GMT+0000 (Coordinated Universal Time)
-->
import MCPInstall from '@site/src/partials/mcp-install';
@@ -71,7 +71,7 @@ func main() {
// Register your feature flag provider
openfeature.SetProviderAndWait(openfeature.NoopProvider{})
// Create a new client
- client := openfeature.NewClient("app")
+ client := openfeature.NewDefaultClient()
// Evaluate your feature flag
v2Enabled := client.Boolean(
context.TODO(), "v2_enabled", true, openfeature.EvaluationContext{},
@@ -137,7 +137,7 @@ openfeature.SetEvaluationContext(openfeature.NewTargetlessEvaluationContext(
))
// set a value to the client context
-client := openfeature.NewClient("my-app")
+client := openfeature.NewDefaultClient()
client.SetEvaluationContext(openfeature.NewTargetlessEvaluationContext(
map[string]any{
"version": "1.4.6",
@@ -151,7 +151,7 @@ evalCtx := openfeature.NewEvaluationContext(
"company": "Initech",
},
)
-boolValue, err := client.BooleanValue(context.TODO(), "boolFlag", false, evalCtx)
+boolValue := client.Boolean(context.TODO(), "boolFlag", false, evalCtx)
```
### Hooks
@@ -167,11 +167,11 @@ Once you've added a hook as a dependency, it can be registered at the global, cl
openfeature.AddHooks(ExampleGlobalHook{})
// add a hook on this client, to run on all evaluations made by this client
-client := openfeature.NewClient("my-app")
+client := openfeature.NewDefaultClient()
client.AddHooks(ExampleClientHook{})
// add a hook for this evaluation only
-value, err := client.BooleanValue(
+value := client.Boolean(
context.TODO(), "boolFlag", false, openfeature.EvaluationContext{}, openfeature.WithHooks(ExampleInvocationHook{}),
)
```
@@ -184,7 +184,7 @@ For example, a flag enhancing the appearance of a UI component might drive user
```go
// initialize a client
-client := openfeature.NewClient("my-app")
+client := openfeature.NewDefaultClient()
// trigger tracking event action
client.Track(
@@ -332,7 +332,7 @@ ec := openfeature.TransactionContext(ctx)
tCtx := openfeature.MergeTransactionContext(ctx, openfeature.EvaluationContext{})
// use TransactionContext in a flag evaluation
-client.BooleanValue(tCtx, ....)
+_ = client.Boolean(tCtx, ....)
```
### Multi-Provider Implementation
diff --git a/docs/reference/sdks/server/java.mdx b/docs/reference/sdks/server/java.mdx
index 123c2205e..211c47b52 100644
--- a/docs/reference/sdks/server/java.mdx
+++ b/docs/reference/sdks/server/java.mdx
@@ -9,7 +9,7 @@ This content has been automatically generated from java-sdk.
Edits should be made here: https://github.com/open-feature/java-sdk
Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs
-Last updated at Mon Jun 08 2026 09:46:33 GMT+0000 (Coordinated Universal Time)
+Last updated at Wed Jul 01 2026 09:18:59 GMT+0000 (Coordinated Universal Time)
-->
import MCPInstall from '@site/src/partials/mcp-install';
@@ -20,8 +20,8 @@ import MCPInstall from '@site/src/partials/mcp-install';
-
-
+
+
@@ -59,7 +59,7 @@ Note that this library is intended to be used in server-side contexts and has no
dev.openfeaturesdk
- 1.20.2
+ 1.21.0
```
@@ -82,7 +82,7 @@ If you would like snapshot builds, this is the relevant repository information:
```groovy
dependencies {
- implementation 'dev.openfeature:sdk:1.20.2'
+ implementation 'dev.openfeature:sdk:1.21.0'
}
```
@@ -213,15 +213,15 @@ If the flag management system you're using supports targeting, you can provide t
// set a value to the global context
OpenFeatureAPI api = OpenFeatureAPI.getInstance();
Map apiAttrs = new HashMap<>();
-apiAttrs.put("region", new Value(System.getEnv("us-east-1")));
+apiAttrs.put("region", new Value(System.getenv("AWS_REGION")));
EvaluationContext apiCtx = new ImmutableContext(apiAttrs);
api.setEvaluationContext(apiCtx);
// set a value to the client context
Map clientAttrs = new HashMap<>();
-clientAttrs.put("region", new Value(System.getEnv("us-east-1")));
+clientAttrs.put("region", new Value(System.getenv("AWS_REGION")));
EvaluationContext clientCtx = new ImmutableContext(clientAttrs);
-Client client = api.getInstance().getClient();
+Client client = api.getClient();
client.setEvaluationContext(clientCtx);
// set a value to the invocation context
@@ -288,7 +288,7 @@ If a domain has no associated provider, the global provider is used.
FeatureProvider scopedProvider = new MyProvider();
// registering the default provider
-OpenFeatureAPI.getInstance().setProvider(LocalProvider());
+OpenFeatureAPI.getInstance().setProvider(new LocalProvider());
// registering a provider to a domain
OpenFeatureAPI.getInstance().setProvider("my-domain", new CachedProvider());
@@ -448,25 +448,26 @@ This can be a new repository or included in [the existing contrib repository](ht
Implement your own hook by conforming to the `Hook interface`.
```java
-class MyHook implements Hook {
+class MyHook implements Hook