| created | "2025-12-16T00:00:00.000Z" |
| modified | "2026-05-09T00:00:00.000Z" |
| reviewed | "2026-04-25T00:00:00.000Z" |
| name | openfeature |
| description | OpenFeature vendor-agnostic feature flag SDK: installation, evaluation, providers. Use when implementing feature flags, A/B testing, or progressive rollouts. |
| user-invocable | false |
| allowed-tools | Bash, Read, Write, Edit, Grep, Glob |
OpenFeature SDK Integration
When to Use This Skill
| Use this skill when... | Use a sibling skill instead when... |
|---|
| You need the vendor-agnostic OpenFeature SDK API, hooks, and evaluation patterns | You need the GO Feature Flag (GOFF) self-hosted backend specifics โ use go-feature-flag |
| You are choosing between providers or wiring an OpenFeature client into application code | You want to scaffold the full feature-flag stack (SDK + provider + CI) from scratch โ use configure-feature-flags |
| Another skill needs the canonical reference for OpenFeature semantics | You want runtime detection of an existing feature-flag setup before changing anything โ use configure-feature-flags |
Vendor-agnostic feature flag SDK providing standardized API across languages and providers. Use when implementing feature flags, A/B testing, canary releases, or progressive rollouts with any feature flag backend.
When to Use
Automatic activation triggers:
- User mentions "feature flags", "feature toggles", or "feature management"
- User asks about A/B testing or canary releases
- User wants to implement progressive rollouts
- Project has OpenFeature SDK dependencies
- User mentions OpenFeature, flagd, or vendor-agnostic flags
Related skills:
go-feature-flag - Specific GO Feature Flag provider details
launchdarkly - LaunchDarkly provider integration
Core Concepts
Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Application Code โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ OpenFeature SDK (API) โ
โ โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ โ
โ โ getBool() โ getString() โ getNumber()โ getObject()โ โ
โ โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Provider โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ GO Feature Flag โ flagd โ LaunchDarkly โ Split โ etc โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Flag Source โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ File โ S3 โ GitHub โ API โ ConfigMap โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Key Components
- API - Standardized interface for flag evaluation
- Provider - Backend-specific implementation
- Evaluation Context - User/request data for targeting
- Hooks - Lifecycle extensions for logging, telemetry
SDK Installation
Node.js (Server)
npm install @openfeature/server-sdk
npm install @openfeature/go-feature-flag-provider
npm install @openfeature/flagd-provider
npm install @openfeature/in-memory-provider
Node.js (Browser/React)
npm install @openfeature/web-sdk
npm install @openfeature/react-sdk
npm install @openfeature/go-feature-flag-web-provider
Python
uv add openfeature-sdk
uv add openfeature-provider-go-feature-flag
Go
go get github.com/open-feature/go-sdk
go get github.com/open-feature/go-sdk-contrib/providers/go-feature-flag
Java
<dependency>
<groupId>dev.openfeature</groupId>
<artifactId>sdk</artifactId>
<version>1.7.0</version>
</dependency>
Rust
[dependencies]
open-feature = "0.2"
Basic Usage Patterns
Initialization
import { OpenFeature } from '@openfeature/server-sdk';
import { GoFeatureFlagProvider } from '@openfeature/go-feature-flag-provider';
const provider = new GoFeatureFlagProvider({
endpoint: process.env.GOFF_RELAY_URL || 'http://localhost:1031',
});
await OpenFeature.setProviderAndWait(provider);
const client = OpenFeature.getClient('my-app');
Flag Evaluation
const isEnabled = await client.getBooleanValue('new-feature', false);
const buttonColor = await client.getStringValue('button-color', '#000000');
const maxItems = await client.getNumberValue('max-items', 10);
const config = await client.getObjectValue('feature-config', {});
const context = { targetingKey: userId, email: userEmail, groups: ['beta'] };
const isEnabled = await client.getBooleanValue('new-feature', false, context);
Evaluation Context
const context: EvaluationContext = {
targetingKey: user.id,
email: user.email,
groups: user.roles,
plan: user.subscription,
country: request.geoip.country,
browser: request.headers['user-agent'],
};
OpenFeature.setContext(context);
await client.getBooleanValue('feature', false, context);
Hooks
import { Hook, HookContext, EvaluationDetails } from '@openfeature/server-sdk';
const loggingHook: Hook = {
before: (hookContext: HookContext) => {
console.log(`Evaluating flag: ${hookContext.flagKey}`);
},
after: (hookContext: HookContext, details: EvaluationDetails<unknown>) => {
console.log(`Flag ${hookContext.flagKey} = ${details.value}`);
},
error: (hookContext: HookContext, error: Error) => {
console.error(`Error evaluating ${hookContext.flagKey}:`, error);
},
};
OpenFeature.addHooks(loggingHook);
client.addHooks(loggingHook);
React Integration
import { OpenFeatureProvider, useFlag, useBooleanFlagValue } from '@openfeature/react-sdk';
import { GoFeatureFlagWebProvider } from '@openfeature/go-feature-flag-web-provider';
const provider = new GoFeatureFlagWebProvider({
endpoint: import.meta.env.VITE_GOFF_RELAY_URL,
});
function App() {
return (
<OpenFeatureProvider provider={provider}>
<MyComponent />
</OpenFeatureProvider>
);
}
function MyComponent() {
const isEnabled = useBooleanFlagValue('new-feature', false);
const { value, isLoading, error } = useFlag('button-color', '#000');
if (isLoading) return <Spinner />;
return (
<div>
{isEnabled && }
Click me
);
}
Testing
In-Memory Provider
import { OpenFeature } from '@openfeature/server-sdk';
import { InMemoryProvider } from '@openfeature/in-memory-provider';
const testProvider = new InMemoryProvider({
'new-feature': {
variants: {
on: true,
off: false,
},
defaultVariant: 'off',
disabled: false,
},
'button-color': {
variants: {
blue: '#0066CC',
green: '#00CC66',
},
defaultVariant: 'blue',
disabled: false,
},
});
beforeAll(async () => {
await OpenFeature.setProviderAndWait(testProvider);
});
afterAll(async () => {
await OpenFeature.close();
});
Mocking in Unit Tests
import { vi } from 'vitest';
import { OpenFeature } from '@openfeature/server-sdk';
vi.mock('@openfeature/server-sdk', () => ({
OpenFeature: {
getClient: vi.fn().mockReturnValue({
getBooleanValue: vi.fn().mockResolvedValue(true),
getStringValue: vi.fn().mockResolvedValue('test-value'),
}),
},
}));
Best Practices
1. Initialize Early
async function bootstrap() {
await initializeFeatureFlags();
await initializeDatabase();
await startServer();
}
2. Use Meaningful Flag Names
'checkout.new-payment-flow'
'dashboard.beta-analytics'
'api.rate-limit-v2'
'feature1'
'test-flag'
'enabled'
3. Always Provide Defaults
const isEnabled = await client.getBooleanValue('risky-feature', false);
const maxItems = await client.getNumberValue('max-items', 100);
4. Handle Provider Errors
try {
const value = await client.getBooleanValue('feature', false);
} catch (error) {
logger.error('Feature flag evaluation failed', { error });
return defaultBehavior();
}
5. Clean Up Old Flags
const flagUsageHook: Hook = {
after: (context, details) => {
metrics.increment(`feature_flag.${context.flagKey}.evaluations`);
},
};
Documentation
Related Commands
/configure:feature-flags - Set up feature flag infrastructure
/configure:sentry - Error tracking (for feature flag rollback monitoring)