<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>OpenFeature Blog</title>
        <link>https://openfeature.dev/blog</link>
        <description>OpenFeature Blog</description>
        <lastBuildDate>Sat, 28 Mar 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[KubeCon EU 2026 Recap: In-Person Discussions and What's Next]]></title>
            <link>https://openfeature.dev/blog/kubecon-eu-2026-recap</link>
            <guid>https://openfeature.dev/blog/kubecon-eu-2026-recap</guid>
            <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A recap of OpenFeature at KubeCon EU 2026 in Amsterdam. Sessions, booth conversations, and summaries from our in-person community discussions on experimentation, OFREP, flagd, AI workflows, and more.]]></description>
            <content:encoded><![CDATA[<p>KubeCon EU 2026 in Amsterdam is in the books. We had a great week. Well-attended sessions, busy booth conversations, a party on a boat that never left the dock, and a series of focused in-person discussions on the future of the project. Here's a summary of the week.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sessions">Sessions<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap#sessions" class="hash-link" aria-label="Direct link to Sessions" title="Direct link to Sessions" translate="no">​</a></h2>
<p>OpenFeature had three sessions on the schedule this year:</p>
<ul>
<li class="">
<p><a href="https://sched.co/2EWfG" target="_blank" rel="noopener noreferrer" class=""><strong>Building Secure Package Pipelines</strong></a>: André Silva walked through how to build a secure open-source package pipeline at the Maintainer Summit, covering OIDC authentication, SBOM generation, cryptographic attestations, and automated releases.</p>
</li>
<li class="">
<p><a href="https://sched.co/2EF4j" target="_blank" rel="noopener noreferrer" class=""><strong>OpenFeature Update From the Maintainers</strong></a>: Lukas Reining, André Silva, Thomas Poignant, and Alexandra Oberaigner shared updates on the MCP server, the OpenFeature GitHub Action for flag cleanup, and the stable release of OFREP. The session was part of the Maintainer Track on Wednesday.</p>
</li>
</ul>
<img src="https://openfeature.dev/assets/images/maintainer-update-6c2af57f43b81a1434fbeef63a705820.jpeg">
<ul>
<li class=""><a href="https://kccnceu2026.sched.com/event/2CW7W" target="_blank" rel="noopener noreferrer" class=""><strong>18 Bluetooth Controllers Walk into a Bar</strong></a>: Simon Schrottner and Manuel Timelthaler gave one of the more memorable talks of the week, demonstrating OpenFeature and OpenTelemetry in action with 18 PlayStation Move controllers, tackling observability in a physical distributed system.</li>
</ul>
<img src="https://openfeature.dev/assets/images/bluetooth-talk-71d04b7cc360e83625b03a4e43daf641.jpg">
<p>Slides and recordings (when available) can be found at the session links above.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="booth">Booth<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap#booth" class="hash-link" aria-label="Direct link to Booth" title="Direct link to Booth" translate="no">​</a></h2>
<p>Our kiosk (P-10B) in the Project Pavilion was busy throughout the week. We had conversations with teams already using OpenFeature in production, folks evaluating it for the first time, and contributors looking to get more involved. We even learned that OpenFeature is helping feature flag kitchen appliances, turns out your next recipe might be behind a flag. It's always valuable to hear directly from users about what's working and where the gaps are.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-person-discussions">In-Person Discussions<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap#in-person-discussions" class="hash-link" aria-label="Direct link to In-Person Discussions" title="Direct link to In-Person Discussions" translate="no">​</a></h2>
<img src="https://openfeature.dev/assets/images/discussions-685cd1c71885fb5b2bae1708934a9292.jpeg">
<p>One of the highlights of having so many maintainers and contributors in one place was the opportunity to hold focused, in-person discussions on key topics. We scheduled these throughout the week near our booth, and the turnout and quality of conversation was excellent. Below are summaries of each discussion.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="experimentation">Experimentation<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap#experimentation" class="hash-link" aria-label="Direct link to Experimentation" title="Direct link to Experimentation" translate="no">​</a></h3>
<p>The experimentation discussion focused on what OpenFeature needs to better support experimentation use cases. Today, the SDK surface area for experimentation is limited to custom hooks and the tracking API, with an implicit link through the targeting key.</p>
<p><strong>Key themes:</strong></p>
<ul>
<li class="">
<p><strong><a href="https://github.com/open-feature/spec/issues/370" target="_blank" rel="noopener noreferrer" class="">Standardized context for experimentation</a>:</strong> Multiple participants identified that having only a targeting key is limiting. There may be a need for well-understood metadata fields (browser, geo, device type) similar to semantic conventions in OpenTelemetry, so systems can map these consistently. This aligns with the existing <a href="https://github.com/open-telemetry/semantic-conventions" target="_blank" rel="noopener noreferrer" class="">Feature Flag Semantic Conventions SIG</a> work in OTel.</p>
</li>
<li class="">
<p><strong><a href="https://github.com/open-feature/spec/issues/371" target="_blank" rel="noopener noreferrer" class="">Evaluation metrics in the SDK</a>:</strong> There was interest in having the SDK produce basic evaluation metrics (e.g. per flag key, by targeting reason, unique targeting keys) that analytics vendors could consume. This could be an official hook we publish rather than new API surface, since it's buildable with hooks today.</p>
</li>
<li class="">
<p><strong><a href="https://github.com/open-feature/spec/issues/370" target="_blank" rel="noopener noreferrer" class="">Experiment grouping</a>:</strong> Several participants described models where experimentation is a separate concept from feature flags, with a 1-to-N mapping between experiments and flags. There's currently no standard way in OpenFeature to describe grouped flags that share targeting under a shared experiment ID. Flag metadata could carry experiment associations, but this isn't standardized yet.</p>
</li>
<li class="">
<p><strong>Tracking API in OFREP:</strong> The question of whether OFREP should have an endpoint for collecting tracking events is an open topic.</p>
</li>
<li class="">
<p><strong>Making experimentation more visible:</strong> The group agreed OpenFeature should more explicitly communicate that it supports experimentation. Better messaging, blog posts, and validation with vendors are next steps.</p>
</li>
</ul>
<p><strong>Action items:</strong></p>
<ul>
<li class="">Gather feedback from vendors on what's missing in the SDKs (<a href="https://github.com/open-feature/spec/issues/370" target="_blank" rel="noopener noreferrer" class="">spec#370</a>)</li>
<li class="">Explore an OFREP API for tracking/event collection (<a href="https://github.com/open-feature/protocol/issues/71" target="_blank" rel="noopener noreferrer" class="">protocol#71</a>)</li>
<li class="">Add tracking to the OFREP demo</li>
<li class="">Improve experimentation messaging/documentation on the website (<a href="https://github.com/open-feature/openfeature.dev/issues/1362" target="_blank" rel="noopener noreferrer" class="">openfeature.dev#1362</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ofrep">OFREP<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap#ofrep" class="hash-link" aria-label="Direct link to OFREP" title="Direct link to OFREP" translate="no">​</a></h3>
<p>The OFREP discussion covered several active topics as the protocol approaches its 1.0 target.</p>
<p><strong>Key themes:</strong></p>
<ul>
<li class="">
<p><strong><a href="https://github.com/open-feature/protocol/issues/62" target="_blank" rel="noopener noreferrer" class="">SSE for change notifications</a>:</strong> The SSE proposal has been merged and implementation is starting. The goal is a generic interface for notifying OFREP clients that their configurations are stale and they need to refetch. Polling will remain as an option but won't be the default.</p>
</li>
<li class="">
<p><strong><a href="https://github.com/open-feature/protocol/issues/65" target="_blank" rel="noopener noreferrer" class="">Local caching for client-side SDKs</a>:</strong> Currently there's no standardized way to do caching with OFREP. A caching API needs to be defined so clients can persist configurations and know when to flush.</p>
</li>
<li class="">
<p><strong><a href="https://github.com/open-feature/protocol/issues/70" target="_blank" rel="noopener noreferrer" class="">Routing and session affinity</a>:</strong> The current POST-based API makes load balancing harder since routing requires parsing the body. The group discussed adding a hash of the targeting key to a request header to enable routing without exposing PII. An ADR will be created for this.</p>
</li>
<li class="">
<p><strong><a href="https://github.com/open-feature/protocol/issues/71" target="_blank" rel="noopener noreferrer" class="">Tracking support</a>:</strong> The group discussed whether OFREP should define an event endpoint. Pre-aggregation on the client side, configurable flush intervals, and bulk payloads were discussed as implementation considerations. The evaluation response could include the events endpoint URL, letting the provider enable tracking conditionally.</p>
</li>
<li class="">
<p><strong><a href="https://github.com/open-feature/protocol/issues/72" target="_blank" rel="noopener noreferrer" class="">OpenAPI vs gRPC</a>:</strong> Some participants noted that their organizations require gRPC for public APIs. An issue will be opened to explore gRPC definitions for OFREP.</p>
</li>
<li class="">
<p><strong>Timeline:</strong> The target is OFREP 1.0 by Q2 2026.</p>
</li>
</ul>
<p><strong>Action items:</strong></p>
<ul>
<li class="">ADR for targeting key hash in request headers (<a href="https://github.com/open-feature/protocol/issues/70" target="_blank" rel="noopener noreferrer" class="">protocol#70</a>)</li>
<li class="">Tracking endpoint for OFREP (<a href="https://github.com/open-feature/protocol/issues/71" target="_blank" rel="noopener noreferrer" class="">protocol#71</a>)</li>
<li class="">gRPC definitions for OFREP (<a href="https://github.com/open-feature/protocol/issues/72" target="_blank" rel="noopener noreferrer" class="">protocol#72</a>)</li>
<li class="">Reintroduce OFREP SIG meetings</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="flagd">flagd<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap#flagd" class="hash-link" aria-label="Direct link to flagd" title="Direct link to flagd" translate="no">​</a></h3>
<p>The flagd discussion covered both the current feature roadmap and a longer-term vision for the evaluation engine.</p>
<p><strong>Current priorities:</strong></p>
<ul>
<li class="">
<p><strong>Feature set, precision, nesting, and rollouts:</strong> Todd outlined the active work areas. There's consensus on what needs to land, including fractional precision improvements.</p>
</li>
<li class="">
<p><strong>Vision: stay minimalistic.</strong> The group reaffirmed that flagd should remain focused. There were discussions around making manual writing of rule sets easier and how targeting rules are authored with rule-builders.</p>
</li>
</ul>
<p><strong>Pain points:</strong></p>
<ul>
<li class="">OpenTelemetry integration gaps</li>
<li class="">Inconsistent behavior across language implementations</li>
<li class="">Missing language support (e.g. Perl)</li>
<li class="">Inconsistent reason codes across languages</li>
</ul>
<p><strong>Shared evaluation engine:</strong></p>
<p>The biggest topic was reducing cross-language inconsistencies by sharing the evaluation engine implementation. The group explored two approaches:</p>
<ul>
<li class=""><strong>WASM:</strong> Could provide a single engine across all languages, but there are real challenges around type behavior between languages, and support across platforms. The value of having a single shared code-base is real; how do we achieve it?</li>
</ul>
<p>The consensus was to drive toward a <strong>v1.0 milestone with defined test cases</strong> for evaluation behavior, ensuring consistency regardless of implementation approach.</p>
<p><strong>Action items:</strong></p>
<ul>
<li class="">Performance benchmarks and load testing, gate PRs on performance where applicable (<a href="https://github.com/open-feature/flagd/issues/1915" target="_blank" rel="noopener noreferrer" class="">flagd#1915</a>)</li>
<li class="">Enhance the ADR for the sync API; modularize and define what services are actually needed (<a href="https://github.com/open-feature/flagd/issues/1781" target="_blank" rel="noopener noreferrer" class="">flagd#1781</a>)</li>
<li class="">Changes to the sync API for 1.0 (agreed in principle)</li>
<li class="">Case-insensitive matching for evaluation (<a href="https://github.com/open-feature/flagd/issues/1916" target="_blank" rel="noopener noreferrer" class="">flagd#1916</a>)</li>
<li class="">Explore CNCF support for performance testing on dedicated machines (<a href="https://github.com/open-feature/flagd/issues/1915" target="_blank" rel="noopener noreferrer" class="">flagd#1915</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="otel-observability">OTel Observability<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap#otel-observability" class="hash-link" aria-label="Direct link to OTel Observability" title="Direct link to OTel Observability" translate="no">​</a></h3>
<p>The observability discussion focused on deepening the integration between OpenFeature and OpenTelemetry.</p>
<p><strong>Key themes:</strong></p>
<ul>
<li class="">
<p><strong><a href="https://github.com/open-feature/spec/issues/372" target="_blank" rel="noopener noreferrer" class="">Move OTel into the SDKs</a>:</strong> The group proposed moving telemetry from hooks into the SDKs natively. This would mean traces and metrics are built-in rather than requiring separate hook setup. Likely makes sense to include it in the flagd providers by default.</p>
</li>
<li class="">
<p><strong>Native vs hooks:</strong> There's a question of whether to extend the SDK API to include traces and metrics directly, or continue with the hook-based approach.</p>
</li>
<li class="">
<p><strong>Connecting flags and telemetry:</strong> A push for metrics semantic conventions specific to feature flags.</p>
</li>
<li class="">
<p><strong>flagd observability:</strong> Check existing ADRs and add OTel support to flagd providers directly. An ADR for event tracking is needed, including how computation/aggregation should work in flagd.</p>
</li>
</ul>
<p><strong>Action items:</strong></p>
<ul>
<li class="">Increase participation in the existing <a href="https://github.com/open-telemetry/semantic-conventions" target="_blank" rel="noopener noreferrer" class="">Feature Flag Semantic Conventions SIG</a> in OTel</li>
<li class="">Stabilize telemetry conventions to "stable" status</li>
<li class="">Push for feature flag metrics semantic conventions through the SIG</li>
<li class="">ADR for event tracking and computation in flagd</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-workflow-integrations">AI Workflow Integrations<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap#ai-workflow-integrations" class="hash-link" aria-label="Direct link to AI Workflow Integrations" title="Direct link to AI Workflow Integrations" translate="no">​</a></h3>
<p>The AI discussion explored how OpenFeature can better serve AI application developers and how the project itself can leverage AI tooling.</p>
<p><strong>OpenFeature for AI developers:</strong></p>
<ul>
<li class="">
<p><strong>MCP and Skills:</strong> The OpenFeature MCP server and related tooling can help AI application developers work with feature flags more naturally. The group discussed how to make these tools more discoverable and useful.</p>
</li>
<li class="">
<p><strong>Experimentation for AI workflows:</strong> How can developers use OpenFeature's experimentation capabilities to tweak models and manage AI workflow rollouts? This ties back to the experimentation discussion.</p>
</li>
<li class="">
<p><strong><a href="https://github.com/open-feature/protocol/issues/73" target="_blank" rel="noopener noreferrer" class="">Standards for flag creation</a>:</strong> Can we define a standard way for AI tools to create and manage feature flags? This would enable tighter integration with AI-assisted development workflows.</p>
</li>
</ul>
<p><strong>OpenFeature using AI:</strong></p>
<ul>
<li class="">Engage with the community to understand where AI tooling (e.g. write permissions, automated flag management) can add value to the project itself.</li>
<li class="">Validate that the community sees value in these directions before investing heavily.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="expanding-the-technical-committee">Expanding the Technical Committee<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap#expanding-the-technical-committee" class="hash-link" aria-label="Direct link to Expanding the Technical Committee" title="Direct link to Expanding the Technical Committee" translate="no">​</a></h3>
<p>The group discussed growing the Technical Committee (TC) to ensure broader representation and sustainable governance.</p>
<ul>
<li class=""><strong>Target size:</strong> The consensus is that the TC needs at least 5 members (currently 3).</li>
<li class=""><strong>Recruitment:</strong> Several maintainers will reach out to potential candidates within their organizations and the broader community. The goal is to bring in people who are already active contributors.</li>
<li class=""><strong>Vendor representation:</strong> The group would like to see representation from more vendors who are adopting OpenFeature, though timing depends on their level of involvement in the project.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h2>
<p>The discussions in Amsterdam gave us good direction on several fronts. Expect to see movement on OFREP 1.0, experimentation support, the shared flagd evaluation engine, and deeper OTel integration through the rest of the year. If any of these areas interest you, the best way to get involved is to join the relevant discussions:</p>
<ul>
<li class=""><a href="https://cloud-native.slack.com/archives/C0344AANLA1" target="_blank" rel="noopener noreferrer" class="">CNCF Slack #openfeature</a></li>
<li class=""><a class="" href="https://openfeature.dev/community/#community-meetings">Bi-weekly community meetings</a></li>
<li class=""><a href="https://github.com/open-feature" target="_blank" rel="noopener noreferrer" class="">GitHub</a></li>
</ul>
<p>Thanks to everyone who visited the booth, attended sessions, or joined our discussions throughout the week. We'll be at <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/" target="_blank" rel="noopener noreferrer" class="">KubeCon NA 2026</a> in Salt Lake City this November. Hope to see you there.</p>]]></content:encoded>
            <category>kubecon</category>
            <category>cncf</category>
            <category>recap</category>
        </item>
        <item>
            <title><![CDATA[OpenFeature at KubeCon + CloudNativeCon Europe 2026]]></title>
            <link>https://openfeature.dev/blog/kubecon-eu-2026</link>
            <guid>https://openfeature.dev/blog/kubecon-eu-2026</guid>
            <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Join OpenFeature at KubeCon EU 2026 in Amsterdam! Here's everything you need to know about our sessions, booth, community meetups, and recent project highlights.]]></description>
            <content:encoded><![CDATA[<p>KubeCon + CloudNativeCon Europe 2026 kicks off next week in <strong>Amsterdam, March 23-26</strong>, and the OpenFeature community will be there in force. Whether you're looking to catch a talk, chat with maintainers at our booth, or join us for evening drinks, here's everything you need to know.</p>
<img src="https://openfeature.dev/assets/images/kubecon-eu-26-724f8694c73df48b96444b6c8224ef23.png">
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sessions-at-kubecon">Sessions at KubeCon<a href="https://openfeature.dev/blog/kubecon-eu-2026#sessions-at-kubecon" class="hash-link" aria-label="Direct link to Sessions at KubeCon" title="Direct link to Sessions at KubeCon" translate="no">​</a></h2>
<p>OpenFeature maintainers and contributors are presenting across several sessions throughout the week:</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-secure-package-pipelines"><a href="https://sched.co/2EWfG" target="_blank" rel="noopener noreferrer" class="">Building Secure Package Pipelines</a><a href="https://openfeature.dev/blog/kubecon-eu-2026#building-secure-package-pipelines" class="hash-link" aria-label="Direct link to building-secure-package-pipelines" title="Direct link to building-secure-package-pipelines" translate="no">​</a></h3>
<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Speakers</strong></td><td>Andre Silva (LexisNexis Risk Solutions)</td></tr><tr><td><strong>Date</strong></td><td>Sunday, March 22</td></tr><tr><td><strong>Time</strong></td><td>16:05 - 16:40 CET</td></tr><tr><td><strong>Location</strong></td><td>Maintainer Summit -- Forum</td></tr></tbody></table>
<p>Andre will walk through creating a secure package pipeline that any open-source maintainer can achieve -- covering OIDC authentication, automated SBOM generation, cryptographic attestations, and automated releases with Release Please.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfeature-update-from-the-maintainers"><a href="https://sched.co/2EF4j" target="_blank" rel="noopener noreferrer" class="">OpenFeature Update From the Maintainers</a><a href="https://openfeature.dev/blog/kubecon-eu-2026#openfeature-update-from-the-maintainers" class="hash-link" aria-label="Direct link to openfeature-update-from-the-maintainers" title="Direct link to openfeature-update-from-the-maintainers" translate="no">​</a></h3>
<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Speakers</strong></td><td>Lukas Reining (codecentric AG), Andre Silva (LexisNexis Risk Solutions), Thomas Poignant (Gens de Confiance), Alexandra Oberaigner (Dynatrace)</td></tr><tr><td><strong>Date</strong></td><td>Wednesday, March 25</td></tr><tr><td><strong>Time</strong></td><td>11:45 - 12:15 CET</td></tr><tr><td><strong>Location</strong></td><td>E103-105</td></tr></tbody></table>
<p>Get the latest updates from the OpenFeature maintainers on what's new in the project and where things are headed. Bring your questions.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="18-bluetooth-controllers-walk-into-a-bar-observability--runtime-configuration-with-cncf-tools"><a href="https://kccnceu2026.sched.com/event/2CW7W" target="_blank" rel="noopener noreferrer" class="">18 Bluetooth Controllers Walk into a Bar: Observability &amp; Runtime Configuration with CNCF Tools</a><a href="https://openfeature.dev/blog/kubecon-eu-2026#18-bluetooth-controllers-walk-into-a-bar-observability--runtime-configuration-with-cncf-tools" class="hash-link" aria-label="Direct link to 18-bluetooth-controllers-walk-into-a-bar-observability--runtime-configuration-with-cncf-tools" title="Direct link to 18-bluetooth-controllers-walk-into-a-bar-observability--runtime-configuration-with-cncf-tools" translate="no">​</a></h3>
<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Speakers</strong></td><td>Simon Schrottner (Dynatrace), Manuel Timelthaler (Tractive)</td></tr><tr><td><strong>Date</strong></td><td>Thursday, March 26</td></tr><tr><td><strong>Time</strong></td><td>15:15 - 15:45 CET</td></tr><tr><td><strong>Location</strong></td><td>Auditorium -- KubeCon Main Schedule</td></tr></tbody></table>
<p>What happens when your "distributed system" is 18 PlayStation Move controllers on Bluetooth? Simon and Manuel explore observability challenges you'd never expect, using OpenFeature and OpenTelemetry to manage context-aware flags, intelligent sampling, and real-time telemetry in a physical party game.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="visit-our-booth">Visit Our Booth<a href="https://openfeature.dev/blog/kubecon-eu-2026#visit-our-booth" class="hash-link" aria-label="Direct link to Visit Our Booth" title="Direct link to Visit Our Booth" translate="no">​</a></h2>
<p>Stop by and chat with OpenFeature maintainers at our kiosk in the <strong>Project Pavilion (Halls 1-5)</strong>.</p>
<p><strong>Kiosk Number:</strong> P-10B</p>
<p><strong>Schedule:</strong></p>
<ul>
<li class=""><strong>Tuesday, March 24:</strong> 15:10 - 19:00 CET</li>
<li class=""><strong>Wednesday, March 25:</strong> 14:00 - 17:00 CET</li>
<li class=""><strong>Thursday, March 26:</strong> 12:30 - 14:00 CET</li>
</ul>
<p>We'll be there to answer questions, demo the latest features, and hear how you're using OpenFeature in your organization.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="meet-the-community">Meet the Community<a href="https://openfeature.dev/blog/kubecon-eu-2026#meet-the-community" class="hash-link" aria-label="Direct link to Meet the Community" title="Direct link to Meet the Community" translate="no">​</a></h2>
<p>A number of OpenFeature maintainers and contributors will be in Amsterdam throughout the week, and we're organizing informal evening meetups -- including drinks. If you'd like to join or help coordinate, hop into the <strong>#openfeature-kubecon</strong> channel on the <a href="https://cloud-native.slack.com/" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a>. It's a great opportunity to connect face-to-face with the people building the project.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-openfeature">What's New in OpenFeature<a href="https://openfeature.dev/blog/kubecon-eu-2026#whats-new-in-openfeature" class="hash-link" aria-label="Direct link to What's New in OpenFeature" title="Direct link to What's New in OpenFeature" translate="no">​</a></h2>
<p>A lot has happened since <a class="" href="https://openfeature.dev/blog/kubecon-na-2025-recap">KubeCon NA 2025</a>. Here are some of the highlights:</p>
<ul>
<li class="">
<p><strong>New Governance Committee members</strong> -- The 2026 elections have concluded and we're excited to welcome <a href="https://github.com/askpt" target="_blank" rel="noopener noreferrer" class="">Andre Silva</a> (LexisNexis Risk Solutions), <a href="https://github.com/jonathannorris" target="_blank" rel="noopener noreferrer" class="">Jonathan Norris</a> (Dynatrace), <a href="https://github.com/cupofcat" target="_blank" rel="noopener noreferrer" class="">Maks Osowski</a> (Google), and <a href="https://github.com/thomaspoignant" target="_blank" rel="noopener noreferrer" class="">Thomas Poignant</a> (Gens de Confiance) to the <a class="" href="https://openfeature.dev/community/community-members/#governance-board">Governance Board</a> for the 2026-2028 term.</p>
</li>
<li class="">
<p><strong>CNCF Training (LFS140)</strong> -- The official <a href="https://training.linuxfoundation.org/training/feature-flagging-with-openfeature-lfs140/" target="_blank" rel="noopener noreferrer" class="">Feature Flagging with OpenFeature</a> course is available on the Linux Foundation Training Platform.</p>
</li>
<li class="">
<p><strong>C++ SDK</strong> -- A new <a href="https://github.com/open-feature/cpp-sdk" target="_blank" rel="noopener noreferrer" class="">C++ SDK</a> is being bootstrapped with core API surfaces, provider management, and a Bazel build system.</p>
</li>
<li class="">
<p><strong>OpenFeature CLI</strong> -- The CLI continues to mature with a new <a href="https://github.com/open-feature/cli/releases" target="_blank" rel="noopener noreferrer" class=""><code>push</code> command</a> for syncing local flag definitions to remote providers, an improved <code>compare</code> command, and updated code generators.</p>
</li>
<li class="">
<p><strong>Multi-Provider support across SDKs</strong> -- Multi-Provider has shipped or is actively being developed in <a href="https://github.com/open-feature/js-sdk" target="_blank" rel="noopener noreferrer" class="">JS</a>, <a href="https://github.com/open-feature/java-sdk/releases/tag/v1.20.0" target="_blank" rel="noopener noreferrer" class="">Java</a>, <a href="https://github.com/open-feature/go-sdk/releases/tag/v1.17.0" target="_blank" rel="noopener noreferrer" class="">Go</a>, <a href="https://github.com/open-feature/dotnet-sdk/releases/tag/v2.10.0" target="_blank" rel="noopener noreferrer" class="">.NET</a>, <a href="https://github.com/open-feature/python-sdk" target="_blank" rel="noopener noreferrer" class="">Python</a>, <a href="https://github.com/open-feature/swift-sdk/releases/tag/0.5.0" target="_blank" rel="noopener noreferrer" class="">Swift</a>, and <a href="https://github.com/open-feature/kotlin-sdk" target="_blank" rel="noopener noreferrer" class="">Kotlin</a>, enabling powerful new use cases for combining multiple flag sources.</p>
</li>
<li class="">
<p><strong>flagd</strong> -- flagd has shipped several releases with major features including <a href="https://github.com/open-feature/flagd/releases" target="_blank" rel="noopener noreferrer" class="">multi-project selectors</a>, OAuth support for HTTP sync, array flag configurations, and a new memdb-based flag store.</p>
</li>
<li class="">
<p><strong>OpenFeature MCP Server</strong> -- A new <a href="https://github.com/open-feature/mcp" target="_blank" rel="noopener noreferrer" class="">MCP server</a> for integrating feature flags with AI/LLM tooling, now stabilizing with protocol schema updates and reliability improvements.</p>
</li>
<li class="">
<p><strong>Platform modernization</strong> -- .NET SDK upgraded to <a href="https://github.com/open-feature/dotnet-sdk/releases/tag/v2.11.0" target="_blank" rel="noopener noreferrer" class="">.NET 10</a>, Angular SDK reached <a href="https://github.com/open-feature/js-sdk" target="_blank" rel="noopener noreferrer" class="">v1.0+</a>, Go SDK moved to Go 1.25, and Python dropped 3.9 support.</p>
</li>
<li class="">
<p><strong>React <code>&lt;FeatureFlag&gt;</code> component</strong> -- The React SDK added a new <a href="https://github.com/open-feature/js-sdk" target="_blank" rel="noopener noreferrer" class="">declarative <code>&lt;FeatureFlag&gt;</code> component</a> for cleaner flag evaluation in React applications.</p>
</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-person-discussions">In-Person Discussions<a href="https://openfeature.dev/blog/kubecon-eu-2026#in-person-discussions" class="hash-link" aria-label="Direct link to In-Person Discussions" title="Direct link to In-Person Discussions" translate="no">​</a></h2>
<p>With so many maintainers and contributors in Amsterdam at the same time, we're organizing informal in-person discussion sessions around key topics for the project. If any of these topics interest you, come find us in the <strong>#openfeature-kubecon</strong> channel on the <a href="https://cloud-native.slack.com/" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a>.</p>
<p>Topics on the agenda include:</p>
<ul>
<li class=""><strong>Experimentation support</strong> -- advancing experimentation capabilities in OpenFeature</li>
<li class=""><strong>flagd changes</strong> -- rollout strategies, fractional granularity, and more</li>
<li class=""><strong>flagd common evaluation engine</strong> -- exploring a shared evaluation engine across flagd languages</li>
<li class=""><strong>OFREP</strong> -- SSE support and local caching changes</li>
<li class=""><strong>AI workflow integrations</strong> -- integrating feature flags into AI/ML workflows</li>
<li class=""><strong>Expanding the TC and growing maintainers</strong> -- building out the Technical Committee and onboarding new maintainers</li>
<li class=""><strong>OTel observability</strong> -- deeper integration with OpenTelemetry</li>
<li class=""><strong>C++ SDK</strong> -- roadmap and direction for the new C++ SDK</li>
</ul>
<p>These are open discussions -- all are welcome regardless of experience level.</p>
<hr>
<p>We're looking forward to seeing you in Amsterdam. If you haven't registered yet, there's still time:</p>
<p><strong><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/register/" target="_blank" rel="noopener noreferrer" class="">Register for KubeCon + CloudNativeCon Europe 2026</a></strong></p>
<p>Follow us on <a href="https://bsky.app/profile/openfeature.dev" target="_blank" rel="noopener noreferrer" class="">Bluesky</a>, <a href="https://www.linkedin.com/company/openfeature/" target="_blank" rel="noopener noreferrer" class="">LinkedIn</a>, and join the <a href="https://cloud-native.slack.com/archives/C0344AANLA1" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a> to connect with the community. See you in Amsterdam!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Welcoming the 2026-2028 OpenFeature Governance Board Members]]></title>
            <link>https://openfeature.dev/blog/governance-board-2026</link>
            <guid>https://openfeature.dev/blog/governance-board-2026</guid>
            <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The 2026 Governance Board elections have concluded. Meet the four new members joining the OpenFeature Governance Board for the 2026-2028 term.]]></description>
            <content:encoded><![CDATA[<p>The 2026 OpenFeature Governance Board elections have concluded, and we're pleased to announce the four members joining the board for the <strong>2026-2028 term</strong>: three new members and one re-elected member.
These individuals have been active contributors to the OpenFeature community and bring a range of perspectives from across the feature flagging ecosystem.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-governance-board-members">New Governance Board Members<a href="https://openfeature.dev/blog/governance-board-2026#new-governance-board-members" class="hash-link" aria-label="Direct link to New Governance Board Members" title="Direct link to New Governance Board Members" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="andré-silva----lexisnexis-risk-solutions">André Silva -- LexisNexis Risk Solutions<a href="https://openfeature.dev/blog/governance-board-2026#andr%C3%A9-silva----lexisnexis-risk-solutions" class="hash-link" aria-label="Direct link to André Silva -- LexisNexis Risk Solutions" title="Direct link to André Silva -- LexisNexis Risk Solutions" translate="no">​</a></h3>
<p><a href="https://github.com/askpt" target="_blank" rel="noopener noreferrer" class="">André</a> is a software engineer at LexisNexis Risk Solutions based in Dublin, Ireland.
He is a maintainer of the <a href="https://github.com/open-feature/dotnet-sdk" target="_blank" rel="noopener noreferrer" class="">OpenFeature .NET SDK</a> and a participant in the OpenTelemetry Semantic Conventions SIG, giving him a cross-project perspective on how observability and feature flagging standards intersect.
André is committed to growing the community through public speaking and blog posts, and brings firsthand experience with the challenges enterprises face when adopting feature flagging standards.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="jonathan-norris----dynatrace-re-elected">Jonathan Norris -- Dynatrace (re-elected)<a href="https://openfeature.dev/blog/governance-board-2026#jonathan-norris----dynatrace-re-elected" class="hash-link" aria-label="Direct link to Jonathan Norris -- Dynatrace (re-elected)" title="Direct link to Jonathan Norris -- Dynatrace (re-elected)" translate="no">​</a></h3>
<p><a href="https://github.com/jonathannorris" target="_blank" rel="noopener noreferrer" class="">Jonathan</a> is a Director of Software Engineering at Dynatrace, where he is helping lead the effort to build an OpenFeature-native feature management platform into the core Dynatrace product following the acquisition of DevCycle.
Previously Co-Founder and CTO of DevCycle and Taplytics, Jonathan has spent over twelve years building A/B testing and feature flagging products and has been a regular contributor to the OpenFeature project.
He was first elected to the Governance Board in 2024 and continues his service for a second term.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="maks-osowski----google">Maks Osowski -- Google<a href="https://openfeature.dev/blog/governance-board-2026#maks-osowski----google" class="hash-link" aria-label="Direct link to Maks Osowski -- Google" title="Direct link to Maks Osowski -- Google" translate="no">​</a></h3>
<p><a href="https://github.com/cupofcat" target="_blank" rel="noopener noreferrer" class="">Maks</a> is a software engineer at Google, where he is building Google's OpenFeature-first first-party and third-party feature flagging platform.
He brings a dual perspective to the board: strategic vision from a decade as a Product Manager across GKE, YouTube, and Google Docs, combined with hands-on technical depth as an OpenFeature contributor.
Maks is focused on flagd 1.0 readiness, multi-language reliability, and sustained community growth.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="thomas-poignant----gens-de-confiance">Thomas Poignant -- Gens de Confiance<a href="https://openfeature.dev/blog/governance-board-2026#thomas-poignant----gens-de-confiance" class="hash-link" aria-label="Direct link to Thomas Poignant -- Gens de Confiance" title="Direct link to Thomas Poignant -- Gens de Confiance" translate="no">​</a></h3>
<p><a href="https://github.com/thomaspoignant" target="_blank" rel="noopener noreferrer" class="">Thomas</a> is the CTO of Gens de Confiance, based in Paris, France, and a long-time member of the OpenFeature Technical Committee.
He is the creator and maintainer of <a href="https://gofeatureflag.org/" target="_blank" rel="noopener noreferrer" class="">GO Feature Flag</a>, an open-source flag management system that gives him a unique position bridging the gap between high-level specifications and practical implementation.
Thomas represents the voice of the open-source community in the feature management ecosystem.
He'll step down from role on the Technical Committee to join the Governance Board.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-governance-board">Full Governance Board<a href="https://openfeature.dev/blog/governance-board-2026#full-governance-board" class="hash-link" aria-label="Direct link to Full Governance Board" title="Direct link to Full Governance Board" translate="no">​</a></h2>
<p>With the new members seated, the full Governance Board for 2026 is:</p>
<table><thead><tr><th>Member</th><th>Organization</th><th>Term</th></tr></thead><tbody><tr><td><a href="https://github.com/askpt" target="_blank" rel="noopener noreferrer" class="">André Silva</a></td><td>LexisNexis Risk Solutions</td><td>2026-2028</td></tr><tr><td><a href="https://github.com/dabeeeenster" target="_blank" rel="noopener noreferrer" class="">Ben Rometsch</a></td><td>Flagsmith</td><td>2025-2027</td></tr><tr><td><a href="https://github.com/jonathannorris" target="_blank" rel="noopener noreferrer" class="">Jonathan Norris</a></td><td>Dynatrace</td><td>2026-2028</td></tr><tr><td><a href="https://github.com/cupofcat" target="_blank" rel="noopener noreferrer" class="">Maks Osowski</a></td><td>Google</td><td>2026-2028</td></tr><tr><td><a href="https://github.com/beeme1mr" target="_blank" rel="noopener noreferrer" class="">Michael Beemer</a></td><td>Dynatrace</td><td>2025-2027</td></tr><tr><td><a href="https://github.com/moredip" target="_blank" rel="noopener noreferrer" class="">Pete Hodgson</a></td><td>Independent</td><td>2025-2027</td></tr><tr><td><a href="https://github.com/thomaspoignant" target="_blank" rel="noopener noreferrer" class="">Thomas Poignant</a></td><td>Gens de Confiance</td><td>2026-2028</td></tr></tbody></table>
<p>For more details on the Governance Board's role and charter, see the <a class="" href="https://openfeature.dev/community/governance-charter">Governance Charter</a>.</p>
<p>Congratulations to André, Jonathan, Maks, and Thomas!</p>
<p>We also want to offer our sincere thanks to those who previously served on the Governance Committee.
Your time, care, and leadership helped shape OpenFeature into the healthy, collaborative community it is today.</p>
<p>Thank you to the broader community for participating in the election process.</p>
<p>Over the next few weeks, the Governance Committee will share its goals for the year ahead.
Stay tuned!</p>]]></content:encoded>
            <category>governance</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[KubeCon NA 2025 Recap and New CNCF Training]]></title>
            <link>https://openfeature.dev/blog/kubecon-na-2025-recap</link>
            <guid>https://openfeature.dev/blog/kubecon-na-2025-recap</guid>
            <pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[KubeCon NA 2025 Recap... and a Special Announcement!]]></description>
            <content:encoded><![CDATA[<p>What an incredible week!
KubeCon North America 2025 has officially finished up, and we're still reflecting on all the energy, conversations, and sessions.
If you couldn't make it, don't worry, we've got you covered with all the highlights as well as some exciting news...</p>
<img src="https://openfeature.dev/assets/images/sign-f5d9d89a5b04c1e97a19c97ef20b4468.jpg">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-successful-summit">A Successful Summit<a href="https://openfeature.dev/blog/kubecon-na-2025-recap#a-successful-summit" class="hash-link" aria-label="Direct link to A Successful Summit" title="Direct link to A Successful Summit" translate="no">​</a></h2>
<p>First off, a huge thank you to everyone who joined us at the OpenFeature Summit.
It was great to see a room full of users and contributors to the project.
We loved seeing so many of you there, asking thoughtful questions, and sharing your own experiences with feature flagging.
Thanks again to our summit sponsor, <a href="https://launchdarkly.com/" target="_blank" rel="noopener noreferrer" class="">LaunchDarkly</a>!</p>
<p>Check out the <a href="https://colocatedeventsna2025.sched.com/overview/type/OpenFeature+Summit" target="_blank" rel="noopener noreferrer" class="">summit summary page</a> for recordings and slide presentations.</p>
<img src="https://openfeature.dev/assets/images/session-d3ce1fad61cbae87e897a02507f15085.jpg">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="feature-flag-talks">Feature Flag Talks<a href="https://openfeature.dev/blog/kubecon-na-2025-recap#feature-flag-talks" class="hash-link" aria-label="Direct link to Feature Flag Talks" title="Direct link to Feature Flag Talks" translate="no">​</a></h2>
<p>We also hosted two incredible talks that were all about feature flags and OpenFeature.
Both sessions were well-attended, and questions and conversations kept going long after the talks ended.
It's clear that feature flagging is a hot topic, and we're thrilled to see so much interest in the space.</p>
<p>🔥 <a href="https://kccncna2025.sched.com/event/27FdI/feature-flags-suck-the-problems-with-feature-flagging-and-how-to-avoid-them-pete-hodgson-ph1" target="_blank" rel="noopener noreferrer" class="">Feature Flags Suck! - The Problems With Feature Flagging and How To Avoid Them</a></p>
<p>📈 <a href="https://kccncna2025.sched.com/event/27FfH/feature-flag-driven-development-seamlessly-integrate-feature-flags-into-your-sdlc-kris-coleman-testifysec-michael-beemer-dynatrace" target="_blank" rel="noopener noreferrer" class="">Feature Flag Driven Development: Seamlessly Integrate Feature Flags Into Your SDLC</a></p>
<img src="https://openfeature.dev/assets/images/talking-7ecddeff7428d91f8adaa3b12718a492.jpg">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-cncf-training-course-feature-flagging-with-openfeature">New CNCF Training Course: Feature Flagging with OpenFeature<a href="https://openfeature.dev/blog/kubecon-na-2025-recap#new-cncf-training-course-feature-flagging-with-openfeature" class="hash-link" aria-label="Direct link to New CNCF Training Course: Feature Flagging with OpenFeature" title="Direct link to New CNCF Training Course: Feature Flagging with OpenFeature" translate="no">​</a></h2>
<p align="center"><img src="https://openfeature.dev/assets/images/lfs140-17bda5cf6226713e3b13e4090c1e1bf9.png"></p>
<p>We're happy to announce the launch of our official CNCF training course: <a href="https://training.linuxfoundation.org/training/feature-flagging-with-openfeature-lfs140/" target="_blank" rel="noopener noreferrer" class="">Feature Flagging with OpenFeature (LFS140)</a>.
This course is perfect for developers and platform engineers who want to learn how to integrate feature flags into their workflows or enhance their apps and platforms with OpenFeature.
It covers everything from the basics of feature flagging to advanced use cases, and it's a great way to level up your skills.
Check it out!</p>
<img src="https://openfeature.dev/assets/images/booth-69eecdff6aa453890bfeb6dc45c8e910.jpg">
<p>As always, we were excited to hear about new adopters, stories, and usage of the OpenFeature project at the booth.
Thanks again to everyone who made KubeCon NA 2025 such an unforgettable experience.
Whether you joined us in person or follow along online, we're so grateful for your support.
Here's to continuing the conversation and building the future of feature flagging together!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Join OpenFeature at KubeCon + CloudNativeCon North America 2025!]]></title>
            <link>https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview</link>
            <guid>https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview</guid>
            <pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Get ready for KubeCon + CloudNativeCon North America 2025 in Atlanta, Georgia! Here's everything you need to know about the OpenFeature Summit and feature flag talks.]]></description>
            <content:encoded><![CDATA[<p>KubeCon + CloudNativeCon North America 2025 is just around the corner! Hosted in <strong>Atlanta, Georgia, from November 10-13</strong>, this year’s event is packed with exciting sessions and discussions. Again among the highlights is the <strong>OpenFeature Summit</strong>, a co-located event dedicated to feature flagging and progressive delivery.</p>
<img src="https://openfeature.dev/assets/images/kubecon-na-25-18107e923aa7dcba9cee1c2c201e97d7.png">
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfeature-summit-agenda"><strong>OpenFeature Summit Agenda</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#openfeature-summit-agenda" class="hash-link" aria-label="Direct link to openfeature-summit-agenda" title="Direct link to openfeature-summit-agenda" translate="no">​</a></h2>
<p>📅 <strong>Date:</strong> Monday, November 10, 2025<br>
<!-- -->📍 <strong>Location:</strong> Building B | Level 2 | B213-214</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="doctor-flag-into-the-kubernetes-featureverse-with-k0rdent-and-openfeature"><strong>Doctor Flag: Into the Kubernetes Featureverse with k0rdent and OpenFeature</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#doctor-flag-into-the-kubernetes-featureverse-with-k0rdent-and-openfeature" class="hash-link" aria-label="Direct link to doctor-flag-into-the-kubernetes-featureverse-with-k0rdent-and-openfeature" title="Direct link to doctor-flag-into-the-kubernetes-featureverse-with-k0rdent-and-openfeature" translate="no">​</a></h3>
<p><strong>Prithvi Raj (Mirantis)</strong><br>
<strong>Time:</strong> 1:35 PM EST</p>
<p>Discover how Kubernetes and OpenFeature can work together to create powerful feature flagging solutions. Learn about the integration of k0rdent with OpenFeature to simplify feature flagging in Kubernetes environments.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-ships-fast-and-breaks-things--feature-flags-keep-it-controlled"><strong>AI Ships Fast and Breaks Things — Feature Flags Keep It Controlled</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#ai-ships-fast-and-breaks-things--feature-flags-keep-it-controlled" class="hash-link" aria-label="Direct link to ai-ships-fast-and-breaks-things--feature-flags-keep-it-controlled" title="Direct link to ai-ships-fast-and-breaks-things--feature-flags-keep-it-controlled" translate="no">​</a></h3>
<p><strong>Jonathan Norris (DevCycle)</strong><br>
<strong>Time:</strong> 2:10 PM EST</p>
<p>Explore how feature flags can help manage the risks of deploying AI-driven changes at scale. Jonathan will share insights on using feature flags to enable faster iterations and controlled rollouts.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="feature-flag-driven-development-in-reverse"><strong>Feature Flag-Driven Development… in Reverse</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#feature-flag-driven-development-in-reverse" class="hash-link" aria-label="Direct link to feature-flag-driven-development-in-reverse" title="Direct link to feature-flag-driven-development-in-reverse" translate="no">​</a></h3>
<p><strong>Robert Erez (Octopus Deploy)</strong><br>
<strong>Time:</strong> 2:45 PM EST</p>
<p>Robert Erez will explore the concept of "reverse engineering" feature flag-driven development and provide a unique perspective on improving software delivery pipelines.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-what-broke-to-what-changed-unlocking-feature-flag-observability"><strong>From “What Broke?” To “What Changed?”: Unlocking Feature Flag Observability</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#from-what-broke-to-what-changed-unlocking-feature-flag-observability" class="hash-link" aria-label="Direct link to from-what-broke-to-what-changed-unlocking-feature-flag-observability" title="Direct link to from-what-broke-to-what-changed-unlocking-feature-flag-observability" translate="no">​</a></h3>
<p><strong>Parth Suthar (DevCycle) &amp; Michael Beemer (Dynatrace)</strong><br>
<strong>Time:</strong> 3:25 PM EST</p>
<p>Learn how feature flags can enhance observability, helping teams quickly identify and address issues in their applications. Parth and Michael will share practical examples of integrating feature flag observability into your workflows.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="blueprint-for-building-programmable-ci-pipelines-using-openfeature"><strong>Blueprint for Building Programmable CI Pipelines Using OpenFeature</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#blueprint-for-building-programmable-ci-pipelines-using-openfeature" class="hash-link" aria-label="Direct link to blueprint-for-building-programmable-ci-pipelines-using-openfeature" title="Direct link to blueprint-for-building-programmable-ci-pipelines-using-openfeature" translate="no">​</a></h3>
<p><strong>Gaurav Saxena</strong><br>
<strong>Time:</strong> 4:00 PM EST</p>
<p>Gaurav Saxena will share a detailed blueprint for creating programmable CI pipelines using OpenFeature, showcasing how to streamline development workflows and improve efficiency.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="skip-the-deployment-queue-automated-rollouts-and-rollbacks-using-openfeature"><strong>Skip the Deployment Queue: Automated Rollouts and Rollbacks Using OpenFeature</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#skip-the-deployment-queue-automated-rollouts-and-rollbacks-using-openfeature" class="hash-link" aria-label="Direct link to skip-the-deployment-queue-automated-rollouts-and-rollbacks-using-openfeature" title="Direct link to skip-the-deployment-queue-automated-rollouts-and-rollbacks-using-openfeature" translate="no">​</a></h3>
<p><strong>Ekansh Gupta (SigNoz) &amp; Shivay Lamba (Couchbase)</strong><br>
<strong>Time:</strong> 4:35 PM EST</p>
<p>Ekansh Gupta and Shivay Lamba will discuss strategies for automating rollouts and rollbacks with OpenFeature, enabling teams to deploy more confidently and effectively.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lightning-talk-no-more-if-else-soup-scalable-feature-flag-architecture-with-design-patterns"><strong>Lightning Talk: No More If-Else Soup: Scalable Feature Flag Architecture With Design Patterns</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#lightning-talk-no-more-if-else-soup-scalable-feature-flag-architecture-with-design-patterns" class="hash-link" aria-label="Direct link to lightning-talk-no-more-if-else-soup-scalable-feature-flag-architecture-with-design-patterns" title="Direct link to lightning-talk-no-more-if-else-soup-scalable-feature-flag-architecture-with-design-patterns" translate="no">​</a></h3>
<p><strong>Gaurika Poplai (Microsoft)</strong><br>
<strong>Time:</strong> 5:05 PM EST</p>
<p>Gaurika Poplai will deliver an engaging lightning talk on how to design scalable feature flag architectures using proven design patterns.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-feature-flag-talks-at-kubecon"><strong>Key Feature Flag Talks at KubeCon</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#key-feature-flag-talks-at-kubecon" class="hash-link" aria-label="Direct link to key-feature-flag-talks-at-kubecon" title="Direct link to key-feature-flag-talks-at-kubecon" translate="no">​</a></h2>
<p>In addition to the OpenFeature Summit, don’t miss these exciting feature flag-focused sessions during KubeCon + CloudNativeCon:</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="feature-flags-suck---the-problems-with-feature-flagging-and-how-to-avoid-them"><strong>Feature Flags Suck! - The Problems With Feature Flagging and How To Avoid Them</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#feature-flags-suck---the-problems-with-feature-flagging-and-how-to-avoid-them" class="hash-link" aria-label="Direct link to feature-flags-suck---the-problems-with-feature-flagging-and-how-to-avoid-them" title="Direct link to feature-flags-suck---the-problems-with-feature-flagging-and-how-to-avoid-them" translate="no">​</a></h3>
<p><strong>Speaker:</strong> Pete Hodgson (PH1)<br>
<strong>Time:</strong> Thursday, November 13, 11:00 AM - 11:30 AM EST<br>
<strong>Location:</strong> Building B | Level 5 | Thomas Murphy Ballroom 2-3</p>
<p>Pete Hodgson will dive into the common pitfalls of feature flagging and how to avoid them. Learn how to manage feature flags effectively and leverage CNCF's OpenFeature project to streamline your workflows.</p>
<p><a href="https://kccncna2025.sched.com/event/27FdI/feature-flags-suck-the-problems-with-feature-flagging-and-how-to-avoid-them-pete-hodgson-ph1?iframe=no&amp;w=&amp;sidebar=yes&amp;bg=no" target="_blank" rel="noopener noreferrer" class="">Read more about this session here.</a></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="feature-flag-driven-development-seamlessly-integrate-feature-flags-into-your-sdlc"><strong>Feature Flag Driven Development: Seamlessly Integrate Feature Flags Into Your SDLC</strong><a href="https://openfeature.dev/blog/kubecon-na-2025-openfeature-summit-preview#feature-flag-driven-development-seamlessly-integrate-feature-flags-into-your-sdlc" class="hash-link" aria-label="Direct link to feature-flag-driven-development-seamlessly-integrate-feature-flags-into-your-sdlc" title="Direct link to feature-flag-driven-development-seamlessly-integrate-feature-flags-into-your-sdlc" translate="no">​</a></h3>
<p><strong>Speakers:</strong> Kris Coleman (TestifySec) &amp; Michael Beemer (Dynatrace)<br>
<strong>Time:</strong> Thursday, November 13, 3:15 PM - 3:45 PM EST<br>
<strong>Location:</strong> Building B | Level 4 | B406b-407</p>
<p>Kris Coleman and Michael Beemer will introduce Feature Flag Driven Development (FFDD), a groundbreaking workflow that integrates feature flag management into the SDLC. Their demo will showcase how FFDD leverages CNCF's OpenFeature spec and tools like the OpenFeature CLI to enable type-safe, GitOps-driven flag promotion.</p>
<p><a href="https://kccncna2025.sched.com/event/27FfH/feature-flag-driven-development-seamlessly-integrate-feature-flags-into-your-sdlc-kris-coleman-testifysec-michael-beemer-dynatrace?iframe=no&amp;w=&amp;sidebar=yes&amp;bg=no" target="_blank" rel="noopener noreferrer" class="">Read more about this session here.</a></p>
<hr>
<p>We’re excited to see you at <strong>KubeCon + CloudNativeCon North America 2025</strong> and the <strong>OpenFeature Summit</strong>! Don’t miss this chance to connect with the OpenFeature community, learn from industry leaders, and explore the future of feature flagging.</p>
<p>👉 <strong><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/register/" target="_blank" rel="noopener noreferrer" class="">Register for KubeCon + CloudNativeCon North America 2025</a></strong> 👈</p>
<p>Follow us on <a href="https://twitter.com/openfeature" target="_blank" rel="noopener noreferrer" class="">Twitter</a> or <a href="https://bsky.app/profile/openfeature.dev" target="_blank" rel="noopener noreferrer" class="">Bluesky</a> for live updates during the event. See you in Atlanta!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Scaling Feature Flags eBook: A Roadmap for Safer Releases & Faster Development]]></title>
            <link>https://openfeature.dev/blog/scaling-feature-flags-ebook</link>
            <guid>https://openfeature.dev/blog/scaling-feature-flags-ebook</guid>
            <pubDate>Fri, 13 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[I’m excited to share this collaborative guide from Flagsmith (featuring insights from OpenFeature & eBay) on how to scale feature flags while fighting vendor lock-in!]]></description>
            <content:encoded><![CDATA[<p>I’m excited to share this collaborative guide from Flagsmith (featuring insights from OpenFeature &amp; eBay) on how to scale feature flags while fighting vendor lock-in!</p>
<p>As engineering teams contend with the constant demand for increased speed and efficiency in their development practices, the rules around compliance and security remain rigid. This presents one of the core problems we see teams struggling with today:</p>
<p><strong>How can we move fast, with safety?</strong></p>
<p>Pete Hodgson, OpenFeature Governance Board Member, poses this question in his foreword for the <a href="https://143451822.fs1.hubspotusercontent-eu1.net/hubfs/143451822/eBooks/eBook:%20Scaling%20Feature%20Flags%20-%20A%20Roadmap%20for%20Safer%20Releases%20&amp;%20Faster%20Development.pdf" target="_blank" rel="noopener noreferrer" class="">new guide</a> the <a href="https://www.flagsmith.com/" target="_blank" rel="noopener noreferrer" class="">Flagsmith</a> team put together with OpenFeature and eBay.</p>
<p><a href="https://143451822.fs1.hubspotusercontent-eu1.net/hubfs/143451822/eBooks/eBook:%20Scaling%20Feature%20Flags%20-%20A%20Roadmap%20for%20Safer%20Releases%20&amp;%20Faster%20Development.pdf" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Scaling Feature Flags eBook" src="https://openfeature.dev/assets/images/scaling-feature-flags-ebook-096b474d8db23f055247cfa04e40517e.png" width="1200" height="628" class="img_ev3q"></a></p>
<p>For large organisations operating in complex or regulated environments, the question is particularly salient. Feature flags form part of the answer (in support of Continuous Delivery), but only if introduced in the right way. Large organisations face a steep learning curve when introducing any new technology, and feature flags are no exception.</p>
<p>Because feature flags live deep in your codebase, it’s important to introduce them in a thoughtful and strategic way, avoiding locking you into bad habits or specific vendors.</p>
<p><strong>Feature flags are more of a social innovation than a technical one. Their real magic is revealed when they’re introduced to an organisation at scale—impacting the very way software gets built.</strong> The technology is only half the battle. Determining how to use it, who can use it, and how to drive adoption successfully is just as important.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-a-strong-foundation-for-feature-flags">Building a strong foundation for feature flags<a href="https://openfeature.dev/blog/scaling-feature-flags-ebook#building-a-strong-foundation-for-feature-flags" class="hash-link" aria-label="Direct link to Building a strong foundation for feature flags" title="Direct link to Building a strong foundation for feature flags" translate="no">​</a></h2>
<p>Doing a good job of introducing any new technology into a large organisation starts with people—the people behind the technology and the internal teams who will adopt it.</p>
<p>Introducing feature flags will fundamentally change the way you build software, so pulling in the right stakeholders from the beginning is important. Start by creating a working group with representatives from your engineering, QA, product, and DevOps/infrastructure teams.</p>
<p>Additionally, you’ll need full executive buy-in to bring flags on at scale. This is true from a budget perspective but, just as importantly, from a time perspective, too. Part of the reason the eBay team was so successful with their <a href="https://143451822.fs1.hubspotusercontent-eu1.net/hubfs/143451822/eBooks/eBook:%20Scaling%20Feature%20Flags%20-%20A%20Roadmap%20for%20Safer%20Releases%20&amp;%20Faster%20Development.pdf" target="_blank" rel="noopener noreferrer" class="">OpenFeature adoption</a> is because they were given full license to use engineering hours to get it done.</p>
<p>Budget for this time up front and create a plan with specific milestones and owners—as well as a strict timeline, so that the project keeps moving forward. Ensure this plan is shared at a company level, so that those involved are motivated to stay on time and on track.</p>
<p>eBay leaned into three main levers to drive organisational-wide adoption:</p>
<ol>
<li class="">Identifying initial influencers to pilot with: They identified key internal influencers, working to form a group of diverse and motivated individuals. Gradually, as the team collected and iterated on initial feedback from these developers, they prepared to scale it to other teams.</li>
<li class="">Scaling the pilot programme: They identified 21 different teams to run multiple pilots with to learn and create the roadmap for a feature flag MVP. They did three rounds of pilots over three quarters, focusing on building product-market fit internally:</li>
<li class="">Finding success &amp; building the MVP: Once they had completed the final round of feedback, they started preparing the MVP, which, once ready, they had to roll out to everyone. No small feat at a company the size of eBay.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tailoring-feature-flags-to-your-organisations-needs">Tailoring feature flags to your organisation’s needs<a href="https://openfeature.dev/blog/scaling-feature-flags-ebook#tailoring-feature-flags-to-your-organisations-needs" class="hash-link" aria-label="Direct link to Tailoring feature flags to your organisation’s needs" title="Direct link to Tailoring feature flags to your organisation’s needs" translate="no">​</a></h2>
<p>As you begin to determine how to introduce feature flags into your release processes, ensure your team is familiar with the different kinds of flags as well as best practices to keep your flags healthy and reduce tech debt. Feature flags can become an anti-pattern if over-engineered, so be sure to familiarise yourself with the different <a href="https://143451822.fs1.hubspotusercontent-eu1.net/hubfs/143451822/eBooks/eBook:%20Scaling%20Feature%20Flags%20-%20A%20Roadmap%20for%20Safer%20Releases%20&amp;%20Faster%20Development.pdf" target="_blank" rel="noopener noreferrer" class="">types of flags and lifecycles</a>.</p>
<p>Another best practice for getting up and running with flags is to identify the simplest possible use case, start there, and then gradually introduce them more widely and in more complex use cases.</p>
<p>Creating governance for your feature flag usage is going to be a key part of this adoption. This article is a sneak preview of the full guide on scaling feature flags.</p>
<p>If you enjoyed it and want to read on, you can download the full (ungated) guide with the case study <a href="https://143451822.fs1.hubspotusercontent-eu1.net/hubfs/143451822/eBooks/eBook:%20Scaling%20Feature%20Flags%20-%20A%20Roadmap%20for%20Safer%20Releases%20&amp;%20Faster%20Development.pdf" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>]]></content:encoded>
            <category>blog</category>
            <category>scaling</category>
            <category>feature flags</category>
            <category>ebook</category>
            <category>flagsmith</category>
        </item>
        <item>
            <title><![CDATA[TLDR: KubeCon EU 2025]]></title>
            <link>https://openfeature.dev/blog/tldr-kubecon-london</link>
            <guid>https://openfeature.dev/blog/tldr-kubecon-london</guid>
            <pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[KubeCon EU 2025 Summary]]></description>
            <content:encoded><![CDATA[<p>Hello from the OpenFeature community! This post wraps up KubeCon EU 2025 and The OpenFeature Summit.</p>
<img src="https://openfeature.dev/assets/images/london-74b5a73a336093f2e89e833c7a034d80.png">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tldr-kubecon-eu-2025">TLDR: KubeCon EU 2025<a href="https://openfeature.dev/blog/tldr-kubecon-london#tldr-kubecon-eu-2025" class="hash-link" aria-label="Direct link to TLDR: KubeCon EU 2025" title="Direct link to TLDR: KubeCon EU 2025" translate="no">​</a></h2>
<p>This year's KubeCon EU was located in London, where I happen to live, giving me the opportunity to attend KubeCon EU for the first time. I had a wonderful time finally meeting fellow OpenFeature maintainers face-to-face and connecting with users of OpenFeature.</p>
<p>This year we saw a growth of interest in OpenFeature, and heard stories of people using OpenFeature in their own products. The OpenFeature booth at the project pavillion buzzed with activity, plenty of knowledge shared and the power of OpenFeature shared with interested people.</p>
<img src="https://openfeature.dev/assets/images/photo2-164c476d260da794bc2c7d5eb4ea6785.jpg">
<p>For a second time at KubeCon our dedicated, co-located event, <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/co-located-events/openfeature-summit">The OpenFeature Summit</a> took place the day before KubeCon EU 2025 itself. The summit featured great talks and speakers. I would like to point of a few of these talks:</p>
<ul>
<li class="">
<p><a href="https://www.youtube.com/watch?v=lEXm6k2wpG4&amp;t=1658s">▶️ OpenFeature Update From the Maintainers - Thomas Poignant, Lukas Reining &amp; Alexandra Oberaigner</a> Latest updates what happened in the world of OpenFeature.</p>
</li>
<li class="">
<p><a href="https://www.youtube.com/watch?v=pvjmPTTyCfc">▶️ OpenFeature’s Positive Impact on Confidence at Dynatrace - Simon Schrottner &amp; Todd Baert, Dynatrace </a> by Simon Schrottner &amp; Todd Baert from Dynatrace gave a great presentation about how they internally use the different OpenFeature offerings like flagd, OpenFeature SDKs</p>
</li>
<li class="">
<p><a href="https://www.youtube.com/watch?v=8P1_VIErKYk">▶️ Canary Deployments Are a Myth - True Progressive Delivery Occurs Via OpenFeature - Bob Walker, Octopus Deploy</a> by Bob Walker from Octopus Deploy described how they solved they delivery problems using OpenFeature and feature flags. A deep dive how flags can help with deploying releases in a safe and convenient manner. Tip! A longer version of this talk is available as part of KubeCon EU 2025.</p>
</li>
<li class="">
<p><a href="https://www.youtube.com/watch?v=R2s54KCsQMg">▶️ Lightning Talk: OpenFeature Multi-Provider: Enabling New Feature Flagging Use-Cases</a> by Jonathan Norris from DevCycle. A talk about ways you can use the new Multi-Provider to your benefit, like to migrate away from feature flag solution to your new one.</p>
</li>
<li class="">
<p><a href="https://www.youtube.com/watch?v=6stsemAoBHA">▶️ Challenges in Distributed Feature Flag Evaluation and How To Solve Them Lukas Reining &amp; Christopher Bohlen, codecentric AG </a> by Lukas Reinig &amp; Christopher Bohlen from codecentric AG. In this talk we got into the nitty gritty of feature flags that span multiple services, and saw multiple proposals how we can ensure the feature flag evaluations are consistent between the services.</p>
</li>
</ul>
<img src="https://openfeature.dev/assets/images/photo3-f1761bd6bc8523b036d73dcfa1700700.jpg">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introducing-openfeature-cli">Introducing OpenFeature CLI<a href="https://openfeature.dev/blog/tldr-kubecon-london#introducing-openfeature-cli" class="hash-link" aria-label="Direct link to Introducing OpenFeature CLI" title="Direct link to Introducing OpenFeature CLI" translate="no">​</a></h2>
<p>During the conference we also introduced our latest creation, OpenFeature CLI, which streamlines how feature flags are managed within your codebase. The tool generates a type-safe OpenFeature client based on a flags manifest file that either can be pulled from supported feature flag systems or sourced from a JSON file.</p>
<img src="https://openfeature.dev/assets/images/photo1-f04ee5d374157a87acbc64ae4223226d.jpg">
<p>With OpenFeature CLI, developers can:</p>
<ul>
<li class="">Generate a strongly-typed client, custom-built for your specific feature flags, in Typescript, Python or C# (with more to come!)</li>
<li class="">Validate flag configurations against schemas</li>
<li class="">Seamlessly integrate with existing CI/CD pipelines</li>
</ul>
<p>The CLI represents our commitment to improving developer experience and making feature flag management more accessible to teams of all sizes. It's designed to work alongside your existing tools and workflows with minimal friction.</p>
<p>In a separate article, we will dive deeper into the goals of <code>openfeature-cli</code> and how it can improve a developer's experience working with feature flags. Stay tuned for a hands-on tutorial.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://openfeature.dev/blog/tldr-kubecon-london#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>KubeCon EU 2025 was a milestone event for the OpenFeature community. The growing adoption of OpenFeature across diverse organizations demonstrates the industry's recognition of standardized feature flagging as a critical component of modern software delivery.</p>
<p>We'd like to thank everyone who visited our booth, attended the summit, or participated in OpenFeature-related discussions throughout the conference. Your enthusiasm and feedback drive our project forward.</p>
<p>We'd love to welcome you into <a class="" href="https://openfeature.dev/community/">the OpenFeature community</a>. You can join our <a href="https://cloud-native.slack.com/archives/C0344AANLA1" target="_blank" rel="noopener noreferrer" class="">Slack channel</a>, attend our <a class="" href="https://openfeature.dev/community/#community-meetings">bi-weekly community meeting</a> or just check out our <a href="https://github.com/open-feature" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="impressions">Impressions<a href="https://openfeature.dev/blog/tldr-kubecon-london#impressions" class="hash-link" aria-label="Direct link to Impressions" title="Direct link to Impressions" translate="no">​</a></h2>
<img src="https://openfeature.dev/assets/images/photo4-0b797939b3c77fc073634872275a90d0.jpg">
<img src="https://openfeature.dev/assets/images/photo5-db819e4be7a2b1b4a66bebc02d4ac8c6.jpg">
<img src="https://openfeature.dev/assets/images/photo6-9519af540c24e326c6976d8857481464.jpg">]]></content:encoded>
            <category>kubecon</category>
            <category>cncf</category>
            <category>session</category>
            <category>talk</category>
            <category>booth</category>
            <category>OpenFeature summit</category>
            <category>co-located</category>
        </item>
        <item>
            <title><![CDATA[Sentry OpenFeature Integration]]></title>
            <link>https://openfeature.dev/blog/sentry-openfeature-integration</link>
            <guid>https://openfeature.dev/blog/sentry-openfeature-integration</guid>
            <pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Announcing Sentry's OpenFeature integration for enhanced feature flag observability]]></description>
            <content:encoded><![CDATA[<p>We're excited to announce that Sentry has released OpenFeature Hooks for <a href="https://docs.sentry.io/platforms/javascript/configuration/integrations/openfeature/" target="_blank" rel="noopener noreferrer" class="">JavaScript</a> and <a href="https://docs.sentry.io/platforms/python/integrations/openfeature/" target="_blank" rel="noopener noreferrer" class="">Python</a>, enabling developers to track feature flag evaluations directly in their error monitoring and performance tracking.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-the-sentry-openfeature-integration">What is the Sentry OpenFeature Integration?<a href="https://openfeature.dev/blog/sentry-openfeature-integration#what-is-the-sentry-openfeature-integration" class="hash-link" aria-label="Direct link to What is the Sentry OpenFeature Integration?" title="Direct link to What is the Sentry OpenFeature Integration?" translate="no">​</a></h2>
<p>The Sentry OpenFeature Hook allows Sentry to track feature flag evaluations within your application.
When an error occurs, Sentry will include the state of all evaluated feature flags in the error report, providing crucial context for debugging and troubleshooting.</p>
<p>This integration is currently in beta and only supports boolean flag evaluations.
See their <a href="https://changelog.sentry.dev/changelog/view-distributions-of-feature-flag-evaluations-inside-issue-details/" target="_blank" rel="noopener noreferrer" class="">changelog</a> for details on how feature flags are integrated into their platform.</p>
<img src="https://openfeature.dev/assets/images/sentry_dashboard-b9d8e9f8df48b82ca6375e2ec8bb61cf.png">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="javascript-integration">JavaScript Integration<a href="https://openfeature.dev/blog/sentry-openfeature-integration#javascript-integration" class="hash-link" aria-label="Direct link to JavaScript Integration" title="Direct link to JavaScript Integration" translate="no">​</a></h2>
<p>To use the Sentry OpenFeature Hook in your JavaScript application:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">*</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">as</span><span class="token plain"> Sentry </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"@sentry/browser"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> OpenFeature </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"@openfeature/web-sdk"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Sentry</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">init</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  dsn</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"https://examplePublicKey@o0.ingest.sentry.io/0"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  integrations</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain">Sentry</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">openFeatureIntegration</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">setProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyProviderOfChoice</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">addHooks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Sentry</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">OpenFeatureIntegrationHook</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> result </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getBooleanValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"test-flag"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// evaluate with a default value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Sentry</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">captureException</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Error</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Something went wrong!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<blockquote>
<p>Requirements: Sentry SDK version 8.43.0 or higher</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="python-integration">Python Integration<a href="https://openfeature.dev/blog/sentry-openfeature-integration#python-integration" class="hash-link" aria-label="Direct link to Python Integration" title="Direct link to Python Integration" translate="no">​</a></h2>
<p>For Python applications, you can use the Sentry OpenFeature Hook as follows:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> sentry_sdk</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> sentry_sdk</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">integrations</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">openfeature </span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> OpenFeatureIntegration</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> openfeature </span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> api</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token operator" style="color:#d7deea">//</span><span class="token plain"> Initialize Sentry </span><span class="token keyword" style="color:#c5a5c5">with</span><span class="token plain"> the OpenFeature integration</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">sentry_sdk</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">init</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    dsn</span><span class="token operator" style="color:#d7deea">=</span><span class="token string" style="color:#8dc891">"https://examplePublicKey@o0.ingest.sentry.io/0"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    integrations</span><span class="token operator" style="color:#d7deea">=</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        OpenFeatureIntegration</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token operator" style="color:#d7deea">//</span><span class="token plain"> Get your OpenFeature client</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">get_client</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token operator" style="color:#d7deea">//</span><span class="token plain"> Evaluate a feature flag</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">get_boolean_value</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"hello"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> default_value</span><span class="token operator" style="color:#d7deea">=</span><span class="token boolean" style="color:#ff8b50">False</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token operator" style="color:#d7deea">//</span><span class="token plain"> If an error occurs</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> Sentry will include the feature flag state</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">sentry_sdk</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">capture_exception</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">Exception</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"Something went wrong!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre></div></div>
<blockquote>
<p>Requirements: sentry-sdk &gt;= 2.19.2, openfeature-sdk &gt;= 0.7.1, Python &gt;= 3.8</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-of-feature-flag-observability">Benefits of Feature Flag Observability<a href="https://openfeature.dev/blog/sentry-openfeature-integration#benefits-of-feature-flag-observability" class="hash-link" aria-label="Direct link to Benefits of Feature Flag Observability" title="Direct link to Benefits of Feature Flag Observability" translate="no">​</a></h2>
<p>The Sentry OpenFeature integration provides several key benefits:</p>
<ol>
<li class="">
<p><strong>Contextual Error Reporting</strong>: When errors occur, you'll see exactly which feature flags were active, helping you identify if a flag change contributed to the issue.</p>
</li>
<li class="">
<p><strong>Performance Monitoring</strong>: Track how feature flags impact your application's performance.</p>
</li>
<li class="">
<p><strong>Debugging Efficiency</strong>: Reduce the time spent reproducing issues by having feature flag state automatically included in error reports.</p>
</li>
<li class="">
<p><strong>Release Confidence</strong>: Make data-driven decisions about feature rollouts by correlating errors with specific flag states.</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-value-of-open-standards">The Value of Open Standards<a href="https://openfeature.dev/blog/sentry-openfeature-integration#the-value-of-open-standards" class="hash-link" aria-label="Direct link to The Value of Open Standards" title="Direct link to The Value of Open Standards" translate="no">​</a></h2>
<p>This integration exemplifies the power of open standards in the feature flagging ecosystem.
By implementing the OpenFeature specification, Sentry can provide a seamless integration that works with any OpenFeature provider, without requiring vendor-specific implementations.</p>
<p>This aligns with OpenFeature's vision of reducing integration effort by <a href="https://openfeature.dev/blog/openfeature-a-standard-for-feature-flagging/#from-effortnm-to-effortnm" target="_blank" rel="noopener noreferrer" class="">moving from effort(N*M) to effort(N+M)</a>.
OpenFeature delivers a standardized feature flagging SDK, already implemented by most providers, and Sentry can focus on building a great performance monitoring and error-tracking platform for their users.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next Steps<a href="https://openfeature.dev/blog/sentry-openfeature-integration#next-steps" class="hash-link" aria-label="Direct link to Next Steps" title="Direct link to Next Steps" translate="no">​</a></h2>
<p>If you're using Sentry and OpenFeature, we encourage you to try out this integration.
The feature flag state will be automatically included in your error reports, providing valuable context for debugging.</p>
<p>For more information, check out the official Sentry documentation:</p>
<ul>
<li class=""><a href="https://docs.sentry.io/platforms/javascript/configuration/integrations/openfeature/" target="_blank" rel="noopener noreferrer" class="">JavaScript Integration</a></li>
<li class=""><a href="https://docs.sentry.io/platforms/python/integrations/openfeature/" target="_blank" rel="noopener noreferrer" class="">Python Integration</a></li>
</ul>
<p>Using another platform? Sentry is planning expanding support for more platforms, starting with mobile.
We're excited to see how this integration helps teams better understand the impact of their feature flags on application stability and performance.</p>]]></content:encoded>
            <category>sentry</category>
            <category>openfeature</category>
            <category>feature flags</category>
            <category>observability</category>
        </item>
        <item>
            <title><![CDATA[Vercel Flags SDK - OpenFeature Adapter]]></title>
            <link>https://openfeature.dev/blog/vercel-flags-sdk-adapter</link>
            <guid>https://openfeature.dev/blog/vercel-flags-sdk-adapter</guid>
            <pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Announcing Vercel Flags SDK OpenFeature Adapter]]></description>
            <content:encoded><![CDATA[<p>We are happy to share the news that Vercel's new open-source <a href="https://flags-sdk.dev/" target="_blank" rel="noopener noreferrer" class="">Flags SDK</a> for Next.js and SvelteKit has shipped with a native <a href="https://flags-sdk.dev/docs/api-reference/adapters/openfeature" target="_blank" rel="noopener noreferrer" class="">OpenFeature Adapter</a>.</p>
<p>The Flags SDK is an exciting development for standardizing feature flagging in Next.js and SvelteKit, as it takes an <a href="https://vercel.com/blog/flags-as-code-in-next-js" target="_blank" rel="noopener noreferrer" class="">opinionated approach</a> to how feature flags should be used:</p>
<ul>
<li class="">Feature Flags are just functions</li>
<li class="">Feature Flags are only evaluated on the server-side, no client-side flag evaluation is supported to improve performance, avoid layout shifts, and other non-optimal user experiences.</li>
<li class="">Integration with the Vercel Toolbar, allows local overrides of flag values during development, testing and even in production.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfeature-provider-example">OpenFeature Provider Example<a href="https://openfeature.dev/blog/vercel-flags-sdk-adapter#openfeature-provider-example" class="hash-link" aria-label="Direct link to OpenFeature Provider Example" title="Direct link to OpenFeature Provider Example" translate="no">​</a></h3>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// flags.ts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#8dc891">{</span><span class="token imports"> createOpenFeatureAdapter </span><span class="token imports punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"@flags-sdk/openfeature"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#8dc891">{</span><span class="token imports"> dedupe</span><span class="token imports punctuation" style="color:#8dc891">,</span><span class="token imports"> flag </span><span class="token imports punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"flags/next"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">type</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token maybe-class-name">EvaluationContext</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"@openfeature/server-sdk"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// pass an init function, and return the client</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> openFeatureAdapter </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">createOpenFeatureAdapter</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> provider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">YourProviderOfChoice</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> </span><span class="token maybe-class-name">OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">setProviderAndWait</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">provider</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token maybe-class-name">OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> identify </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">dedupe</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> headers</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> cookies </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Your own logic to identify the user</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// Identifying the user should rely on reading cookies and headers only, and</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// not make any network requests, as it's important to keep latency low here.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> user </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">getUser</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">headers</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> cookies</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> context</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">EvaluationContext</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    targetingKey</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> user</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">id</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// .. other properties ..</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">export</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> exampleFlag </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:#79b6f2">flag</span><span class="token generic-function generic class-name operator" style="color:#d7deea">&lt;</span><span class="token generic-function generic class-name builtin" style="color:#D8DEE9">boolean</span><span class="token generic-function generic class-name punctuation" style="color:#8dc891">,</span><span class="token generic-function generic class-name" style="color:#FAC863"> EvaluationContext</span><span class="token generic-function generic class-name operator" style="color:#d7deea">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  key</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"example-flag"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  defaultValue</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  identify</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  adapter</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> openFeatureAdapter</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">booleanValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// page.tsx</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#8dc891">{</span><span class="token imports"> exampleFlag </span><span class="token imports punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"../flags"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">export</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">async</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">Page</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> banner </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">exampleFlag</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">div</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">      </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain">banner </span><span class="token operator" style="color:#d7deea">?</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag class-name" style="color:#FAC863">Banner</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag punctuation" style="color:#8dc891">/&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">      </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token comment" style="color:#999999">/* other components */</span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">div</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<p>This adapter will allow most Node.js OpenFeature Providers to work with the Flags SDK, though there may be some compatability issues with certain Node.js OpenFeature Providers with the <a href="https://vercel.com/docs/functions/runtimes/edge" target="_blank" rel="noopener noreferrer" class="">Vercel Edge Runtime</a> that should be tested per-provider.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-value-of-open-standards">The Value of Open Standards<a href="https://openfeature.dev/blog/vercel-flags-sdk-adapter#the-value-of-open-standards" class="hash-link" aria-label="Direct link to The Value of Open Standards" title="Direct link to The Value of Open Standards" translate="no">​</a></h3>
<p>The integration demonstrates a key aspect of OpenFeature's vision - <a href="https://deploy-preview-1055--openfeature.netlify.app/blog/openfeature-a-standard-for-feature-flagging/#from-effortnm-to-effortnm" target="_blank" rel="noopener noreferrer" class="">moving from effort(N*M) to effort(N+M)</a>.
OpenFeature delivers a standardized feature flagging SDK, already implemented by most providers, and Vercel can focus on building a wonderful framework-specific developer experience on top of that foundation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="future-of-nextjs-support">Future of Next.js Support<a href="https://openfeature.dev/blog/vercel-flags-sdk-adapter#future-of-nextjs-support" class="hash-link" aria-label="Direct link to Future of Next.js Support" title="Direct link to Future of Next.js Support" translate="no">​</a></h3>
<p>We are excited to continue working with the team at Vercel that is leading this effort, and to help expand the efforts of open standards in feature flagging for Next.js and SvelteKit.
One of the visions of OpenFeature has always been deeper integration into the language / framework level as the adoption of OpenFeature continues to grow, we are happy to work with language and framework authors who strive to offer feature flagging built-in.</p>
<p>While the Flags SDK is offering Next.js and SvelteKit developers with an opinionated and performance optimized open-source feature flagging SDK, we recognize that its structure may not work for all Next.js developers out there relying on a mixture of client-side rendering in their applications.
If you are knowledgeable about Next.js and would like to help OpenFeature develop our Next.js SDK, please reach out to us in the <a href="https://openfeature.dev/community/#discussions" target="_blank" rel="noopener noreferrer" class="">CNCF #openfeature Slack</a>.</p>
<p>If you'd like to test out the Flags SDK OpenFeature Adapter check out their <a href="https://vercel.com/templates/next.js/flags-sdk-openfeature" target="_blank" rel="noopener noreferrer" class="">example project</a>.</p>]]></content:encoded>
            <category>vercel</category>
            <category>flags sdk</category>
            <category>next.js</category>
            <category>openfeature adapter</category>
        </item>
        <item>
            <title><![CDATA[DevCycle March 2025 - OpenFeature Hackathon]]></title>
            <link>https://openfeature.dev/blog/devcycle-march-2025-hackathon</link>
            <guid>https://openfeature.dev/blog/devcycle-march-2025-hackathon</guid>
            <pubDate>Wed, 19 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[DevCycle March 2025 OpenFeature Hackathon]]></description>
            <content:encoded><![CDATA[<p>A few times a year at DevCycle, we hit pause on our usual work, push aside our roadmaps, and dive into a few days of rapid experimentation and collaboration.
For our first hackathon of 2025, we opted for an <strong>OpenFeature-theme</strong> —a chance to explore new ideas, test bold concepts, and build something innovative for the OpenFeature ecosystem together.</p>
<p>This year, teams tackled projects ranging from OpenFeature CLI improvements to using OpenFeature Remote Evaluation Protocol with CloudFlare Workers.
Let's take a closer look at how our team hacked, what we learned, and why these projects matter.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="devcycles-hackathon-projects">DevCycle's Hackathon Projects<a href="https://openfeature.dev/blog/devcycle-march-2025-hackathon#devcycles-hackathon-projects" class="hash-link" aria-label="Direct link to DevCycle's Hackathon Projects" title="Direct link to DevCycle's Hackathon Projects" translate="no">​</a></h2>
<img src="https://openfeature.dev/assets/images/devcycle-march-2025-hackathon-0445696eb5b200d7b7b2178bd91dab26.jpg">
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfeature-remote-evaluation-protocol-with-cloudflare-workers">OpenFeature Remote Evaluation Protocol with Cloudflare Workers<a href="https://openfeature.dev/blog/devcycle-march-2025-hackathon#openfeature-remote-evaluation-protocol-with-cloudflare-workers" class="hash-link" aria-label="Direct link to OpenFeature Remote Evaluation Protocol with Cloudflare Workers" title="Direct link to OpenFeature Remote Evaluation Protocol with Cloudflare Workers" translate="no">​</a></h3>
<p>At DevCycle, we were an early supporters of the <a href="https://openfeature.dev/specification/appendix-c" target="_blank" rel="noopener noreferrer" class="">OpenFeature Remote Evaluation Protocol (OFREP)</a>, and long-time users of <a href="https://developers.cloudflare.com/workers/" target="_blank" rel="noopener noreferrer" class="">Cloudflare Workers</a>.
Naturally, we were curious if we could use the OFREP API as a bridge interface to better support Feature Flags in these edge environments.
As one of our hackathon projects, Elliot from our team built a <a href="https://github.com/DevCycleHQ-Sandbox/OFREP-bucketing-worker" target="_blank" rel="noopener noreferrer" class="">DevCycle OFREP Worker</a>, which we could publish for customers to run in their own environment.
This worker can use a <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/" target="_blank" rel="noopener noreferrer" class="">service binding</a> to bind this worker to any of their own internal workers.</p>
<p>This implementation provides a Cloudflare Worker template that synchronizes and caches DevCycle flags configuration within your Cloudflare environment.
The worker fetches the flag configuration from the DevCycle's CDN once, which is served by Cloudflare's CDN / R2, and then processes the project configuration locally to evaluate flags for individual users.
This means that feature flags can be accessed almost instantaneously within any Worker in your environment, eliminating processing delays and reducing external API calls.</p>
<p>Then, in your internal worker, you can use the existing OpenFeature SDKs with the OFREP Provider to bind the fetch call to the DevCycle OFREP Worker:</p>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#8dc891">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">OpenFeature</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'@openfeature/server-sdk'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#8dc891">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">OFREPProvider</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'@openfeature/ofrep-provider'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> provider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OFREPProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    baseUrl</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'https://ofrep-bucketing-worker.devcycle.com'</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token function-variable function" style="color:#79b6f2">fetchImplementation</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">input</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">RequestInfo</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">|</span><span class="token plain"> </span><span class="token constant" style="color:#5a9bcf">URL</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> init</span><span class="token operator" style="color:#d7deea">?</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">RequestInit</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#d7deea">=&gt;</span><span class="token plain"> env</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token constant" style="color:#5a9bcf">OFREP_BUCKETING</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">fetch</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> init</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    headers</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token punctuation" style="color:#8dc891">[</span><span class="token string" style="color:#8dc891">'Content-Type'</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'application/json'</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> </span><span class="token maybe-class-name">OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">setProviderAndWait</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">provider</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token maybe-class-name">OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<p>Integrating OFREP with Cloudflare Workers offers a scalable and high-performance solution for feature flag evaluation at the edge built on open standards.
This was a great demo during our Hackathon; there is still some work to do to productize <a href="https://github.com/DevCycleHQ-Sandbox/OFREP-bucketing-worker" target="_blank" rel="noopener noreferrer" class="">this OFREP worker</a>; reach out to us if you think this is an interesting use-case for OFREP as we continue to work on it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfeature-cli-contribution">OpenFeature CLI Contribution<a href="https://openfeature.dev/blog/devcycle-march-2025-hackathon#openfeature-cli-contribution" class="hash-link" aria-label="Direct link to OpenFeature CLI Contribution" title="Direct link to OpenFeature CLI Contribution" translate="no">​</a></h3>
<p>Strongly typed feature flags are essential for teams managing feature flags at scale across large codebases.
DevCycle has long supported the <code>dvc generate types</code> command in our CLI, which generates <a href="https://docs.devcycle.com/sdk/client-side-sdks/react/react-typescript/" target="_blank" rel="noopener noreferrer" class="">Typescript Types</a> for our DevCycle SDKs.
When we heard about the development progress of the <a href="https://github.com/open-feature/cli" target="_blank" rel="noopener noreferrer" class="">OpenFeature CLI</a> in generating types for OpenFeature SDKs, we were eager to contribute to its development.</p>
<p>While the OpenFeature CLI is in its early development, type generation for Go and React is already functional.
However, there was no built-in way for vendors to integrate their platforms with the CLI’s type generation feature.</p>
<p>The <code>openfeature generate react</code> command runs by generating a typed interface for your OpenFeature SDK from a known list of flags from a standard flags manifest file.
To support this standard as a vendor, the CLI would need a way to pull and sync the flag manifest file directly from a vendor’s platform.
Jason from DevCycle stepped in and created an <code>openfeature pull</code> method to pull flag data from DevCycle's API and generate a manifest file for the CLI to use.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">&gt; openfeature pull</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">&gt; openfeature generate react</span><br></span></code></pre></div></div>
<p>This will result in an <code>openfeature.ts</code> file with populated variable hooks:</p>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token string" style="color:#8dc891">'use client'</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">type</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ReactFlagEvaluationOptions</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">type</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ReactFlagEvaluationNoSuspenseOptions</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">type</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">FlagQuery</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  useFlag</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  useSuspenseFlag</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"@openfeature/react-sdk"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">/**</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* </span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* </span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* **Details:**</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* - flag key: `a-newer-feature`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* - default value: `false`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* - type: `boolean`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">*/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">export</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> useANewerFeature </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">options</span><span class="token operator" style="color:#d7deea">?</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">ReactFlagEvaluationOptions</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">FlagQuery</span><span class="token operator" style="color:#d7deea">&lt;</span><span class="token builtin" style="color:#D8DEE9">boolean</span><span class="token operator" style="color:#d7deea">&gt;</span><span class="token plain"> </span><span class="token arrow operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">useFlag</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"a-newer-feature"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">/**</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* </span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* </span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* **Details:**</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* - flag key: `a-newer-feature`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* - default value: `false`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* - type: `boolean`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">*</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* Equivalent to useFlag with options: `{ suspend: true }`</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">* @experimental — Suspense is an experimental feature subject to change in future versions.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">*/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">export</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> useSuspenseANewerFeature </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">options</span><span class="token operator" style="color:#d7deea">?</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">ReactFlagEvaluationNoSuspenseOptions</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">FlagQuery</span><span class="token operator" style="color:#d7deea">&lt;</span><span class="token builtin" style="color:#D8DEE9">boolean</span><span class="token operator" style="color:#d7deea">&gt;</span><span class="token plain"> </span><span class="token arrow operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">useSuspenseFlag</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"a-newer-feature"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token spread operator" style="color:#d7deea">...</span><br></span></code></pre></div></div>
<p>We are excited to keep working on the CLI with the folks from Dynatrace, Google Cloud, and others leading this effort.
<a href="https://github.com/open-feature/cli/pull/79" target="_blank" rel="noopener noreferrer" class="">Our PR adding the pull command</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="codemod-convert-codebase-from-vendor-sdk-to-openfeature-sdk">Codemod: Convert Codebase from Vendor SDK to OpenFeature SDK<a href="https://openfeature.dev/blog/devcycle-march-2025-hackathon#codemod-convert-codebase-from-vendor-sdk-to-openfeature-sdk" class="hash-link" aria-label="Direct link to Codemod: Convert Codebase from Vendor SDK to OpenFeature SDK" title="Direct link to Codemod: Convert Codebase from Vendor SDK to OpenFeature SDK" translate="no">​</a></h3>
<p>Building a <a href="https://codemod.com/" target="_blank" rel="noopener noreferrer" class="">Codemod</a> for OpenFeature migrations has been on our radar for a while.
After connecting with the Codemod team, we saw its potential for helping customers migrate from vendor SDKs to OpenFeature SDKs.
Codemod has gained great adoption among teams upgrading to the latest versions of React or officially supported upgrade paths - such as the transition from <a href="https://codemod.com/blog/nuxt-announcement#nuxt-4-migration" target="_blank" rel="noopener noreferrer" class="">Nuxt 3 to Nuxt 4 (Nuxt 3 → 4)</a>.</p>
<p>This hackathon finally gave us the chance to experiment with Codemod’s tooling and publish a codemod.
Think of the codemod platform as tooling around open-source code transformation tools like <a href="https://github.com/facebook/jscodeshift" target="_blank" rel="noopener noreferrer" class="">jscodeshift</a>, while adding AI-powered tooling for generating codemods, plus an NPM-like repository for distributing them.</p>
<p>Our first set of codemods focussed on helping teams transition their codebases from DevCycle or Launchdarkly Node.js SDKs to using the OpenFeature SDK, using the respective vendor’s OpenFeature Provider.
To do this, we discovered it best to break down the problem into smaller, testable steps and then run all the codemods together in a workflow:</p>
<ul>
<li class=""><a href="https://codemod.com/registry/devcycle-to-openfeature-nodejs-update-imports" target="_blank" rel="noopener noreferrer" class="">Update Imports CodeMod</a> - transforms file and packages imports to use OpenFeature + Provider.</li>
<li class=""><a href="https://codemod.com/registry/devcycle-to-openfeature-nodejs-initialization-transform" target="_blank" rel="noopener noreferrer" class="">Initialization Transform</a> - transforms the SDK initialization from using <code>initializeDevCycle()</code> to setting up the <code>DevCycleProvider</code> and creating the OpenFeature Client</li>
<li class=""><a href="https://codemod.com/registry/devcycle-to-openfeature-nodejs-user-context-transform" target="_blank" rel="noopener noreferrer" class="">User Context Transform</a> - updates <code>DevCycleUser</code> to <code>EvaluationContext</code> objects, rename <code>user_id</code> param to <code>targetingKey</code></li>
<li class=""><a href="https://codemod.com/registry/devcycle-to-openfeature-nodejs-variable-transform" target="_blank" rel="noopener noreferrer" class="">Variable Transform</a> - replaces DevCycle <code>variableValue()</code> and <code>variable()</code> calls with <code>get&lt;Type&gt;Value()</code> and <code>get&lt;Type&gt;Details()</code> calls to OpenFeature</li>
</ul>
<p>After installing codemod: <code>npm i -g codemod</code>, these can be run using:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">codemod devcycle-to-openfeature-nodejs-workflow</span><br></span></code></pre></div></div>
<p>The codemod CLI will download the latest version of the codemods and run them against your codebase.</p>
<img src="https://openfeature.dev/assets/images/codemod-b9bd3d54f94ffc7d8ce61cb87e912804.png">
<p><a href="https://github.com/DevCycleHQ-Sandbox/OpenFeature-Codemod" target="_blank" rel="noopener noreferrer" class="">These codemods</a> are a great starting point for anyone looking to do much of the heavy lifting, updating a codebase from DevCycle or Launchdarkly Node.js SDKs to OpenFeature.
We are interested in feedback from the community about the value of these codemods and if we should continue developing them for more languages / vendors, as well as if these codemods would make sense as an OpenFeature-supported project.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="docusaurus-openfeature-wrapper">Docusaurus OpenFeature Wrapper<a href="https://openfeature.dev/blog/devcycle-march-2025-hackathon#docusaurus-openfeature-wrapper" class="hash-link" aria-label="Direct link to Docusaurus OpenFeature Wrapper" title="Direct link to Docusaurus OpenFeature Wrapper" translate="no">​</a></h3>
<p>Docusaurus is a popular framework for building documentation websites, making it easy to create and maintain interactive docs using Markdown and React.
Since both <a href="https://github.com/DevCycleHQ/devCycle-docs" target="_blank" rel="noopener noreferrer" class="">DevCycle</a> and <a href="https://github.com/open-feature/openfeature.dev" target="_blank" rel="noopener noreferrer" class="">OpenFeature</a> rely on Docusaurus for their documentation, integrating feature flagging directly into the platform makes perfect sense.
With this approach, documentation can dynamically update based on feature flags, allowing teams to release code and docs together—an essential capability for feature-driven development.</p>
<p>For the OpenFeature Hackathon, one of our engineers, Parth, built an OpenFeature Docusaurus plugin, leveraging the OpenFeature React SDK and flagd to enable feature management within documentation sites.
He created a <a href="https://github.com/DevCycleHQ-Sandbox/docusaurus-openfeature-provider" target="_blank" rel="noopener noreferrer" class="">Docusaurus provider</a> and applied it to a <a href="https://github.com/DevCycleHQ-Sandbox/sample-docusaurus" target="_blank" rel="noopener noreferrer" class="">barebones Docusaurus site</a> to showcase its functionality.
The plugin allows developers to use feature flags to dynamically toggle sections of documentation, ensuring content remains in sync with evolving product features.
By integrating OpenFeature, this project bridges the gap between documentation and feature flagging, improving flexibility, maintainability, and release coordination for teams using Docusaurus.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="devcycle-provider-updates-for-go-net--ruby">DevCycle Provider Updates for Go, .NET &amp; Ruby<a href="https://openfeature.dev/blog/devcycle-march-2025-hackathon#devcycle-provider-updates-for-go-net--ruby" class="hash-link" aria-label="Direct link to DevCycle Provider Updates for Go, .NET &amp; Ruby" title="Direct link to DevCycle Provider Updates for Go, .NET &amp; Ruby" translate="no">​</a></h3>
<p>DevCycle has been supporting OpenFeature for several years, and as part of this hackathon, Jamie took the time to review our OpenFeature providers across our SDKs to ensure they were up-to-date with the latest OpenFeature SDK features.<br>
<!-- -->This included adding event tracking support and handling initialization/close when applicable.</p>
<p>We also worked on building and publishing our much requested <a href="https://docs.devcycle.com/sdk/server-side-sdks/ruby/ruby-openfeature" target="_blank" rel="noopener noreferrer" class="">DevCycle OpenFeature Ruby Provider</a>.
Our goal is to provide OpenFeature support across all DevCycle SDKs, with only Next.js, iOS, Android, React Native, Flutter, and Roku remaining for full coverage.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dogfooding-openfeature-sdk-nestjs-sdk--providers">Dogfooding OpenFeature SDK Nest.js SDK + Providers<a href="https://openfeature.dev/blog/devcycle-march-2025-hackathon#dogfooding-openfeature-sdk-nestjs-sdk--providers" class="hash-link" aria-label="Direct link to Dogfooding OpenFeature SDK Nest.js SDK + Providers" title="Direct link to Dogfooding OpenFeature SDK Nest.js SDK + Providers" translate="no">​</a></h3>
<p>In the spirit of dogfooding OpenFeature and our own Providers, Kaushal from our team took up the task of updating the usage of DevCycle's Nest.js SDK in our main API service to use the <a href="https://openfeature.dev/docs/reference/sdks/server/javascript/nestjs/" target="_blank" rel="noopener noreferrer" class="">OpenFeature Nest.js SDK</a> with <a href="https://docs.devcycle.com/sdk/server-side-sdks/nestjs/nestjs-openfeature" target="_blank" rel="noopener noreferrer" class="">DevCycle's Nest.js Provider</a>.</p>
<p>To accomplish this, we introduced a wrapper service that used a single instance of the OpenFeature Client, making it accessible across our Nest.js service.
This straightforward migration allowed the OpenFeature Client to replace any existing calls to DevCycle's SDK.</p>
<p>One of the key takeaways from this project was realizing how much our API development relied on  Nest.js decorators, which simplified our feature flagging of API endpoints:</p>
<ul>
<li class=""><code>@RequireFlagsEnabled(["flag1", "flag2"], ForbiddenException)</code>
<ul>
<li class="">This would check if the targeting context evaluated multiple Boolean values to true for all the flags passed in else return the exception (default exception of <code>NotFound</code>)</li>
</ul>
</li>
<li class=""><code>@RequireFlagValues({ "flag1": "apples", "flag2": true }, ForbiddenException)</code>
<ul>
<li class="">This would check if the targeting context matched multiple flags to the corresponding values to true for all the flags passed in, else return the exception (default exception of <code>NotFound</code>)</li>
</ul>
</li>
</ul>
<p>We started a <a href="https://github.com/open-feature/js-sdk/pull/1159" target="_blank" rel="noopener noreferrer" class="">PR here</a> to enhance the Nest.js SDK with these decorators.</p>
<p>We also lean heavily on the mock interfaces provided by the DevCycle Nest.js SDK to mock and set flag values, which allows us to test different branching code paths in our API service.
Adding similar mocking capabilities would be a useful addition to make testing all the OpenFeature SDKs easier.
Dogfooding the OpenFeature SDKs and our own providers was a valuable learning experience, sparking new ideas on how to contribute to and improve these SDKs in the future.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="projects-that-didnt-make-the-cut-this-time-around">Projects that Didn't Make the Cut This Time Around<a href="https://openfeature.dev/blog/devcycle-march-2025-hackathon#projects-that-didnt-make-the-cut-this-time-around" class="hash-link" aria-label="Direct link to Projects that Didn't Make the Cut This Time Around" title="Direct link to Projects that Didn't Make the Cut This Time Around" translate="no">​</a></h3>
<ul>
<li class=""><strong>Evaluation Reasons for SDKs</strong> – Enhancing our SDKs with evaluation reasons, bringing us closer to full OpenFeature spec compliance.</li>
<li class=""><strong>Feature Flag Observability</strong> – Improving insights into how feature flags impact performance and decision-making.</li>
<li class=""><strong>Add Tracking support to more SDKs</strong> - <a href="https://openfeature.dev/docs/reference/sdks/sdk-compatibility#server-side-sdks" target="_blank" rel="noopener noreferrer" class="">OpenFeature SDK Tracking Support</a></li>
<li class=""><strong>Multi-Provider Expansion</strong> – Bringing multi-provider support to more languages.</li>
</ul>
<p>And many more!
Each project aimed to strengthen the OpenFeature ecosystem and provide better tools for developers.
Let us know what projects you found the most interesting and we should continue developing further, please reach out to us in the <a href="https://openfeature.dev/community/#discussions" target="_blank" rel="noopener noreferrer" class="">CNCF #openfeature Slack</a>.</p>]]></content:encoded>
            <category>devcycle</category>
            <category>hackathon</category>
        </item>
        <item>
            <title><![CDATA[Open Invitation to the Vendor Commitee]]></title>
            <link>https://openfeature.dev/blog/open-invite-vendor-commitee</link>
            <guid>https://openfeature.dev/blog/open-invite-vendor-commitee</guid>
            <pubDate>Wed, 05 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Open Invitation to the Vendor Commitee]]></description>
            <content:encoded><![CDATA[<p>The OpenFeature project is excited to announce the formation of our <strong>Vendor Council</strong> — a collaborative forum designed to deepen engagement with commercial vendors and open-source maintainers in the feature flagging ecosystem.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="about-openfeature">About OpenFeature<a href="https://openfeature.dev/blog/open-invite-vendor-commitee#about-openfeature" class="hash-link" aria-label="Direct link to About OpenFeature" title="Direct link to About OpenFeature" translate="no">​</a></h2>
<p>OpenFeature is a CNCF-incubating project that's defining open standards for feature flagging and experimentation. As a vendor-agnostic initiative, we're committed to improving the developer experience across the feature flagging landscape.</p>
<p><strong>Key highlights:</strong></p>
<ul>
<li class="">A <a href="https://github.com/open-feature/spec" target="_blank" rel="noopener noreferrer" class="">vendor-agnostic open standard</a> for feature flagging</li>
<li class="">Open-source project under Apache 2 license</li>
<li class=""><a href="https://www.cncf.io/projects/openfeature/" target="_blank" rel="noopener noreferrer" class="">Supported under the CNCF</a> (alongside projects like Kubernetes and OpenTelemetry)</li>
<li class="">Designed to work with any feature flag management tool - commercial, open-source, or in-house</li>
<li class="">Broad industry support with many feature flagging vendors already providing official integrations</li>
<li class="">Support for multiple tech stacks, both server-side and frontend - 12 and counting</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-join-the-vendor-council">Why Join the Vendor Council?<a href="https://openfeature.dev/blog/open-invite-vendor-commitee#why-join-the-vendor-council" class="hash-link" aria-label="Direct link to Why Join the Vendor Council?" title="Direct link to Why Join the Vendor Council?" translate="no">​</a></h2>
<p>As key players in the feature flagging ecosystem, your insights are invaluable to shaping our specifications and improving the developer experience of consuming feature flags in codebases.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="areas-where-were-seeking-input">Areas Where We're Seeking Input:<a href="https://openfeature.dev/blog/open-invite-vendor-commitee#areas-where-were-seeking-input" class="hash-link" aria-label="Direct link to Areas Where We're Seeking Input:" title="Direct link to Areas Where We're Seeking Input:" translate="no">​</a></h3>
<ul>
<li class="">Enhancing <a href="https://flagd.dev/" target="_blank" rel="noopener noreferrer" class="">flagd</a>, our lightweight feature-flagging daemon that enables dynamic configuration updates without code changes</li>
<li class="">Adding event tracking capabilities to OpenFeature, to improve experimentation and A/B testing within feature flag implementations</li>
<li class="">The <a href="https://github.com/open-feature/protocol" target="_blank" rel="noopener noreferrer" class="">OpenFeature Remote Evaluation Protocol (OFREP)</a>, an initiative aimed at reducing SDK authoring burden on vendors and standardizing communication between flag evaluation systems</li>
<li class="">Future initiatives that would help flagging platforms adopt OpenFeature or make it more valuable for your users</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="participation-involves">Participation Involves:<a href="https://openfeature.dev/blog/open-invite-vendor-commitee#participation-involves" class="hash-link" aria-label="Direct link to Participation Involves:" title="Direct link to Participation Involves:" translate="no">​</a></h3>
<ul>
<li class="">Quarterly virtual meetings (approximately 1 hour)</li>
<li class="">Occasional email correspondence for feedback</li>
<li class="">Optional participation in our Slack community</li>
</ul>
<p>We're flexible and open to structuring participation in a way that works best for our advisors.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-for-vendors">Benefits for Vendors:<a href="https://openfeature.dev/blog/open-invite-vendor-commitee#benefits-for-vendors" class="hash-link" aria-label="Direct link to Benefits for Vendors:" title="Direct link to Benefits for Vendors:" translate="no">​</a></h3>
<ul>
<li class="">Early access to new features and specifications</li>
<li class="">Direct influence on the project's direction</li>
<li class="">Networking opportunities with other industry leaders</li>
<li class="">Shared marketing opportunities to promote OpenFeature features in your products</li>
<li class="">Recognition as a contributor to this open-source initiative</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-join">How to Join<a href="https://openfeature.dev/blog/open-invite-vendor-commitee#how-to-join" class="hash-link" aria-label="Direct link to How to Join" title="Direct link to How to Join" translate="no">​</a></h2>
<p>If your organization is involved in the feature flagging space - whether as a commercial vendor or an open-source maintainer - and you're interested in joining the OpenFeature Vendor Council, we'd love to hear from you!</p>
<p>Please reach out to us by:</p>
<ul>
<li class="">Emailing Pete Hodgson (a member of the Open Feature Governance Committee) at <a href="mailto:workwith@thepete.net" target="_blank" rel="noopener noreferrer" class="">workwith@thepete.net</a></li>
<li class="">Posting in the <a href="https://openfeature.dev/community/#special-interest-groups" target="_blank" rel="noopener noreferrer" class="">#openfeature Slack channel</a></li>
<li class="">Opening an issue in our <a href="https://github.com/open-feature/community" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a></li>
</ul>
<p>In your message, please include:</p>
<ol>
<li class="">Your name and organization</li>
<li class="">Your role within the organization</li>
<li class="">A brief description of your interest in OpenFeature</li>
<li class="">Contact information for follow-up</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="join-us-in-shaping-the-future">Join Us in Shaping the Future<a href="https://openfeature.dev/blog/open-invite-vendor-commitee#join-us-in-shaping-the-future" class="hash-link" aria-label="Direct link to Join Us in Shaping the Future" title="Direct link to Join Us in Shaping the Future" translate="no">​</a></h2>
<p>The OpenFeature project is committed to creating standards that benefit the entire feature flagging ecosystem. By bringing together diverse perspectives from across the industry, we can build something truly valuable for developers and organizations alike.</p>
<p>We look forward to collaborating with you!</p>]]></content:encoded>
            <category>cncf</category>
            <category>vendors</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[OpenFeature at KubeCon EU '25]]></title>
            <link>https://openfeature.dev/blog/kubeconeu25</link>
            <guid>https://openfeature.dev/blog/kubeconeu25</guid>
            <pubDate>Thu, 06 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenFeature at KubeCon EU '25]]></description>
            <content:encoded><![CDATA[<p>Great news! The OpenFeature summit the OpenFeature Summit will be returning to KubeCon + CloudNativeCon Europe 2025.
We have a fantastic lineup of speakers and sessions planned, and we can't wait to see you there.</p>
<img src="https://openfeature.dev/assets/images/join-78c6c0404cebe57b6c011c6567995498.png">
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfeature-summit">OpenFeature Summit<a href="https://openfeature.dev/blog/kubeconeu25#openfeature-summit" class="hash-link" aria-label="Direct link to OpenFeature Summit" title="Direct link to OpenFeature Summit" translate="no">​</a></h3>
<p>The OpenFeature Summit is the ultimate gathering for feature flagging enthusiasts to exchange insights, best practices, and success (and a few horror) stories.
This event is a fantastic opportunity to network, engage in lively discussions, and explore the latest innovations in feature flagging.</p>
<p><strong>Event Details:</strong></p>
<ul>
<li class=""><strong>Date:</strong> April 1, 2025</li>
<li class=""><strong>Location:</strong> <a href="https://maps.app.goo.gl/JcuV7fbsGrHrMmiD7" target="_blank" rel="noopener noreferrer" class="">ExCeL London, Royal Victoria Dock, 1 Western Gateway, London E16 1XL, United Kingdom</a></li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The OpenFeature Summit is a co-located event held the day before KubeCon EU and requires an all-access pass.</p></div></div>
<p><strong>Schedule Highlights:</strong></p>
<ul>
<li class=""><strong>13:25 BST:</strong> Welcome + Opening Remarks</li>
<li class=""><strong>13:35 BST:</strong> <a href="https://colocatedeventseu2025.sched.com/event/1u5kz/openfeatures-positive-impact-on-confidence-at-dynatrace-simon-schrottner-todd-baert-dynatrace" target="_blank" rel="noopener noreferrer" class="">OpenFeature's Positive Impact on Confidence at Dynatrace</a> - Simon Schrottner &amp; Todd Baert, Dynatrace</li>
<li class=""><strong>14:15 BST:</strong> ⚡ <a href="https://colocatedeventseu2025.sched.com/event/1u5l2/cl-lightning-talk-bridge-infrastructure-application-openfeature-for-dynamic-feature-management-in-k8-deployments-nikunj-goyal-adobe-aditi-gupta-disney-plus-hotstar" target="_blank" rel="noopener noreferrer" class="">Lightning Talk: Bridge Infrastructure &amp; Application - OpenFeature for Dynamic Feature Management in K8 Deployments</a> - Nikunj Goyal, Adobe &amp; Aditi Gupta, Disney Plus Hotstar</li>
<li class=""><strong>14:30 BST:</strong> ⚡ <a href="https://colocatedeventseu2025.sched.com/event/1u5l5/cl-lightning-talk-look-into-the-hooks-of-openfeature-saurav-jain-apify" target="_blank" rel="noopener noreferrer" class="">Lightning Talk: Look Into the Hooks of OpenFeature</a> - Saurav Jain, Apify</li>
<li class=""><strong>14:50 BST:</strong> <a href="https://colocatedeventseu2025.sched.com/event/1u5l8/canary-deployments-are-a-myth-true-progressive-delivery-occurs-via-openfeature-bob-walker-octopus-deploy" target="_blank" rel="noopener noreferrer" class="">Canary Deployments Are a Myth - True Progressive Delivery Occurs Via OpenFeature</a> - Bob Walker, Octopus Deploy</li>
<li class=""><strong>15:20 BST:</strong> <a href="https://colocatedeventseu2025.sched.com/event/1u5lB/challenges-in-distributed-feature-flag-evaluation-and-how-to-solve-them-lukas-reining-christopher-bohlen-codecentric-ag" target="_blank" rel="noopener noreferrer" class="">Challenges in Distributed Feature Flag Evaluation and How To Solve Them</a> - Lukas Reining &amp; Christopher Bohlen, codecentric AG</li>
<li class=""><strong>15:55 BST:</strong> <a href="https://colocatedeventseu2025.sched.com/event/1u5lE/flag-tastic-and-fearless-feature-flags-meet-kubernetes-for-deployments-that-sing-aditya-soni-forrester-anshika-tiwari-aws" target="_blank" rel="noopener noreferrer" class="">Flag-tastic and Fearless: Feature Flags Meet Kubernetes for Deployments That Sing</a> - Aditya Soni, Forrester &amp; Anshika Tiwari, AWS</li>
<li class=""><strong>16:45 BST:</strong> ⚡ <a href="https://colocatedeventseu2025.sched.com/event/1u5lH/cl-lightning-talk-openfeature-multi-provider-enabling-new-feature-flagging-use-cases-jonathan-norris-devcycle" target="_blank" rel="noopener noreferrer" class="">Lightning Talk: OpenFeature Multi-Provider: Enabling New Feature Flagging Use-Cases</a> - Jonathan Norris, DevCycle</li>
<li class=""><strong>15:45 BST:</strong> <a href="https://colocatedeventseu2025.sched.com/event/1u5lK/beyond-boolean-solving-hard-problems-in-feature-flag-architecture-at-scale-ryan-feigenbaum-growthbook" target="_blank" rel="noopener noreferrer" class="">Beyond Boolean: Solving Hard Problems in Feature Flag Architecture at Scale</a> - Ryan Feigenbaum, GrowthBook</li>
<li class=""><strong>17:15 BST:</strong> ⚡ <a href="https://colocatedeventseu2025.sched.com/event/1u5lN/cl-lightning-talk-the-permutations-and-combinations-of-managing-features-beyond-the-toggle-prerit-munjal-infraone" target="_blank" rel="noopener noreferrer" class="">Lightning Talk: The Permutations and Combinations of Managing Features: Beyond the Toggle</a> - Prerit Munjal, InfraOne</li>
<li class=""><strong>15:25 BST</strong> Closing Remarks</li>
</ul>
<p>For more details, visit our <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/co-located-events/openfeature-summit/" target="_blank" rel="noopener noreferrer" class="">OpenFeature Summit page</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubecon-eu-sessions">KubeCon EU Sessions<a href="https://openfeature.dev/blog/kubeconeu25#kubecon-eu-sessions" class="hash-link" aria-label="Direct link to KubeCon EU Sessions" title="Direct link to KubeCon EU Sessions" translate="no">​</a></h3>
<p>In addition to the OpenFeature Summit, there will also be several sessions during KubeCon EU:</p>
<ul>
<li class="">
<p><a href="https://kccnceu2025.sched.com/event/1tcxA/openfeature-update-from-the-maintainers-thomas-poignant-adevinta-lukas-reining-codecentric-ag" target="_blank" rel="noopener noreferrer" class="">OpenFeature Update from the Maintainers</a> - Thomas Poignant, Adevinta &amp; Lukas Reining, codecentric AG</p>
<ul>
<li class=""><strong>Date:</strong> Wednesday, April 2, 2025</li>
<li class=""><strong>Time:</strong> 11:15 - 11:45 BST</li>
<li class=""><strong>Location:</strong> Level 3 | ICC Capital Suite 10-12</li>
</ul>
</li>
<li class="">
<p><a href="https://kccnceu2025.sched.com/event/1txAN/how-we-progressively-deliver-changes-to-kubernetes-using-canary-deployments-and-feature-flags-bob-walker-octopus-deploy" target="_blank" rel="noopener noreferrer" class="">How We Progressively Deliver Changes To Kubernetes Using Canary Deployments and Feature Flags</a> - Bob Walker, Octopus Deploy</p>
<ul>
<li class=""><strong>Date:</strong> Thursday, April 3, 2025</li>
<li class=""><strong>Time:</strong> 16:00 - 16:30 BST</li>
<li class=""><strong>Location:</strong> Level 0 | ICC Capital Hall | Room 2</li>
</ul>
</li>
<li class="">
<p><a href="https://kccnceu2025.sched.com/event/1txHF/type-safe-feature-flagging-in-openfeature-lessons-learned-from-using-feature-flags-at-google-michael-beemer-dynatrace-florin-mihai-anghel-google?iframe=yes&amp;w=100%25&amp;sidebar=yes&amp;bg=no" target="_blank" rel="noopener noreferrer" class="">Type-safe Feature Flagging in OpenFeature: Lessons Learned From Using Feature Flags at Google</a> - Michael Beemer, Dynatrace &amp; Florin-Mihai Anghel, Google</p>
<ul>
<li class=""><strong>Date:</strong> Friday, April 4, 2025</li>
<li class=""><strong>Time:</strong> 11:45 - 12:15 BST</li>
<li class=""><strong>Location:</strong> Level 1 | Hall Entrance N10 | Room H</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="visit-our-booth">Visit Our Booth<a href="https://openfeature.dev/blog/kubeconeu25#visit-our-booth" class="hash-link" aria-label="Direct link to Visit Our Booth" title="Direct link to Visit Our Booth" translate="no">​</a></h3>
<p>Don't miss the chance to visit our booth in the project pavilion!
We'll be there to answer your questions, demonstrate our latest features, and discuss how OpenFeature can help your organization.</p>
<p><strong>Booth Location:</strong> Solutions Showcase</p>
<p><strong>Schedule:</strong></p>
<ul>
<li class=""><strong>Wednesday, April 2:</strong> 15:30 - 19:45 BST</li>
<li class=""><strong>Thursday, April 3:</strong> 14:00 - 17:00 BST</li>
<li class=""><strong>Friday, April 4:</strong> 12:30 - 14:00 BST</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="call-for-sponsors">Call for Sponsors<a href="https://openfeature.dev/blog/kubeconeu25#call-for-sponsors" class="hash-link" aria-label="Direct link to Call for Sponsors" title="Direct link to Call for Sponsors" translate="no">​</a></h2>
<p>We are still looking for sponsors for our co-located event.
If you're interested in supporting the OpenFeature Summit and gaining visibility among a highly engaged audience, please review the <a href="https://events.linuxfoundation.org/wp-content/uploads/2025/02/sponsor-cncf-2025_020425.pdf" target="_blank" rel="noopener noreferrer" class="">sponsorship prospectus</a>.</p>
<p>We look forward to seeing you at KubeCon EU and the OpenFeature Summit!</p>]]></content:encoded>
            <category>kubecon</category>
            <category>cncf</category>
            <category>session</category>
            <category>talk</category>
            <category>booth</category>
            <category>OpenFeature summit</category>
            <category>co-located</category>
        </item>
        <item>
            <title><![CDATA[KubeCon Wrapped & New Tracking Event Functionality]]></title>
            <link>https://openfeature.dev/blog/kubecon-wrapped-and-tracking</link>
            <guid>https://openfeature.dev/blog/kubecon-wrapped-and-tracking</guid>
            <pubDate>Mon, 09 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[KubeCon NA 2024 Summary and Tracking Announcement]]></description>
            <content:encoded><![CDATA[<p>Hello from the OpenFeature community!
This post is a double-feature of sorts: we'll be wrapping up our time at KubeCon NA 2024 as well as talking about our latest SDK feature: <a class="" href="https://openfeature.dev/blog/kubecon-wrapped-and-tracking#robust-experimentation-support-with-tracking-events">✨ <em>tracking events</em> ✨</a>.</p>
<img src="https://openfeature.dev/assets/images/summit-wrapped-63cf20cdf33801118beba7f2373d0f98.png">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubecon-na-2024-wrapped">KubeCon NA 2024 <em>Wrapped</em><a href="https://openfeature.dev/blog/kubecon-wrapped-and-tracking#kubecon-na-2024-wrapped" class="hash-link" aria-label="Direct link to kubecon-na-2024-wrapped" title="Direct link to kubecon-na-2024-wrapped" translate="no">​</a></h2>
<p>As usual, we had a great time at the OpenFeature booth in the project pavilion.
We always appreciate the chance to connect with maintainers face-to-face, sometimes for the first time!
Each year we hear from more users who've made use of OpenFeature within their organization or project.</p>
<p>This was also our first time having our own dedicated, colocated event: <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/co-located-events/openfeature-summit/" target="_blank" rel="noopener noreferrer" class="">The OpenFeature Summit</a>!
There were some great talks here; a couple of highlights:</p>
<ul>
<li class=""><a href="https://youtu.be/6ivdFYgznxQ?si=kVg-6mkPX4INwBca" target="_blank" rel="noopener noreferrer" class="">▶️ Migrating to OpenFeature at Scale: 0 to Billions</a>, by Chetan Kapoor &amp; Justin Abrahms from <a href="https://innovation.ebayinc.com/tech/engineering/" target="_blank" rel="noopener noreferrer" class="">eBay</a>
<ul>
<li class="">a great presentation about using OpenFeature at massive scale, and a notable example of how to effectively (and empathetically) promote the internal adoption of a tool at enterprise scale</li>
</ul>
</li>
<li class=""><a href="https://youtu.be/CwckuHnQkzE?si=8XRPauAKqqDoLA4R" target="_blank" rel="noopener noreferrer" class="">▶️ Experimentation Programs at Scale: Lessons Learned from Top Companies</a>, by Graham McNicoll from <a href="https://www.growthbook.io/" target="_blank" rel="noopener noreferrer" class="">GrowthBook</a>
<ul>
<li class="">if this doesn't convince you that you need to be using experimentation to validate your features and roadmap, nothing will!</li>
<li class="">particularly relevant to <a href="https://openfeature.dev/blog/kubecon-wrapped-and-tracking#robust-experimentation-support-with-tracking-events" class="">some of our newest features</a> 👀</li>
</ul>
</li>
</ul>
<p>The full list of videos and slides from the OpenFeature Summit are available <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/co-located-events/openfeature-summit/#thank-you-for-attending" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p>Additionally, don't sleep on Pete Hodgson's <a href="https://kccncna2024.sched.com/event/1i7rl/migratory-patterns-making-architectural-transitions-with-confidence-and-grace-pete-hodgson-partnerslate" target="_blank" rel="noopener noreferrer" class="">SDLC track presentation</a> on undertaking big, hairy migrations, and how feature flags can help.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="robust-experimentation-support-with-tracking-events">Robust Experimentation Support with Tracking Events<a href="https://openfeature.dev/blog/kubecon-wrapped-and-tracking#robust-experimentation-support-with-tracking-events" class="hash-link" aria-label="Direct link to Robust Experimentation Support with Tracking Events" title="Direct link to Robust Experimentation Support with Tracking Events" translate="no">​</a></h2>
<p>Teams spend a lot of time talking about developing, deploying, monitoring and maintaining features, but how do you know if you've built the right features in the first place?
Without data to evaluate the success and adoption of features, aren't you just guessing?
The best teams bake experimentation into their product development cycle, so that they can use data to drive their decisions.</p>
<p>Some feature flag vendors provide functionality to help address this issue, and we knew OpenFeature needed to as well.
With the <a href="https://github.com/open-feature/spec/pull/268" target="_blank" rel="noopener noreferrer" class="">latest enhancements to our specification</a>, OpenFeature now supports this sort of experimentation!
The new <a class="" href="https://openfeature.dev/specification/sections/tracking">Tracking API</a> defines interfaces and functions to allow application authors to "close the gap" between feature flags and business objectives; helping to assert that a particular flag variant actually corresponds to increased usage, for instance.</p>
<p>In fact, if your vendor or home-grown feature flag solution doesn't support equivalent functionality, <a class="" href="https://openfeature.dev/specification/sections/hooks">hooks</a> and tracking compose a flexible solution to associate flag evaluations with usage data, regardless of whatever customer data platform or telemetry backend you use.
For more information, see <a class="" href="https://openfeature.dev/docs/reference/concepts/tracking">tracking concepts</a>.</p>
<p>These enhancements were brought to you by the hard work of many feature flag vendors, enterprises, and subject matter experts...
Thanks to all who helped!</p>
<img src="https://openfeature.dev/assets/images/thanks-5db438758475251505f88d0a5b82a45b.png">
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="implementations-and-future-plans">Implementations and Future Plans<a href="https://openfeature.dev/blog/kubecon-wrapped-and-tracking#implementations-and-future-plans" class="hash-link" aria-label="Direct link to Implementations and Future Plans" title="Direct link to Implementations and Future Plans" translate="no">​</a></h3>
<p>Tracking event functionality is already implemented in our React, Javascript, Java, and Go SDKs, with more on the way.
For an up-to-date list of implementations, check out the <a class="" href="https://openfeature.dev/docs/reference/sdks/sdk-compatibility">SDK Compatibility Overview</a>.
Download the latest release in your language of choice and try it out!</p>]]></content:encoded>
            <category>tracking</category>
            <category>specification</category>
            <category>experimentation</category>
            <category>spec</category>
            <category>kubecon</category>
            <category>cncf</category>
        </item>
        <item>
            <title><![CDATA[Contributor Spotlight: Max VelDink]]></title>
            <link>https://openfeature.dev/blog/max-veldink-spotlight</link>
            <guid>https://openfeature.dev/blog/max-veldink-spotlight</guid>
            <pubDate>Tue, 15 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenFeature Contributor Spotlight]]></description>
            <content:encoded><![CDATA[<p>In this edition of the OpenFeature Contributor Spotlight, we’re excited to highlight <a href="https://www.linkedin.com/in/maxveldink/" target="_blank" rel="noopener noreferrer" class=""><strong>Max VelDink</strong></a>, a dedicated developer whose work has played a pivotal role in advancing the <a href="https://github.com/open-feature/ruby-sdk" target="_blank" rel="noopener noreferrer" class="">OpenFeature Ruby SDK</a>. Max has contributed significant improvements to the OpenFeature project, and his efforts have helped expand the representation of Ruby in the cloud-native space.</p>
<img src="https://openfeature.dev/assets/images/max-10933aede9a7a8c1a74e28259b0ddc71.png">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-max-got-involved-with-openfeature">How Max Got Involved with OpenFeature<a href="https://openfeature.dev/blog/max-veldink-spotlight#how-max-got-involved-with-openfeature" class="hash-link" aria-label="Direct link to How Max Got Involved with OpenFeature" title="Direct link to How Max Got Involved with OpenFeature" translate="no">​</a></h2>
<p>Max’s journey with OpenFeature began around a year ago while working at <a href="https://www.justworks.com/" target="_blank" rel="noopener noreferrer" class="">Justworks</a>, where his team was re-evaluating their flagging strategy. He noticed that the Ruby SDK existed and had the basics of flag evaluation implemented but was not yet released or highlighted on the website.</p>
<p>“At Justworks, I wrote our implementation to get us going, but I started to upstream many of our learnings into the Ruby SDK. We dropped support for our internal implementation last month and are now entirely on the main SDK,” Max explains.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="motivation-to-contribute">Motivation to Contribute<a href="https://openfeature.dev/blog/max-veldink-spotlight#motivation-to-contribute" class="hash-link" aria-label="Direct link to Motivation to Contribute" title="Direct link to Motivation to Contribute" translate="no">​</a></h2>
<p>Max is passionate about increasing Ruby’s presence within <a href="https://www.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Cloud Native Computing Foundation (CNCF)</a> projects, where he feels it doesn’t get as much attention as other languages. As he puts it, “Ruby is largely underrepresented in many CNCF projects; the Ruby community tends to have its own handful of competing libraries but doesn’t interact externally as much as other languages like Golang and Java.”</p>
<p>Beyond his focus on Ruby, Max also feels a strong sense of responsibility to give back to the open-source community. “I owe a great deal to the open-source community and feel like OpenFeature is an excellent project to give back on, as the implementation is straightforward, and I actively use it at Justworks,” he says.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-contributions">Key Contributions<a href="https://openfeature.dev/blog/max-veldink-spotlight#key-contributions" class="hash-link" aria-label="Direct link to Key Contributions" title="Direct link to Key Contributions" translate="no">​</a></h2>
<p>Max’s key contributions to the OpenFeature project have focused primarily on the Ruby SDK. Some of his major achievements include:</p>
<ul>
<li class="">Reviving the dormant <strong>Ruby SDK</strong> project and getting it to a releasable state, which led to it being officially listed on the OpenFeature.dev website</li>
<li class="">Implementing the <strong>InMemoryProvider</strong> utility in the Ruby contrib project</li>
<li class="">Contributing to the <strong>MetaProvider</strong> in the Ruby contrib project, including working on the specification language for it</li>
</ul>
<p>These contributions have greatly improved the usability and functionality of the Ruby SDK, helping it gain more traction within the OpenFeature ecosystem.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="most-rewarding-experience">Most Rewarding Experience<a href="https://openfeature.dev/blog/max-veldink-spotlight#most-rewarding-experience" class="hash-link" aria-label="Direct link to Most Rewarding Experience" title="Direct link to Most Rewarding Experience" translate="no">​</a></h2>
<p>For Max, one of the most fulfilling moments in his OpenFeature contributor journey was seeing the Ruby SDK officially listed on the OpenFeature website. As he reflects, “Definitely getting the Ruby SDK listed on the website was a big milestone.”</p>
<p>What made this achievement even more meaningful for Max was that it marked his debut in large-scale open-source contributions. “It was my first time participating in a large open-source project, and that was very rewarding,” he shares, emphasizing the impact of his work on the broader OpenFeature community.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advice-for-newcomers">Advice for Newcomers<a href="https://openfeature.dev/blog/max-veldink-spotlight#advice-for-newcomers" class="hash-link" aria-label="Direct link to Advice for Newcomers" title="Direct link to Advice for Newcomers" translate="no">​</a></h2>
<p>When offering advice to newcomers, Max suggests starting with the foundation. “Start with the basics in the specification!” he advises, noting that, “Unlike other standards and specs around the web, OpenFeature is very straightforward and digestible, and you can read the whole thing in less than an hour.”</p>
<p>Max encourages new contributors to explore whether their primary language is represented or if the vendor they use has a provider. Once you find something that sparks your interest, his advice is simple: “Just start coding!”</p>
<p>He adds that contributors shouldn’t hesitate to ask for support, because “the OpenFeature community is very friendly, and welcomes all questions on Slack or GitHub.”</p>
<h1>Thank You, Max!</h1>
<p>We’re grateful for Max’s dedication and contributions to the OpenFeature project. His work has had a significant impact, and we look forward to seeing how he continues to shape the future of feature flagging standards.</p>]]></content:encoded>
            <category>contributor</category>
            <category>community</category>
            <category>ruby</category>
            <category>open-source</category>
            <category>cncf</category>
        </item>
        <item>
            <title><![CDATA[OpenFeature at KubeCon NA '24]]></title>
            <link>https://openfeature.dev/blog/kubeconna24</link>
            <guid>https://openfeature.dev/blog/kubeconna24</guid>
            <pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenFeature at KubeCon NA '24]]></description>
            <content:encoded><![CDATA[<p>We are excited to announce that OpenFeature will be hosting its very first co-located event at KubeCon + CloudNativeCon North America 2024!
This is an exciting milestone for us, and we can't wait to share it with you.</p>
<img src="https://openfeature.dev/assets/images/logo-81b1c59ef45a71f63d194c601134f3a0.png">
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfeature-summit-a-new-era-in-feature-flagging">OpenFeature Summit: A New Era in Feature Flagging<a href="https://openfeature.dev/blog/kubeconna24#openfeature-summit-a-new-era-in-feature-flagging" class="hash-link" aria-label="Direct link to OpenFeature Summit: A New Era in Feature Flagging" title="Direct link to OpenFeature Summit: A New Era in Feature Flagging" translate="no">​</a></h3>
<p>The OpenFeature Summit is the ultimate gathering for feature flagging enthusiasts to exchange insights, best practices, and success (and a few horror) stories.
This event is a fantastic opportunity to network, engage in lively discussions, and explore the latest innovations in feature flagging.</p>
<p><strong>Event Details:</strong></p>
<ul>
<li class=""><strong>Date:</strong> November 13, 2024</li>
<li class=""><strong>Location:</strong> Salt Palace Convention Center, Salt Lake City, UT</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The OpenFeature Summit is a co-located event held the day before KubeCon NA and requires an all-access pass.</p></div></div>
<p><strong>Schedule Highlights:</strong></p>
<ul>
<li class=""><strong>9:10am MST:</strong> Welcome + Opening Remarks</li>
<li class=""><strong>9:45am MST:</strong> <a href="https://colocatedeventsna2024.sched.com/event/1izpU/how-to-rollout-an-update-for-a-cni-without-breaking-the-world-wide-web-reza-ramezanpour-jen-luther-thomas-tigera" target="_blank" rel="noopener noreferrer" class="">How to Rollout an Update for a CNI Without Breaking the World Wide Web</a> - Reza Ramezanpour &amp; Jen Luther Thomas, Tigera</li>
<li class=""><strong>10:40am MST:</strong> <a href="https://colocatedeventsna2024.sched.com/event/1izpu/test-smarter-not-harder-qa-enhancements-with-openfeature-meha-bhalodiya-red-hat" target="_blank" rel="noopener noreferrer" class="">Test Smarter, Not Harder: QA Enhancements with OpenFeature</a> - Meha Bhalodiya, Red Hat</li>
<li class=""><strong>11:15am MST:</strong> <a href="https://colocatedeventsna2024.sched.com/event/1izqM/migrating-to-open-feature-at-scale-0-to-billions-chetan-kapoor-justin-abrahms-ebay" target="_blank" rel="noopener noreferrer" class="">Migrating to Open Feature at Scale: 0 to Billions</a> - Chetan Kapoor &amp; Justin Abrahms, eBay</li>
<li class=""><strong>11:45am MST:</strong> <a href="https://colocatedeventsna2024.sched.com/event/1izqq/experimentation-programs-at-scale-lessons-learned-from-top-companies-graham-mcnicoll-growthbook" target="_blank" rel="noopener noreferrer" class="">Experimentation Programs at Scale: Lessons Learned from Top Companies</a> - Graham McNicoll, GrowthBook</li>
<li class=""><strong>12:00pm MST:</strong> ⚡ <a href="https://colocatedeventsna2024.sched.com/event/1izr2/cl-lightning-talk-the-hidden-costs-of-feature-flags-understanding-and-managing-adoption-challenges-shreya-shivratriwar-software-engineer" target="_blank" rel="noopener noreferrer" class="">Lightning Talk: The Hidden Costs of Feature Flags: Understanding and Managing Adoption Challenges</a> - Shreya Shivratriwar, Software Engineer</li>
<li class=""><strong>12:15pm MST:</strong> ⚡ <a href="https://colocatedeventsna2024.sched.com/event/1izrK/cl-lightning-talk-mocking-feature-flags-in-unit-tests-aman-gadadare-jio" target="_blank" rel="noopener noreferrer" class="">Lightning Talk: Mocking Feature Flags in Unit Tests</a> - Aman Gadadare, Jio</li>
<li class=""><strong>12:25pm MST:</strong> ⚡ <a href="https://colocatedeventsna2024.sched.com/event/1izrP/cl-lightning-talk-would-a-gradual-rollout-by-any-other-hashing-algorithm-still-smell-as-sweet-chris-griffing-gitkraken" target="_blank" rel="noopener noreferrer" class="">Lightning Talk: Would a Gradual Rollout by Any Other Hashing Algorithm Still Smell as Sweet?</a> - Chris Griffing, GitKraken</li>
<li class=""><strong>12:35pm MST:</strong> Closing Remarks</li>
</ul>
<p>For more details, visit our <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/co-located-events/openfeature-summit/" target="_blank" rel="noopener noreferrer" class="">OpenFeature Summit page</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubecon-na-sessions">KubeCon NA Sessions<a href="https://openfeature.dev/blog/kubeconna24#kubecon-na-sessions" class="hash-link" aria-label="Direct link to KubeCon NA Sessions" title="Direct link to KubeCon NA Sessions" translate="no">​</a></h3>
<p>In addition to the OpenFeature Summit, there will also be several sessions during KubeCon NA:</p>
<ul>
<li class="">
<p><a href="https://kccncna2024.sched.com/event/1i7kY/taming-your-applications-environments-marcos-lilljedahl-dagger-mauricio-salaboy-salatino-diagrid" target="_blank" rel="noopener noreferrer" class="">Taming Your Application’s Environments</a> - Marcos Lilljedahl, Dagger &amp; Mauricio "Salaboy" Salatino, Diagrid</p>
<ul>
<li class=""><strong>Date:</strong> Wednesday, November 13, 2024</li>
<li class=""><strong>Time:</strong> 5:25pm - 6:00pm MST</li>
<li class=""><strong>Location:</strong> Salt Palace | Level 2 | 250</li>
</ul>
</li>
<li class="">
<p><a href="https://kccncna2024.sched.com/event/1i7rl/migratory-patterns-making-architectural-transitions-with-confidence-and-grace-pete-hodgson-partnerslate" target="_blank" rel="noopener noreferrer" class="">Migratory Patterns: Making Architectural Transitions with Confidence and Grace</a> - Pete Hodgson, PartnerSlate</p>
<ul>
<li class=""><strong>Date:</strong> Friday, November 15, 2024</li>
<li class=""><strong>Time:</strong> 4:00pm - 4:35pm MST</li>
<li class=""><strong>Location:</strong> Salt Palace | Level 2 | 255 EF</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="visit-our-booth">Visit Our Booth<a href="https://openfeature.dev/blog/kubeconna24#visit-our-booth" class="hash-link" aria-label="Direct link to Visit Our Booth" title="Direct link to Visit Our Booth" translate="no">​</a></h3>
<p>Don't miss the chance to visit our booth at the Solutions Showcase!
We'll be there to answer your questions, demonstrate our latest features, and discuss how OpenFeature can help your organization.</p>
<p><strong>Booth Location:</strong> Salt Palace | Level 1 | Halls A-C + 1-5 | Solutions Showcase</p>
<p><strong>Schedule:</strong></p>
<ul>
<li class=""><strong>Wednesday, November 13:</strong> 3:15pm - 8:00pm</li>
<li class=""><strong>Thursday, November 14:</strong> 1:45pm - 5:00pm</li>
<li class=""><strong>Friday, November 15:</strong> 12:30pm - 2:30pm</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="call-for-sponsors">Call for Sponsors<a href="https://openfeature.dev/blog/kubeconna24#call-for-sponsors" class="hash-link" aria-label="Direct link to Call for Sponsors" title="Direct link to Call for Sponsors" translate="no">​</a></h3>
<p>We are still looking for sponsors for our co-located event.
If you're interested in supporting the OpenFeature Summit and gaining visibility among a highly engaged audience, please review the <a href="https://events.linuxfoundation.org/wp-content/uploads/2024/09/sponsor-cncf-2025_09.11.24.pdf" target="_blank" rel="noopener noreferrer" class="">sponsorship prospectus</a>.</p>
<p>We look forward to seeing you at KubeCon NA and the OpenFeature Summit!</p>]]></content:encoded>
            <category>kubecon</category>
            <category>cncf</category>
            <category>session</category>
            <category>talk</category>
            <category>booth</category>
            <category>OpenFeature summit</category>
            <category>co-located</category>
        </item>
        <item>
            <title><![CDATA[Announcing the OpenFeature Angular SDK!]]></title>
            <link>https://openfeature.dev/blog/announcing-angular-sdk</link>
            <guid>https://openfeature.dev/blog/announcing-angular-sdk</guid>
            <pubDate>Tue, 17 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Announcing the first official release of the OpenFeature Angular SDK!]]></description>
            <content:encoded><![CDATA[<p>We are excited to unveil the first official release of the <a class="" href="https://openfeature.dev/docs/reference/sdks/client/web/angular">@openfeature/angular-sdk</a>! 🚀
This SDK extends OpenFeature capabilities to Angular applications, with a focus on Angular's unique patterns and practices.
In this post, we’ll walk you through some of the standout features and how they integrate seamlessly with Angular development.</p>
<img src="https://openfeature.dev/assets/images/angular-e44fde5f13b7a1133f850e29d4ff0304.png">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://openfeature.dev/blog/announcing-angular-sdk#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="angular-module-system-integration">Angular Module System Integration<a href="https://openfeature.dev/blog/announcing-angular-sdk#angular-module-system-integration" class="hash-link" aria-label="Direct link to Angular Module System Integration" title="Direct link to Angular Module System Integration" translate="no">​</a></h3>
<p>The Angular SDK exports a module that allows you to configure your <a href="https://openfeature.dev/docs/reference/concepts/provider" target="_blank" rel="noopener noreferrer" class="">OpenFeature provider</a> using Angular constructs.
You can set your default provider, and optionally configure additional providers for other domains.
Besides configuring your provider, you'll also need to use the <code>OpenFeatureModule</code> in order to utilize the other features of the SDK.</p>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> NgModule </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'@angular/core'</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> CommonModule </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'@angular/common'</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> OpenFeatureModule </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'@openfeature/angular-sdk'</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token decorator at operator" style="color:#d7deea">@</span><span class="token decorator function" style="color:#79b6f2">NgModule</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  declarations</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// Other components</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  imports</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    CommonModule</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    OpenFeatureModule</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">forRoot</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">YourOpenFeatureProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token comment" style="color:#999999">// domainBoundProviders are optional, mostly needed if more than one provider is needed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      domainBoundProviders</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        domain1</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">YourOtherOpenFeatureProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        domain2</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">YourOtherOtherOpenFeatureProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">export</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">AppModule</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="easy-templating-with-directives">Easy Templating with Directives<a href="https://openfeature.dev/blog/announcing-angular-sdk#easy-templating-with-directives" class="hash-link" aria-label="Direct link to Easy Templating with Directives" title="Direct link to Easy Templating with Directives" translate="no">​</a></h3>
<p>Perhaps the most useful part of the Angular SDK is the inclusion of the built in evaluation directives.
These directives handle all the flag evaluation boilerplate for you, using Angular's directive abstractions which add functionality to elements.
In its most basic form, the directive differentially renders templates based on the flag evaluation result:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">&lt;!-- evaluate a flag called new-message and show a render a different template based on the result --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">div</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token tag" style="color:#fc929e">  </span><span class="token tag attr-name" style="color:#c5a5c5">*booleanFeatureFlag</span><span class="token tag attr-value punctuation attr-equals" style="color:#8dc891">=</span><span class="token tag attr-value punctuation" style="color:#8dc891">"</span><span class="token tag attr-value punctuation" style="color:#8dc891">'</span><span class="token tag attr-value" style="color:#8dc891">new-message'; default: true; else: booleanFeatureElse;</span><span class="token tag attr-value punctuation" style="color:#8dc891">"</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain">Welcome to this OpenFeature-enabled Angular app!</span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">div</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">ng-template</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">#booleanFeatureElse</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain">Welcome to this Angular app.</span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">ng-template</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><br></span></code></pre></div></div>
<p>String, Numeric, and Object flags are also supported.
For these, you can supply templates based by matching against the returned flag value:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">&lt;!-- render this template if the value == 10 --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">div</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token tag" style="color:#fc929e">  </span><span class="token tag attr-name" style="color:#c5a5c5">*numberFeatureFlag</span><span class="token tag attr-value punctuation attr-equals" style="color:#8dc891">=</span><span class="token tag attr-value punctuation" style="color:#8dc891">"</span><span class="token tag attr-value punctuation" style="color:#8dc891">'</span><span class="token tag attr-value" style="color:#8dc891">discountRate'; value: 10; default: 5; else: numberFeatureElse</span><span class="token tag attr-value punctuation" style="color:#8dc891">"</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  This is shown when the feature flag matches the specified discount rate.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">div</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">&lt;!-- render this template if the value != 10 --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">ng-template</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">#numberFeatureElse</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  This is shown when the feature flag does not match the specified discount rate.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">ng-template</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><br></span></code></pre></div></div>
<p>Additionally, it's possible to bind the evaluation result and related metadata to the template by omitting the <code>value</code> to match:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">&lt;!-- omitting the `value` to match against unconditionally renders this template --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">div</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">*stringFeatureFlag</span><span class="token tag attr-value punctuation attr-equals" style="color:#8dc891">=</span><span class="token tag attr-value punctuation" style="color:#8dc891">"</span><span class="token tag attr-value punctuation" style="color:#8dc891">'</span><span class="token tag attr-value" style="color:#8dc891">themeColor'; default: 'light'; let value;</span><span class="token tag attr-value punctuation" style="color:#8dc891">"</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  The theme color is {{ value }}.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">div</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="loading-and-automatic-re-rendering">Loading and Automatic Re-Rendering<a href="https://openfeature.dev/blog/announcing-angular-sdk#loading-and-automatic-re-rendering" class="hash-link" aria-label="Direct link to Loading and Automatic Re-Rendering" title="Direct link to Loading and Automatic Re-Rendering" translate="no">​</a></h3>
<p>You may want to hide some content until your provider is ready.
For this reason, the directives support specifying templates to render before your provider is ready, and while it's <a href="https://openfeature.dev/docs/reference/concepts/sdk-paradigms#static-context-paradigms-client-side-sdks" target="_blank" rel="noopener noreferrer" class="">reconciling its state</a> after context changes.
The directive will automatically re-render when the provider's readiness changes, or if the flag values themselves change.</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">&lt;!-- render different templates based on the readiness of the flag provider --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">div</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token tag" style="color:#fc929e">  </span><span class="token tag attr-name" style="color:#c5a5c5">*booleanFeatureFlag</span><span class="token tag attr-value punctuation attr-equals" style="color:#8dc891">=</span><span class="token tag attr-value punctuation" style="color:#8dc891">"</span><span class="token tag attr-value punctuation" style="color:#8dc891">'</span><span class="token tag attr-value" style="color:#8dc891">my-feature'; default: true; else: booleanFeatureElse; initializing: booleanFeatureInitializing; reconciling: booleanFeatureReconciling</span><span class="token tag attr-value punctuation" style="color:#8dc891">"</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain">This is shown when the feature flag is enabled.</span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">div</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">ng-template</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">#booleanFeatureElse</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain">This is shown when the feature flag is disabled.</span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">ng-template</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">ng-template</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">#booleanFeatureInitializing</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain">This is shown when the feature flag is initializing.</span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">ng-template</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">ng-template</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">#booleanFeatureReconciling</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain">This is shown when the feature flag is reconciling.</span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">p</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891">&lt;/</span><span class="token tag" style="color:#fc929e">ng-template</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compatibility">Compatibility<a href="https://openfeature.dev/blog/announcing-angular-sdk#compatibility" class="hash-link" aria-label="Direct link to Compatibility" title="Direct link to Compatibility" translate="no">​</a></h2>
<p>As with other framework-specific SDKs, the Angular SDK is built on top of the existing <code>@openfeature/web-sdk</code>.
Any OpenFeature provider built to support the web SDK can also be used with the <code>@openfeature/angular-sdk</code>, no changes required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="looking-ahead">Looking Ahead<a href="https://openfeature.dev/blog/announcing-angular-sdk#looking-ahead" class="hash-link" aria-label="Direct link to Looking Ahead" title="Direct link to Looking Ahead" translate="no">​</a></h2>
<p>We’re eager to expand the Angular SDK’s capabilities with future updates!
If you're an Angular developer or interested in exploring how feature flags can enhance your applications, we encourage you to try out the OpenFeature Angular SDK.
Happy coding! 🎉</p>]]></content:encoded>
            <category>angular</category>
            <category>ng</category>
            <category>sdk</category>
            <category>ts</category>
            <category>js</category>
            <category>javascript</category>
            <category>web</category>
        </item>
        <item>
            <title><![CDATA[OpenFeature Contributor Spotlight: André Silva]]></title>
            <link>https://openfeature.dev/blog/andre-silva-spotlight</link>
            <guid>https://openfeature.dev/blog/andre-silva-spotlight</guid>
            <pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenFeature Contributor Spotlight]]></description>
            <content:encoded><![CDATA[<p>Welcome to our inaugural OpenFeature Contributor Spotlight, where we highlight and celebrate standout contributors who have made a significant impact on the OpenFeature project. For this edition, we’re excited to introduce André Silva, a dedicated developer who has been instrumental in advancing our .NET library and telemetry conventions.</p>
<img src="https://openfeature.dev/assets/images/andre-88183a6614425cdcbdda4290518dc46f.png">
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-involved-with-openfeature">Getting Involved with OpenFeature<a href="https://openfeature.dev/blog/andre-silva-spotlight#getting-involved-with-openfeature" class="hash-link" aria-label="Direct link to Getting Involved with OpenFeature" title="Direct link to Getting Involved with OpenFeature" translate="no">​</a></h2>
<p>André discovered OpenFeature while researching the state of feature flag vendors. He became intrigued by OpenFeature's potential as a new standardization effort in the feature flag space and decided to contribute after noticing some "needs help" tags on GitHub issues.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="motivation-to-contribute">Motivation to Contribute<a href="https://openfeature.dev/blog/andre-silva-spotlight#motivation-to-contribute" class="hash-link" aria-label="Direct link to Motivation to Contribute" title="Direct link to Motivation to Contribute" translate="no">​</a></h2>
<p>For André, contributing to OpenFeature is more than just writing code—it's about solving critical software development and release challenges. He believes in the power of community-driven standards to reduce dependencies on third-party vendors, allowing companies to focus more on their products. The opportunity to shape these standards and libraries, and see them adopted by others, is incredibly rewarding for him.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-contributions">Key Contributions<a href="https://openfeature.dev/blog/andre-silva-spotlight#key-contributions" class="hash-link" aria-label="Direct link to Key Contributions" title="Direct link to Key Contributions" translate="no">​</a></h2>
<p>André has made several significant contributions to OpenFeature, particularly in the .NET ecosystem. Some of his key achievements include:</p>
<ul>
<li class="">Bringing more telemetry signals to the .NET library</li>
<li class="">Adding new features based on the OpenFeature specification to the .NET library</li>
<li class="">Updating the codebase to incorporate the latest C# language features</li>
<li class="">Helping shape telemetry conventions for feature flags</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="most-rewarding-experience">Most Rewarding Experience<a href="https://openfeature.dev/blog/andre-silva-spotlight#most-rewarding-experience" class="hash-link" aria-label="Direct link to Most Rewarding Experience" title="Direct link to Most Rewarding Experience" translate="no">​</a></h2>
<p>For André, the most rewarding aspect of contributing to OpenFeature is seeing the library gain traction among developers. As more people start using OpenFeature, the responsibility to deliver high-quality outcomes increases, but so does the satisfaction of knowing his work is making a difference.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advice-for-newcomers">Advice for Newcomers<a href="https://openfeature.dev/blog/andre-silva-spotlight#advice-for-newcomers" class="hash-link" aria-label="Direct link to Advice for Newcomers" title="Direct link to Advice for Newcomers" translate="no">​</a></h2>
<p>André’s advice for anyone looking to contribute to OpenFeature is simple: "Don't be afraid." The OpenFeature community is always welcoming new contributors, and André is particularly open to helping those interested in working on the .NET libraries.</p>
<h1>Thank You, André!</h1>
<p>We're grateful for André's dedication and contributions to the OpenFeature project. His work has made a significant impact, and we look forward to seeing how he continues to shape the future of feature flag standards.</p>]]></content:encoded>
            <category>contributor</category>
            <category>community</category>
            <category>.NET</category>
            <category>dotnet</category>
            <category>c#</category>
            <category>csharp</category>
            <category>telemetry</category>
        </item>
        <item>
            <title><![CDATA[OpenFeature .NET SDK 2.0 Release]]></title>
            <link>https://openfeature.dev/blog/dotnet-sdk-v2</link>
            <guid>https://openfeature.dev/blog/dotnet-sdk-v2</guid>
            <pubDate>Wed, 21 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Announcing the 2.0 Release of the OpenFeature SDK for .NET]]></description>
            <content:encoded><![CDATA[<p>Today we're announcing the release of the OpenFeature SDK for .NET, v2.0!
This release contains several ergonomic improvements to the SDK, which .NET developers will appreciate.
It also includes some performance optimizations brought to you by the latest .NET primitives.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="notable-improvements">Notable Improvements<a href="https://openfeature.dev/blog/dotnet-sdk-v2#notable-improvements" class="hash-link" aria-label="Direct link to Notable Improvements" title="Direct link to Notable Improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-for-cancellation-tokens-idiomatic-method-names">Support for Cancellation Tokens, Idiomatic Method Names<a href="https://openfeature.dev/blog/dotnet-sdk-v2#support-for-cancellation-tokens-idiomatic-method-names" class="hash-link" aria-label="Direct link to Support for Cancellation Tokens, Idiomatic Method Names" title="Direct link to Support for Cancellation Tokens, Idiomatic Method Names" translate="no">​</a></h3>
<p>Methods on some key interfaces (such as provider resolvers) have been updated to indicate that they work asynchronously, by appending the <code>Async</code> suffix in accordance with .NET conventions:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">myProviderInstance</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetProviderAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">myProviderInstance</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<p>Additionally, optional cancellation tokens can now be passed to applicable asynchronous methods.
This allows for the cancellation of async tasks, and is consistent with .NET norms:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetBooleanValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"my-flag"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetBooleanValueAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"my-flag"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> cancellationToken</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="valuetasks-for-hooks">ValueTasks for Hooks<a href="https://openfeature.dev/blog/dotnet-sdk-v2#valuetasks-for-hooks" class="hash-link" aria-label="Direct link to ValueTasks for Hooks" title="Direct link to ValueTasks for Hooks" translate="no">​</a></h3>
<p>The return types for stages within <a class="" href="https://openfeature.dev/docs/reference/concepts/hooks">hooks</a> have been updated to take advantage of the performance benefit provided by <a href="https://devblogs.microsoft.com/dotnet/understanding-the-whys-whats-and-whens-of-valuetask/" target="_blank" rel="noopener noreferrer" class="">ValueTasks</a>.
The vast majority of hook stages run synchronously, and they are awaited internally by the SDK; so we can avoid the additional allocations associated with <code>Tasks</code> by using <code>ValueTasks</code>:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyBeforeHook</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token type-list class-name" style="color:#FAC863">Hook</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">EvaluationContext</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token generic-method function" style="color:#79b6f2">Before</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&lt;</span><span class="token generic-method generic class-name" style="color:#FAC863">T</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name" style="color:#FAC863">T</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">        </span><span class="token class-name" style="color:#FAC863">IReadOnlyDictionary</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token class-name punctuation" style="color:#8dc891">,</span><span class="token class-name" style="color:#FAC863"> </span><span class="token class-name keyword" style="color:#c5a5c5">object</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> hints </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">      </span><span class="token comment" style="color:#999999">// code to run before flag evaluation</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">ValueTask</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">EvaluationContext</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token generic-method function" style="color:#79b6f2">BeforeAsync</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&lt;</span><span class="token generic-method generic class-name" style="color:#FAC863">T</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name" style="color:#FAC863">T</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">        </span><span class="token class-name" style="color:#FAC863">IReadOnlyDictionary</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token class-name punctuation" style="color:#8dc891">,</span><span class="token class-name" style="color:#FAC863"> </span><span class="token class-name keyword" style="color:#c5a5c5">object</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> hints </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">CancellationToken</span><span class="token plain"> cancellationToken </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">      </span><span class="token comment" style="color:#999999">// code to run before flag evaluation</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration-steps">Migration Steps<a href="https://openfeature.dev/blog/dotnet-sdk-v2#migration-steps" class="hash-link" aria-label="Direct link to Migration Steps" title="Direct link to Migration Steps" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="application-authors">Application Authors<a href="https://openfeature.dev/blog/dotnet-sdk-v2#application-authors" class="hash-link" aria-label="Direct link to Application Authors" title="Direct link to Application Authors" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="async-suffixes-and-cancellation-tokens">Async suffixes and Cancellation Tokens<a href="https://openfeature.dev/blog/dotnet-sdk-v2#async-suffixes-and-cancellation-tokens" class="hash-link" aria-label="Direct link to Async suffixes and Cancellation Tokens" title="Direct link to Async suffixes and Cancellation Tokens" translate="no">​</a></h4>
<p>Generally, application authors won't have to make many changes.</p>
<p>As mentioned above, some async methods have been changed to conform to .NET conventions.
Evaluation methods now have the "Async" suffix, and accept an optional cancellationToken:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetBooleanValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"my-flag"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetBooleanValueAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"my-flag"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> cancellationToken</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<p>The method for setting a provider has been updated similarly:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">myProviderInstance</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetProviderAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">myProviderInstance</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="client-name-has-changed-to-domain">"Client Name" has Changed to "Domain"<a href="https://openfeature.dev/blog/dotnet-sdk-v2#client-name-has-changed-to-domain" class="hash-link" aria-label="Direct link to &quot;Client Name&quot; has Changed to &quot;Domain&quot;" title="Direct link to &quot;Client Name&quot; has Changed to &quot;Domain&quot;" translate="no">​</a></h4>
<p>Parameters previously named "client name" are now named "domain".
"<a href="https://openfeature.dev/specification/glossary/#domain" target="_blank" rel="noopener noreferrer" class="">Domains</a>" are a more powerful concept than "named clients", but in instances where named clients were previously used, function identically.
No changes to consuming code are necessary these cases.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="provider-authors">Provider Authors<a href="https://openfeature.dev/blog/dotnet-sdk-v2#provider-authors" class="hash-link" aria-label="Direct link to Provider Authors" title="Direct link to Provider Authors" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="provider-method-name-changes">Provider Method Name Changes<a href="https://openfeature.dev/blog/dotnet-sdk-v2#provider-method-name-changes" class="hash-link" aria-label="Direct link to Provider Method Name Changes" title="Direct link to Provider Method Name Changes" translate="no">​</a></h4>
<p>Provider authors must change their implementations in accordance with new methods names on the provider interface.
Optionally, you can make use of the new cancellation token:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">ResolutionDetails</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name keyword" style="color:#c5a5c5">bool</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">ResolveBooleanValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">                </span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token plain"> flagKey</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">                </span><span class="token class-name keyword" style="color:#c5a5c5">bool</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">                </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token class-name punctuation" style="color:#8dc891">?</span><span class="token plain"> context </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">                </span><span class="token comment" style="color:#999999">// return boolean flag details</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">ResolutionDetails</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name keyword" style="color:#c5a5c5">bool</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">ResolveBooleanValueAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">                </span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token plain"> flagKey</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">                </span><span class="token class-name keyword" style="color:#c5a5c5">bool</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">                </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token class-name punctuation" style="color:#8dc891">?</span><span class="token plain"> context </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">                </span><span class="token class-name" style="color:#FAC863">CancellationToken</span><span class="token plain"> cancellationToken </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">                </span><span class="token comment" style="color:#999999">// return boolean flag details</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">            </span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="no-need-for-provider-status">No Need for Provider Status<a href="https://openfeature.dev/blog/dotnet-sdk-v2#no-need-for-provider-status" class="hash-link" aria-label="Direct link to No Need for Provider Status" title="Direct link to No Need for Provider Status" translate="no">​</a></h4>
<p>It's no longer necessary to define, update or expose provider status.
If your provider requires initialization, simply define the optional <code>InitializeAsync</code> method:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyProvider</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token type-list class-name" style="color:#FAC863">FeatureProvider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">private</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderStatus</span><span class="token plain"> _status </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> ProviderStatus</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">NotReady</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain">        </span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">   </span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">ProviderStatus</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">GetStatus</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">        </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> _status</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">Initialize</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">InitializeAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">CancellationToken</span><span class="token plain"> cancellationToken </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token comment" style="color:#999999">// some async initialization</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<p>For more details about this change, see our <a class="" href="https://openfeature.dev/blog/reconciling-with-state">previous blog post</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hook-authors">Hook Authors<a href="https://openfeature.dev/blog/dotnet-sdk-v2#hook-authors" class="hash-link" aria-label="Direct link to Hook Authors" title="Direct link to Hook Authors" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="hooks-must-return-valuetask">Hooks Must Return ValueTask<a href="https://openfeature.dev/blog/dotnet-sdk-v2#hooks-must-return-valuetask" class="hash-link" aria-label="Direct link to Hooks Must Return ValueTask" title="Direct link to Hooks Must Return ValueTask" translate="no">​</a></h4>
<p>Hooks must now return <code>ValueTask</code> instead of <code>Task</code>:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyBeforeHook</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token type-list class-name" style="color:#FAC863">Hook</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">EvaluationContext</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token generic-method function" style="color:#79b6f2">Before</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&lt;</span><span class="token generic-method generic class-name" style="color:#FAC863">T</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name" style="color:#FAC863">T</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">        </span><span class="token class-name" style="color:#FAC863">IReadOnlyDictionary</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token class-name punctuation" style="color:#8dc891">,</span><span class="token class-name" style="color:#FAC863"> </span><span class="token class-name keyword" style="color:#c5a5c5">object</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> hints </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">      </span><span class="token comment" style="color:#999999">// code to run before flag evaluation</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-remove-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">ValueTask</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">EvaluationContext</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token generic-method function" style="color:#79b6f2">BeforeAsync</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&lt;</span><span class="token generic-method generic class-name" style="color:#FAC863">T</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name" style="color:#FAC863">T</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">        </span><span class="token class-name" style="color:#FAC863">IReadOnlyDictionary</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token class-name punctuation" style="color:#8dc891">,</span><span class="token class-name" style="color:#FAC863"> </span><span class="token class-name keyword" style="color:#c5a5c5">object</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> hints </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">CancellationToken</span><span class="token plain"> cancellationToken </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">      </span><span class="token comment" style="color:#999999">// code to run before flag evaluation</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line code-block-diff-add-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-changelog">Full Changelog<a href="https://openfeature.dev/blog/dotnet-sdk-v2#full-changelog" class="hash-link" aria-label="Direct link to Full Changelog" title="Direct link to Full Changelog" translate="no">​</a></h2>
<p>See <a href="https://github.com/open-feature/dotnet-sdk/blob/main/CHANGELOG.md#200-2024-08-21" target="_blank" rel="noopener noreferrer" class="">here</a> for the full changelog.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thanks">Thanks!<a href="https://openfeature.dev/blog/dotnet-sdk-v2#thanks" class="hash-link" aria-label="Direct link to Thanks!" title="Direct link to Thanks!" translate="no">​</a></h2>
<p>Thanks to all our users, and a special thanks to everyone who contributed to the .NET SDK:</p>
<img src="https://openfeature.dev/assets/images/contributors-7b1a49772ea2cbf64a2255715de6e052.png">]]></content:encoded>
            <category>.NET</category>
            <category>dotnet</category>
            <category>c#</category>
            <category>csharp</category>
            <category>async</category>
            <category>v2.0</category>
            <category>v2</category>
            <category>sdk</category>
        </item>
        <item>
            <title><![CDATA[Join OpenFeature at WeAreDevelopers World Congress '24]]></title>
            <link>https://openfeature.dev/blog/wearedevelopers-2024</link>
            <guid>https://openfeature.dev/blog/wearedevelopers-2024</guid>
            <pubDate>Thu, 18 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[WeAreDevelopers]]></description>
            <content:encoded><![CDATA[<p>We are thrilled that OpenFeature is featured as part of the GitHub Open Source Spotlight at the 2024 WeAreDevelopers World Congress in Berlin, Germany, taking place July 18-19, 2024.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="about-the-wearedevelopers-world-congress">About the WeAreDevelopers World Congress<a href="https://openfeature.dev/blog/wearedevelopers-2024#about-the-wearedevelopers-world-congress" class="hash-link" aria-label="Direct link to About the WeAreDevelopers World Congress" title="Direct link to About the WeAreDevelopers World Congress" translate="no">​</a></h2>
<p>The WeAreDevelopers World Congress is one of the largest developer conferences globally. It brings together tech enthusiasts, developers, engineers, and thought leaders from around the world to discuss the latest trends, innovations, and technologies shaping the future. With over 200 speakers, including industry pioneers and tech visionaries, the event offers a comprehensive agenda filled with keynote speeches, workshops, and networking opportunities. This congress is an excellent opportunity for learning, inspiration, and professional growth, making it a valuable event for anyone passionate about technology.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="about-the-github-open-source-spotlight">About the GitHub Open Source Spotlight<a href="https://openfeature.dev/blog/wearedevelopers-2024#about-the-github-open-source-spotlight" class="hash-link" aria-label="Direct link to About the GitHub Open Source Spotlight" title="Direct link to About the GitHub Open Source Spotlight" translate="no">​</a></h2>
<p>The GitHub Open Source Spotlight is a dedicated space within the WeAreDevelopers World Congress that highlights notable open-source projects and the communities behind them. This spotlight provides a platform for developers to showcase their work, share insights, and collaborate with peers. Being featured in this segment underscores the importance and impact of open-source contributions in the tech ecosystem. We are honored to be part of this lineup, where we can share our journey, innovations, and future plans with the broader tech community.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-to-find-us">Where to Find Us<a href="https://openfeature.dev/blog/wearedevelopers-2024#where-to-find-us" class="hash-link" aria-label="Direct link to Where to Find Us" title="Direct link to Where to Find Us" translate="no">​</a></h2>
<p>You can find us at Exhibition Hall 2.2. Our booth will feature:</p>
<ul>
<li class=""><strong>Live Demos:</strong> Get hands-on experience with OpenFeature and see how it can integrate into your projects.</li>
<li class=""><strong>Expert Talks:</strong> Engage with members of the OpenFeature team who will be available to discuss your queries, provide insights, and share best practices.</li>
<li class=""><strong>Networking Opportunities:</strong> Connect with like-minded professionals, exchange ideas, and build relationships that can help propel your projects and career forward.</li>
</ul>
<p>Follow OpenFeature on all our social channels to stay updated throughout the event.</p>
<ul>
<li class=""><strong>Twitter:</strong> <a href="https://twitter.com/OpenFeature" target="_blank" rel="noopener noreferrer" class="">@OpenFeature</a></li>
<li class=""><strong>LinkedIn:</strong> <a href="https://www.linkedin.com/company/openfeature" target="_blank" rel="noopener noreferrer" class="">OpenFeature</a></li>
<li class=""><strong>GitHub:</strong> <a href="https://github.com/openfeature" target="_blank" rel="noopener noreferrer" class="">OpenFeature</a></li>
</ul>]]></content:encoded>
            <category>wearedevelopers</category>
            <category>booth</category>
        </item>
        <item>
            <title><![CDATA[OpenFeature Multi-Provider Release]]></title>
            <link>https://openfeature.dev/blog/openfeature-multi-provider-release</link>
            <guid>https://openfeature.dev/blog/openfeature-multi-provider-release</guid>
            <pubDate>Fri, 14 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Introducing an OpenFeature Multi-Provider for Node.js and JavaScript]]></description>
            <content:encoded><![CDATA[<p>We are excited to announce the release of the OpenFeature “Multi-Provider” for JavaScript and NodeJS. This new provider allows developers to access multiple OpenFeature providers through a unified interface, with customizable strategies that reconcile inconsistencies between providers. The Multi-Provider supports use cases including provider migrations and long-term support for multiple feature flag sources. It is currently available for the Javascript OpenFeature SDKs <a href="https://www.npmjs.com/package/@openfeature/server-sdk" target="_blank" rel="noopener noreferrer" class="">@openfeature/server-sdk</a> and <a href="https://www.npmjs.com/package/@openfeature/web-sdk" target="_blank" rel="noopener noreferrer" class="">@openfeature/web-sdk</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How It Works<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> multiProvider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MultiProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderA</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderB</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword control-flow" style="color:#c5a5c5">await</span><span class="token plain"> </span><span class="token maybe-class-name">OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">setProviderAndWait</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">multiProvider</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">openFeatureClient </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token maybe-class-name">OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> value </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#c5a5c5">await</span><span class="token plain"> openFeatureClient</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">getStringValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">'flag-key'</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'default value'</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> someUser</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<p>The Multi-Provider behaves like any other provider, but under the hood it combines results from any number of providers. It takes a list of providers as its only required parameter, then evaluates flags by progressing through the list of providers in order. By default, it will only evaluate the next provider if the current one indicates the flag was not found. Once there is a flag match, the Multi-Provider will return that result and not evaluate with the remaining providers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="strategies">Strategies<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#strategies" class="hash-link" aria-label="Direct link to Strategies" title="Direct link to Strategies" translate="no">​</a></h2>
<p>In order to support diverse use cases, the Multi-Provider also accepts a Strategy parameter, which can be customized to control which providers are evaluated and how the final result is determined.</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> multiProvider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MultiProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderA</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderB</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">SomeStrategy</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-match-strategy">First Match Strategy<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#first-match-strategy" class="hash-link" aria-label="Direct link to First Match Strategy" title="Direct link to First Match Strategy" translate="no">​</a></h3>
<p>The default Strategy is the <code>FirstMatchStrategy</code>. This will evaluate providers in order, moving on to the next provider only if the current provider returns a <code>FLAG_NOT_FOUND</code> result. If an error is thrown by any provider, the Multi-Provider will throw that error. The OpenFeature SDK will then catch the error and return the default value.</p>
<p>This strategy is useful for migrating from one provider to another, when some flags have been ported to the new system while others remain in the old one. By putting the new provider first in the provider's list, the Multi-Provider will prefer results from the new system but keep the old as a fallback.</p>
<p><code>FirstMatchStrategy</code> can also be used to pull feature flags from multiple sources, and return as soon as the flag is found.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-successful-strategy">First Successful Strategy<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#first-successful-strategy" class="hash-link" aria-label="Direct link to First Successful Strategy" title="Direct link to First Successful Strategy" translate="no">​</a></h3>
<p><code>FirstSuccessfulStrategy</code> is similar to <code>FirstMatchStrategy</code>, except that errors from evaluated providers do not halt execution. Instead, it will return the first successful result from a provider. If no provider successfully responds, it will throw an error result.</p>
<p>One use case for this strategy is if you want the Multi-Provider to fallback to another provider in the case of an error, rather than throwing an error itself. For example, if an external vendor provider goes down, you may want to automatically fall back to a config file.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="comparison-strategy">Comparison Strategy<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#comparison-strategy" class="hash-link" aria-label="Direct link to Comparison Strategy" title="Direct link to Comparison Strategy" translate="no">​</a></h3>
<p>The <code>ComparisonStrategy</code> requires that all providers agree on a value. If the providers return the same value, the result of the evaluation will be that value. Otherwise, the evaluation result will contain an error in the <code>errors</code> field to indicate a mismatch, and the result value will be the value returned by the first provider. The <code>ComparisonStrategy</code> also evaluates all providers in parallel, as it is not intended to exit as soon as it finds a match.</p>
<p>One use case for this strategy is validating the success of a provider migration. If the configuration in one provider has been recreated in another, this strategy confirms the flags and user targeting are consistent between those sources.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-strategies">Custom Strategies<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#custom-strategies" class="hash-link" aria-label="Direct link to Custom Strategies" title="Direct link to Custom Strategies" translate="no">​</a></h3>
<p>In order to support complex provider behaviour and diverse use cases, users can write custom strategies that extend the abstract <code>BaseEvaluationStrategy</code> class. Some key methods to control the Multi-Provider’s behaviour include:</p>
<ul>
<li class=""><strong>runMode:</strong> This property determines whether providers are evaluated sequentially or in parallel.</li>
<li class=""><strong>shouldEvaluateThisProvider:</strong> This function is called before a provider is evaluated. If it returns false, the provider is skipped. This is useful for conditional evaluations based on the flag key or the provider's state.<!-- -->
<ul>
<li class="">For example, if you know that all flag keys containing the substring <code>provider_a_</code> should only be evaluated using ProviderA, you can skip evaluating with any other providers when that prefix is used.</li>
</ul>
</li>
</ul>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">export</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyCustomStrategy</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">BaseEvaluationStrategy</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token comment" style="color:#999999">// In this example, we know keys containing 'provider_a_' will only exist in ProviderA</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  override </span><span class="token function" style="color:#79b6f2">shouldEvaluateThisProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    strategyContext</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">StrategyPerProviderContext</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    evalContext</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">EvaluationContext</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">)</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token builtin" style="color:#D8DEE9">boolean</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">strategyContext</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">flagKey</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">includes</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">'provider_a_'</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;&amp;</span><span class="token plain"> strategyContext</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">providerName</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">!==</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'ProviderA'</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<ul>
<li class=""><strong>shouldEvaluateNextProvider:</strong> After a provider is evaluated, this function determines whether to proceed with evaluating the next provider. It takes into account the result or any errors encountered. If it returns true, the next provider is evaluated; otherwise, the evaluation stops and the results are passed to <code>determineFinalResult</code>. In parallel execution mode, this function is not called.<!-- -->
<ul>
<li class="">If your provider indicates that a result should not be used in a non-standard way, you can customize <code>shouldEvaluateNextProvider</code> to continue to the next provider if that condition is met. For example, if your provider result should be skipped when <code>flagMetadata.unusableResult</code> is <code>true</code>, you can check for that property here.</li>
</ul>
</li>
</ul>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">export</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyCustomStrategy</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">BaseEvaluationStrategy</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  override </span><span class="token generic-function function" style="color:#79b6f2">shouldEvaluateNextProvider</span><span class="token generic-function generic class-name operator" style="color:#d7deea">&lt;</span><span class="token generic-function generic class-name constant" style="color:#5a9bcf">T</span><span class="token generic-function generic class-name" style="color:#FAC863"> </span><span class="token generic-function generic class-name keyword" style="color:#c5a5c5">extends</span><span class="token generic-function generic class-name" style="color:#FAC863"> FlagValue</span><span class="token generic-function generic class-name operator" style="color:#d7deea">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    strategyContext</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">StrategyPerProviderContext</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    context</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">EvaluationContext</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    details</span><span class="token operator" style="color:#d7deea">?</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">ResolutionDetails</span><span class="token operator" style="color:#d7deea">&lt;</span><span class="token constant" style="color:#5a9bcf">T</span><span class="token operator" style="color:#d7deea">&gt;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    thrownError</span><span class="token operator" style="color:#d7deea">?</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token builtin" style="color:#D8DEE9">unknown</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">)</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token builtin" style="color:#D8DEE9">boolean</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// if the provider indicates the result should not be used, continue to next provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">details</span><span class="token operator" style="color:#d7deea">?.</span><span class="token plain">flagMetadata</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">unusableResult</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">===</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// otherwise, return this result</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<ul>
<li class=""><strong>determineFinalResult:</strong> This function is invoked after all evaluations are completed (or when no further evaluations are needed). It consolidates the results and determines the final outcome. The function must return a <code>FinalResult</code> object, which includes the final resolution details and the corresponding provider, or an array of errors if the result was unsuccessful.<!-- -->
<ul>
<li class="">For example, if you are evaluating several providers in parallel and want to control which result is used in the case of a mismatch, rather than using the built-in <code>ComparisonStrategy</code>, you could override this function.</li>
</ul>
</li>
</ul>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">export</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyCustomStrategy</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">BaseEvaluationStrategy</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  override runMode </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'parallel'</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  override </span><span class="token generic-function function" style="color:#79b6f2">determineFinalResult</span><span class="token generic-function generic class-name operator" style="color:#d7deea">&lt;</span><span class="token generic-function generic class-name constant" style="color:#5a9bcf">T</span><span class="token generic-function generic class-name" style="color:#FAC863"> </span><span class="token generic-function generic class-name keyword" style="color:#c5a5c5">extends</span><span class="token generic-function generic class-name" style="color:#FAC863"> FlagValue</span><span class="token generic-function generic class-name operator" style="color:#d7deea">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    strategyContext</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">StrategyPerProviderContext</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    context</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">EvaluationContext</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    resolutions</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">ProviderResolutionResult</span><span class="token operator" style="color:#d7deea">&lt;</span><span class="token constant" style="color:#5a9bcf">T</span><span class="token operator" style="color:#d7deea">&gt;</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">)</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">FinalResult</span><span class="token operator" style="color:#d7deea">&lt;</span><span class="token constant" style="color:#5a9bcf">T</span><span class="token operator" style="color:#d7deea">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">let</span><span class="token plain"> value</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token constant" style="color:#5a9bcf">T</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">|</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">undefined</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> resolution </span><span class="token keyword" style="color:#c5a5c5">of</span><span class="token plain"> resolutions</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">typeof</span><span class="token plain"> value </span><span class="token operator" style="color:#d7deea">!==</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'undefined'</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">&amp;&amp;</span><span class="token plain"> value </span><span class="token operator" style="color:#d7deea">!==</span><span class="token plain"> resolution</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">details</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        logger</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">warn</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">'Mismatch between provider results: '</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> value</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> resolution</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">details</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        value </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> resolution</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">details</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token comment" style="color:#999999">// we want to always use the first provider's resolution</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> finalResolution </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> resolutions</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">this</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">resolutionToFinalResult</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">finalResolution</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-cases">Use Cases<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#use-cases" class="hash-link" aria-label="Direct link to Use Cases" title="Direct link to Use Cases" translate="no">​</a></h2>
<p>Some key use cases supported by the Multi-Provider include:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="migrating-from-one-provider-to-another">Migrating from one provider to another<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#migrating-from-one-provider-to-another" class="hash-link" aria-label="Direct link to Migrating from one provider to another" title="Direct link to Migrating from one provider to another" translate="no">​</a></h3>
<p>Let’s say you were using one provider, <code>OldProvider</code>, but have decided to switch to <code>NewProvider</code> moving forward. You have been creating all new flags in <code>NewProvider</code>, while slowly copying over your existing flags. This means your newest flags only exist in <code>NewProvider</code> , some of your older flags only exist in <code>OldProvider</code>, and an increasing number of flags exist in both. Previously, you would have to instantiate an OpenFeature client for each of your providers, or register the providers under different domains and manage switching between them manually. The Multi-Provider allows you to wrap both providers and prioritize the new one automatically:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> multiProvider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MultiProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">NewProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OldProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<p>The <code>NewProvider</code> now takes precedence and will always be used, unless a flag does not exist in its configuration. In that case, the Multi-Provider will fall back to <code>OldProvider</code> automatically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="validating-the-success-of-a-migration">Validating the success of a migration<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#validating-the-success-of-a-migration" class="hash-link" aria-label="Direct link to Validating the success of a migration" title="Direct link to Validating the success of a migration" translate="no">​</a></h3>
<p>You can also use the Multi-Provider to confirm that two or more providers always agree on all evaluation results. For example, once you are finished migrating all of your feature flags from <code>OldProvider</code> to <code>NewProvider</code>, you may want to run concurrently for some time and track any instances where the evaluation results differ, to catch errors in the configuration of <code>NewProvider</code>.</p>
<p>By using the <a href="https://www.notion.so/OpenFeature-Multi-Provider-OF-Blog-Post-4cd7d2e9d7f5473093a5a37b4c3ed89b?pvs=21" target="_blank" rel="noopener noreferrer" class="">ComparisonStrategy</a>, you can configure the Multi-Provider to run all providers and return an error result if the results don’t match.</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> newProvider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">NewProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> oldProvider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OldProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> onMismatch </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">_resolutions</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token maybe-class-name">ProviderResolutionResult</span><span class="token tag punctuation" style="color:#8dc891">&lt;</span><span class="token tag class-name" style="color:#FAC863">FlagValue</span><span class="token tag punctuation" style="color:#8dc891">&gt;</span><span class="token plain-text">[]) =&gt; </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">	logger</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">warn</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">'Provider mismatch!'</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">const multiProvider = new MultiProvider(</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">    [</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">      </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> newProvider</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain-text">,</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">      </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">        </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> oldProvider</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">    ],</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">    new ComparisonStrategy(</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">      oldProvider, // the fallback provider to trust in the case of a mismatch</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">      onMismatch, // callback method called when provider resolutions don't match</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">    )</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain-text">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="aggregating-flags-from-multiple-sources">Aggregating flags from multiple sources<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#aggregating-flags-from-multiple-sources" class="hash-link" aria-label="Direct link to Aggregating flags from multiple sources" title="Direct link to Aggregating flags from multiple sources" translate="no">​</a></h3>
<p>The Multi-Provider can be used to combine feature flags from sources such as environment variables, database entries, and vendor feature flags, without having to instantiate multiple SDK clients. The order of the providers list establishes the precedence order of providers to control which should be trusted if keys exist in both systems. For example, if you want to use environment variables to override flag values from a vendor provider, you could pass the environment variable provider as the first in the providers list.</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> multiProvider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MultiProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EnvVarProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">VendorProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword control-flow" style="color:#c5a5c5">await</span><span class="token plain"> </span><span class="token maybe-class-name">OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">setProviderAndWait</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">multiProvider</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">openFeatureClient </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token maybe-class-name">OpenFeature</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> value </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#c5a5c5">await</span><span class="token plain"> openFeatureClient</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token method function property-access" style="color:#79b6f2">getStringValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">'flag-key'</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'default value'</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> someUser</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<p>If the flag with the key ‘flag-key’ exists in both providers, it will only be evaluated with the <code>EnvVarProvider</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-a-fallback-for-cloud-providers">Setting a fallback for cloud providers<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#setting-a-fallback-for-cloud-providers" class="hash-link" aria-label="Direct link to Setting a fallback for cloud providers" title="Direct link to Setting a fallback for cloud providers" translate="no">​</a></h3>
<p>You can use the Multi-Provider to automatically fall back to a local configuration if an external vendor provider goes down, rather than using the default values. By using the <code>FirstSuccessfulStrategy</code>, the Multi-Provider will move on to the next provider in the list if an error is thrown.</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> multiProvider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MultiProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">VendorProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">      </span><span class="token literal-property property" style="color:#5a9bcf">provider</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EnvVarProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">    </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token punctuation" style="color:#8dc891">]</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">FirstSuccessfulStrategy</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre></div></div>
<p>In this example, if <code>VendorProvider</code> is unavailable for any reason, <code>EnvVarProvider</code> will be evaluated instead.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compatibility">Compatibility<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#compatibility" class="hash-link" aria-label="Direct link to Compatibility" title="Direct link to Compatibility" translate="no">​</a></h2>
<p>The Multi-Provider offers developers more flexibility and control when managing complex feature flag setups. As a first step, we have implemented it in the <a href="https://www.npmjs.com/package/@openfeature/server-sdk" target="_blank" rel="noopener noreferrer" class="">@openfeature/server-sdk</a> and <a href="https://www.npmjs.com/package/@openfeature/web-sdk" target="_blank" rel="noopener noreferrer" class="">@openfeature/web-sdk</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="future-plans">Future Plans<a href="https://openfeature.dev/blog/openfeature-multi-provider-release#future-plans" class="hash-link" aria-label="Direct link to Future Plans" title="Direct link to Future Plans" translate="no">​</a></h2>
<p>We’re excited to get feedback about the current strategies and hear about other possible use cases. As we validate the Multi-Provider on the initial supported implementations we will gradually expand to support other languages and further strategies. We welcome contributors to bring this functionality to other languages.</p>]]></content:encoded>
            <category>node</category>
            <category>javascript</category>
            <category>providers</category>
        </item>
    </channel>
</rss>