CINXE.COM

<!doctype html> <html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-specification docs-version-current docs-doc-page docs-doc-id-sections/evaluation-context" data-has-hydrated="false"> <head> <meta charset="UTF-8"> <meta name="generator" content="Docusaurus v3.7.0"> <title data-rh="true">Evaluation Context | OpenFeature</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://openfeature.dev/img/opengraph.jpg"><meta data-rh="true" name="twitter:image" content="https://openfeature.dev/img/opengraph.jpg"><meta data-rh="true" property="og:url" content="https://openfeature.dev/specification/sections/evaluation-context"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-specification-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-specification-current"><meta data-rh="true" property="og:title" content="Evaluation Context | OpenFeature"><meta data-rh="true" name="description" content="The specification that defines the structure and expectations of evaluation context."><meta data-rh="true" property="og:description" content="The specification that defines the structure and expectations of evaluation context."><link data-rh="true" rel="canonical" href="https://openfeature.dev/specification/sections/evaluation-context"><link data-rh="true" rel="alternate" href="https://openfeature.dev/specification/sections/evaluation-context" hreflang="en"><link data-rh="true" rel="alternate" href="https://openfeature.dev/specification/sections/evaluation-context" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://PH0VDWFP7Q-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="OpenFeature RSS Feed"> <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="OpenFeature Atom Feed"> <link rel="search" type="application/opensearchdescription+xml" title="OpenFeature" href="/opensearch.xml"> <link rel="preconnect" href="https://www.google-analytics.com"> <link rel="preconnect" href="https://www.googletagmanager.com"> <script async src="https://www.googletagmanager.com/gtag/js?id=G-ZG0JSPYJXZ"></script> <script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-ZG0JSPYJXZ",{anonymize_ip:!0})</script> <link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon-precomposed.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png"> <link rel="icon" type="image/svg+xml" href="/favicons/favicon-light.svg"> <link rel="shortcut icon" type="image/x-icon" href="/favicons/favicon.ico"> <link rel="manifest" href="/favicons/site.webmanifest"> <meta name="theme-color" content="#ffffff"> <meta name="msapplication-config" content="/favicons/browserconfig.xml"><link rel="stylesheet" href="/assets/css/styles.385ab5b9.css"> <script src="/assets/js/runtime~main.aa35e229.js" defer="defer"></script> <script src="/assets/js/main.2feeef09.js" defer="defer"></script> </head> <body class="navigation-with-keyboard"> <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const a=new URLSearchParams(window.location.search).entries();for(var[t,e]of a)if(t.startsWith("docusaurus-data-")){var n=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(n,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/logo-dark.svg"><link rel="preload" as="image" href="/img/logo-light.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="announcementBar_mb4j" role="banner"><div class="announcementBarPlaceholder_vyr4"></div><div class="content_knG7 announcementBarContent_xLdY">We're back! Check out all the ways you can connect with us at <a href="/blog/kubeconeu25">KubeCon + CloudNativeCon Europe 2025</a>.</div><button type="button" aria-label="Close" class="clean-btn close closeButton_CVFx announcementBarClose_gvF7"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo-dark.svg" alt="OpenFeature Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/logo-light.svg" alt="OpenFeature Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate"></b></a><a class="navbar__item navbar__link" href="/docs/reference/intro">Docs</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/specification/">Specification</a><a class="navbar__item navbar__link" href="/ecosystem">Ecosystem</a><a class="navbar__item navbar__link" href="/community/">Community</a><a class="navbar__item navbar__link" href="/support-training">Support &amp; Training</a><a class="navbar__item navbar__link" href="/docs/tutorials/five-minutes-to-feature-flags">Tutorials</a><a class="navbar__item navbar__link" href="/blog">Blog</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/open-feature" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub organization"></a><div class="toggle_nTvT colorModeToggle_DEke"><button class="clean-btn toggleButton_gYZh toggleButtonDisabled_zh5C" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)"><div class="toggleLogo_HXbd"><div class="toggleIcon_U8RU"><div class="track_Vm51"><div></div></div></div></div></button></div><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Command+K)"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG menuWithAnnouncementBar_GW3s"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/specification/">Introduction</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/specification/glossary">Glossary</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/specification/types">Types and Data Structures</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--active" href="/specification/category/sections">Sections</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/specification/sections/flag-evaluation">Flag Evaluation API</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/specification/sections/providers">Provider</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/specification/sections/evaluation-context">Evaluation Context</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/specification/sections/hooks">Hooks</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/specification/sections/events">Events</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/specification/sections/tracking">Tracking</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/specification/appendix-a">Appendix A: Included Utilities</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/specification/appendix-b">Appendix B: Gherkin Suites</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/specification/appendix-c">Appendix C: OpenFeature Remote Evaluation Protocol</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/specification/appendix-d">Appendix D: Observability</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/specification/category/sections"><span itemprop="name">Sections</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Evaluation Context</span><meta itemprop="position" content="2"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>3. Evaluation Context</h1></header> <p><a href="https://github.com/open-feature/spec/tree/main/specification#experimental" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://img.shields.io/static/v1?label=Status&amp;message=experimental&amp;color=orange" alt="experimental" class="img_ev3q"></a></p> <h2 class="anchor anchorWithStickyNavbar_LWe7" id="overview">Overview<a href="#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview">​</a></h2> <p>The <code>evaluation context</code> provides ambient information for the purposes of flag evaluation. Contextual data may be used as the basis for targeting, including rule-based evaluation, overrides for specific subjects, or fractional flag evaluation.</p> <p>The context might contain information about the end-user, the application, the host, or any other ambient data that might be useful in flag evaluation. For example, a flag system might define rules that return a specific value based on the user&#x27;s email address, locale, or the time of day. The context provides this information. The context can be optionally provided at evaluation, and mutated in <a href="/specification/sections/hooks">before hooks</a>.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="31-fields">3.1 Fields<a href="#31-fields" class="hash-link" aria-label="Direct link to 3.1 Fields" title="Direct link to 3.1 Fields">​</a></h3> <div class="markdown-alert markdown-alert-note"><p class="markdown-alert-title"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"></path><path d="m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0"></path></svg>Note</p> <p>Field casing is not specified and should be chosen in accordance with language idioms.</p> </div> <p>see: <a href="/specification/types">types</a></p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="requirement-311">Requirement 3.1.1<a href="#requirement-311" class="hash-link" aria-label="Direct link to Requirement 3.1.1" title="Direct link to Requirement 3.1.1">​</a></h4> <blockquote> <p>The <code>evaluation context</code> structure <strong>MUST</strong> define an optional <code>targeting key</code> field of type string, identifying the subject of the flag evaluation.</p> </blockquote> <p>The targeting key uniquely identifies the subject (end-user, or client service) of a flag evaluation. Providers may require this field for fractional flag evaluation, rules, or overrides targeting specific users. Such providers may behave unpredictably if a targeting key is not specified at flag resolution.</p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="requirement-312">Requirement 3.1.2<a href="#requirement-312" class="hash-link" aria-label="Direct link to Requirement 3.1.2" title="Direct link to Requirement 3.1.2">​</a></h4> <blockquote> <p>The evaluation context <strong>MUST</strong> support the inclusion of custom fields, having keys of type <code>string</code>, and values of type <code>boolean | string | number | datetime | structure</code>.</p> </blockquote> <p>see: <a href="/specification/types#structure">structure</a>, <a href="/specification/types#datetime">datetime</a></p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="requirement-313">Requirement 3.1.3<a href="#requirement-313" class="hash-link" aria-label="Direct link to Requirement 3.1.3" title="Direct link to Requirement 3.1.3">​</a></h4> <blockquote> <p>The evaluation context <strong>MUST</strong> support fetching the custom fields by key and also fetching all key value pairs.</p> </blockquote> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="requirement-314">Requirement 3.1.4<a href="#requirement-314" class="hash-link" aria-label="Direct link to Requirement 3.1.4" title="Direct link to Requirement 3.1.4">​</a></h4> <blockquote> <p>The evaluation context fields <strong>MUST</strong> have an unique key.</p> </blockquote> <p>The key uniquely identifies a field in the <code>evaluation context</code> and it should be unique across all types to avoid any collision when marshalling the <code>evaluation context</code> by the provider.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="32-context-levels-and-merging">3.2 Context levels and merging<a href="#32-context-levels-and-merging" class="hash-link" aria-label="Direct link to 3.2 Context levels and merging" title="Direct link to 3.2 Context levels and merging">​</a></h3> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="condition-321">Condition 3.2.1<a href="#condition-321" class="hash-link" aria-label="Direct link to Condition 3.2.1" title="Direct link to Condition 3.2.1">​</a></h4> <blockquote> <p>The implementation uses the dynamic-context paradigm.</p> </blockquote> <p>see: <a href="/specification/glossary#dynamic-context-paradigm">dynamic-context paradigm</a></p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-3211">Conditional Requirement 3.2.1.1<a href="#conditional-requirement-3211" class="hash-link" aria-label="Direct link to Conditional Requirement 3.2.1.1" title="Direct link to Conditional Requirement 3.2.1.1">​</a></h5> <blockquote> <p>The API, Client and invocation <strong>MUST</strong> have a method for supplying <code>evaluation context</code>.</p> </blockquote> <p>API (global) <code>evaluation context</code> can be used to supply static data to flag evaluation, such as an application identifier, compute region, or hostname. Client and invocation <code>evaluation context</code> are ideal for dynamic data, such as end-user attributes.</p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="condition-322">Condition 3.2.2<a href="#condition-322" class="hash-link" aria-label="Direct link to Condition 3.2.2" title="Direct link to Condition 3.2.2">​</a></h4> <p><a href="https://github.com/open-feature/spec/tree/main/specification#experimental" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://img.shields.io/static/v1?label=Status&amp;message=experimental&amp;color=orange" alt="experimental" class="img_ev3q"></a></p> <blockquote> <p>The implementation uses the static-context paradigm.</p> </blockquote> <p>see: <a href="/specification/glossary#static-context-paradigm">static-context paradigm</a></p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-3221">Conditional Requirement 3.2.2.1<a href="#conditional-requirement-3221" class="hash-link" aria-label="Direct link to Conditional Requirement 3.2.2.1" title="Direct link to Conditional Requirement 3.2.2.1">​</a></h5> <blockquote> <p>The API <strong>MUST</strong> have a method for setting the global <code>evaluation context</code>.</p> </blockquote> <p>API (global) <code>evaluation context</code> can be used to supply data to flag evaluation, such as (but not limited to) user name, email, or user organization membership changes.</p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-3222">Conditional Requirement 3.2.2.2<a href="#conditional-requirement-3222" class="hash-link" aria-label="Direct link to Conditional Requirement 3.2.2.2" title="Direct link to Conditional Requirement 3.2.2.2">​</a></h5> <blockquote> <p>The Client and invocation <strong>MUST NOT</strong> have a method for supplying <code>evaluation context</code>.</p> </blockquote> <p>In the static-context paradigm, context is global. The client and invocation cannot supply evaluation context.</p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-3223">Conditional Requirement 3.2.2.3<a href="#conditional-requirement-3223" class="hash-link" aria-label="Direct link to Conditional Requirement 3.2.2.3" title="Direct link to Conditional Requirement 3.2.2.3">​</a></h5> <blockquote> <p>The API <strong>MUST</strong> have a method for setting <code>evaluation context</code> for a <code>domain</code>.</p> </blockquote> <p>In the static-context paradigm, provider specific context can be set using the associated <code>domain</code>. The global context is used if there is no matching provider specific context.</p> <p>See <a href="/specification/sections/flag-evaluation#setting-a-provider">setting a provider</a>, <a href="/specification/glossary#domain">domain</a> for details.</p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-3224">Conditional Requirement 3.2.2.4<a href="#conditional-requirement-3224" class="hash-link" aria-label="Direct link to Conditional Requirement 3.2.2.4" title="Direct link to Conditional Requirement 3.2.2.4">​</a></h5> <blockquote> <p>The API <strong>MUST</strong> have a mechanism to manage <code>evaluation context</code> for an associated <code>domain</code>.</p> </blockquote> <p>In the static-context paradigm, it&#x27;s possible to create and remove provider-specific context. See <a href="/specification/sections/flag-evaluation#setting-a-provider">setting a provider</a>, <a href="/specification/glossary#domain">domain</a> for details.</p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="requirement-323">Requirement 3.2.3<a href="#requirement-323" class="hash-link" aria-label="Direct link to Requirement 3.2.3" title="Direct link to Requirement 3.2.3">​</a></h4> <blockquote> <p>Evaluation context <strong>MUST</strong> be merged in the order: API (global; lowest precedence) -&gt; transaction -&gt; client -&gt; invocation -&gt; before hooks (highest precedence), with duplicate values being overwritten.</p> </blockquote> <p>Any fields defined in the transaction <code>evaluation context</code> will overwrite duplicate fields defined in the global <code>evaluation context</code>, any fields defined in the client <code>evaluation context</code> will overwrite duplicate fields defined in the transaction <code>evaluation context</code>, and fields defined in the invocation <code>evaluation context</code> will overwrite duplicate fields defined globally or on the client. Any resulting <code>evaluation context</code> from a <a href="/specification/sections/hooks#requirement-434">before hook</a> will overwrite duplicate fields defined globally, on the client, or in the invocation.</p> <!-- --> <p>This describes the precedence of all <code>evaluation context</code> variants. Depending on the <code>paradigm</code>, not all variants might be available in an <code>SDK</code> implementation.</p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="condition-324">Condition 3.2.4<a href="#condition-324" class="hash-link" aria-label="Direct link to Condition 3.2.4" title="Direct link to Condition 3.2.4">​</a></h4> <p><a href="https://github.com/open-feature/spec/tree/main/specification#experimental" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://img.shields.io/static/v1?label=Status&amp;message=experimental&amp;color=orange" alt="experimental" class="img_ev3q"></a></p> <blockquote> <p>The implementation uses the static-context paradigm.</p> </blockquote> <p>see: <a href="/specification/glossary#static-context-paradigm">static-context paradigm</a></p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-3241">Conditional Requirement 3.2.4.1<a href="#conditional-requirement-3241" class="hash-link" aria-label="Direct link to Conditional Requirement 3.2.4.1" title="Direct link to Conditional Requirement 3.2.4.1">​</a></h5> <blockquote> <p>When the global <code>evaluation context</code> is set, the <code>on context changed</code> function <strong>MUST</strong> run.</p> </blockquote> <p>The SDK implementation must run the <code>on context changed</code> function on all registered provider that use the global <code>evaluation context</code> whenever it is mutated.</p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-3242">Conditional Requirement 3.2.4.2<a href="#conditional-requirement-3242" class="hash-link" aria-label="Direct link to Conditional Requirement 3.2.4.2" title="Direct link to Conditional Requirement 3.2.4.2">​</a></h5> <blockquote> <p>When the <code>evaluation context</code> for a specific provider is set, the <code>on context changed</code> function <strong>MUST</strong> only run on the associated provider.</p> </blockquote> <p>The SDK implementation must run the <code>on context changed</code> function only on the provider that is scoped to the mutated <code>evaluation context</code>.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="33-context-propagation">3.3 Context Propagation<a href="#33-context-propagation" class="hash-link" aria-label="Direct link to 3.3 Context Propagation" title="Direct link to 3.3 Context Propagation">​</a></h3> <p><a href="https://github.com/open-feature/spec/tree/main/specification#experimental" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://img.shields.io/static/v1?label=Status&amp;message=experimental&amp;color=orange" alt="experimental" class="img_ev3q"></a></p> <p><code>Transaction context</code> is a container for transaction-specific <code>evaluation context</code> (e.g. user id, user agent, IP). Transaction context can be set where specific data is available (e.g. an auth service or request handler) and by using the <code>transaction context propagator</code> it will automatically be applied to all flag evaluations within a transaction (e.g. a request or thread).</p> <p>The following shows a possible TypeScript implementation using <a href="https://nodejs.org/api/async_context.html" target="_blank" rel="noopener noreferrer">AsyncLocalStorage (async_hooks)</a>:</p> <div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><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">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">AsyncLocalStorageTransactionContext</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">TransactionContextPropagator</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">private</span><span class="token plain"> asyncLocalStorage </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">AsyncLocalStorage</span><span class="token class-name operator" style="color:#d7deea">&lt;</span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token 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 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 function" style="color:#79b6f2">getTransactionContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> 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 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 plain">asyncLocalStorage</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getStore</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 operator" style="color:#d7deea">??</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 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 function" style="color:#79b6f2">setTransactionContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">context</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> EvaluationContext</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token function-variable function" style="color:#79b6f2">callback</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 punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</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 keyword" style="color:#c5a5c5">void</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">this</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">asyncLocalStorage</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">run</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"> callback</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 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 doc-comment comment" style="color:#999999">/**</span><br></span><span class="token-line" style="color:#ffffff"><span class="token doc-comment comment" style="color:#999999"> * This example is based on an express middleware.</span><br></span><span class="token-line" style="color:#ffffff"><span class="token doc-comment comment" style="color:#999999"> */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">app</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">use</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">req</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> Request</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> res</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> next</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> NextFunction</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </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">const</span><span class="token plain"> ip </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> res</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 function" style="color:#79b6f2">get</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;X-Forwarded-For&quot;</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">setTransactionContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> targetingKey</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> req</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">user</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">id</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> ipAddress</span><span class="token operator" style="color:#d7deea">:</span><span class="token plain"> ip </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 punctuation" style="color:#8dc891">)</span><span class="token plain"> </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 comment" style="color:#999999">// The transaction context is used in any flag evaluation throughout the whole call chain of next </span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token function" style="color:#79b6f2">next</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"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="condition-331">Condition 3.3.1<a href="#condition-331" class="hash-link" aria-label="Direct link to Condition 3.3.1" title="Direct link to Condition 3.3.1">​</a></h4> <blockquote> <p>The implementation uses the dynamic-context paradigm.</p> </blockquote> <p>see: <a href="/specification/glossary#dynamic-context-paradigm">dynamic-context paradigm</a></p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-3311">Conditional Requirement 3.3.1.1<a href="#conditional-requirement-3311" class="hash-link" aria-label="Direct link to Conditional Requirement 3.3.1.1" title="Direct link to Conditional Requirement 3.3.1.1">​</a></h5> <blockquote> <p>The API <strong>SHOULD</strong> have a method for setting a <code>transaction context propagator</code>.</p> </blockquote> <p>If there already is a <code>transaction context propagator</code>, it is replaced with the new one.</p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="condition-3312">Condition 3.3.1.2<a href="#condition-3312" class="hash-link" aria-label="Direct link to Condition 3.3.1.2" title="Direct link to Condition 3.3.1.2">​</a></h4> <blockquote> <p>The SDK implements context propagation.</p> </blockquote> <p>A language may not have any applicable way of implementing <code>transaction context propagation</code> so the language SDK might not implement context propagation.</p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-33121">Conditional Requirement 3.3.1.2.1<a href="#conditional-requirement-33121" class="hash-link" aria-label="Direct link to Conditional Requirement 3.3.1.2.1" title="Direct link to Conditional Requirement 3.3.1.2.1">​</a></h5> <blockquote> <p>The API <strong>MUST</strong> have a method for setting the <code>evaluation context</code> of the <code>transaction context propagator</code> for the current transaction.</p> </blockquote> <p>If a <code>transaction context propagator</code> is set, the SDK will call the <a href="#conditional-requirement-33122">method defined in 3.3.1.3</a> with this <code>evaluation context</code> and so this <code>evaluation context</code> will be available during the current transaction. If no <code>transaction context propagator</code> is set, this <code>evaluation context</code> is not used for evaluations. This method then can be used for example in a request handler to add request-specific information to the <code>evaluation context</code>.</p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-33122">Conditional Requirement 3.3.1.2.2<a href="#conditional-requirement-33122" class="hash-link" aria-label="Direct link to Conditional Requirement 3.3.1.2.2" title="Direct link to Conditional Requirement 3.3.1.2.2">​</a></h5> <blockquote> <p>A <code>transaction context propagator</code> <strong>MUST</strong> have a method for setting the <code>evaluation context</code> of the current transaction.</p> </blockquote> <p>A <code>transaction context propagator</code> is responsible for persisting context for the duration of a single transaction. Typically, a transaction context propagator will propagate the context using a language-specific carrier such as <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html" target="_blank" rel="noopener noreferrer">ThreadLocal (Java)</a>, <a href="https://nodejs.org/api/async_hooks.html" target="_blank" rel="noopener noreferrer">async hooks (Node.js)</a>, <a href="https://pkg.go.dev/context" target="_blank" rel="noopener noreferrer">Context (Go)</a> or another similar mechanism.</p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-33123">Conditional Requirement 3.3.1.2.3<a href="#conditional-requirement-33123" class="hash-link" aria-label="Direct link to Conditional Requirement 3.3.1.2.3" title="Direct link to Conditional Requirement 3.3.1.2.3">​</a></h5> <blockquote> <p>A <code>transaction context propagator</code> <strong>MUST</strong> have a method for getting the <code>evaluation context</code> of the current transaction.</p> </blockquote> <p>This will be used by the SDK implementation when merging the context for evaluating a feature flag.</p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="condition-332">Condition 3.3.2<a href="#condition-332" class="hash-link" aria-label="Direct link to Condition 3.3.2" title="Direct link to Condition 3.3.2">​</a></h4> <blockquote> <p>The implementation uses the static-context paradigm.</p> </blockquote> <p>see: <a href="/specification/glossary#static-context-paradigm">static-context paradigm</a></p> <h5 class="anchor anchorWithStickyNavbar_LWe7" id="conditional-requirement-3321">Conditional Requirement 3.3.2.1<a href="#conditional-requirement-3321" class="hash-link" aria-label="Direct link to Conditional Requirement 3.3.2.1" title="Direct link to Conditional Requirement 3.3.2.1">​</a></h5> <blockquote> <p>The API <strong>MUST NOT</strong> have a method for setting a <code>transaction context propagator</code>.</p> </blockquote> <p>In the static-context paradigm, context is global, so there must not be different contexts between transactions.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/open-feature/spec/edit/main/specification/sections/03-evaluation-context.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/specification/sections/providers"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Provider</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/specification/sections/hooks"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Hooks</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#overview" class="table-of-contents__link toc-highlight">Overview</a><ul><li><a href="#31-fields" class="table-of-contents__link toc-highlight">3.1 Fields</a><ul><li><a href="#requirement-311" class="table-of-contents__link toc-highlight">Requirement 3.1.1</a></li><li><a href="#requirement-312" class="table-of-contents__link toc-highlight">Requirement 3.1.2</a></li><li><a href="#requirement-313" class="table-of-contents__link toc-highlight">Requirement 3.1.3</a></li><li><a href="#requirement-314" class="table-of-contents__link toc-highlight">Requirement 3.1.4</a></li></ul></li><li><a href="#32-context-levels-and-merging" class="table-of-contents__link toc-highlight">3.2 Context levels and merging</a><ul><li><a href="#condition-321" class="table-of-contents__link toc-highlight">Condition 3.2.1</a></li><li><a href="#condition-322" class="table-of-contents__link toc-highlight">Condition 3.2.2</a></li><li><a href="#requirement-323" class="table-of-contents__link toc-highlight">Requirement 3.2.3</a></li><li><a href="#condition-324" class="table-of-contents__link toc-highlight">Condition 3.2.4</a></li></ul></li><li><a href="#33-context-propagation" class="table-of-contents__link toc-highlight">3.3 Context Propagation</a><ul><li><a href="#condition-331" class="table-of-contents__link toc-highlight">Condition 3.3.1</a></li><li><a href="#condition-3312" class="table-of-contents__link toc-highlight">Condition 3.3.1.2</a></li><li><a href="#condition-332" class="table-of-contents__link toc-highlight">Condition 3.3.2</a></li></ul></li></ul></li></ul></div></div></div></div></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Sections</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/reference/intro">Docs</a></li><li class="footer__item"><a class="footer__link-item" href="/specification">Specification</a></li><li class="footer__item"><a class="footer__link-item" href="/community">Community</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/tutorials/five-minutes-to-feature-flags">Tutorials</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://bsky.app/profile/openfeature.dev" target="_blank" rel="noopener noreferrer" class="footer__link-item">BlueSky<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/openfeature" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.linkedin.com/company/openfeature/" target="_blank" rel="noopener noreferrer" class="footer__link-item">LinkedIn<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://cloud-native.slack.com/archives/C0344AANLA1" target="_blank" rel="noopener noreferrer" class="footer__link-item">Join us on Slack<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.youtube.com/@openfeature" target="_blank" rel="noopener noreferrer" class="footer__link-item">YouTube<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/open-feature" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.linuxfoundation.org/legal/trademark-usage" target="_blank" rel="noopener noreferrer" class="footer__link-item">Trademarks<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"> <a href="https://www.netlify.com" target="_blank" rel="noreferrer noopener" aria-label="Deploys by Netlify"> <img src="https://www.netlify.com/img/global/badges/netlify-color-accent.svg" alt="Deploys by Netlify" width="114" height="51"> </a> </li></ul></div></div><div class="footer__bottom text--center"><svg xmlns="http://www.w3.org/2000/svg" viewBox="-1.81 -3.06 419.38 80.13" style="width:300px"><style>.st0{fill:#fff}</style><g id="XMLID_1_"><g id="XMLID_575_"><path id="XMLID_643_" d="M102.2 33c3.3 0 5.9-1.3 8-3.9l4.3 4.4c-3.4 3.8-7.3 5.7-11.9 5.7s-8.3-1.4-11.3-4.3-4.4-6.5-4.4-10.9 1.5-8.1 4.5-11 6.7-4.4 11.1-4.4c4.9 0 9 1.9 12.2 5.6l-4.1 4.7q-3.15-3.9-7.8-3.9c-2.5 0-4.6.8-6.4 2.4s-2.7 3.8-2.7 6.6.8 5 2.5 6.7c1.6 1.4 3.6 2.3 6 2.3" class="st0"></path><path id="XMLID_641_" d="M119.7 38.8V9.1h6.6v23.8H139v5.9z" class="st0"></path><path id="XMLID_638_" d="M168 34.7c-3 2.9-6.7 4.4-11.1 4.4s-8.1-1.5-11.1-4.4-4.5-6.6-4.5-10.9c0-4.4 1.5-8 4.5-10.9s6.7-4.4 11.1-4.4S165 10 168 12.9s4.5 6.6 4.5 10.9c0 4.4-1.5 8-4.5 10.9m-2.3-10.9c0-2.6-.9-4.9-2.6-6.8s-3.8-2.8-6.3-2.8-4.6.9-6.3 2.8-2.6 4.1-2.6 6.8c0 2.6.9 4.9 2.6 6.8s3.8 2.8 6.3 2.8 4.6-.9 6.3-2.8c1.8-1.9 2.6-4.1 2.6-6.8" class="st0"></path><path id="XMLID_636_" d="M186 31.2q1.65 2.1 4.5 2.1c2.85 0 3.4-.7 4.4-2.1 1.1-1.4 1.6-3.3 1.6-5.6V9.2h6.6v16.6q0 6.45-3.6 9.9c-3.6 3.45-5.4 3.5-9.1 3.5s-6.8-1.2-9.2-3.5q-3.6-3.45-3.6-9.9V9.2h6.6v16.4c.1 2.3.7 4.2 1.8 5.6" class="st0"></path><path id="XMLID_633_" d="M232.7 13c2.8 2.6 4.3 6.2 4.3 10.8s-1.4 8.3-4.1 11c-2.8 2.7-7 4-12.6 4H210V9.1h10.5c5.3 0 9.4 1.3 12.2 3.9m-4.8 17.7c1.6-1.5 2.4-3.8 2.4-6.7s-.8-5.2-2.4-6.7q-2.4-2.4-7.5-2.4h-3.7V33h4.2c3 0 5.3-.8 7-2.3" class="st0"></path><path id="XMLID_631_" d="M274.7 9.1h6.6v29.7h-6.6l-14.2-18.6v18.6h-6.6V9.1h6.2l14.6 19.1z" class="st0"></path><path id="XMLID_628_" d="m309.8 38.8-2.8-6.4h-12.5l-2.8 6.4h-7.1l12.8-29.7h6.4l12.8 29.7zM300.9 18l-3.7 8.6h7.4z" class="st0"></path><path id="XMLID_626_" d="M330.8 14.9v24h-6.6v-24h-8.4V9.2h23.5v5.7z" class="st0"></path><path id="XMLID_624_" d="M344 9.1h6.6v29.7H344z" class="st0"></path><path id="XMLID_622_" d="m368.9 28 7.6-18.9h7.2l-11.9 29.7h-5.6L354.3 9.1h7.2z" class="st0"></path><path id="XMLID_620_" d="M408.6 9.1V15h-14.8v6.1h13.3v5.7h-13.3V33h15.3v5.9h-21.9V9.2h21.4z" class="st0"></path><path id="XMLID_618_" d="M94.6 64.1c1.8 0 3.3-.7 4.5-2.2l2.4 2.5c-1.9 2.1-4.1 3.2-6.7 3.2s-4.7-.8-6.3-2.4c-1.7-1.6-2.5-3.7-2.5-6.1 0-2.5.8-4.5 2.5-6.2s3.8-2.5 6.2-2.5c2.7 0 5 1 6.9 3.1l-2.3 2.6c-1.2-1.5-2.6-2.2-4.4-2.2-1.4 0-2.6.5-3.6 1.4s-1.5 2.1-1.5 3.7.5 2.8 1.4 3.7c.9 1 2.1 1.4 3.4 1.4" class="st0"></path><path id="XMLID_615_" d="M118 65.1c-1.7 1.6-3.8 2.5-6.2 2.5-2.5 0-4.5-.8-6.2-2.5-1.7-1.6-2.5-3.7-2.5-6.1s.8-4.5 2.5-6.1 3.8-2.5 6.2-2.5c2.5 0 4.5.8 6.2 2.5 1.7 1.6 2.5 3.7 2.5 6.1s-.8 4.5-2.5 6.1m-1.2-6.1c0-1.5-.5-2.8-1.4-3.8-1-1-2.1-1.6-3.5-1.6s-2.6.5-3.5 1.6c-1 1-1.4 2.3-1.4 3.8s.5 2.7 1.4 3.8c1 1 2.1 1.6 3.5 1.6s2.6-.5 3.5-1.6c.9-1 1.4-2.3 1.4-3.8" class="st0"></path><path id="XMLID_613_" d="m138.6 56.9-4.5 9.1h-2.2l-4.5-9.1v10.5h-3.7V50.7h5l4.3 9.1 4.3-9.1h5v16.7h-3.7z" class="st0"></path><path id="XMLID_610_" d="M157.9 52.3c1.2 1 1.8 2.5 1.8 4.6s-.6 3.6-1.8 4.5c-1.2 1-3 1.4-5.5 1.4h-2.2v4.6h-3.7V50.7h5.9c2.5.1 4.3.6 5.5 1.6m-2.7 6.5c.4-.5.7-1.2.7-2.2s-.3-1.6-.9-2-1.5-.6-2.7-.6h-2.1v5.6h2.5c1.2 0 2-.3 2.5-.8" class="st0"></path><path id="XMLID_608_" d="M167 63.1c.6.8 1.5 1.2 2.5 1.2s1.9-.4 2.5-1.2.9-1.8.9-3.2v-9.2h3.7V60c0 2.4-.7 4.3-2 5.6s-3 1.9-5.1 1.9-3.8-.7-5.1-2-2-3.2-2-5.6v-9.3h3.7v9.2q0 2.25.9 3.3" class="st0"></path><path id="XMLID_606_" d="M187.5 54v13.4h-3.7V54h-4.7v-3.2h13.2V54z" class="st0"></path><path id="XMLID_604_" d="M195 50.8h3.7v16.7H195z" class="st0"></path><path id="XMLID_602_" d="M214.4 50.8h3.7v16.7h-3.7l-7.9-10.4v10.4h-3.7V50.8h3.5l8.2 10.7V50.8z" class="st0"></path><path id="XMLID_600_" d="M233.1 59h3.7v5.9c-1.7 1.8-3.9 2.8-6.9 2.8-2.4 0-4.5-.8-6.2-2.4s-2.5-3.7-2.5-6.1c0-2.5.8-4.5 2.5-6.2s3.7-2.5 6.1-2.5 4.5.8 6.2 2.4l-1.9 2.8c-.7-.7-1.4-1.1-2.1-1.3-.6-.2-1.3-.4-2-.4-1.4 0-2.6.5-3.6 1.4-1 1-1.5 2.2-1.5 3.8s.5 2.8 1.4 3.8c.9.9 2 1.4 3.3 1.4s2.4-.2 3.2-.7V59z" class="st0"></path><path id="XMLID_598_" d="M257.8 50.8v3.3h-7.7v3.6h7.3V61h-7.3v6.5h-3.7V50.8z" class="st0"></path><path id="XMLID_595_" d="M275 65.1c-1.7 1.6-3.8 2.5-6.2 2.5-2.5 0-4.5-.8-6.2-2.5-1.7-1.6-2.5-3.7-2.5-6.1s.8-4.5 2.5-6.1 3.8-2.5 6.2-2.5c2.5 0 4.5.8 6.2 2.5 1.7 1.6 2.5 3.7 2.5 6.1s-.8 4.5-2.5 6.1m-1.3-6.1c0-1.5-.5-2.8-1.4-3.8-1-1-2.1-1.6-3.5-1.6s-2.6.5-3.5 1.6c-1 1-1.4 2.3-1.4 3.8s.5 2.7 1.4 3.8c1 1 2.1 1.6 3.5 1.6s2.6-.5 3.5-1.6c1-1 1.4-2.3 1.4-3.8" class="st0"></path><path id="XMLID_593_" d="M285.1 63.1c.6.8 1.5 1.2 2.5 1.2s1.9-.4 2.5-1.2.9-1.8.9-3.2v-9.2h3.7V60c0 2.4-.7 4.3-2 5.6s-3 1.9-5.1 1.9-3.8-.7-5.1-2-2-3.2-2-5.6v-9.3h3.7v9.2c-.1 1.5.3 2.6.9 3.3" class="st0"></path><path id="XMLID_591_" d="M310.2 50.8h3.7v16.7h-3.7l-7.9-10.4v10.4h-3.7V50.8h3.5l8.2 10.7V50.8z" class="st0"></path><path id="XMLID_588_" d="M330.7 53c1.6 1.5 2.4 3.5 2.4 6.1s-.8 4.6-2.3 6.1-3.9 2.3-7.1 2.3H318V50.8h5.9c3 0 5.3.7 6.8 2.2m-2.7 9.9c.9-.9 1.4-2.1 1.4-3.7s-.5-2.9-1.4-3.8-2.3-1.3-4.2-1.3h-2.1v10.1h2.4c1.7-.1 3-.5 3.9-1.3" class="st0"></path><path id="XMLID_585_" d="m347.7 67.4-1.5-3.6h-7l-1.5 3.6h-4l7.2-16.7h3.6l7.2 16.7zm-5-11.7-2.1 4.8h4.2z" class="st0"></path><path id="XMLID_583_" d="M359.5 54v13.4h-3.7V54H351v-3.2h13.2V54z" class="st0"></path><path id="XMLID_581_" d="M366.9 50.8h3.7v16.7h-3.7z" class="st0"></path><path id="XMLID_578_" d="M388.7 65.1c-1.7 1.6-3.8 2.5-6.2 2.5-2.5 0-4.5-.8-6.2-2.5-1.7-1.6-2.5-3.7-2.5-6.1s.8-4.5 2.5-6.1 3.8-2.5 6.2-2.5c2.5 0 4.5.8 6.2 2.5 1.7 1.6 2.5 3.7 2.5 6.1s-.8 4.5-2.5 6.1m-1.2-6.1c0-1.5-.5-2.8-1.4-3.8-1-1-2.1-1.6-3.5-1.6s-2.6.5-3.5 1.6c-1 1-1.4 2.3-1.4 3.8s.5 2.7 1.4 3.8c1 1 2.1 1.6 3.5 1.6s2.6-.5 3.5-1.6c.9-1 1.4-2.3 1.4-3.8" class="st0"></path><path id="XMLID_576_" d="M406 50.8h3.7v16.7H406l-7.9-10.4v10.4h-3.7V50.8h3.5l8.2 10.7z" class="st0"></path></g></g><g id="XMLID_197_"><g id="XMLID_392_"><path id="XMLID_397_" d="M15.5 47.7H6.4v21.4h21.3v-9.2H15.5z" class="st0"></path><path id="XMLID_395_" d="M61.3 47.8v12.1H49.1v-.1 9.3h21.3V47.7h-9.2z" class="st0"></path><path id="XMLID_394_" d="M6.4 26.4h9.2l-.1-.1V14.2h12.2V5H6.4z" class="st0"></path><path id="XMLID_393_" d="M49.1 5v9.2h12.2v12.2h9.1V5z" class="st0"></path></g><g id="XMLID_200_" opacity="0.8"><path id="XMLID_391_" d="M47.9 26.4 35.7 14.2h13.4V5H27.7v9.2l12.2 12.2z" class="st0"></path><path id="XMLID_390_" d="M36.9 47.7h-8L39 57.8l2 2.1H27.7v9.2h21.4v-9.3l-6.1-6z" class="st0"></path><path id="XMLID_389_" d="M61.3 26.4v13.3l-2.1-2.1-10.1-10.1v8.1l6 6 6.1 6.1h9.2V26.4z" class="st0"></path><path id="XMLID_388_" d="M27.7 38.5 15.6 26.4H6.4v21.3h9.1V34.4l12.2 12.2z" class="st0"></path></g></g></svg><div class="footer__copyright">© 2025 OpenFeature is a Cloud Native Computing Foundation incubating project | Documentation Distributed under CC BY 4.0 | All Rights Reserved</div></div></div></footer></div> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10