GitOps-native, OpenFeature-compatible. Deploy with confidence, roll back in seconds, and target exactly who sees what — from a single control plane.
Trusted by engineering teams shipping at scale
From simple on/off toggles to complex multi-variate experiments — flagctl handles the full feature flag lifecycle.
Define flags as YAML. Review via PR. Deploy with confidence. Your flag config lives in git — versioned, auditable, and rollbackable like any other code.
key: checkout-v2 type: boolean lifecycle: experiment environments: production: enabled: true rollout: 80 staging: enabled: true rollout: 100
Standards-compliant SDK for Java, Go, Python, Node.js, and more. Migrate from any provider without rewriting evaluation logic.
Arm a kill switch and your team can instantly flip a flag off in production — with typed confirmation, ZSP, and a full audit trail.
Serve different flag values to different users using CEL-based rules, percentage rollouts, and reusable segment definitions.
Track evaluation counts, SDK distribution, and environment breakdown. Spot anomalies before they become incidents.
Every change to every flag is recorded with actor, timestamp, diff, and reason. Export for SOC 2, ISO 27001, or internal review.
flagctl fits into the workflow you already have — no new processes, no dashboards to babysit.
Create a flag definition in your repo. Specify type, lifecycle, environments, and targeting rules — all as code.
Open a pull request. CI validates schema, team reviews the diff. Merge triggers sync to the control plane via webhook or GitOps agent.
Your service calls the OpenFeature-compatible SDK. Flags are cached locally — P99 eval time is under 5ms with no added network hops.
Use the dashboard to adjust rollout percentages, arm kill switches, or update targeting rules — changes stream to SDKs via SSE in under 500ms.
OpenFeature-compatible. If you've used any major feature flag provider, you already know the API.
// Initialize once at startup FlagctlClient client = FlagctlClient.builder() .sdkKey("sdk_live_abc123") .environment("production") .build(); // Evaluate a boolean flag boolean enabled = client.getBooleanValue( "checkout-v2", false, // default EvaluationContext.builder() .put("userId", user.getId()) .put("plan", user.getPlan()) .build() ); if (enabled) { // new checkout flow }
// Initialize once at startup client, _ := flagctl.NewClient(flagctl.Config{ SDKKey: "sdk_live_abc123", Environment: "production", }) // Evaluate a boolean flag enabled, _ := client.BoolValue(ctx, "checkout-v2", false, openfeature.NewEvaluationContext( user.ID, map[string]any{ "plan": user.Plan, }, ), ) if enabled { // new checkout flow }
# Initialize once at startup client = FlagctlClient( sdk_key="sdk_live_abc123", environment="production", ) # Evaluate a boolean flag enabled = client.get_boolean_value( flag_key="checkout-v2", default_value=False, evaluation_context=EvaluationContext( targeting_key=user.id, attributes={"plan": user.plan}, ), ) if enabled: # new checkout flow
// Initialize once at startup const client = new FlagctlClient({ sdkKey: 'sdk_live_abc123', environment: 'production', }); // Evaluate a boolean flag const enabled = await client.getBooleanValue( 'checkout-v2', false, { targetingKey: user.id, plan: user.plan, } ); if (enabled) { // new checkout flow }
No per-seat pricing. No eval limits on paid plans. One flat monthly fee per environment tier.
Perfect for side projects and small teams getting started with feature flags.
Get started freeFor growing teams running flags in production across multiple environments.
Start Pro trialFor organizations with compliance requirements, SSO needs, or high-volume evaluation.
Talk to salesJoin engineering teams who trust flagctl to control every feature in production.