<?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>GO Feature Flag Blog</title>
        <link>https://gofeatureflag.org/blog</link>
        <description>GO Feature Flag Blog</description>
        <lastBuildDate>Thu, 09 Apr 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[Joining the OpenFeature Governance Committee]]></title>
            <link>https://gofeatureflag.org/blog/2026/04/09/openfeature-governance-committee</link>
            <guid>https://gofeatureflag.org/blog/2026/04/09/openfeature-governance-committee</guid>
            <pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Thomas Poignant, creator of GO Feature Flag, has been elected to the OpenFeature Governance Committee for the 2026-2028 term.]]></description>
            <content:encoded><![CDATA[<p>Thomas Poignant, creator of GO Feature Flag, has been elected to the <strong>OpenFeature Governance Committee</strong> for the
2026-2028 term. This is a milestone to be genuinely proud of — and one that feels like a natural
continuation of the work done at the intersection of GO Feature Flag and the OpenFeature ecosystem.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-the-openfeature-governance-committee">What is the OpenFeature Governance Committee?<a href="https://gofeatureflag.org/blog/2026/04/09/openfeature-governance-committee#what-is-the-openfeature-governance-committee" class="hash-link" aria-label="Direct link to What is the OpenFeature Governance Committee?" title="Direct link to What is the OpenFeature Governance Committee?" translate="no">​</a></h2>
<p><a href="https://openfeature.dev/" target="_blank" rel="noopener noreferrer" class="">OpenFeature</a> is a CNCF incubating project that defines an open standard
for feature flagging. It provides a vendor-neutral API and SDKs so that teams can adopt feature
flags without locking themselves into a specific platform.</p>
<p>The Governance Committee is responsible for steering the overall direction of the project —
from the evolution of the standard itself to community health, contributor experience, and the
long-term vision for the ecosystem. It's the group that makes sure OpenFeature stays open,
collaborative, and useful for everyone building with it.</p>
<p>Previously, Thomas was part of the OpenFeature Technical Committee, contributing to the technical
direction of the project. Joining the Governance Committee means taking on a broader
responsibility: helping shape not just <em>how</em> OpenFeature works, but <em>where</em> it goes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-2026-2028-board">The 2026-2028 Board<a href="https://gofeatureflag.org/blog/2026/04/09/openfeature-governance-committee#the-2026-2028-board" class="hash-link" aria-label="Direct link to The 2026-2028 Board" title="Direct link to The 2026-2028 Board" translate="no">​</a></h2>
<p>Thomas is honored to join a strong group of contributors and practitioners. The full board for the
2026-2028 term is:</p>
<p><strong>Newly elected:</strong></p>
<ul>
<li class=""><strong>André Silva</strong> (LexisNexis Risk Solutions) — maintainer of the OpenFeature .NET SDK and active contributor to OpenTelemetry</li>
<li class=""><strong>Maks Osowski</strong> (Google) — building Google's OpenFeature-first feature flagging platform</li>
<li class=""><strong>Thomas Poignant</strong> (Gens de Confiance) — creator and maintainer of GO Feature Flag</li>
<li class=""><strong>Jonathan Norris</strong> (Dynatrace) — re-elected for a second term; former Co-Founder and CTO of DevCycle</li>
</ul>
<p><strong>Continuing members (2025-2027):</strong></p>
<ul>
<li class=""><strong>Ben Rometsch</strong> (Flagsmith)</li>
<li class=""><strong>Michael Beemer</strong> (Dynatrace)</li>
<li class=""><strong>Pete Hodgson</strong> (Independent)</li>
</ul>
<p>You can read the full announcement on the
<a href="https://openfeature.dev/blog/governance-board-2026" target="_blank" rel="noopener noreferrer" class="">OpenFeature blog</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-means-for-go-feature-flag">What this means for GO Feature Flag<a href="https://gofeatureflag.org/blog/2026/04/09/openfeature-governance-committee#what-this-means-for-go-feature-flag" class="hash-link" aria-label="Direct link to What this means for GO Feature Flag" title="Direct link to What this means for GO Feature Flag" translate="no">​</a></h2>
<p>GO Feature Flag has been committed to the OpenFeature standard since its early days. The project
ships native OpenFeature providers, supports OFREP (the OpenFeature Remote Evaluation Protocol),
and follows the spec closely to ensure compatibility across the ecosystem.</p>
<p>Being on the Governance Committee means Thomas can contribute to the standard directly — bringing
the perspective of a maintainer who runs a feature flagging solution in production, and who
hears from users daily about what they need. It's an opportunity to make sure the standard evolves
in ways that are practical, implementable, and genuinely useful for the teams building on top of it.</p>
<p>For users of GO Feature Flag, this is a signal of continuity: the project will remain deeply
aligned with OpenFeature, and Thomas will be in a position to ensure the standard and the implementation
stay in sync.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lets-keep-building-together">Let's keep building together<a href="https://gofeatureflag.org/blog/2026/04/09/openfeature-governance-committee#lets-keep-building-together" class="hash-link" aria-label="Direct link to Let's keep building together" title="Direct link to Let's keep building together" translate="no">​</a></h2>
<p>Open source only works when people show up — as contributors, maintainers, users, and community
members. Thank you to everyone who has supported GO Feature Flag and OpenFeature over the years.
This role is one more way to give back to that community.</p>
<p>If you have thoughts on the direction of OpenFeature or GO Feature Flag, come share them on
<a href="https://github.com/thomaspoignant/go-feature-flag" target="_blank" rel="noopener noreferrer" class="">GitHub</a> or the
<a href="https://cloud-native.slack.com/archives/C0344AANLA1" target="_blank" rel="noopener noreferrer" class="">CNCF Slack #openfeature channel</a>.</p>]]></content:encoded>
            <category>openfeature</category>
            <category>governance</category>
            <category>community</category>
            <category>cncf</category>
        </item>
        <item>
            <title><![CDATA[GO Feature Flag at KubeCon EU 2026 — Amsterdam Recap]]></title>
            <link>https://gofeatureflag.org/blog/2026/04/07/kubecon-amsterdam-2026</link>
            <guid>https://gofeatureflag.org/blog/2026/04/07/kubecon-amsterdam-2026</guid>
            <pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A look back at our week in Amsterdam at KubeCon + CloudNativeCon Europe 2026.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="image" src="https://gofeatureflag.org/assets/images/image-cc26779109d7a741345159d51e0d1c0c.png" width="2400" height="1600" class="img_ev3q"></p>
<p>KubeCon + CloudNativeCon Europe 2026 in Amsterdam is behind us, and what a week it was.
For GO Feature Flag, it was both an opportunity to represent the project on a big stage and
to connect directly with the community in person.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="speaking-at-the-maintainer-track">Speaking at the Maintainer Track<a href="https://gofeatureflag.org/blog/2026/04/07/kubecon-amsterdam-2026#speaking-at-the-maintainer-track" class="hash-link" aria-label="Direct link to Speaking at the Maintainer Track" title="Direct link to Speaking at the Maintainer Track" translate="no">​</a></h2>
<iframe width="100%" height="444" src="https://www.youtube.com/embed/9ebYq4cbjIY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
<p>I had the privilege of presenting during the <strong>"OpenFeature Update From the Maintainers"</strong>
session as part of the Maintainer Track on Wednesday. Alongside Lukas Reining, André Silva,
and Alexandra Oberaigner, we shared the latest news from the OpenFeature ecosystem —
including the OpenFeature MCP server, the new GitHub Action for flag cleanup, and the stable
release of OFREP.</p>
<p>The <a href="https://docs.google.com/presentation/d/1I6ulZnEbR1NleY58Q2ppKGIjum8AksOJDwavqb7mp1w/edit#slide=id.p" target="_blank" rel="noopener noreferrer" class="">slides from the session</a> are available.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="governance-committee-shaping-the-future-of-openfeature">Governance Committee: Shaping the Future of OpenFeature<a href="https://gofeatureflag.org/blog/2026/04/07/kubecon-amsterdam-2026#governance-committee-shaping-the-future-of-openfeature" class="hash-link" aria-label="Direct link to Governance Committee: Shaping the Future of OpenFeature" title="Direct link to Governance Committee: Shaping the Future of OpenFeature" translate="no">​</a></h2>
<p>As a member of the OpenFeature Governance Committee, a big part of the week was
participating in focused in-person discussions with other maintainers and contributors.
These conversations covered some of the most important topics on the project's roadmap.</p>
<p><strong>Experimentation</strong> was a major theme. The group explored how OpenFeature can better support
experimentation use cases — from standardized context fields and evaluation metrics in the SDK,
to defining how grouped experiments map to flags. There's real momentum here and we should
expect progress on this front through the rest of the year.</p>
<p><strong>OFREP</strong> (the OpenFeature Remote Evaluation Protocol) is approaching its 1.0 milestone,
targeted for Q2 2026. Discussions covered SSE-based change notifications to replace polling
as the default, local caching for client-side SDKs, routing with targeting key hashes, and
whether to introduce a tracking event endpoint. There was even a conversation about gRPC
definitions for organizations that require it.</p>
<p><strong>Growing the Technical Committee</strong> was also on the agenda. The consensus is that the TC
needs to grow to at least 5 members (currently 3) to ensure broader representation and
sustainable governance. The goal is to bring in contributors who are already active in the
project.</p>
<p>You can read the full summary of all discussions in the
<a href="https://openfeature.dev/blog/kubecon-eu-2026-recap" target="_blank" rel="noopener noreferrer" class="">official OpenFeature KubeCon EU 2026 recap</a>
published by the OpenFeature team.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conversations-with-the-go-feature-flag-community">Conversations with the GO Feature Flag Community<a href="https://gofeatureflag.org/blog/2026/04/07/kubecon-amsterdam-2026#conversations-with-the-go-feature-flag-community" class="hash-link" aria-label="Direct link to Conversations with the GO Feature Flag Community" title="Direct link to Conversations with the GO Feature Flag Community" translate="no">​</a></h2>
<p>Beyond the sessions and committee work, one of the most valuable parts of the week was
simply talking with people. Conferences like KubeCon are a rare opportunity to have direct,
unfiltered conversations with users — the folks who are running GO Feature Flag in
production every day.</p>
<p>I was able to gather a lot of candid feedback: how people are using the solution, what
patterns have emerged organically in the wild, where things work smoothly, and where there
are rough edges. That kind of direct input is something you just can't replicate through
GitHub issues or async Slack threads.</p>
<p>This is always one of the best parts of attending these events. A 10-minute conversation
at a booth often contains more signal than weeks of async feedback. Thank you to everyone
who stopped by, introduced themselves, or shared how they're using GO Feature Flag — it
genuinely shapes the direction of the project.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-time">See You Next Time<a href="https://gofeatureflag.org/blog/2026/04/07/kubecon-amsterdam-2026#see-you-next-time" class="hash-link" aria-label="Direct link to See You Next Time" title="Direct link to See You Next Time" translate="no">​</a></h2>
<p>Amsterdam was a great reminder of why in-person events matter for open-source projects.
The OpenFeature ecosystem is growing, the conversations are maturing, and the roadmap ahead
is exciting.</p>
<p>If you weren't able to make it to Amsterdam, keep an eye on the GO Feature Flag changelog
and the OpenFeature community channels — a lot of what was discussed this week will be
landing as issues, ADRs, and PRs over the coming months.</p>
<hr>
<p><em>Want to get involved? Join us on the
<a href="https://cloud-native.slack.com/archives/C0344AANLA1" target="_blank" rel="noopener noreferrer" class="">CNCF Slack #openfeature channel</a>
or check out the <a href="https://github.com/thomaspoignant/go-feature-flag" target="_blank" rel="noopener noreferrer" class="">GO Feature Flag repository</a>.</em></p>]]></content:encoded>
            <category>kubecon</category>
            <category>openfeature</category>
            <category>cncf</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[In-Process Evaluation for GO Feature Flag OpenFeature Providers]]></title>
            <link>https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers</link>
            <guid>https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers</guid>
            <pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[GO, Java, .NET, Python, and JavaScript/TypeScript providers now support in-process evaluation for faster flag resolution with far fewer network calls.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="In-Process OpenFeature Providers Banner" src="https://gofeatureflag.org/assets/images/inprocess-banner-61bbdb9406831475b10959f8702e9872.png" width="2752" height="1536" class="img_ev3q"></p>
<p>We are excited to introduce <strong>in-process evaluation</strong> for the GO Feature Flag OpenFeature server providers: <code>Go</code>, <code>Java</code>, <code>.NET</code>, <code>Python</code>, <code>JavaScript</code>, and <code>TypeScript</code>.</p>
<p>This capability is designed to improve evaluation performance and drastically reduce network traffic between your applications and the relay-proxy.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changes-with-in-process-evaluation">What changes with in-process evaluation?<a href="https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers#what-changes-with-in-process-evaluation" class="hash-link" aria-label="Direct link to What changes with in-process evaluation?" title="Direct link to What changes with in-process evaluation?" translate="no">​</a></h2>
<p>Previously, when you used the OpenFeature providers we ship, evaluation used <strong>remote evaluation</strong>: each flag evaluation triggered a network call to the relay-proxy.</p>
<p>That model fits many setups, but it is not always the most performant or resilient way to evaluate feature flags on hot paths.</p>
<p>That is why we are launching <strong>in-process</strong> evaluation mode for our most widely used providers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How it works<a href="https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers#how-it-works" class="hash-link" aria-label="Direct link to How it works" title="Direct link to How it works" translate="no">​</a></h3>
<p>With <strong>in-process evaluation</strong>, the provider:</p>
<ol>
<li class="">Periodically fetches the latest flag configuration from the relay-proxy.</li>
<li class="">Stores it locally in memory.</li>
<li class="">Evaluates flags directly inside your application process, using a shared evaluation engine so every provider behaves consistently.</li>
</ol>
<p>Your flag checks no longer depend on a network round trip on the critical path.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="but-what-about-the-evaluation-data">But what about the evaluation data?<a href="https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers#but-what-about-the-evaluation-data" class="hash-link" aria-label="Direct link to But what about the evaluation data?" title="Direct link to But what about the evaluation data?" translate="no">​</a></h2>
<p>Not calling the relay-proxy to evaluate your flag does not mean you lose observability.</p>
<p>The providers collect evaluation data from local evaluations and send it to the relay-proxy, so you can keep observing evaluations as before. For how events are recorded when evaluation runs in the provider, see <a class="" href="https://gofeatureflag.org/docs/tracking/flag-usage-tracking">flag usage tracking</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-gains-in-practice">Performance gains in practice<a href="https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers#performance-gains-in-practice" class="hash-link" aria-label="Direct link to Performance gains in practice" title="Direct link to Performance gains in practice" translate="no">​</a></h2>
<p>Moving evaluation in-process gives you immediate performance benefits:</p>
<ul>
<li class=""><strong>Lower latency</strong>: evaluations are local, so there is no request/response overhead per flag check.</li>
<li class=""><strong>Higher throughput</strong>: your app can evaluate more flags with less pressure on the relay-proxy.</li>
<li class=""><strong>Better resilience</strong>: short network hiccups have less impact on runtime flag evaluation.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fewer-network-calls">Fewer network calls<a href="https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers#fewer-network-calls" class="hash-link" aria-label="Direct link to Fewer network calls" title="Direct link to Fewer network calls" translate="no">​</a></h2>
<p>This is one of the biggest wins.</p>
<table><thead><tr><th>Mode</th><th>Network behavior</th></tr></thead><tbody><tr><td>Remote evaluation</td><td>1 network call for each flag evaluation</td></tr><tr><td>In-process evaluation</td><td>No network call for each flag evaluation (only periodic config refresh + event export)</td></tr></tbody></table>
<p>If your request path evaluates several flags, in-process mode can remove a lot of network calls and reduce infrastructure overhead.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-providers-support-it">Which providers support it?<a href="https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers#which-providers-support-it" class="hash-link" aria-label="Direct link to Which providers support it?" title="Direct link to Which providers support it?" translate="no">​</a></h2>
<p>The in-process capability is available in the GO Feature Flag OpenFeature providers for:</p>
<ul>
<li class=""><a href="https://gofeatureflag.org/docs/sdk/server_providers/openfeature_go" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
<li class=""><a href="https://gofeatureflag.org/docs/sdk/server_providers/openfeature_java" target="_blank" rel="noopener noreferrer" class="">Java</a></li>
<li class=""><a href="https://gofeatureflag.org/docs/sdk/server_providers/openfeature_dotnet" target="_blank" rel="noopener noreferrer" class="">.NET</a></li>
<li class=""><a href="https://gofeatureflag.org/docs/sdk/server_providers/openfeature_python" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
<li class=""><a href="https://gofeatureflag.org/docs/sdk/server_providers/openfeature_javascript" target="_blank" rel="noopener noreferrer" class="">JavaScript/TypeScript</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-enable-it">How to enable it<a href="https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers#how-to-enable-it" class="hash-link" aria-label="Direct link to How to enable it" title="Direct link to How to enable it" translate="no">​</a></h2>
<p>Each provider lets you choose an evaluation mode <strong>in-process</strong> (evaluate locally after syncing config) or <strong>remote</strong> (ask the relay-proxy on each evaluation)—through its configuration. The option names differ by language (for example, JavaScript and TypeScript use <code>evaluationType</code> with <code>EvaluationType.InProcess</code> or <code>EvaluationType.Remote</code>; Java and .NET expose <code>evaluationType</code> in their provider options with the same idea).</p>
<p>Use the documentation for your runtime above for exact types, defaults, and examples.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-process-or-remote-how-to-choose">In-process or remote: how to choose?<a href="https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers#in-process-or-remote-how-to-choose" class="hash-link" aria-label="Direct link to In-process or remote: how to choose?" title="Direct link to In-process or remote: how to choose?" translate="no">​</a></h2>
<p>Use <strong>in-process</strong> when you want:</p>
<ul>
<li class="">the best runtime performance</li>
<li class="">very low latency</li>
<li class="">fewer network calls in hot code paths</li>
</ul>
<p>Use <strong>remote</strong> evaluation when you want each evaluation to hit the relay-proxy so decisions are always tied to the latest server-side evaluation. That can be a good fit when network latency to the relay is negligible, for example, in a <strong>sidecar</strong> deployment where the proxy sits beside your app.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thoughts">Final thoughts<a href="https://gofeatureflag.org/blog/2026/03/31/in-process-openfeature-providers#final-thoughts" class="hash-link" aria-label="Direct link to Final thoughts" title="Direct link to Final thoughts" translate="no">​</a></h2>
<p>In-process evaluation gives you a strong reliability and performance boost while keeping the OpenFeature developer experience you already use today.</p>
<p>If your workload is latency-sensitive, this mode is a great default.</p>]]></content:encoded>
            <category>openfeature</category>
            <category>performance</category>
            <category>in-process</category>
            <category>ofrep</category>
        </item>
        <item>
            <title><![CDATA[Seamlessly Update API Keys at Runtime in GO Feature Flag (No Restarts Needed)]]></title>
            <link>https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates</link>
            <guid>https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates</guid>
            <pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover how GO Feature Flag's new runtime API key update feature enables you to update API keys without restarting the relay proxy, ensuring continuous availability and improved security.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="In-Process OpenFeature Providers Banner" src="https://gofeatureflag.org/assets/images/banner-16724c8731d5238290571fef9993bc67.png" width="1300" height="540" class="img_ev3q"></p>
<p>We're excited to announce a new feature in GO Feature Flag that makes API key management easier and more secure: <strong>Runtime API Key Updates</strong>! 🎉</p>
<p>We've heard from the community that having to restart the relay proxy for every API key update or rotation was a real pain point. Managing API keys is crucial for security, but needing a restart for each change led to unnecessary downtime and interruptions.<br>
<!-- -->With this new feature, you can now update, rotate, and manage API keys on the fly—your relay proxy keeps running, and requests are served continuously, with no need for restarts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-the-challenge-api-key-management">🤔 The Challenge: API Key Management<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#-the-challenge-api-key-management" class="hash-link" aria-label="Direct link to 🤔 The Challenge: API Key Management" title="Direct link to 🤔 The Challenge: API Key Management" translate="no">​</a></h2>
<p>API keys are essential for securing access to your GO Feature Flag relay proxy. However, managing them has always been challenging:</p>
<ul>
<li class=""><strong>Key rotation</strong> required service restarts, causing downtime</li>
<li class=""><strong>Adding new keys</strong> meant taking the service offline</li>
<li class=""><strong>Removing compromised keys</strong> couldn't be done immediately</li>
<li class=""><strong>No flexibility</strong> to respond quickly to security incidents</li>
</ul>
<p>These limitations made it difficult to follow security best practices like regular key rotation and immediate response to security threats.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-introducing-runtime-api-key-updates">✨ Introducing Runtime API Key Updates<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#-introducing-runtime-api-key-updates" class="hash-link" aria-label="Direct link to ✨ Introducing Runtime API Key Updates" title="Direct link to ✨ Introducing Runtime API Key Updates" translate="no">​</a></h2>
<p>GO Feature Flag starting <code>v1.50.0</code> supports <strong>updating API keys at runtime</strong> without requiring a restart of the relay proxy.<br>
<!-- -->This feature works in both <strong>default mode</strong> and <strong>flagset mode</strong>, giving you the flexibility to manage keys dynamically.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This feature is available starting from GO Feature Flag <code>v1.50.0</code> and above.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-benefits">Key Benefits<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#key-benefits" class="hash-link" aria-label="Direct link to Key Benefits" title="Direct link to Key Benefits" translate="no">​</a></h3>
<ul>
<li class="">✅ <strong>Zero Downtime</strong>: Update keys without interrupting service</li>
<li class="">✅ <strong>Immediate Response</strong>: Remove compromised keys instantly</li>
<li class="">✅ <strong>Easy Rotation</strong>: Rotate keys as soon as you change your configuration file</li>
<li class="">✅ <strong>Flexible Management</strong>: Add, remove, or update keys as needed</li>
<li class="">✅ <strong>Automatic Detection</strong>: Changes are detected and applied automatically</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-how-it-works">🚀 How It Works<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#-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>
<p>The relay proxy continuously monitors your configuration file for changes. When it detects updates to API keys, it:</p>
<ol>
<li class=""><strong>Validates</strong> the new configuration <em>(if invalid your new configuration will be ignored)</em></li>
<li class=""><strong>Updates</strong> the internal API key mappings</li>
<li class=""><strong>Applies</strong> changes immediately</li>
<li class=""><strong>Continues</strong> serving requests without interruption</li>
</ol>
<p>All of this happens automatically in the background, with no manual intervention required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-configuration-requirements">⚙️ Configuration Requirements<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#%EF%B8%8F-configuration-requirements" class="hash-link" aria-label="Direct link to ⚙️ Configuration Requirements" title="Direct link to ⚙️ Configuration Requirements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="default-mode">Default Mode<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#default-mode" class="hash-link" aria-label="Direct link to Default Mode" title="Direct link to Default Mode" translate="no">​</a></h3>
<p>In default mode, <strong>only API keys can be updated at runtime</strong>:</p>
<ul>
<li class="">✅ <code>authorizedKeys.evaluation</code></li>
<li class="">✅ <code>authorizedKeys.admin</code></li>
<li class="">❌ All other configuration changes are ignored</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="-usage-example">📝 Usage Example<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#-usage-example" class="hash-link" aria-label="Direct link to 📝 Usage Example" title="Direct link to 📝 Usage Example" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockTitle_OeMC">goff-proxy.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># Initial configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">authorizedKeys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">evaluation</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"key-1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"key-2"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">admin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"admin-key-1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Updated configuration (runtime update - no restart needed!)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">authorizedKeys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">evaluation</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"key-1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"key-2"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"key-3"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)"># ✅ New key added</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"key-4"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)"># ✅ Another new key</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">admin</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"admin-key-1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"admin-key-2"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)"># ✅ New admin key added</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="flagset-mode">Flagset Mode<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#flagset-mode" class="hash-link" aria-label="Direct link to Flagset Mode" title="Direct link to Flagset Mode" translate="no">​</a></h3>
<p>In flagset mode:</p>
<ul>
<li class="">✅ API keys for each flag set can be updated</li>
<li class="">✅ Flag sets must have a <code>name</code> configured</li>
<li class="">❌ Other flagset configuration changes are not supported</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="-usage-example-1">📝 Usage Example<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#-usage-example-1" class="hash-link" aria-label="Direct link to 📝 Usage Example" title="Direct link to 📝 Usage Example" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockTitle_OeMC">goff-proxy.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">flagSets</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">a  </span><span class="token comment" style="color:rgb(106, 153, 85)"># ✅ Name is required for runtime updates</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">apiKeys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"team-a-key-1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"team-a-key-2"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)"># ✅ Can add new keys at runtime</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">retrievers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> file</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> /flags/team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">a</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flags.yaml</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">b</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">apiKeys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"team-b-key-1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token comment" style="color:rgb(106, 153, 85)"># ✅ Can remove keys at runtime by removing them from the config</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">retrievers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> s3</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">bucket</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">b</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flags</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p><strong>Important</strong>: For flagset mode, your flag sets <strong>must have a <code>name</code> configured</strong> for runtime updates to work.<br>
<!-- -->Without a name (or if you use <code>default</code> as the name), runtime updates won't be possible since we are not able to target which flagset has changed.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-real-world-use-cases">🎯 Real-World Use Cases<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#-real-world-use-cases" class="hash-link" aria-label="Direct link to 🎯 Real-World Use Cases" title="Direct link to 🎯 Real-World Use Cases" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-case-1-multi-tenant-key-management">Use Case 1: Multi-Tenant Key Management<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#use-case-1-multi-tenant-key-management" class="hash-link" aria-label="Direct link to Use Case 1: Multi-Tenant Key Management" title="Direct link to Use Case 1: Multi-Tenant Key Management" translate="no">​</a></h3>
<p><strong>Scenario</strong>: Managing API keys for multiple customers in flagset mode.</p>
<p><strong>Solution</strong>: Update keys for individual flag sets independently. Each customer's keys can be managed separately without affecting others.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-case-2-scheduled-key-rotation">Use Case 2: Scheduled Key Rotation<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#use-case-2-scheduled-key-rotation" class="hash-link" aria-label="Direct link to Use Case 2: Scheduled Key Rotation" title="Direct link to Use Case 2: Scheduled Key Rotation" translate="no">​</a></h3>
<p><strong>Scenario</strong>: Your security policy requires rotating API keys every 90 days.</p>
<p><strong>Solution</strong>: Update the configuration file with new keys, keep old keys temporarily, migrate clients, then remove old keys—all without downtime.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-case-3-team-onboarding">Use Case 3: Team Onboarding<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#use-case-3-team-onboarding" class="hash-link" aria-label="Direct link to Use Case 3: Team Onboarding" title="Direct link to Use Case 3: Team Onboarding" translate="no">​</a></h3>
<p><strong>Scenario</strong>: A new team needs access to a flag set.</p>
<p><strong>Solution</strong>: Simply add their API key to the flag set configuration. No restart needed, and they can start using the service immediately.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-learn-more">📚 Learn More<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#-learn-more" class="hash-link" aria-label="Direct link to 📚 Learn More" title="Direct link to 📚 Learn More" translate="no">​</a></h2>
<ul>
<li class="">📖 <a href="https://docs.gofeatureflag.org/relay-proxy/configure-relay-proxy#runtime-configuration-updates" target="_blank" rel="noopener noreferrer" class="">Runtime Configuration Updates Documentation</a></li>
<li class="">📖 <a href="https://docs.gofeatureflag.org/concepts/flagset" target="_blank" rel="noopener noreferrer" class="">Flag Set Concepts</a></li>
<li class="">📖 <a href="https://docs.gofeatureflag.org/relay-proxy/configure-relay-proxy" target="_blank" rel="noopener noreferrer" class="">Configuration Guide</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-get-started-today">🎉 Get Started Today<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#-get-started-today" class="hash-link" aria-label="Direct link to 🎉 Get Started Today" title="Direct link to 🎉 Get Started Today" translate="no">​</a></h2>
<p>Runtime API key updates are available in GO Feature Flag starting version <code>v1.50.0</code>! This feature makes API key management more secure, flexible, and convenient.</p>
<p>Whether you're rotating keys, responding to security incidents, or managing access for multiple teams, runtime updates ensure your feature flag service remains available and secure.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://gofeatureflag.org/blog/2026/01/07/runtime-api-key-updates#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h3>
<ul>
<li class="">💬 <a href="https://gofeatureflag.org/slack" target="_blank" rel="noopener noreferrer" class="">Community Discussions</a></li>
<li class="">🐛 <a href="https://github.com/thomaspoignant/go-feature-flag/issues" target="_blank" rel="noopener noreferrer" class="">Report Issues</a></li>
<li class="">📚 <a href="https://docs.gofeatureflag.org/" target="_blank" rel="noopener noreferrer" class="">Full Documentation</a></li>
</ul>
<p>We can't wait to see how this feature improves your API key management workflow! 🚀</p>]]></content:encoded>
            <category>api keys</category>
            <category>runtime updates</category>
            <category>key rotation</category>
        </item>
        <item>
            <title><![CDATA[Grafana is Now Using GO Feature Flag 🎉]]></title>
            <link>https://gofeatureflag.org/blog/2025/10/03/grafana-using-go-feature-flag</link>
            <guid>https://gofeatureflag.org/blog/2025/10/03/grafana-using-go-feature-flag</guid>
            <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We’re proud to announce that Grafana, one of the world’s most popular observability platforms, is now using GO Feature Flag as a dependency in their project! 🚀]]></description>
            <content:encoded><![CDATA[<p>We’re proud to announce that <a href="https://github.com/grafana/grafana" target="_blank" rel="noopener noreferrer" class=""><strong>Grafana</strong></a>, one of the world’s most popular observability platforms, is now using <strong><a href="https://gofeatureflag.org/" target="_blank" rel="noopener noreferrer" class="">GO Feature Flag</a></strong> as a dependency in their project! 🚀</p>
<p><img decoding="async" loading="lazy" alt="Grafana using GO Feature Flag" src="https://gofeatureflag.org/assets/images/grafana-go-feature-flag-8b3765aa4fe3e4debecb26f203bfd4cc.png" width="1542" height="408" class="img_ev3q">
<em>(Screenshot from Grafana’s <code>go.mod</code> file showing GO Feature Flag)</em></p>
<p>This is a huge milestone for us. Grafana is one of the most widely used observability platforms in the world, relied upon by countless developers and organizations to monitor and visualize their systems. Seeing such a respected open-source project adopt <strong>GO Feature Flag</strong> is a strong validation of the reliability, performance, and simplicity of our solution.</p>
<p>A big thank you to our community and contributors for making this possible — and to the Grafana team for trusting our solution. ❤️</p>
<p>Here’s to safer rollouts, faster innovation, and more great open-source collaborations ahead! 🚀</p>
<p>We’re incredibly proud of this milestone, but it’s only the beginning. GO Feature Flag continues to evolve, and we’re committed to making it even easier for teams of all sizes to roll out new features with confidence.</p>
<p>If you’re curious about how GO Feature Flag can fit into your projects, check out our <a href="https://gofeatureflag.org/docs/" target="_blank" rel="noopener noreferrer" class=""> documentation</a> or join our <a href="https://gofeatureflag.org/slack/" target="_blank" rel="noopener noreferrer" class="">community</a>. We’d love to hear from you!</p>]]></content:encoded>
            <category>grafana</category>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[🏗️ Introducing Flag Sets: Organize Your Feature Flags Like Never Before]]></title>
            <link>https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets</link>
            <guid>https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets</guid>
            <pubDate>Thu, 18 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover how GO Feature Flag's new flag sets feature enables better organization, team isolation, and multi-tenant support for your feature flag management.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Flag Sets Banner" src="https://gofeatureflag.org/assets/images/flagsets-675cab0cd5849897717d6ae6474521fb.jpg" width="1395" height="716" class="img_ev3q"></p>
<p>We're excited to announce that we have released one of the most requested feature for GO Feature Flag.<br>
<!-- -->It will revolutionize how you organize and manage your feature flags: <strong>Flag Sets</strong>! 🎉</p>
<p>As your applications grow and teams expand, managing feature flags can become increasingly complex. Different teams need their own flags, environments require separate configurations, and multi-tenant applications demand isolated flag management. That's exactly what Flag Sets are designed to solve.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-what-are-flag-sets">🤔 What Are Flag Sets?<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#-what-are-flag-sets" class="hash-link" aria-label="Direct link to 🤔 What Are Flag Sets?" title="Direct link to 🤔 What Are Flag Sets?" translate="no">​</a></h2>
<hr>
<p>Flag Sets are a powerful organizational feature in GO Feature Flag that allows you to group related feature flags into separate, isolated collections. Each flag set operates independently with its own:</p>
<ul>
<li class=""><strong>Configuration</strong>: Retrievers, exporters, and notifiers</li>
<li class=""><strong>API Keys</strong>: Secure access control with dedicated authentication</li>
<li class=""><strong>Flag Management</strong>: Complete isolation from other flag sets</li>
<li class=""><strong>Data Tracking</strong>: Separate evaluation data and analytics</li>
</ul>
<p>Think of flag sets as <strong>"virtual feature flag environments"</strong> within your single GO Feature Flag relay proxy instance.<br>
<!-- -->They provide the organizational benefits of multiple instances while maintaining the simplicity of a single deployment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-what-are-the-benefits-of-flag-sets">✨ What are the benefits of flag sets?<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#-what-are-the-benefits-of-flag-sets" class="hash-link" aria-label="Direct link to ✨ What are the benefits of flag sets?" title="Direct link to ✨ What are the benefits of flag sets?" translate="no">​</a></h2>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-team-isolation">🏢 <strong>Team Isolation</strong><a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#-team-isolation" class="hash-link" aria-label="Direct link to -team-isolation" title="Direct link to -team-isolation" translate="no">​</a></h3>
<p>In modern software development, different teams often need to manage their own feature flags independently. With flag sets, you can:</p>
<ul>
<li class=""><strong>Team A</strong>: Manage application A feature flags: <code>new-navigation</code>, <code>dark-mode</code>, <code>responsive-design</code>.</li>
<li class=""><strong>Team B</strong>: Manage application A feature flags: <code>new-payment-api</code>, <code>caching-strategy</code>, <code>rate-limiting</code>, <code>dark-mode</code>.</li>
<li class="">...</li>
</ul>
<p>Each team gets their own isolated environment without interfering with others.</p>
<ul>
<li class="">You can have the same feature flag name with a different configuration.</li>
<li class="">Team A cannot access to Team B feature flags.</li>
<li class="">Each flag set can have a dedicated exporter.</li>
<li class="">Each flag set can notify flag changes in a different place.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-multi-tenant-applications">🏘️ <strong>Multi-Tenant Applications</strong><a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#%EF%B8%8F-multi-tenant-applications" class="hash-link" aria-label="Direct link to ️-multi-tenant-applications" title="Direct link to ️-multi-tenant-applications" translate="no">​</a></h3>
<p>For applications serving multiple customers or organizations, flag sets provide perfect isolation:</p>
<ul>
<li class="">Each customer gets their own flag set.</li>
<li class="">No risk of flag name collisions between customers.</li>
<li class="">Isolated configurations and data tracking.</li>
<li class="">Secure access control per customer.</li>
<li class="">Routing to the flag set is based on API Keys.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-how-flag-sets-work">⚙️ How Flag Sets Work<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#%EF%B8%8F-how-flag-sets-work" class="hash-link" aria-label="Direct link to ⚙️ How Flag Sets Work" title="Direct link to ⚙️ How Flag Sets Work" translate="no">​</a></h2>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-structure">Configuration Structure<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#configuration-structure" class="hash-link" aria-label="Direct link to Configuration Structure" title="Direct link to Configuration Structure" translate="no">​</a></h3>
<p>Flag sets are configured in your relay proxy configuration file, instead of defining your configuration on top level of the file we have introduce a new field called flagset.</p>
<p>In each flag set you can configure his behavior like in this example:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">server</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">mode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> http</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1031</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">flagsets</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">a</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">apiKeys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'team-a-api-key-1'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'team-a-api-key-2'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">retrievers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> file</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> /flags/team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">a</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flags.yaml</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">exporters</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> s3</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">bucket</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">a</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">evaluations</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">notifiers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> slack</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">webhookUrl</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'https://hooks.slack.com/services/team-a-webhook'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">b</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">apiKeys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'team-b-api-key'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">retrievers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> github</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">repository</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">org/team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">b</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flags</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> flags.yaml</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">exporters</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> kafka</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">topic</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">b</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">evaluations</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">notifiers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> discord</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">webhookUrl</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'https://discord.com/api/webhooks/team-b-webhook'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">c</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">apiKeys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'team-c-api-key'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">retrievers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> s3</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">bucket</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">b</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flags</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">item</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> flags.yaml</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">exporters</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> file</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">outputDir</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> /logs/team</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">c</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">evaluations</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">pollingInterval</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1000</span><br></span></code></pre></div></div>
<p>As you can see, you are able to configure every flag sets differently.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Always provide a <strong><code>name</code></strong> for your flag sets. This enables runtime API key updates without requiring a restart of the relay proxy.
If you omit the name (or use <code>default</code> as the name), a UUID will be generated automatically and you won't be able to update API keys at runtime.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="api-key-based-routing">API Key-Based Routing<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#api-key-based-routing" class="hash-link" aria-label="Direct link to API Key-Based Routing" title="Direct link to API Key-Based Routing" translate="no">​</a></h3>
<p>The magic of flag sets lies in their API key-based routing system:</p>
<ol>
<li class=""><strong>Extract API Key</strong>: The relay proxy extracts the API key from the <code>X-API-Key</code> header.</li>
<li class=""><strong>Find Flag Set</strong>: It looks up which flag set is associated with that API key.</li>
<li class=""><strong>Route Request</strong>: The evaluation request is routed to that specific flag set.</li>
<li class=""><strong>Return Result</strong>: The evaluation result comes from that flag set's flags.</li>
</ol>
<p>This means you can have identical flag names across different flag sets without any conflicts ✨.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfeature-provider-integration">OpenFeature Provider Integration<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#openfeature-provider-integration" class="hash-link" aria-label="Direct link to OpenFeature Provider Integration" title="Direct link to OpenFeature Provider Integration" translate="no">​</a></h3>
<p>Using flag sets in your applications is straightforward. You simply initialize your providers with the correct API key.<br>
<!-- -->All the providers have a way to pass the API Key to use, based on this one the relay proxy will route the request to the correct flag set.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-benefits-of-using-flag-sets">Key Benefits of using flag sets<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#key-benefits-of-using-flag-sets" class="hash-link" aria-label="Direct link to Key Benefits of using flag sets" title="Direct link to Key Benefits of using flag sets" translate="no">​</a></h2>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-complete-isolation">🔒 <strong>Complete Isolation</strong><a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#-complete-isolation" class="hash-link" aria-label="Direct link to -complete-isolation" title="Direct link to -complete-isolation" translate="no">​</a></h3>
<ul>
<li class="">No inheritance between flag sets</li>
<li class="">Identical flag names can exist across different sets</li>
<li class="">Independent configurations and data tracking</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-secure-access-control">🔑 <strong>Secure Access Control</strong><a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#-secure-access-control" class="hash-link" aria-label="Direct link to -secure-access-control" title="Direct link to -secure-access-control" translate="no">​</a></h3>
<ul>
<li class="">API key-based authentication for each flag set</li>
<li class="">Multiple API keys per flag set for flexibility</li>
<li class="">No cross-contamination between teams or customers</li>
<li class=""><strong>Runtime API key updates</strong>: Update, add, or rotate API keys without restarting the relay proxy</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-flexible-configuration">🎯 <strong>Flexible Configuration</strong><a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#-flexible-configuration" class="hash-link" aria-label="Direct link to -flexible-configuration" title="Direct link to -flexible-configuration" translate="no">​</a></h3>
<ul>
<li class="">Each flag set can have its own retrievers, exporters, and notifiers</li>
<li class="">Independent polling intervals and file formats</li>
<li class="">Custom notification channels per team</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-separate-analytics">📊 <strong>Separate Analytics</strong><a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#-separate-analytics" class="hash-link" aria-label="Direct link to -separate-analytics" title="Direct link to -separate-analytics" translate="no">​</a></h3>
<ul>
<li class="">Evaluation data is tracked separately per flag set</li>
<li class="">Independent export configurations</li>
<li class="">Team-specific monitoring and alerting</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration-guide">Migration Guide<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#migration-guide" class="hash-link" aria-label="Direct link to Migration Guide" title="Direct link to Migration Guide" translate="no">​</a></h2>
<hr>
<p>If you're currently using a single GO Feature Flag configuration, migrating to flag sets is straightforward:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="option-1-gradual-migration">Option 1: Gradual Migration<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#option-1-gradual-migration" class="hash-link" aria-label="Direct link to Option 1: Gradual Migration" title="Direct link to Option 1: Gradual Migration" translate="no">​</a></h3>
<ol>
<li class="">Ensure that all your providers are using API Keys to connect to GO Feature Flag.</li>
<li class="">Create a flag set and move your actual configuration inside it.</li>
<li class="">Associate your API Keys to the flag set.</li>
<li class="">Create extra flag sets and move flags over them.</li>
<li class="">Change the API Key used in your provider to point to the right flag set.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="option-2-full-migration">Option 2: Full Migration<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#option-2-full-migration" class="hash-link" aria-label="Direct link to Option 2: Full Migration" title="Direct link to Option 2: Full Migration" translate="no">​</a></h3>
<ol>
<li class="">Create flag sets for each team or purpose.</li>
<li class="">Move all flags to appropriate flag sets.</li>
<li class="">Update all applications with new API keys.</li>
<li class="">Remove the old single configuration.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started-today">Get Started Today<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#get-started-today" class="hash-link" aria-label="Direct link to Get Started Today" title="Direct link to Get Started Today" translate="no">​</a></h2>
<p>Flag Sets are available now in GO Feature Flag! Whether you're managing multiple teams, serving multiple customers, or just want better organization, flag sets provide the flexibility and isolation you need.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://gofeatureflag.org/blog/2025/09/18/introducing-flagsets#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h3>
<ul>
<li class="">📚 <a href="https://docs.gofeatureflag.org/concepts/flagset" target="_blank" rel="noopener noreferrer" class="">Flag Sets Documentation</a></li>
<li class="">🔧 <a href="https://docs.gofeatureflag.org/relay-proxy/configure-relay-proxy#use-multiple-flag-sets" target="_blank" rel="noopener noreferrer" class="">Configuration Guide</a></li>
<li class="">💬 <a href="https://gofeatureflag.org/slack" target="_blank" rel="noopener noreferrer" class="">Community Discussions</a></li>
<li class="">🐛 <a href="https://github.com/thomaspoignant/go-feature-flag/issues" target="_blank" rel="noopener noreferrer" class="">Report Issues</a></li>
</ul>
<p>We can't wait to see how you use Flag Sets to organize and scale your feature flag management! And please share your feedbacks ! 🚀</p>]]></content:encoded>
            <category>feature flags</category>
            <category>flagsets</category>
            <category>organization</category>
            <category>multi-tenant</category>
            <category>team isolation</category>
        </item>
        <item>
            <title><![CDATA[Watch Thomas's PlatformCon 2025 Talk on Feature Flag Decoupling]]></title>
            <link>https://gofeatureflag.org/blog/2025/07/01/platformcon-2025-talk</link>
            <guid>https://gofeatureflag.org/blog/2025/07/01/platformcon-2025-talk</guid>
            <pubDate>Tue, 01 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Thomas Poignant presents "Decouple Deployments and Releases with OpenFeature" at PlatformCon 2025, exploring how to separate feature releases from code deployments using feature flags and OpenFeature.]]></description>
            <content:encoded><![CDATA[<p>We're excited to share that Thomas Poignant, creator of GO Feature Flag, presented an insightful talk at <strong>PlatformCon 2025</strong> about decoupling deployments from feature releases using OpenFeature.</p>
<iframe width="100%" height="444" src="https://www.youtube.com/embed/mPHlhMkuH9c" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="talk-decouple-deployments-and-releases-with-openfeature">Talk: "Decouple Deployments and Releases with OpenFeature"<a href="https://gofeatureflag.org/blog/2025/07/01/platformcon-2025-talk#talk-decouple-deployments-and-releases-with-openfeature" class="hash-link" aria-label="Direct link to Talk: &quot;Decouple Deployments and Releases with OpenFeature&quot;" title="Direct link to Talk: &quot;Decouple Deployments and Releases with OpenFeature&quot;" translate="no">​</a></h2>
<p>In this presentation, Thomas explores how traditional deployment strategies often directly couple feature releases with code deployments, increasing risks and slowing time-to-market. He demonstrates how <strong>OpenFeature</strong>, a vendor-agnostic API for feature flagging, enables developers to separate feature releases from code deployments, providing precise control over feature visibility and experimentation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-youll-learn">What You'll Learn<a href="https://gofeatureflag.org/blog/2025/07/01/platformcon-2025-talk#what-youll-learn" class="hash-link" aria-label="Direct link to What You'll Learn" title="Direct link to What You'll Learn" translate="no">​</a></h2>
<p>The talk covers several key concepts:</p>
<ul>
<li class=""><strong>Fundamental feature flagging concepts</strong> and how they transform development workflows</li>
<li class=""><strong>OpenFeature integration</strong> and how it simplifies feature flag management across different providers</li>
<li class=""><strong>Real-world use cases</strong> demonstrating the practical benefits of deployment/release decoupling</li>
<li class=""><strong>Best practices</strong> for implementing feature flags effectively in development workflows</li>
<li class=""><strong>Risk reduction strategies</strong> for safer and more controlled feature rollouts</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-matters">Why This Matters<a href="https://gofeatureflag.org/blog/2025/07/01/platformcon-2025-talk#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>In today's fast-paced development environment, the ability to deploy code without immediately releasing features to users has become crucial for:</p>
<ul>
<li class=""><strong>Reducing deployment risks</strong> by allowing features to be tested in production before user exposure</li>
<li class=""><strong>Faster time-to-market</strong> through independent deployment and release cycles</li>
<li class=""><strong>Enhanced experimentation capabilities</strong> with controlled feature rollouts</li>
<li class=""><strong>Improved incident response</strong> with the ability to quickly disable problematic features</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="about-platformcon-2025">About PlatformCon 2025<a href="https://gofeatureflag.org/blog/2025/07/01/platformcon-2025-talk#about-platformcon-2025" class="hash-link" aria-label="Direct link to About PlatformCon 2025" title="Direct link to About PlatformCon 2025" translate="no">​</a></h2>
<p>PlatformCon is the premier conference for platform engineering, bringing together industry experts to share insights on building and scaling development platforms. Thomas's talk was part of the conference's focus on modern development practices and tooling that enable engineering teams to ship software more effectively.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more-about-go-feature-flag">Learn More About GO Feature Flag<a href="https://gofeatureflag.org/blog/2025/07/01/platformcon-2025-talk#learn-more-about-go-feature-flag" class="hash-link" aria-label="Direct link to Learn More About GO Feature Flag" title="Direct link to Learn More About GO Feature Flag" translate="no">​</a></h2>
<p>If you're interested in implementing feature flags in your own projects, check out:</p>
<ul>
<li class=""><strong><a href="https://gofeatureflag.org/docs/getting-started" target="_blank" rel="noopener noreferrer" class="">GO Feature Flag Documentation</a></strong> - Get started with our open-source feature flag solution</li>
<li class=""><strong><a href="https://gofeatureflag.org/docs/sdk" target="_blank" rel="noopener noreferrer" class="">OpenFeature Integration</a></strong> - Learn how to use GO Feature Flag with OpenFeature</li>
<li class=""><strong><a href="https://gofeatureflag.org/docs/concepts/flag-evaluation" target="_blank" rel="noopener noreferrer" class="">Best Practices Guide</a></strong> - Understand how to implement feature flags effectively</li>
</ul>
<hr>
<p>Have questions about feature flagging or want to share your own experiences? Join our community discussions or reach out to Thomas on <a href="https://github.com/thomaspoignant" target="_blank" rel="noopener noreferrer" class="">GitHub</a> or <a href="https://www.linkedin.com/in/poignantthomas/" target="_blank" rel="noopener noreferrer" class="">LinkedIn</a>.</p>]]></content:encoded>
            <category>platformcon</category>
            <category>openfeature</category>
            <category>feature flags</category>
            <category>deployment</category>
            <category>release management</category>
        </item>
        <item>
            <title><![CDATA[Introducing Exporter Metadata in the GO Feature Flag Provider for OpenFeature.]]></title>
            <link>https://gofeatureflag.org/blog/2025/01/21/exporter-metadata</link>
            <guid>https://gofeatureflag.org/blog/2025/01/21/exporter-metadata</guid>
            <pubDate>Tue, 21 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Exporter metadata in the GO Feature Flag provider for OpenFeature allows enriching evaluation events with static context data like environment or app version for improved observability and analysis.]]></description>
            <content:encoded><![CDATA[<p>This blog post dives into a new functionality introduced in the GO Feature Flag provider for OpenFeature: exporter metadata. We'll explore how it works and how you can leverage it to enrich your evaluation events with valuable static information.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-exporter-metadata">What is Exporter Metadata?<a href="https://gofeatureflag.org/blog/2025/01/21/exporter-metadata#what-is-exporter-metadata" class="hash-link" aria-label="Direct link to What is Exporter Metadata?" title="Direct link to What is Exporter Metadata?" translate="no">​</a></h2>
<p>Exporter metadata is an object you can configure when initializing your GO Feature Flag provider for OpenFeature.</p>
<p>It allows you to specify a set of static information that you want to consistently include with all your evaluation events.
A good example of information you might include in exporter metadata is the environment in which your application is running,
the version of the application or anything that helps you when you analyze your evaluation data.</p>
<p>This data is then forwarded to the exporter and incorporated into your feature events as a new field called <code>metadata</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-use-exporter-metadata">Why Use Exporter Metadata?<a href="https://gofeatureflag.org/blog/2025/01/21/exporter-metadata#why-use-exporter-metadata" class="hash-link" aria-label="Direct link to Why Use Exporter Metadata?" title="Direct link to Why Use Exporter Metadata?" translate="no">​</a></h2>
<p>Including exporter metadata in your evaluation events offers several advantages:</p>
<ul>
<li class=""><strong>Enhanced Context</strong>: By adding static information to your events, you can provide richer context for analysis. This can include details about the environment (e.g., development, staging, production), the application version, or any other relevant data that sheds light on feature usage patterns.</li>
<li class=""><strong>Improved Observability</strong>: With exporter metadata, you gain a more comprehensive view of feature evaluation across different contexts. This can be particularly useful for debugging purposes or identifying trends in feature adoption for specific environments or application versions.</li>
<li class=""><strong>Simplified Data Enrichment</strong>: Exporter metadata eliminates the need to manually inject context information into every evaluation event. This streamlines your code and ensures consistency in the data you collect.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use-exporter-metadata">How to Use Exporter Metadata<a href="https://gofeatureflag.org/blog/2025/01/21/exporter-metadata#how-to-use-exporter-metadata" class="hash-link" aria-label="Direct link to How to Use Exporter Metadata" title="Direct link to How to Use Exporter Metadata" translate="no">​</a></h2>
<p>In all providers that support exporter metadata, you can pass a map of key-value pairs to the <code>ExporterMetadata</code> field in the provider's configuration.
Value can be a <code>string</code>, a <code>bool</code>, an <code>int</code> or a <code>float64</code>.</p>
<p>This map will be included in all evaluation events sent to the exporter and added to the <code>metadata</code> field by the exporter.</p>
<p>Here's an example of how you can configure exporter metadata in the Kotlin provider:</p>
<div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">val</span><span class="token plain"> options </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token function" style="color:rgb(220, 220, 170)">GoFeatureFlagOptions</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        endpoint </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(206, 145, 120)">"https://mygoffserver.com/"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        exporterMetadata </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">mapOf</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-literal singleline string" style="color:rgb(206, 145, 120)">"device"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">to</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(206, 145, 120)">"Pixel 4"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(206, 145, 120)">"appVersion"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">to</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(206, 145, 120)">"1.0.0"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">val</span><span class="token plain"> provider </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">GoFeatureFlagProvider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">options</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre></div></div>
<p>In this example, we're passing some information that can help to understand the context of the evaluation events such as the device type and the appVersion.</p>
<p>With this configuration, all evaluation events sent to the exporter will include the <code>metadata</code> field with the specified key-value pairs.
And it will look like this:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token property">"kind"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"feature"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token property">"contextKind"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"user"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token property">"userKey"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"4f433951-4c8c-42b3-9f18-8c9a5ed8e9eb"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token property">"creationDate"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token number" style="color:rgb(181, 206, 168)">1737465936</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token property">"key"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"REDIRECTION"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token property">"variation"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"on"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token property">"value"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token property">"default"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token property">"version"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">""</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token property">"source"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"PROVIDER_CACHE"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token property">"metadata"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token property">"device"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"Pixel 4"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token property">"appVersion"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token string" style="color:rgb(206, 145, 120)">"1.0.0"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token property">"openfeature"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token property">"provider"</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"android"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-providers-support-exporter-metadata">Which Providers Support Exporter Metadata?<a href="https://gofeatureflag.org/blog/2025/01/21/exporter-metadata#which-providers-support-exporter-metadata" class="hash-link" aria-label="Direct link to Which Providers Support Exporter Metadata?" title="Direct link to Which Providers Support Exporter Metadata?" translate="no">​</a></h2>
<p>To be able to use exporter metadata, you need to use the relay-proxy in version <code>v1.41.1</code> or above and as minimum the following version of the providers:</p>
<ul>
<li class=""><strong>Kotlin</strong>: <code>v0.3.0</code></li>
<li class=""><strong>Web</strong>: <code>v0.2.4</code></li>
<li class=""><strong>Swift</strong>: <code>v0.3.0</code></li>
<li class=""><strong>Java</strong>: <code>v0.4.2</code></li>
<li class=""><strong>NodeJS</strong>: <code>v0.7.5</code></li>
<li class=""><strong>PHP</strong>: <code>1.1.0</code></li>
<li class=""><strong>Ruby</strong>: <code>0.1.3</code></li>
<li class=""><strong>Python</strong>: <code>v0.4.1</code></li>
<li class=""><strong>.NET</strong>: <code>0.2.1</code></li>
<li class=""><strong>GO</strong>: <code>v0.2.3</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://gofeatureflag.org/blog/2025/01/21/exporter-metadata#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Exporter metadata provides a powerful mechanism to enrich your evaluation events with static information in the GO Feature Flag provider for OpenFeature.
By incorporating this functionality, you can gain deeper insights into feature usage patterns and streamline your data collection process.</p>
<p>This blog post has provided a brief introduction to exporter metadata.
We encourage you to experiment with this feature and explore its potential to enhance your feature flag evaluation practices.</p>]]></content:encoded>
            <category>openfeature</category>
            <category>exporter</category>
        </item>
        <item>
            <title><![CDATA[(Java) OpenFeature provider improve the internal cache management.]]></title>
            <link>https://gofeatureflag.org/blog/2024/10/20/breaking-change-java</link>
            <guid>https://gofeatureflag.org/blog/2024/10/20/breaking-change-java</guid>
            <pubDate>Sun, 20 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[The Java provider has been updated to improve the internal cache management by migrating from guava cache to caffeine cache.]]></description>
            <content:encoded><![CDATA[<p>Until Today the java provider, used the guava cache to store the flags and the segments.
Using the guava cache is now <a href="https://javadoc.io/doc/com.google.guava/guava/latest/com/google/common/cache/package-summary.html" target="_blank" rel="noopener noreferrer" class="">discouraged</a> by the guava team.</p>
<p>In order to follow the guidance of the guava team, we have decided to migrate the internal cache of the Java provider from <code>guava</code> to <code>caffeine</code>.</p>
<p>This may create a <strong>breaking change</strong> for you if you were using a custom cache configuration with the <code>guava</code> cache in your provider.<br>
<!-- -->Because of this, the cache configuration on <code>GoFeatureFlagProviderOptions</code> that used Guava's <code>CacheBuilder</code> is now handled by <code>Caffeine</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-migrate">How to migrate<a href="https://gofeatureflag.org/blog/2024/10/20/breaking-change-java#how-to-migrate" class="hash-link" aria-label="Direct link to How to migrate" title="Direct link to How to migrate" translate="no">​</a></h2>
<p>Configuration cache with Guava used to be like this:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token import namespace">com</span><span class="token import namespace punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token import namespace">google</span><span class="token import namespace punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token import namespace">common</span><span class="token import namespace punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token import namespace">cache</span><span class="token import namespace punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token import class-name" style="color:rgb(78, 201, 176)">CacheBuilder</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token class-name" style="color:rgb(78, 201, 176)">CacheBuilder</span><span class="token plain"> guavaCacheBuilder </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">CacheBuilder</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">newBuilder</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">initialCapacity</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">maximumSize</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2000</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token class-name" style="color:rgb(78, 201, 176)">FeatureProvider</span><span class="token plain"> provider </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProvider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProviderOptions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">builder</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">endpoint</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"https://my-gofeatureflag-instance.org"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">cacheBuilder</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">guavaCacheBuilder</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">build</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token class-name" style="color:rgb(78, 201, 176)">OpenFeatureAPI</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getInstance</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">setProviderAndWait</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">provider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// ...</span><br></span></code></pre></div></div>
<p>Now with Caffeine it should be like this:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token import namespace">com</span><span class="token import namespace punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token import namespace">github</span><span class="token import namespace punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token import namespace">benmanes</span><span class="token import namespace punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token import namespace">caffeine</span><span class="token import namespace punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token import namespace">cache</span><span class="token import namespace punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token import class-name" style="color:rgb(78, 201, 176)">Caffeine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token class-name" style="color:rgb(78, 201, 176)">Caffeine</span><span class="token plain"> caffeineCacheConfig </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">Caffeine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">newBuilder</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">initialCapacity</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">maximumSize</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2000</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token class-name" style="color:rgb(78, 201, 176)">FeatureProvider</span><span class="token plain"> provider </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProvider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProviderOptions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">builder</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">endpoint</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"https://my-gofeatureflag-instance.org"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">cacheConfig</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">caffeineCacheConfig</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">build</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token class-name" style="color:rgb(78, 201, 176)">OpenFeatureAPI</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getInstance</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">setProviderAndWait</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">provider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">// ...</span><br></span></code></pre></div></div>
<p>For a complete list of customizations  options available in Caffeine, please refer to the <a href="https://github.com/ben-manes/caffeine/wiki" target="_blank" rel="noopener noreferrer" class="">Caffeine documentation</a> for more details.</p>]]></content:encoded>
            <category>openfeature</category>
            <category>java</category>
            <category>breaking changes</category>
        </item>
        <item>
            <title><![CDATA[Changes to golang OpenFeature Integration]]></title>
            <link>https://gofeatureflag.org/blog/2024/08/14/changes-to-golang-openfeature-integration</link>
            <guid>https://gofeatureflag.org/blog/2024/08/14/changes-to-golang-openfeature-integration</guid>
            <pubDate>Wed, 14 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We have released 2 new golang providers for OpenFeature, let's explain all the changes.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="blog_cover.png" src="https://gofeatureflag.org/assets/images/blog_cover-551c6a50d204cc3316f7a43ae59625e3.png" width="1083" height="323" class="img_ev3q">
We're excited to announce significant improvements to the integration between GO Feature Flag and OpenFeature.</p>
<p>To better serve our users' diverse needs, we've decided to split the previous Go provider into two distinct providers:</p>
<ul>
<li class=""><a href="https://github.com/open-feature/go-sdk-contrib/tree/main/providers/go-feature-flag" target="_blank" rel="noopener noreferrer" class=""><code>go-feature-flag</code></a>: For use with the GO Feature Flag relay proxy.</li>
<li class=""><a href="https://github.com/open-feature/go-sdk-contrib/tree/main/providers/go-feature-flag-in-process" target="_blank" rel="noopener noreferrer" class=""><code>go-feature-flag-in-process</code></a>: For direct integration of GO Feature Flag into your application.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the-split">Why the Split?<a href="https://gofeatureflag.org/blog/2024/08/14/changes-to-golang-openfeature-integration#why-the-split" class="hash-link" aria-label="Direct link to Why the Split?" title="Direct link to Why the Split?" translate="no">​</a></h2>
<p>The decision to create separate providers was driven by several factors:</p>
<ul>
<li class=""><strong>Distinct Use Cases:</strong> It's uncommon for users to require both the relay proxy and in-process capabilities simultaneously.</li>
<li class=""><strong>Dependency Management:</strong> The in-process provider introduces additional dependencies, which can complicate integration.</li>
<li class=""><strong>Maintainability:</strong> Managing two distinct functionalities within a single provider proved challenging.</li>
</ul>
<p>By separating these functionalities, we've streamlined the integration process and enhanced overall maintainability.</p>
<p>We also use this split to rewrite from scratch the provider to increase the quality of the OpenFeature integration.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="choosing-the-right-provider">Choosing the Right Provider<a href="https://gofeatureflag.org/blog/2024/08/14/changes-to-golang-openfeature-integration#choosing-the-right-provider" class="hash-link" aria-label="Direct link to Choosing the Right Provider" title="Direct link to Choosing the Right Provider" translate="no">​</a></h2>
<p>To select the appropriate provider for your application, consider the following:</p>
<ul>
<li class=""><a href="https://github.com/open-feature/go-sdk-contrib/tree/main/providers/go-feature-flag" target="_blank" rel="noopener noreferrer" class=""><code>go-feature-flag</code></a>: Ideal for multi-language environments using the GO Feature Flag relay proxy. This provider offers a lightweight integration with minimal dependencies, ensuring consistency with other language-specific providers.</li>
<li class=""><a href="https://github.com/open-feature/go-sdk-contrib/tree/main/providers/go-feature-flag-in-process" target="_blank" rel="noopener noreferrer" class=""><code>go-feature-flag-in-process</code></a>: Best suited for Go-only applications that prefer a direct integration without the overhead of a separate service.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://gofeatureflag.org/blog/2024/08/14/changes-to-golang-openfeature-integration#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>As you may imagine, this split comes with some breaking changes, but we've done everything possible to limit it as much as possible.
Please be aware of the following breaking changes:</p>
<ul>
<li class=""><strong>Existing go-feature-flag users:</strong> If you were previously using the <code>go-feature-flag</code> provider with the Go module, you'll need to transition to the <code>go-feature-flag-in-process</code> provider.</li>
<li class=""><strong>Configuration Changes:</strong> The <code>HTTPClient</code> interface has been removed from the configuration in favor of using the standard <code>http.Client</code> <em>(This should have no impact on the way to pass the http client in the options)</em>.</li>
<li class=""><strong>Cache Compatibility:</strong> If you are using the in-memory cache of the provider, ensure your relay proxy is updated to version <code>1.32.0</code> or later, if not the cache will not work as expected and you may have an increase on the number of connection to the relay-proxy.</li>
</ul>
<p>We understand that these changes may require adjustments to your existing setup. We recommend carefully reviewing the updated documentation for both providers to ensure a smooth transition.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next Steps<a href="https://gofeatureflag.org/blog/2024/08/14/changes-to-golang-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>We encourage you to explore the new providers and leverage the enhanced features they offer. If you encounter any issues or have feedback, please don't hesitate to <a href="https://github.com/thomaspoignant/go-feature-flag/issues/new/choose" target="_blank" rel="noopener noreferrer" class="">open an issue</a>.</p>
<p>We're committed to providing you with the best possible feature flagging experience.</p>]]></content:encoded>
            <category>openfeature</category>
            <category>golang</category>
        </item>
        <item>
            <title><![CDATA[Feature Flagging in the SDLC]]></title>
            <link>https://gofeatureflag.org/blog/2024/08/02/feature-flagging-in-the-SDLC</link>
            <guid>https://gofeatureflag.org/blog/2024/08/02/feature-flagging-in-the-SDLC</guid>
            <pubDate>Fri, 02 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Feature Flagging in the Software Development Lifecycle - Follow the life of a feature flag from birth to retirement.]]></description>
            <content:encoded><![CDATA[<p><strong>Thomas</strong> recently delivered a presentation on Feature Flagging in the Software Development Lifecycle (SDLC) for OpenFeature. Given the presentation's public availability, we are pleased to share the slides with you.</p>
<p>Effective management of the feature flag lifecycle is crucial for maximizing the value of feature flags within an organization.</p>
<p>This presentation is covering the following key areas:</p>
<ul>
<li class=""><strong>Feature flag lifecycle:</strong> Understanding the complete journey of a feature flag.</li>
<li class=""><strong>Roles and responsibilities:</strong> Identifying who owns each phase of the lifecycle.</li>
<li class=""><strong>Feature flag naming conventions:</strong> Best practices for clear and consistent flag identification.</li>
<li class=""><strong>Preventing flag debt:</strong> Strategies for avoiding the accumulation of unused or obsolete flags.</li>
<li class=""><strong>Involving project managers:</strong> The importance of project management collaboration in feature flag initiatives.</li>
</ul>
<p>By understanding these concepts, you can optimize your feature flagging strategy and drive business success.</p>
<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vSt-lZkiFpntGRWB-FZ0IFMFZlWrd6kk1tjjNrh1r4oDn19C32-lFGq4qxFZbfQmaSf6MUnTZJyAtsT/embed?start=false&amp;loop=false&amp;delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>]]></content:encoded>
            <category>openfeature</category>
            <category>SDLC</category>
            <category>Slides</category>
            <category>Presentation</category>
        </item>
        <item>
            <title><![CDATA[GO Feature Flag: Now Powering Your Mobile App Experience]]></title>
            <link>https://gofeatureflag.org/blog/2024/07/25/go-feature-flag-mobile-support</link>
            <guid>https://gofeatureflag.org/blog/2024/07/25/go-feature-flag-mobile-support</guid>
            <pubDate>Thu, 25 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[GO Feature Flag: Now Powering Your Mobile App Experience.]]></description>
            <content:encoded><![CDATA[<p>We're thrilled to announce a major milestone for GO Feature Flag: <strong>full compatibility with mobile applications</strong>.
That's right, you can now leverage the power of feature flags to optimize your iOS, Android, and React Native apps with unparalleled ease and flexibility.</p>
<p><img decoding="async" loading="lazy" alt="GO Feature Flag: Now Powering Your Mobile App Experience" src="https://gofeatureflag.org/assets/images/mobile-support-bdc8b741188a4d89ecd5cf6382336690.png" width="1083" height="395" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-mobile-feature-flags-matter">Why Mobile Feature Flags Matter?<a href="https://gofeatureflag.org/blog/2024/07/25/go-feature-flag-mobile-support#why-mobile-feature-flags-matter" class="hash-link" aria-label="Direct link to Why Mobile Feature Flags Matter?" title="Direct link to Why Mobile Feature Flags Matter?" translate="no">​</a></h2>
<p>Mobile app development is a fast-paced world where agility is key. Traditional release cycles can be lengthy and risky. Feature flags provide a dynamic solution by allowing you to control feature visibility without redeploying your app.</p>
<p><strong>This translates to:</strong></p>
<ul>
<li class="">Faster time-to-market: Experiment with new features and iterate quickly based on user feedback.</li>
<li class="">Reduced risk: Gradually roll out features to minimize potential issues and impact.</li>
<li class="">Enhanced control: Turn features on or off in real-time based on user segments or other criteria.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-go-feature-flag-delivers-for-mobile">How GO Feature Flag Delivers for Mobile<a href="https://gofeatureflag.org/blog/2024/07/25/go-feature-flag-mobile-support#how-go-feature-flag-delivers-for-mobile" class="hash-link" aria-label="Direct link to How GO Feature Flag Delivers for Mobile" title="Direct link to How GO Feature Flag Delivers for Mobile" translate="no">​</a></h2>
<p>To bring feature flags to mobile, we've fully embraced the OpenFeature standard.</p>
<p><strong>This means:</strong></p>
<ul>
<li class="">Native support for <strong>iOS</strong> and <strong>Android</strong>: A provider for each platform ensures seamless integration with the OpenFeature SDKs in your mobile app's core.</li>
<li class=""><strong>React Native</strong> compatibility: With the usage of GO Feature Flag web provider and the OpenFeature React SDK you can now manage feature flags within your React Native app using familiar JavaScript syntax.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="diving-deeper-into-the-tech">Diving Deeper into the Tech<a href="https://gofeatureflag.org/blog/2024/07/25/go-feature-flag-mobile-support#diving-deeper-into-the-tech" class="hash-link" aria-label="Direct link to Diving Deeper into the Tech" title="Direct link to Diving Deeper into the Tech" translate="no">​</a></h2>
<p>When it comes to client side, on the 3 platforms we are using the OpenFeature static paradigm <em>(client side SDK)</em>. What does it means?
The key distinction between the client- and server-side feature flagging is the difference in how often evaluation context changes.</p>
<p>When on your mobile device, your evaluation context is changing very rarely since the device is linked to a user. Also, in the client, you expect a very low latency to get the value of your flag.
Based on this idea, the GO Feature Flag providers will retrieve your set of flags and cache them on the device, so you can evaluate them without any network call.</p>
<p>If you want to read more about the OpenFeature static paradigm, you can read this <a href="https://openfeature.dev/blog/catering-to-the-client-side" target="_blank" rel="noopener noreferrer" class="">article from Pete Hodgson</a> in the OpenFeature blog.</p>
<p>For those interested in the technical details, let's explore how this integration works in this sequence diagram:</p>
<p><a href="https://mermaid.live/edit#pako:eNrFVdtO20AQ_ZXV9oEgGUV9aokqpBIuQhUKahBClV829thZsd5x1-tAivj3zl4cJyEE-tQ8Zcdnzpy57T7zDHPgI97A7xZ0BmdSlEZUqWb0q4WxMpO10JaJumaiYdc4kwrcSclMWIn6NRQLh5zUoAsQtjXApmc_vs3M8GQgNVtia5jCTCjHcvja3ce5nLCL6HyhRMluDC5kDubjNCUWxS6mn6DE0vE9LQOZgQotEEPg0HRguADjeBNPM2JXWloplGx8yi5Dl95Fnx57lHb-purATHxHJydIdA3Y7tPgchJdnEdnTWAhVOuDjVFbeLIxQyyIoh4xGQX9gcFbUBcsqP9-c8VuJtNbNsTCQD1cfB5GJxgWFLXZzrxOesexUIpZZCXQELi_c2DeiXUcua-jKIXUjfXfe0ksC5pCBMd6FBJYi1sHy1hk5LoeYo2n6dqjEGtGwOwhQLK50CVEpt1ZjD1aFo6XOiMbJpysQpatiSI9CYUDE4binlpEkJygOmcGqGzN3OuSlI7RNHWZk9uHdUmwfyr3VkGCEXTeFSXOyqrvLgCNkLPsmVQ_d-erum1PHnXxFFGB0HcEgUHKq-WRE5XyhBVCNbAaNBZ0UeaoFhC9eubBQfQ8ONxS7CDQs5DVy47mPdrHoQ203buHKOxrgYbBk6hqdw8V1lHQVJTk1V0L_YWwsXJxPQYaHs_fWa-VfQp78f9xx0jVm3v2wY3aOWdsc9Biw3jCKzCVkDk9Fs_OlHIirSDlhOMz0dC_ZM1-J4wUM0WbSYDnbuJTXhtZCbMco0ITfD9lUHyBr9E9oFyZTh_Kd1CR65byXkceHx9vwJTUsO87jRDdpZuaPCZAXlL9QumL1uJ0qTM-sqaFhLd1Tn2J7-Wm8TyXFg0f-X1KOPjjdXhow8VDfPRI_UKsViiDbTmPp5e_6kKEdw" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://mermaid.ink/img/pako:eNrFVdtO20AQ_ZXV9oEgGUV9aokqpBIuQhUKahBClV829thZsd5x1-tAivj3zl4cJyEE-tQ8Zcdnzpy57T7zDHPgI97A7xZ0BmdSlEZUqWb0q4WxMpO10JaJumaiYdc4kwrcSclMWIn6NRQLh5zUoAsQtjXApmc_vs3M8GQgNVtia5jCTCjHcvja3ce5nLCL6HyhRMluDC5kDubjNCUWxS6mn6DE0vE9LQOZgQotEEPg0HRguADjeBNPM2JXWloplGx8yi5Dl95Fnx57lHb-purATHxHJydIdA3Y7tPgchJdnEdnTWAhVOuDjVFbeLIxQyyIoh4xGQX9gcFbUBcsqP9-c8VuJtNbNsTCQD1cfB5GJxgWFLXZzrxOesexUIpZZCXQELi_c2DeiXUcua-jKIXUjfXfe0ksC5pCBMd6FBJYi1sHy1hk5LoeYo2n6dqjEGtGwOwhQLK50CVEpt1ZjD1aFo6XOiMbJpysQpatiSI9CYUDE4binlpEkJygOmcGqGzN3OuSlI7RNHWZk9uHdUmwfyr3VkGCEXTeFSXOyqrvLgCNkLPsmVQ_d-erum1PHnXxFFGB0HcEgUHKq-WRE5XyhBVCNbAaNBZ0UeaoFhC9eubBQfQ8ONxS7CDQs5DVy47mPdrHoQ203buHKOxrgYbBk6hqdw8V1lHQVJTk1V0L_YWwsXJxPQYaHs_fWa-VfQp78f9xx0jVm3v2wY3aOWdsc9Biw3jCKzCVkDk9Fs_OlHIirSDlhOMz0dC_ZM1-J4wUM0WbSYDnbuJTXhtZCbMco0ITfD9lUHyBr9E9oFyZTh_Kd1CR65byXkceHx9vwJTUsO87jRDdpZuaPCZAXlL9QumL1uJ0qTM-sqaFhLd1Tn2J7-Wm8TyXFg0f-X1KOPjjdXhow8VDfPRI_UKsViiDbTmPp5e_6kKEdw?type=png" alt="" class="img_ev3q"></a></p>
<p>As you can see, the provider is keeping all the flags in memory to serve them as fast as possible without any network call.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-integrate-go-feature-flag-into-your-mobile-app">How to integrate GO Feature Flag into your mobile app?<a href="https://gofeatureflag.org/blog/2024/07/25/go-feature-flag-mobile-support#how-to-integrate-go-feature-flag-into-your-mobile-app" class="hash-link" aria-label="Direct link to How to integrate GO Feature Flag into your mobile app?" title="Direct link to How to integrate GO Feature Flag into your mobile app?" translate="no">​</a></h2>
<p>Ready to supercharge your mobile app development with GO Feature Flag? Here's how to get started:</p>
<ul>
<li class=""><a href="https://gofeatureflag.org/docs/openfeature_sdk/client_providers/openfeature_swift" target="_blank" rel="noopener noreferrer" class="">Integrate the OpenFeature SDK into your iOS project</a></li>
<li class=""><a href="https://gofeatureflag.org/docs/openfeature_sdk/client_providers/openfeature_android" target="_blank" rel="noopener noreferrer" class="">Integrate the OpenFeature SDK into your Android project</a></li>
<li class=""><a href="https://gofeatureflag.org/docs/openfeature_sdk/client_providers/openfeature_react" target="_blank" rel="noopener noreferrer" class="">Integrate the OpenFeature SDK into your React Native project</a></li>
</ul>
<p>Our comprehensive documentation provides detailed instructions and examples to guide you through the process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-future-of-feature-flags">The Future of Feature Flags<a href="https://gofeatureflag.org/blog/2024/07/25/go-feature-flag-mobile-support#the-future-of-feature-flags" class="hash-link" aria-label="Direct link to The Future of Feature Flags" title="Direct link to The Future of Feature Flags" translate="no">​</a></h2>
<p>We're excited about the potential of feature flags to transform mobile app development. With GO Feature Flag's expanded support, we're empowering developers to build better, faster, and more reliable apps.</p>
<p>Stay tuned for future updates as we continue to enhance our platform and explore new possibilities.</p>
<p>Do you have already integrate GO Feature Flag in your mobile app? Let us know your experience in our <a href="http://gofeatureflag.org/slack" target="_blank" rel="noopener noreferrer" class="">Slack channel</a> or on <a href="https://x.com/gofeatureflag" target="_blank" rel="noopener noreferrer" class="">X</a>.</p>]]></content:encoded>
            <category>openfeature</category>
            <category>mobile</category>
            <category>ios</category>
            <category>android</category>
            <category>react-native</category>
        </item>
        <item>
            <title><![CDATA[GO Feature Flag Supports OpenFeature Remote Evaluation Protocol (OFREP)!]]></title>
            <link>https://gofeatureflag.org/blog/2024/03/13/ofrep</link>
            <guid>https://gofeatureflag.org/blog/2024/03/13/ofrep</guid>
            <pubDate>Wed, 13 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[GO Feature Flag is now one of the first flag management systems to support the Open Feature Remote Evaluation Protocol (OFREP).]]></description>
            <content:encoded><![CDATA[<div class="openfeaturelogo_s0L1"><svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="3.55 1.55 283.66 127.41"><title>OpenFeature logo</title><path fill="#231F20" d="M62.61 57.5L34.25 57.5C27.5533 57.5 21.1309 54.8397 16.3956 50.1044 11.6603 45.3692 9 38.9467 9 32.25 9 25.5533 11.6603 19.1308 16.3956 14.3956 21.1309 9.6603 27.5533 7 34.25 7L62.61 7C69.3067 7 75.7292 9.6603 80.4645 14.3956 85.1998 19.1308 87.86 25.5533 87.86 32.25 87.86 38.9467 85.1998 45.3692 80.4645 50.1044 75.7292 54.8397 69.3067 57.5 62.61 57.5zM62.72 13.65C59.0413 13.65 55.4452 14.7409 52.3864 16.7847 49.3277 18.8285 46.9436 21.7334 45.5359 25.1321 44.1281 28.5308 43.7597 32.2706 44.4774 35.8787 45.1951 39.4867 46.9666 42.8009 49.5678 45.4022 52.1691 48.0034 55.4833 49.7749 59.0913 50.4926 62.6994 51.2103 66.4392 50.8419 69.8379 49.4342 73.2366 48.0264 76.1416 45.6424 78.1853 42.5836 80.2291 39.5248 81.32 35.9287 81.32 32.25 81.3213 29.8037 80.8398 27.3811 79.903 25.1213 78.9663 22.8614 77.5927 20.8087 75.861 19.0807 74.1293 17.3527 72.0736 15.9836 69.8118 15.0517 67.5499 14.1197 65.1263 13.6434 62.68 13.65H62.72zM107.68 20.19C110.301 18.69 113.281 17.9328 116.3 18 119.521 17.9625 122.691 18.8026 125.47 20.43 128.222 22.0538 130.463 24.4165 131.94 27.25 133.565 30.4035 134.376 33.9132 134.3 37.46 134.365 41.0217 133.555 44.5449 131.94 47.72 130.487 50.6106 128.249 53.0338 125.484 54.7121 122.718 56.3904 119.535 57.2561 116.3 57.21 113.305 57.2704 110.35 56.517 107.75 55.03 105.438 53.7228 103.494 51.8513 102.1 49.59V74.59H95.8V18.63H102.1V25.63C103.448 23.3567 105.373 21.4801 107.68 20.19zM126.13 29.98C125.061 27.9524 123.438 26.2704 121.45 25.13 119.475 24.0226 117.244 23.4504 114.98 23.47 112.733 23.4554 110.523 24.0424 108.58 25.17 106.585 26.338 104.954 28.0381 103.87 30.08 102.7 32.4068 102.09 34.9753 102.09 37.58 102.09 40.1846 102.7 42.7531 103.87 45.08 104.954 47.1219 106.585 48.822 108.58 49.99 110.523 51.1176 112.733 51.7046 114.98 51.69 117.25 51.7098 119.483 51.1229 121.45 49.99 123.441 48.8265 125.063 47.1245 126.13 45.08 127.327 42.7361 127.922 40.1311 127.86 37.5 127.927 34.8875 127.332 32.3004 126.13 29.98zM174.31 39.95H143.99C143.99 41.5487 144.313 43.1311 144.937 44.6028 145.561 46.0745 146.476 47.4056 147.625 48.5168 148.775 49.628 150.136 50.4966 151.628 51.071 153.12 51.6453 154.712 51.9136 156.31 51.86 158.726 51.9452 161.109 51.2778 163.13 49.95 164.927 48.7135 166.274 46.9275 166.97 44.86H173.75C172.793 48.4337 170.644 51.5736 167.66 53.76 164.359 56.1244 160.368 57.3304 156.31 57.19 152.915 57.2412 149.567 56.3887 146.61 54.72 143.775 53.1081 141.458 50.7215 139.93 47.84 138.267 44.6478 137.435 41.0884 137.51 37.49 137.429 33.9087 138.236 30.363 139.86 27.17 141.354 24.3031 143.651 21.9334 146.47 20.35 149.474 18.7176 152.851 17.894 156.27 17.96 159.605 17.8946 162.899 18.7086 165.82 20.32 168.526 21.826 170.749 24.0697 172.23 26.79 173.758 29.652 174.532 32.856 174.48 36.1 174.491 37.3854 174.434 38.6705 174.31 39.95zM166.42 28.63C165.383 26.9272 163.881 25.5567 162.09 24.68 160.203 23.7646 158.128 23.3023 156.03 23.33 153.036 23.2505 150.125 24.3245 147.9 26.33 145.574 28.5433 144.198 31.5724 144.06 34.78H168.01C168.06 32.6223 167.509 30.4931 166.42 28.63zM209.82 22.12C212.68 24.92 214.11 28.9466 214.11 34.2V56.56H207.88V35.1C207.88 31.32 206.94 28.42 205.05 26.42 204.041 25.4006 202.829 24.6063 201.491 24.0893 200.154 23.5722 198.722 23.3441 197.29 23.42 195.824 23.3494 194.36 23.5911 192.995 24.129 191.629 24.6669 190.394 25.4887 189.37 26.54 187.37 28.62 186.387 31.6433 186.42 35.61V56.61H180.12V18.63H186.42V24.03C187.671 22.0905 189.432 20.5335 191.51 19.53 193.721 18.4552 196.152 17.9108 198.61 17.94 200.663 17.852 202.713 18.1765 204.638 18.8945 206.564 19.6124 208.326 20.7092 209.82 22.12zM70.91 74.72V79.85H49.91V96.13H66.91V101.26H49.91V122.99H43.61V74.72H70.91zM110.23 106.36H79.9C79.903 107.959 80.227 109.541 80.853 111.012 81.48 112.483 82.395 113.813 83.545 114.924 84.695 116.035 86.056 116.904 87.548 117.478 89.04 118.053 90.632 118.322 92.23 118.27 94.646 118.355 97.029 117.688 99.05 116.36 100.847 115.124 102.194 113.338 102.89 111.27H109.67C108.713 114.844 106.565 117.984 103.58 120.17 100.278 122.533 96.288 123.739 92.23 123.6 88.852 123.656 85.519 122.818 82.57 121.17 79.732 119.561 77.414 117.174 75.89 114.29 74.237 111.096 73.418 107.536 73.51 103.94 73.429 100.359 74.236 96.813 75.86 93.62 77.352 90.7511 79.649 88.3806 82.47 86.8 85.474 85.1663 88.851 84.3427 92.27 84.41 95.605 84.3447 98.899 85.1586 101.82 86.77 104.524 88.2787 106.747 90.5217 108.23 93.24 109.75 96.1047 110.521 99.3074 110.47 102.55 110.456 103.823 110.376 105.095 110.23 106.36zM102.33 95.04C101.294 93.3502 99.794 91.9932 98.01 91.13 96.122 90.2157 94.047 89.7535 91.95 89.78 88.955 89.6995 86.045 90.7736 83.82 92.78 81.495 94.9948 80.116 98.0223 79.97 101.23H103.97C104.017 99.0534 103.449 96.9077 102.33 95.04zM116.04 93.66C117.517 90.8265 119.758 88.4638 122.51 86.84 125.292 85.2113 128.466 84.3712 131.69 84.41 134.714 84.3372 137.702 85.0799 140.34 86.56 142.623 87.8254 144.515 89.6933 145.81 91.96V85.04H152.18V122.97H145.81V115.91C144.479 118.211 142.556 120.114 140.24 121.42 137.616 122.911 134.637 123.664 131.62 123.6 128.412 123.642 125.257 122.786 122.51 121.13 119.761 119.432 117.533 117.011 116.07 114.13 114.461 110.96 113.654 107.444 113.72 103.89 113.628 100.34 114.425 96.823 116.04 93.66zM144.04 96.46C142.973 94.4266 141.355 92.7352 139.37 91.58 137.397 90.4783 135.175 89.8999 132.915 89.8999 130.655 89.8999 128.433 90.4783 126.46 91.58 124.486 92.7254 122.877 94.4071 121.82 96.43 120.619 98.7367 120.024 101.31 120.09 103.91 120.024 106.542 120.619 109.148 121.82 111.49 122.875 113.53 124.483 115.231 126.46 116.4 128.411 117.537 130.633 118.124 132.89 118.1 135.163 118.12 137.4 117.533 139.37 116.4 141.36 115.238 142.98 113.536 144.04 111.49 145.232 109.17 145.827 106.588 145.77 103.98 145.85 101.371 145.268 98.7841 144.08 96.46H144.04zM167.82 90.23V112.59C167.75 113.287 167.818 113.992 168.021 114.662 168.223 115.333 168.556 115.958 169 116.5 169.78 117.26 171.15 117.64 173.09 117.64H177.72V122.97H172.05C168.54 122.97 165.91 122.17 164.15 120.55 162.39 118.93 161.52 116.28 161.52 112.55V90.23H156.61V85.04H161.51V75.48H167.81V85.04H177.71V90.23H167.82zM216.28 85.04V122.97H209.98V117.37C208.773 119.32 207.04 120.891 204.98 121.9 202.779 122.997 200.349 123.555 197.89 123.53 195.113 123.584 192.365 122.952 189.89 121.69 187.518 120.461 185.574 118.544 184.31 116.19 182.891 113.433 182.203 110.359 182.31 107.26V85.04H188.51V106.43C188.51 110.17 189.457 113.043 191.35 115.05 192.356 116.07 193.567 116.864 194.903 117.381 196.239 117.898 197.67 118.126 199.1 118.05 200.579 118.131 202.058 117.895 203.438 117.357 204.818 116.819 206.067 115.991 207.1 114.93 209.03 112.86 210 109.83 210 105.86V85.04H216.28zM235.29 86.13C237.585 84.8635 240.18 84.2416 242.8 84.33V90.83H241.14C234.067 90.83 230.533 94.66 230.54 102.32V122.95H224.24V85.04H230.51V91.2C231.57 89.0765 233.233 87.3128 235.29 86.13zM281.77 106.36H251.45C251.45 107.959 251.772 109.541 252.397 111.013 253.021 112.485 253.936 113.816 255.085 114.927 256.235 116.038 257.596 116.907 259.088 117.481 260.58 118.055 262.172 118.324 263.77 118.27 266.187 118.358 268.571 117.69 270.59 116.36 272.391 115.128 273.74 113.34 274.43 111.27H281.22C280.256 114.84 278.109 117.978 275.13 120.17 271.825 122.534 267.831 123.74 263.77 123.6 260.395 123.658 257.065 122.819 254.12 121.17 251.282 119.561 248.964 117.174 247.44 114.29 245.769 111.1 244.933 107.54 245.01 103.94 244.932 100.358 245.743 96.8121 247.37 93.62 248.858 90.7487 251.157 88.3773 253.98 86.8 256.981 85.1676 260.355 84.3439 263.77 84.41 267.108 84.3457 270.405 85.1595 273.33 86.77 276.034 88.2762 278.253 90.5201 279.73 93.24 281.258 96.102 282.032 99.306 281.98 102.55 281.976 103.823 281.906 105.094 281.77 106.36zM273.88 95.04C272.832 93.3419 271.314 91.9838 269.51 91.13 267.641 90.2233 265.587 89.7613 263.51 89.78 260.512 89.6989 257.598 90.7729 255.37 92.78 253.044 94.9933 251.668 98.0224 251.53 101.23H275.53C275.569 99.053 274.998 96.9086 273.88 95.04z"></path></svg><br></div>
<p>We're excited to announce that GO Feature Flag is now one of the first flag management systems to support the Open Feature Remote Evaluation Protocol (OFREP) <em>(currently in an experimental stage)</em>.</p>
<p>This is a significant step towards the adoption of Open Feature, a community-driven initiative aiming to standardize feature flag management across different platforms.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-ofrep">What is OFREP?<a href="https://gofeatureflag.org/blog/2024/03/13/ofrep#what-is-ofrep" class="hash-link" aria-label="Direct link to What is OFREP?" title="Direct link to What is OFREP?" translate="no">​</a></h2>
<p>OFREP is an API specification that allows you to connect your applications to any feature flag management system that supports the protocol using generic providers.  This means more flexibility and choice when it comes to managing your features.</p>
<p>For the full technical details, you can head over to the Open Feature Protocol documentation: Open Feature Protocol: <a href="https://github.com/open-feature/protocol/blob/main/README.md" target="_blank" rel="noopener noreferrer" class="">https://github.com/open-feature/protocol/blob/main/README.md</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-is-this-exciting">Why is this exciting?<a href="https://gofeatureflag.org/blog/2024/03/13/ofrep#why-is-this-exciting" class="hash-link" aria-label="Direct link to Why is this exciting?" title="Direct link to Why is this exciting?" translate="no">​</a></h2>
<p>While OFREP is still under development, its potential is significant. By integrating with OFREP, GO Feature Flag positions itself for:</p>
<ul>
<li class=""><strong>Platform Independence</strong>: Easily connect your applications to different feature flag systems without code changes (once OFREP is widely adopted).</li>
<li class=""><strong>Flexibility</strong>: Choose the feature flag management solution that best suits your needs (future benefit).</li>
<li class=""><strong>Standardization</strong>: Foster collaboration and interoperability within the developer community (future benefit).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="open-feature-providers-a-call-to-action">Open Feature Providers: A Call to Action!<a href="https://gofeatureflag.org/blog/2024/03/13/ofrep#open-feature-providers-a-call-to-action" class="hash-link" aria-label="Direct link to Open Feature Providers: A Call to Action!" title="Direct link to Open Feature Providers: A Call to Action!" translate="no">​</a></h2>
<p>While OFREP itself is in its <strong>experimental stages</strong>, Open Feature Providers are still in the Proof-of-Concept (POC) phase.
This is a fantastic opportunity for developers and organizations to contribute to building this ecosystem.</p>
<p>If you're passionate about feature flagging and want to be part of the Open Feature revolution, we encourage you to reach out and get involved!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lets-move-forward-together">Let's move forward, together!<a href="https://gofeatureflag.org/blog/2024/03/13/ofrep#lets-move-forward-together" class="hash-link" aria-label="Direct link to Let's move forward, together!" title="Direct link to Let's move forward, together!" translate="no">​</a></h2>
<p>We at GO Feature Flag believe that OFREP has the potential to pave the way for a more unified and efficient approach to feature management. By joining the Open Feature movement, we hope to empower developers and create a stronger feature flagging landscape for everyone.</p>
<p>Stay tuned for further updates as we continue to explore the possibilities of OFREP.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="want-to-test-it">Want to test it?<a href="https://gofeatureflag.org/blog/2024/03/13/ofrep#want-to-test-it" class="hash-link" aria-label="Direct link to Want to test it?" title="Direct link to Want to test it?" translate="no">​</a></h2>
<p>If you want to test it, go to our <a href="https://gofeatureflag.org/docs/experimental/ofrep" target="_blank" rel="noopener noreferrer" class="">documentation</a> and start using it today!</p>]]></content:encoded>
            <category>openfeature</category>
            <category>ofrep</category>
            <category>openfeature-remote-evaluation-protocol</category>
        </item>
        <item>
            <title><![CDATA[The Power of Rollbacks]]></title>
            <link>https://gofeatureflag.org/blog/2023/09/12/the-power-of-rollbacks</link>
            <guid>https://gofeatureflag.org/blog/2023/09/12/the-power-of-rollbacks</guid>
            <pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[🚨 Bug alert! No worries, feature flags have your back. Learn how to respond swiftly to issues without breaking a sweat]]></description>
            <content:encoded><![CDATA[<p>As software engineers, the process of releasing new features and updates can be both exhilarating and nerve-wracking.<br>
<!-- -->You've put in countless hours of hard work, and the moment has arrived to introduce your latest creation to the world.</p>
<p><strong>But what happens when things don't go as planned? What if a new feature causes unforeseen issues or negatively impacts your users?</strong></p>
<p>This is where feature flags come to the rescue, offering a safety net that allows you to roll back features immediately without waiting for a deployment. In this blog post, we'll explore why feature flags are an essential tool for securing your software releases.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-old-way-of-doing-rollbacks">The old way of doing rollbacks<a href="https://gofeatureflag.org/blog/2023/09/12/the-power-of-rollbacks#the-old-way-of-doing-rollbacks" class="hash-link" aria-label="Direct link to The old way of doing rollbacks" title="Direct link to The old way of doing rollbacks" translate="no">​</a></h2>
<p>If you are not using feature flags, your release process probably look like this:
<img decoding="async" loading="lazy" alt="classic-RELEASE-process.svg" src="https://gofeatureflag.org/assets/images/classic-RELEASE-process-93ca9ffb224ca4d80af34d3a0bebdf48.svg" width="1300" height="121" class="img_ev3q"></p>
<ol>
<li class="">You code your new feature.</li>
<li class="">Your CI/CD is in charge to put your code in production.</li>
<li class="">Your new feature is available to all your users.</li>
</ol>
<p><strong>BUT what happen if your releases needs to be rollback?</strong></p>
<p><img decoding="async" loading="lazy" alt="classic-ROLLBACK-process.svg" src="https://gofeatureflag.org/assets/images/classic-ROLLBACK-process-37197e7649d788413087123605879eb5.svg" width="1416" height="278" class="img_ev3q"></p>
<p>You will most likely use the same process and go with something like</p>
<ol>
<li class="">Revert your code and push the code.</li>
<li class="">Your CI/CD is in charge to put your code in production.</li>
<li class="">Your rollback is effective.</li>
</ol>
<p>Don't get me wrong this works, and you are probably doing it for years, but here are some problems your may occur while doing it:</p>
<ul>
<li class="">You have to identify what was changed and rollback the code to rollback the code associated to your feature.</li>
<li class="">If you are unlucky, your main branch has changed since your last deployment, so coming back to the previous state may require to rollback more than your feature, and it can impact other teams.</li>
<li class="">Depending on your deployment pipeline it can take minutes to hours to push your rollback in production.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="secure-your-release-using-feature-flags">Secure your release using feature flags<a href="https://gofeatureflag.org/blog/2023/09/12/the-power-of-rollbacks#secure-your-release-using-feature-flags" class="hash-link" aria-label="Direct link to Secure your release using feature flags" title="Direct link to Secure your release using feature flags" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-feature-flags-can-help-here">How feature flags can help here?<a href="https://gofeatureflag.org/blog/2023/09/12/the-power-of-rollbacks#how-feature-flags-can-help-here" class="hash-link" aria-label="Direct link to How feature flags can help here?" title="Direct link to How feature flags can help here?" translate="no">​</a></h3>
<p>The main things we try to achieve here is to unlink deploy and release.
Changing your release process with feature flags is important if you want to secure your way to release new feature in your application.</p>
<p>To achieve this we will follow these steps:</p>
<ol>
<li class="">Create a dedicated feature flag for this feature. This flag should be independent of other flags and only control the state of this new feature.</li>
<li class="">In your application's codebase, implement checks that will monitor the state of the flag. This can usually be done with the usage of a <code>boolean</code> flag. If the flag is set to "<strong><code>false</code></strong>" the code should disable the feature's functionality.</li>
<li class="">When deploying the feature to production, ensure that the flag is initially set to <code>false</code> position for 100% of your users.</li>
<li class="">When you are ready to release the new feature, set the feature to <code>true</code> position for a part of your users.</li>
<li class="">Monitor the feature's performance closely during its initial release.
<img decoding="async" loading="lazy" alt="ff-release-process.svg" src="https://gofeatureflag.org/assets/images/ff-release-process-0bdc49865378a4e7cd33300963a8ec06.svg" width="1554" height="129" class="img_ev3q"></li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="but-what-happen-if-your-releases-needs-to-be-rollback">BUT what happen if your releases needs to be rollback?<a href="https://gofeatureflag.org/blog/2023/09/12/the-power-of-rollbacks#but-what-happen-if-your-releases-needs-to-be-rollback" class="hash-link" aria-label="Direct link to BUT what happen if your releases needs to be rollback?" title="Direct link to BUT what happen if your releases needs to be rollback?" translate="no">​</a></h3>
<p>Now that we have a flag for our new feature it makes our life way easier to rollback this new feature, because as you guess we only have to put back the flag to 0% of our users and the feature will not be available anymore.</p>
<p><img decoding="async" loading="lazy" alt="ff-rollback-process.svg" src="data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDkzOC43NSAxMjEuMjUiIHdpZHRoPSI5MzguNzUiIGhlaWdodD0iMTIxLjI1Ij4KICA8IS0tIHN2Zy1zb3VyY2U6ZXhjYWxpZHJhdyAtLT4KICAKICA8ZGVmcz4KICAgIDxzdHlsZSBjbGFzcz0ic3R5bGUtZm9udHMiPgogICAgICBAZm9udC1mYWNlIHsKICAgICAgICBmb250LWZhbWlseTogIlZpcmdpbCI7CiAgICAgICAgc3JjOiB1cmwoImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vVmlyZ2lsLndvZmYyIik7CiAgICAgIH0KICAgICAgQGZvbnQtZmFjZSB7CiAgICAgICAgZm9udC1mYW1pbHk6ICJDYXNjYWRpYSI7CiAgICAgICAgc3JjOiB1cmwoImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vQ2FzY2FkaWEud29mZjIiKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIAogIDwvZGVmcz4KICA8ZyBzdHJva2UtbGluZWNhcD0icm91bmQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMyNi4yNSAxMS4yNSkgcm90YXRlKDAgMTM1IDQ4LjUpIj48cGF0aCBkPSJNMjQuNjggMC40MyBMMjQ3LjE4IDEuNDMgTDI1Ni4zMyAzLjM1IEwyNTkuMTggMi45MSBMMjY3LjcxIDExLjMxIEwyNzEuMzUgMTYuODggTDI2OS4xNyA3My40NSBMMjY2LjU2IDgyLjkgTDI2NS4yMyA4OC4wMiBMMjU4LjggOTQuMjggTDI0Ni45NSA5OC4xMiBMMjQuMzUgOTYuMDQgTDE1LjM2IDk1Ljc3IEw2LjU4IDkwLjY0IEwzLjY4IDg5LjAzIEwwLjA4IDc4LjA1IEwtMS41MyAxNi42OCBMNC4zNyA4Ljk5IEw3LjY5IDcuMzEgTDEyLjQ5IDEuNDYgTDIyLjczIC0wLjEzIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMCIgZmlsbD0iI2E1ZDhmZiI+PC9wYXRoPjxwYXRoIGQ9Ik0yNC4yNSAwIE0yNC4yNSAwIEM4MS4wMiAtMi42OSwgMTM2LjIxIC0wLjg5LCAyNDUuNzUgMCBNMjQuMjUgMCBDOTUuMzggMS40NiwgMTY2Ljc2IDAuNiwgMjQ1Ljc1IDAgTTI0NS43NSAwIEMyNjMuMTIgLTAuMjIsIDI3MS4xOCA4LjI2LCAyNzAgMjQuMjUgTTI0NS43NSAwIEMyNjIuNjEgMS44NSwgMjY4LjEzIDkuMDUsIDI3MCAyNC4yNSBNMjcwIDI0LjI1IEMyNzAuMzMgMzguMTEsIDI3MC40NyA1Mi44MywgMjcwIDcyLjc1IE0yNzAgMjQuMjUgQzI2OS4yNyAzNi4yNCwgMjY5LjY2IDQ2LjI1LCAyNzAgNzIuNzUgTTI3MCA3Mi43NSBDMjY5LjA2IDg5LjI4LCAyNTkuOTggOTcuMTEsIDI0NS43NSA5NyBNMjcwIDcyLjc1IEMyNjcuOTkgOTAuNDEsIDI2Mi4xNyA5NS4zNCwgMjQ1Ljc1IDk3IE0yNDUuNzUgOTcgQzE2OS4wNCA5Ni4yNSwgODguOTggOTYuNjgsIDI0LjI1IDk3IE0yNDUuNzUgOTcgQzE2OC44NyA5Ni4zMywgOTAuNzcgOTUuNjgsIDI0LjI1IDk3IE0yNC4yNSA5NyBDNy42NiA5OC45MywgLTAuODkgODkuOTEsIDAgNzIuNzUgTTI0LjI1IDk3IEM3LjI3IDk4LjU2LCAtMS4xIDg5Ljk0LCAwIDcyLjc1IE0wIDcyLjc1IEMtMS4yOSA2MC42NiwgMC41IDQ1LjEzLCAwIDI0LjI1IE0wIDcyLjc1IEMwLjk4IDU1LjYsIDAuMiAzOS4xNCwgMCAyNC4yNSBNMCAyNC4yNSBDMS41NSA5LjE2LCA4LjYyIDEuMDcsIDI0LjI1IDAgTTAgMjQuMjUgQzAuMjcgOS4wMSwgNi4zNyAtMS40MSwgMjQuMjUgMCIgc3Ryb2tlPSIjMjI4YmU2IiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiPjwvcGF0aD48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzkzLjgzMzMzNTg3NjQ2NDg0IDM2Ljc1KSByb3RhdGUoMCA2Ny40MTY2NjQxMjM1MzUxNiAyMykiPjx0ZXh0IHg9IjY3LjQxNjY2NDEyMzUzNTE2IiB5PSIwIiBmb250LWZhbWlseT0iSGVsdmV0aWNhLCBTZWdvZSBVSSBFbW9qaSIgZm9udC1zaXplPSIyMHB4IiBmaWxsPSIjMjI4YmU2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZTsiIGRpcmVjdGlvbj0ibHRyIiBkb21pbmFudC1iYXNlbGluZT0idGV4dC1iZWZvcmUtZWRnZSI+8J+RqOKAjfCfkrs8L3RleHQ+PHRleHQgeD0iNjcuNDE2NjY0MTIzNTM1MTYiIHk9IjIzIiBmb250LWZhbWlseT0iSGVsdmV0aWNhLCBTZWdvZSBVSSBFbW9qaSIgZm9udC1zaXplPSIyMHB4IiBmaWxsPSIjMjI4YmU2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZTsiIGRpcmVjdGlvbj0ibHRyIiBkb21pbmFudC1iYXNlbGluZT0idGV4dC1iZWZvcmUtZWRnZSI+VHVybiBmbGFnIHRvIDAlPC90ZXh0PjwvZz48ZyBzdHJva2UtbGluZWNhcD0icm91bmQiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI5Mi41MDAwMDAwMDAwMDA0NSA1OS42NTM1MDYwMzA1NjUwNCkgcm90YXRlKDAgMTMuNjgwMDI4Mzk3NTg5NTgxIC0wLjI0NzMwNTQ0ODc5MzQ0MDUyKSI+PHBhdGggZD0iTS0wLjgxIC0wLjMgQzMuODkgLTAuMzIsIDIzLjI4IDEuMTQsIDI4LjE3IDEgTTAuOTcgLTEuNTEgQzUuNTcgLTEuMzIsIDIzLjAyIC0wLjc0LCAyNy41NyAtMC41NCIgc3Ryb2tlPSIjMGM4NTk5IiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiPjwvcGF0aD48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjkyLjUwMDAwMDAwMDAwMDQ1IDU5LjY1MzUwNjAzMDU2NTA0KSByb3RhdGUoMCAxMy42ODAwMjgzOTc1ODk1ODEgLTAuMjQ3MzA1NDQ4NzkzNDQwNTIpIj48cGF0aCBkPSJNMjcuNDMgMC40MyBMMTUuMjkgNC4yIEwxNS45NyAtNy4wMyBMMjYuMDQgLTIuMjYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIiBmaWxsPSIjMGM4NTk5IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjwvcGF0aD48cGF0aCBkPSJNMjcuMjMgMC4yMyBDMjUuMSAyLjE2LCAxOC44OSAxLjk5LCAxNS4zOCAzLjQ3IE0yNi45OCAtMC4zIEMyNC40NCAxLjM2LCAyMC41NSAyLjEyLCAxNS40OSA0LjkgTTE1Ljc4IDQuNjIgQzE0Ljg0IC0wLjEsIDE0LjExIC0yLjIyLCAxNS4wNiAtNS44NyBNMTQuNDYgNC43NiBDMTQuODYgMC45NiwgMTUuNzIgLTMuNCwgMTQuOTEgLTYuOTIgTTE0LjcyIC03LjQ2IEMyMC4zNiAtNS43MSwgMjMuMDMgLTEuOTIsIDI3LjQyIDAuMjcgTTE0Ljc4IC02LjUzIEMxOS4xNCAtNS40MSwgMjIuNjIgLTIuODIsIDI3LjM0IC0wLjI3IE0yNy41NyAtMC41NCBDMjcuNTcgLTAuNTQsIDI3LjU3IC0wLjU0LCAyNy41NyAtMC41NCBNMjcuNTcgLTAuNTQgQzI3LjU3IC0wLjU0LCAyNy41NyAtMC41NCwgMjcuNTcgLTAuNTQiIHN0cm9rZT0iIzBjODU5OSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIj48L3BhdGg+PC9nPjwvZz48bWFzaz48L21hc2s+PGcgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2NTguNzUgMTApIHJvdGF0ZSgwIDEzNSA1MC41KSI+PHBhdGggZD0iTTI2Ljk4IC0xLjY5IEwyNDMuOTIgMC43IEwyNTMuODcgMS4xMiBMMjYyLjMzIDYuODEgTDI2Ni42OSAxNC44OSBMMjcwLjggMjAuNDUgTDI3MC4xIDc0Ljc5IEwyNzAuMTQgODcuMDggTDI2Ni45NyA5MC44NCBMMjYwLjQxIDk4Ljk1IEwyNDQuNDUgMTAwLjYyIEwyMy4zNCA5OS4xMSBMMTUuMTcgOTguOTQgTDExLjQ5IDk4LjcgTDIuNCA5MS4wOCBMLTEuMTIgODEuNTQgTC0wLjU0IDIwLjYgTDMuMDYgMTQuOTUgTDQuODQgNS45NyBMMTQuODEgMi4wNCBMMjYuNTcgLTAuOSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjAiIGZpbGw9IiNiMmYyYmIiPjwvcGF0aD48cGF0aCBkPSJNMjUuMjUgMCBNMjUuMjUgMCBDODAuMjggMi4yNywgMTM2LjE1IDIuMjUsIDI0NC43NSAwIE0yNS4yNSAwIEM5Mi4zMyAtMS4xNywgMTYwLjgyIC0yLjA5LCAyNDQuNzUgMCBNMjQ0Ljc1IDAgQzI2MC43MiAwLjYzLCAyNjkuMzIgOS4xOSwgMjcwIDI1LjI1IE0yNDQuNzUgMCBDMjYxLjAxIC0xLjYsIDI2OS42NiA3LjUsIDI3MCAyNS4yNSBNMjcwIDI1LjI1IEMyNjkuNyAzNi4xMSwgMjcwLjc3IDQ2LjkyLCAyNzAgNzUuNzUgTTI3MCAyNS4yNSBDMjY5LjY3IDM5Ljk1LCAyNzAuMDcgNTUuNDcsIDI3MCA3NS43NSBNMjcwIDc1Ljc1IEMyNjkuOCA5My45MiwgMjYwLjk0IDk5LjgsIDI0NC43NSAxMDEgTTI3MCA3NS43NSBDMjY5LjgzIDkzLjcsIDI2Mi4wMyAxMDAuMzEsIDI0NC43NSAxMDEgTTI0NC43NSAxMDEgQzE3MC40NSA5OS4xNywgMTAwLjggOTguNzcsIDI1LjI1IDEwMSBNMjQ0Ljc1IDEwMSBDMTY3LjYzIDEwMi42NywgOTEuMTcgMTAzLjA4LCAyNS4yNSAxMDEgTTI1LjI1IDEwMSBDNi41OSAxMDAuMTUsIDEuNTEgOTMuNTMsIDAgNzUuNzUgTTI1LjI1IDEwMSBDNy45NCAxMDEuODksIC0wLjk0IDkwLjM3LCAwIDc1Ljc1IE0wIDc1Ljc1IEMtMS4xOCA1OC4yMiwgMS40NSAzOC4xMiwgMCAyNS4yNSBNMCA3NS43NSBDLTAuOCA1Ny4yOSwgMC42NiA0MS4wMywgMCAyNS4yNSBNMCAyNS4yNSBDMC44NyA2LjYyLCA4LjU5IDAuNTksIDI1LjI1IDAgTTAgMjUuMjUgQy0wLjI5IDguMiwgNi45MSAwLjY0LCAyNS4yNSAwIiBzdHJva2U9IiMyZjllNDQiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSI+PC9wYXRoPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MDQuMjgzMzMyODI0NzA3IDI2KSByb3RhdGUoMCA4OS40NjY2NjcxNzUyOTI5NyAzNC41KSI+PHRleHQgeD0iODkuNDY2NjY3MTc1MjkyOTciIHk9IjAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EsIFNlZ29lIFVJIEVtb2ppIiBmb250LXNpemU9IjIwcHgiIGZpbGw9IiMyZjllNDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJ3aGl0ZS1zcGFjZTogcHJlOyIgZGlyZWN0aW9uPSJsdHIiIGRvbWluYW50LWJhc2VsaW5lPSJ0ZXh0LWJlZm9yZS1lZGdlIj7wn46JPC90ZXh0Pjx0ZXh0IHg9Ijg5LjQ2NjY2NzE3NTI5Mjk3IiB5PSIyMyIgZm9udC1mYW1pbHk9IkhlbHZldGljYSwgU2Vnb2UgVUkgRW1vamkiIGZvbnQtc2l6ZT0iMjBweCIgZmlsbD0iIzJmOWU0NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9IndoaXRlLXNwYWNlOiBwcmU7IiBkaXJlY3Rpb249Imx0ciIgZG9taW5hbnQtYmFzZWxpbmU9InRleHQtYmVmb3JlLWVkZ2UiPiBZb3UgYXJlIGJhY2sgdG8gPC90ZXh0Pjx0ZXh0IHg9Ijg5LjQ2NjY2NzE3NTI5Mjk3IiB5PSI0NiIgZm9udC1mYW1pbHk9IkhlbHZldGljYSwgU2Vnb2UgVUkgRW1vamkiIGZvbnQtc2l6ZT0iMjBweCIgZmlsbD0iIzJmOWU0NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9IndoaXRlLXNwYWNlOiBwcmU7IiBkaXJlY3Rpb249Imx0ciIgZG9taW5hbnQtYmFzZWxpbmU9InRleHQtYmVmb3JlLWVkZ2UiPnRoZSBwcmV2aW91cyB2ZXJzaW9uPC90ZXh0PjwvZz48ZyBzdHJva2UtbGluZWNhcD0icm91bmQiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYwOC43NSA2Ny44MDA3Njk2ODQ0MDc5KSByb3RhdGUoMCAxNy4zNDg4MDQzNzEwODMxMzMgMS4zMDE5MzAwOTc5OTU0MDk2KSI+PHBhdGggZD0iTS0xLjA0IDAuNDEgQzUuMDUgMC44NywgMjkuNzIgMi43OSwgMzUuNzQgMy4wMiBNMC42MiAtMC40MiBDNi42OSAtMC4zNCwgMjkuNTQgMC43MiwgMzUuMTYgMS4yNSIgc3Ryb2tlPSIjMGM4NTk5IiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiPjwvcGF0aD48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjA4Ljc1IDY3LjgwMDc2OTY4NDQwNzkpIHJvdGF0ZSgwIDE3LjM0ODgwNDM3MTA4MzEzMyAxLjMwMTkzMDA5Nzk5NTQwOTYpIj48cGF0aCBkPSJNMzQuNDYgMi42IEwyMC4yMyA3LjU3IEwyMS42MyAtNC4xNCBMMzMuMzQgMC40IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMCIgZmlsbD0iIzBjODU5OSIgZmlsbC1ydWxlPSJldmVub2RkIj48L3BhdGg+PHBhdGggZD0iTTM1LjY4IDIuMTUgQzMyLjc4IDIuNDYsIDI3Ljk3IDQuOTQsIDIxLjQgNy4wNyBNMzUuMDUgMS4xMSBDMzAuNDcgMi4yLCAyNy41NSA0LjI3LCAyMS43OSA3LjE1IE0yMS4xIDYuMDkgQzIyLjE5IDQuNTYsIDIyLjA2IC0wLjM4LCAyMS44IC01LjU4IE0yMC44OCA3LjEzIEMyMC45NiAyLjQxLCAyMi4wMiAtMS41NiwgMjIuMzkgLTUuOTEgTTIyLjY1IC01Ljk3IEMyNS40NiAtNC4xMiwgMzEuMjMgLTEuNiwgMzUuNzUgMC44OCBNMjEuNTIgLTUuMzYgQzI0LjgzIC00LjUyLCAyNy43MSAtMi40NSwgMzQuNDQgMS4yOSBNMzUuMTYgMS4yNSBDMzUuMTYgMS4yNSwgMzUuMTYgMS4yNSwgMzUuMTYgMS4yNSBNMzUuMTYgMS4yNSBDMzUuMTYgMS4yNSwgMzUuMTYgMS4yNSwgMzUuMTYgMS4yNSIgc3Ryb2tlPSIjMGM4NTk5IiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiPjwvcGF0aD48L2c+PC9nPjxtYXNrPjwvbWFzaz48ZyBzdHJva2UtbGluZWNhcD0icm91bmQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwIDEyLjI1KSByb3RhdGUoMCAxMzUgNDkuNSkiPjxwYXRoIGQ9Ik0yMy4wMiAwLjY5IEwyNDYuNDUgMS4xMiBMMjU2LjE4IDAuNTggTDI2NS41MyA2LjQ3IEwyNjcuMDQgOS4zNyBMMjY5Ljg5IDIwLjQ1IEwyNjkuNyA3My44NyBMMjY2LjU1IDgzLjE5IEwyNjcuNDggODguODUgTDI2MS45NiA5Ni43NyBMMjQ0LjEgOTguOTQgTDIzLjIzIDk4Ljg3IEwxMi45OSA5OC43MiBMNy42NiA5My41NiBMMi4wMSA4OC45OSBMMSA4MC41MSBMMS43IDE4LjA1IEwyLjU0IDExLjA3IEw4LjM4IDIuODkgTDI1Ljk2IC0wLjIyIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMCIgZmlsbD0iI2ZmZmZmZiI+PC9wYXRoPjxwYXRoIGQ9Ik0yNC43NSAwIE0yNC43NSAwIEMxMDUuMzEgLTEuOTgsIDE4My44MSAtMC41OCwgMjQ1LjI1IDAgTTI0Ljc1IDAgQzc2LjYgLTAuMjcsIDEyOC44MSAtMS4yMSwgMjQ1LjI1IDAgTTI0NS4yNSAwIEMyNjEuNDYgLTAuNzksIDI2OC42NyA5Ljg4LCAyNzAgMjQuNzUgTTI0NS4yNSAwIEMyNjEuMTIgLTAuODIsIDI2OC45MiA4LjY2LCAyNzAgMjQuNzUgTTI3MCAyNC43NSBDMjcxLjMyIDM1LjA0LCAyNjguNTggNDUuOTEsIDI3MCA3NC4yNSBNMjcwIDI0Ljc1IEMyNjkuNjMgMzUuODgsIDI2OS44OCA0OC43LCAyNzAgNzQuMjUgTTI3MCA3NC4yNSBDMjcwLjM5IDkwLjE1LCAyNjIuMzggOTguNzgsIDI0NS4yNSA5OSBNMjcwIDc0LjI1IEMyNjguMjMgODguNzcsIDI2MS4yNiAxMDEuMjIsIDI0NS4yNSA5OSBNMjQ1LjI1IDk5IEMxOTAuMDcgOTcuNSwgMTMzLjMxIDk3Ljk5LCAyNC43NSA5OSBNMjQ1LjI1IDk5IEMxNTkuNTcgOTguNiwgNzIuNCA5OC41MywgMjQuNzUgOTkgTTI0Ljc1IDk5IEM3LjQ0IDk3LjA4LCAxLjU2IDg5LjI5LCAwIDc0LjI1IE0yNC43NSA5OSBDOC4yNiA5Ny4yMiwgMS43OSA5MS45OSwgMCA3NC4yNSBNMCA3NC4yNSBDMC41NCA1Ni41OSwgLTEuNDkgNDMuMzQsIDAgMjQuNzUgTTAgNzQuMjUgQy0wLjEzIDU0Ljg1LCAtMC4zNCAzNC43NywgMCAyNC43NSBNMCAyNC43NSBDLTEuMzEgOC44LCA4LjY5IDEuODcsIDI0Ljc1IDAgTTAgMjQuNzUgQy0xLjg3IDEwLjAyLCA5LjkxIDAuNTMsIDI0Ljc1IDAiIHN0cm9rZT0iIzFlMWUxZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIj48L3BhdGg+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDk5LjQzMzMzNDM1MDU4NTk0IDM4Ljc1KSByb3RhdGUoMCA0NS41NjY2NjU2NDk0MTQwNiAyMykiPjx0ZXh0IHg9IjQ1LjU2NjY2NTY0OTQxNDA2IiB5PSIwIiBmb250LWZhbWlseT0iSGVsdmV0aWNhLCBTZWdvZSBVSSBFbW9qaSIgZm9udC1zaXplPSIyMHB4IiBmaWxsPSIjMWUxZTFlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZTsiIGRpcmVjdGlvbj0ibHRyIiBkb21pbmFudC1iYXNlbGluZT0idGV4dC1iZWZvcmUtZWRnZSI+8J+kpuKAjeKZgu+4jzwvdGV4dD48dGV4dCB4PSI0NS41NjY2NjU2NDk0MTQwNiIgeT0iMjMiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EsIFNlZ29lIFVJIEVtb2ppIiBmb250LXNpemU9IjIwcHgiIGZpbGw9IiMxZTFlMWUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJ3aGl0ZS1zcGFjZTogcHJlOyIgZGlyZWN0aW9uPSJsdHIiIGRvbWluYW50LWJhc2VsaW5lPSJ0ZXh0LWJlZm9yZS1lZGdlIj5CdWcgZm91bmQ8L3RleHQ+PC9nPjwvc3ZnPg==" width="939" height="121" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-do-this-with-go-feature-flag">How to do this with GO Feature Flag?<a href="https://gofeatureflag.org/blog/2023/09/12/the-power-of-rollbacks#how-to-do-this-with-go-feature-flag" class="hash-link" aria-label="Direct link to How to do this with GO Feature Flag?" title="Direct link to How to do this with GO Feature Flag?" translate="no">​</a></h3>
<ol>
<li class="">Create a new flag</li>
</ol>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">my-new-feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">variations</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">disabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">defaultRule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">percentage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token key atrule">disabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><br></span></code></pre></div></div>
<p><em>As you can see the flag <code>my-new-feature</code> will be off for all your users.</em></p>
<ol start="2">
<li class="">Wrap your new feature with the check of the flag</li>
</ol>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">    evalCtx </span><span class="token operator" style="color:rgb(212, 212, 212)">:=</span><span class="token plain"> of</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">NewEvaluationContext</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"d45e303a-38c2-11ed-a261-0242ac120002"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> client</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">BooleanValue</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"my-new-feature"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> evalCtx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token comment" style="color:rgb(106, 153, 85)">// code of my new feature ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br></span></code></pre></div></div>
<p><em>This example use the OpenFeature GO SDK syntax, but you can do it in any language.</em></p>
<ol start="3">
<li class="">Deploy your code in production.</li>
<li class="">When you are ready to release, edit your flag configuration file to add traffic.</li>
</ol>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">my-new-feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">variations</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">disabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">defaultRule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">percentage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token key atrule">disabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><br></span></code></pre></div></div>
<ol start="5">
<li class="">🚨 If you find a bug and you want to rollback, just edit the flag configuration file again and your feature will be rollback.</li>
</ol>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">my-new-feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">variations</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">disabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">defaultRule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">percentage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token key atrule">disabled</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100</span><br></span></code></pre></div></div>
<ol start="6">
<li class="">Your feature will be rollback immediately and the good part is that you don't even have deployed anything.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://gofeatureflag.org/blog/2023/09/12/the-power-of-rollbacks#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In the dynamic world of software engineering, ensuring the security of your releases is paramount.<br>
<!-- -->Feature flags offer a powerful mechanism for immediate rollbacks, reducing the risk associated with introducing new features.</p>
<p>By embracing feature flags, you can respond swiftly to issues, minimize downtime, and make informed decisions based on real-time data.<br>
<!-- -->The result is a more robust and user-friendly software release process that enhances both the development team's confidence and the end-users' experience.</p>
<p>So, don't wait—start incorporating feature flags into your development workflow today and unlock the potential for secure and successful releases.</p>]]></content:encoded>
            <category>rollback</category>
        </item>
        <item>
            <title><![CDATA[Add Feature Flags in your Node.JS application using GO Feature Flag and Open Feature SDK]]></title>
            <link>https://gofeatureflag.org/blog/2023/07/24/nodejs-tutorial</link>
            <guid>https://gofeatureflag.org/blog/2023/07/24/nodejs-tutorial</guid>
            <pubDate>Mon, 24 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[In this video, we'll walk you through the process of implementing feature flags in your Node js applications, allowing you to roll out new features gradually and control their visibility in real-time.]]></description>
            <content:encoded><![CDATA[<iframe width="100%" height="444" src="https://www.youtube.com/embed/ascFFZqjQAI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
<p>Welcome to this tutorial on using feature flags in Node js with GO Feature Flag and Open Feature SDKs.</p>
<p>In this video, we'll walk you through the process of implementing feature flags in your Node js applications, allowing you to roll out new features gradually and control their visibility in real-time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup-go-feature-flag">Setup GO Feature Flag<a href="https://gofeatureflag.org/blog/2023/07/24/nodejs-tutorial#setup-go-feature-flag" class="hash-link" aria-label="Direct link to Setup GO Feature Flag" title="Direct link to Setup GO Feature Flag" translate="no">​</a></h2>
<p>Before we proceed with the implementation, it's essential to set up GO Feature Flag to efficiently evaluate our flags.
To achieve this, we will create a new file called <code>goff-proxy.yaml</code> that will contain the configuration on how to retrieve our feature flags' configuration file.</p>
<p>In this file, we will first configure where to retrieve the flags and also a polling interval <em>(here 5000 milliseconds)</em>.<br>
<!-- -->It means that GO Feature Flag will read the file every 5 seconds to check if your configuration has changed.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">retriever</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> github  </span><span class="token comment" style="color:rgb(106, 153, 85)"># type of retriever we are using</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">repositorySlug</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> thomaspoignant/demo</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">goff  </span><span class="token comment" style="color:rgb(106, 153, 85)"># repository we are retrieving</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> flags.yaml  </span><span class="token comment" style="color:rgb(106, 153, 85)"># location of the file in the repository</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">pollingInterval</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5000</span><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)"># Time in milliseconds we wait before trying to check for changes</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-our-first-flag">Create our first flag<a href="https://gofeatureflag.org/blog/2023/07/24/nodejs-tutorial#create-our-first-flag" class="hash-link" aria-label="Direct link to Create our first flag" title="Direct link to Create our first flag" translate="no">​</a></h2>
<p>To create our flag we start by using the <a href="https://editor.gofeatureflag.org/" target="_blank" rel="noopener noreferrer" class="">GO Feature Flag editor</a>, for our test we will create a flag
named <code>my-new-feature</code> and it will use a type <code>boolean</code>.</p>
<p><img decoding="async" loading="lazy" alt="editor.png" src="https://gofeatureflag.org/assets/images/editor-78f4f0d3bcefb410bc09d5a338d0252c.png" width="1439" height="885" class="img_ev3q"></p>
<p>When it is ready you can  copy/paste the flag definition and commit it in GitHub.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="start-go-feature-flag">Start GO Feature Flag<a href="https://gofeatureflag.org/blog/2023/07/24/nodejs-tutorial#start-go-feature-flag" class="hash-link" aria-label="Direct link to Start GO Feature Flag" title="Direct link to Start GO Feature Flag" translate="no">​</a></h2>
<p>We will now start GO Feature Flag, for this we gonna use the docker image.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">docker run -p 1031:1031 -e RETRIEVER_TOKEN=$GITHUB_TOKEN -v $(pwd):/goff thomaspoignant/go-feature-flag</span><br></span></code></pre></div></div>
<p>With this command we launch GO Feature Flag on the port 1031 and with the configuration file we just created, you can also see that we provide a GitHub Token, this is to avoid being rate limited by the Github API.</p>
<p><img decoding="async" loading="lazy" alt="terminal.png" src="https://gofeatureflag.org/assets/images/terminal-0db207eb433127d3176598bee06805ce.png" width="1316" height="217" class="img_ev3q"></p>
<p>GO Feature Flag is now started, and we can see that our flag is loaded.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-nodejs-application-using-openfeature">Create Node.JS application using OpenFeature<a href="https://gofeatureflag.org/blog/2023/07/24/nodejs-tutorial#create-nodejs-application-using-openfeature" class="hash-link" aria-label="Direct link to Create Node.JS application using OpenFeature" title="Direct link to Create Node.JS application using OpenFeature" translate="no">​</a></h2>
<p>Now let's start to create our Node JS application.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> GoFeatureFlagProvider </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"@openfeature/go-feature-flag-provider"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"> EvaluationContext</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> OpenFeature </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"@openfeature/js-sdk"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">main</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// We start by creating an instance of the Go Feature Flag Provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// We are just setting the endpoint to connect to our instance of GO Feature Flag</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> provider </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProvider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">     endpoint</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'http://localhost:1031'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// We associate the provider to the SDK</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// It means that now when we call OpenFeature it will rely on GO Feature Flag as a backend.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  OpenFeature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">setProvider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">provider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// We need to ask for a client to evaluate the flags.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> client </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> OpenFeature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getClient</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// We create a context for our evaluation.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> ctx</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> EvaluationContext </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">     targetingKey</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'aae1cb41-c3cb-4753-a117-031ddc958f82'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// We evaluate the flag.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> myNewFeature </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">getBooleanValue</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"my-new-feature"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">myNewFeature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// the new feature is available</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// apply the old feature</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">main</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre></div></div>
<p>You are now ready to use GO Feature Flag in your application.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://gofeatureflag.org/blog/2023/07/24/nodejs-tutorial#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this tutorial we've seen how simple it is to use GO Feature Flag in your Node.JS application using the OpenFeature SDK.</p>
<p>I encourage you to read our documentation to see all the amazing possibility that you will have.</p>
<p>And please provide us <a href="mailto:contact@gofeatureflag.org" target="_blank" rel="noopener noreferrer" class="">feedbacks</a> on how we can make your experience even better.</p>]]></content:encoded>
            <category>openfeature</category>
            <category>nodeJS</category>
        </item>
        <item>
            <title><![CDATA[Enhancing Flag Configuration with Flag Metadata]]></title>
            <link>https://gofeatureflag.org/blog/2023/06/09/flag-metadata</link>
            <guid>https://gofeatureflag.org/blog/2023/06/09/flag-metadata</guid>
            <pubDate>Fri, 09 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Empowering developers to attach additional information directly to flag configurations for enhanced management and code efficiency.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="metadata" src="https://gofeatureflag.org/assets/images/3819075-0f37048ae26af73edc44747cd03d9eb7.png" width="667" height="667" class="img_ev3q"></p>
<p>In the ever-evolving world of software development, feature flag solutions have become instrumental in enabling continuous integration and deployment.
These solutions allow developers to toggle features on and off without deploying new code, providing flexibility and control over feature releases.</p>
<p>But sometimes you need to give context about your flag, is it linked to an issue? Do you need a precise description? ...
To respond to this, <strong>GO Feature Flag</strong> has recently introduced an exciting new feature: <strong>the ability to add metadata to each flag configuration</strong>.</p>
<p>With the version <code>v1.11.0</code> of GO Feature Flag, developers can now add valuable metadata to their flag configurations.
This metadata serves as additional information linked directly to each flag, allowing for a more comprehensive understanding of its purpose and context.
This metadata can include essential details such as issue tracker links, descriptions, or any other information that developers deem relevant.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-code-efficiency">Improved Code Efficiency<a href="https://gofeatureflag.org/blog/2023/06/09/flag-metadata#improved-code-efficiency" class="hash-link" aria-label="Direct link to Improved Code Efficiency" title="Direct link to Improved Code Efficiency" translate="no">​</a></h2>
<p>The inclusion of metadata in flag configurations brings substantial benefits in terms of code efficiency and reusability.
By using the <code>VariationDetails</code> functions, developers can easily retrieve the associated metadata when working with the flag.</p>
<p>This eliminates the need for additional queries or requests to obtain essential information related to a specific flag.
Developers can conveniently leverage this information within their code, leading to streamlined development processes and improved overall efficiency.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-add-the-metadata">How to add the metadata?<a href="https://gofeatureflag.org/blog/2023/06/09/flag-metadata#how-to-add-the-metadata" class="hash-link" aria-label="Direct link to How to add the metadata?" title="Direct link to How to add the metadata?" translate="no">​</a></h2>
<p>We have introduced a new field in the configuration of your flag</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">example_flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">variations</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">A</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">B</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">defaultRule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">variation</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> B</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> this is a super simple example feature flag</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">issue-link</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//jira.xxx/GOFF</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">01</span><br></span></code></pre></div></div>
<p>Now that you have this field available you can read the metadata in your <code>VariationDetails</code> when the evaluation is done.</p>
<p>GO Feature Flag relay-proxy also enable seamless access to the added metadata.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="open-feature-sdk-compatibility">Open Feature SDK Compatibility<a href="https://gofeatureflag.org/blog/2023/06/09/flag-metadata#open-feature-sdk-compatibility" class="hash-link" aria-label="Direct link to Open Feature SDK Compatibility" title="Direct link to Open Feature SDK Compatibility" translate="no">​</a></h2>
<p>To further enhance the usability and compatibility of GO Feature Flag, the new metadata feature aligns with the <strong>v0.6.0</strong> version of the Open Feature specification.
This update ensures that the metadata can be retrieved seamlessly using the Open Feature SDKs.</p>
<p>As soon as the SDKs will compatible with the metadata we will support it in the different GO Feature Flag providers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://gofeatureflag.org/blog/2023/06/09/flag-metadata#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The introduction of metadata support in GO Feature Flag marks a significant milestone in feature flag solutions.
Enabling developers to attach relevant information directly to their flag configurations opens up new possibilities for
enhanced flag management and streamlined development processes.
With the ability to retrieve metadata, developers can access essential information with ease.</p>
<p>The compatibility with the Open Feature SDK further solidifies the integration capabilities and ensures seamless utilization of metadata throughout the development cycle.
Embrace the power of metadata and unlock a new level of control and efficiency in your feature flag management with GO Feature Flag's latest update.</p>]]></content:encoded>
            <category>feature flag</category>
            <category>relay-proxy</category>
            <category>metadata</category>
        </item>
        <item>
            <title><![CDATA[Limiting Access to the relay proxy with API Keys]]></title>
            <link>https://gofeatureflag.org/blog/2023/04/12/relay_proxy_api_keys</link>
            <guid>https://gofeatureflag.org/blog/2023/04/12/relay_proxy_api_keys</guid>
            <pubDate>Wed, 12 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[New API Key feature in GO Feature Flag Relay Proxy 1.7.0 allows you to restrict access to the relay proxy to only known clients.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="security" src="https://gofeatureflag.org/assets/images/20945235-e99155028d107342da6c9cac92235b61.png" width="1000" height="682" class="img_ev3q"></p>
<p>GO Feature Flag Relay Proxy is a powerful tool that enables you to evaluate your feature flags without deploying code changes.
It allows you to test and roll out new features to your users gradually, and to monitor the performance of your code in real-time.</p>
<p>With the recent release of version <code>v1.7.0</code>, GO Feature Flag Relay Proxy introduces a new feature that enhances the
security of your feature flag evaluations.
This new feature allows you to control who can access your relay proxy by configuring API Keys.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="limiting-access-with-api-keys">Limiting Access with API Keys<a href="https://gofeatureflag.org/blog/2023/04/12/relay_proxy_api_keys#limiting-access-with-api-keys" class="hash-link" aria-label="Direct link to Limiting Access with API Keys" title="Direct link to Limiting Access with API Keys" translate="no">​</a></h2>
<p>With the release of GO Feature Flag Relay Proxy version <code>v1.7.0</code>, you can now limit access to the relay proxy by configuring API Keys.
This feature allows you to restrict access to only known clients, adding an additional layer of security to your feature flag evaluations.</p>
<p>To enable this feature, you need to add a list of API Keys to your configuration.
Only requests with these API Keys will be accepted. This means that any requests without a valid API Key will be rejected.</p>
<p>In your <strong>relay proxy</strong> configuration file it will look like this:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># List of authorized API keys.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Each request will need to provide one of authorized key inside a X-API-Key header with format` X-API-Key: &lt;api-key&gt;`.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># There will be no authorization when this config is not configured.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">apiKeys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> 6147795c</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">4438</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">44f1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">8ab2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">18cb3fa9591f </span><span class="token comment" style="color:rgb(106, 153, 85)"># apiKey for client 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> 3e3fb534</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">c8fd</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">42e9</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">8f2e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">c80276b1685c </span><span class="token comment" style="color:rgb(106, 153, 85)"># apiKey for client 2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> 6603f9f8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">2871</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">4149</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">81e8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">8a362a8ae266 </span><span class="token comment" style="color:rgb(106, 153, 85)"># apiKey for client 3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> 0fc30ffe</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">b9bc</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">4398</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">a9f1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">6f8b8486e8ce </span><span class="token comment" style="color:rgb(106, 153, 85)"># apiKey for client 4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> 500d222e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">2654</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">41a4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">bd31</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">e24a629cb78a </span><span class="token comment" style="color:rgb(106, 153, 85)"># apiKey for client 5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># ...</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-client-api-keys-with-openfeature-providers">Using Client API Keys with Openfeature Providers<a href="https://gofeatureflag.org/blog/2023/04/12/relay_proxy_api_keys#using-client-api-keys-with-openfeature-providers" class="hash-link" aria-label="Direct link to Using Client API Keys with Openfeature Providers" title="Direct link to Using Client API Keys with Openfeature Providers" translate="no">​</a></h2>
<p>If you are using Open Feature and our providers, we have updated them to handle the <code>apiKey</code> for you.
You can now specify your <code>apiKey</code> directly when you are initializing your provider. This will authenticate every request
to the relay proxy with this apiKey.</p>
<p>To use this feature, you need to specify the client API Key in your Open Feature provider initialization.
This can be done by adding the <code>apiKey</code> like this:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">GO</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">.NET</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">JAVA</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">JS / TS</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">provider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> err </span><span class="token operator" style="color:rgb(212, 212, 212)">:=</span><span class="token plain"> gofeatureflag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">NewProvider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">gofeatureflag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ProviderOptions</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">//...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  APIKey</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">   </span><span class="token string" style="color:rgb(206, 145, 120)">"6147795c-4438-44f1-8ab2-18cb3fa9591f"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-dotnet codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dotnet codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProviderOptions</span><span class="token plain"> options </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProviderOptions</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    ApiKey </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"6147795c-4438-44f1-8ab2-18cb3fa9591f"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProvider</span><span class="token plain"> authenticatedProvider </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProvider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">options</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProviderOptions</span><span class="token plain"> options </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProviderOptions</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">builder</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">apiKey</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"6147795c-4438-44f1-8ab2-18cb3fa9591f"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">endpoint</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">relayProxyAuthenticatedEndpoint</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">build</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProvider</span><span class="token plain"> provider </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProvider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">options</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">const</span><span class="token plain"> goFeatureFlagProvider </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">GoFeatureFlagProvider</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token literal-property property">apiKey</span><span class="token operator" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'6147795c-4438-44f1-8ab2-18cb3fa9591f'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://gofeatureflag.org/blog/2023/04/12/relay_proxy_api_keys#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The new feature of GO Feature Flag Relay Proxy 1.7.0 allows you to limit access to your relay proxy by configuring API Keys.</p>
<p>This adds an extra layer of security to your feature flag evaluations, ensuring that only known clients can access your relay proxy.</p>
<p>This feature is easy to configure and can be set up in a matter of minutes, giving you peace of mind knowing that your feature flags are secure.</p>]]></content:encoded>
            <category>feature flag</category>
            <category>relay-proxy</category>
        </item>
        <item>
            <title><![CDATA[Feature Flag best practice]]></title>
            <link>https://gofeatureflag.org/blog/feature-flag-best-practice</link>
            <guid>https://gofeatureflag.org/blog/feature-flag-best-practice</guid>
            <pubDate>Wed, 29 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover best practices for using feature flags in software development to improve agility and reduce risk.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Best Practice" src="https://gofeatureflag.org/assets/images/best-practice-59dcc6abbf70bbb5b96f80cca9ca7463.png" width="1320" height="680" class="img_ev3q"></p>
<p>Feature flags are a powerful tool for software development, allowing for more flexible and adaptable development processes.</p>
<p>However, to get the most out of feature flags, it's important to follow some best practices to ensure they are used effectively and efficiently.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-keep-flags-simple-and-scoped">🤷 Keep flags simple and scoped<a href="https://gofeatureflag.org/blog/feature-flag-best-practice#-keep-flags-simple-and-scoped" class="hash-link" aria-label="Direct link to 🤷 Keep flags simple and scoped" title="Direct link to 🤷 Keep flags simple and scoped" translate="no">​</a></h2>
<p>One of the most important best practices for feature flags is to keep them <strong>simple</strong> and <strong>scoped</strong>.</p>
<p>This means avoiding overly complex flags that do too much, and instead using small, targeted flags that can be easily managed and maintained.
Keeping flags simple and scoped helps to avoid confusion and reduces the risk of bugs or other issues.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-avoid-using-flags-as-a-long-term-solution">⏰ Avoid using flags as a long-term solution<a href="https://gofeatureflag.org/blog/feature-flag-best-practice#-avoid-using-flags-as-a-long-term-solution" class="hash-link" aria-label="Direct link to ⏰ Avoid using flags as a long-term solution" title="Direct link to ⏰ Avoid using flags as a long-term solution" translate="no">​</a></h2>
<p>Another important best practice is to avoid using feature flags as a long-term solution.</p>
<p>Feature flags should be used as a temporary measure to test new features or functionality, and then removed once the feature is fully tested and released.</p>
<p>Leaving flags in place for too long can lead to code bloat and confusion, making it harder to maintain and update your codebase.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-test-and-monitor-flags">🧪 Test and monitor flags<a href="https://gofeatureflag.org/blog/feature-flag-best-practice#-test-and-monitor-flags" class="hash-link" aria-label="Direct link to 🧪 Test and monitor flags" title="Direct link to 🧪 Test and monitor flags" translate="no">​</a></h2>
<p>Testing and monitoring flags is essential to ensuring they are working as intended.</p>
<p>This means setting up a testing environment where you can test flags in a controlled environment, as well as monitoring
the usage of flags in production to ensure they are not causing any issues.</p>
<p>By testing and monitoring flags, you can catch any issues early and avoid potential problems down the line.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-centralize-your-feature-flags-in-a-single-location">🎯 Centralize your feature flags in a single location<a href="https://gofeatureflag.org/blog/feature-flag-best-practice#-centralize-your-feature-flags-in-a-single-location" class="hash-link" aria-label="Direct link to 🎯 Centralize your feature flags in a single location" title="Direct link to 🎯 Centralize your feature flags in a single location" translate="no">​</a></h2>
<p>Centralize your feature flags in a single location, such as a feature flag management system <em>(GO Feature Flag is here to help you)</em>, to make it easier to
manage and track them across different applications and environments.</p>
<p>This can help avoid conflicts and inconsistencies, improve collaboration among teams, and reduce the risk of introducing bugs or unintended consequences.</p>
<p>It also helps to use the same flag for multiple applications and to be able to act on a distributed systems.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-document-flags-and-their-purpose">📝 Document flags and their purpose<a href="https://gofeatureflag.org/blog/feature-flag-best-practice#-document-flags-and-their-purpose" class="hash-link" aria-label="Direct link to 📝 Document flags and their purpose" title="Direct link to 📝 Document flags and their purpose" translate="no">​</a></h2>
<p>Documenting flags and their purpose is another best practice that can help to avoid confusion and ensure that everyone on the team is on the same page.</p>
<p>This means providing clear documentation for each flag, including its purpose, when it should be used, and any relevant notes or instructions.
This can help to prevent misunderstandings and ensure that flags are used correctly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-feature-flags-in-combination-with-other-tools">🔨Use feature flags in combination with other tools<a href="https://gofeatureflag.org/blog/feature-flag-best-practice#use-feature-flags-in-combination-with-other-tools" class="hash-link" aria-label="Direct link to 🔨Use feature flags in combination with other tools" title="Direct link to 🔨Use feature flags in combination with other tools" translate="no">​</a></h2>
<p>Finally, it's important to remember that feature flags are just one tool in your development toolbox.</p>
<p>To get the most out of feature flags, it's important to use them in combination with other tools, such as testing
frameworks, monitoring tools, CI/CD, and version control systems.</p>
<p>By using feature flags in combination with other tools, you can create a more comprehensive and effective development process.</p>
<hr>
<h1>Conclusion</h1>
<p>Following these best practices can help to ensure that your feature flags are used effectively and efficiently, allowing you to take full advantage of the benefits they offer.</p>
<p>By keeping flags simple and scoped, avoiding long-term use, testing and monitoring flags, documenting flags and their purpose, and using feature flags in combination with other tools, you can create a more flexible and adaptable development process that can help you to stay ahead of the competition.</p>
<center><a href="https://gofeatureflag.org/docs"><button class="pushy__btn pushy__btn--md pushy__btn--black"><p>Getting started with GO Feature Flag</p></button></a></center>]]></content:encoded>
            <category>feature flag</category>
            <category>best practice</category>
        </item>
        <item>
            <title><![CDATA[Multiple Configuration Flags for GO Feature Flag 🗄️]]></title>
            <link>https://gofeatureflag.org/blog/2023/03/17/multiple-config-file</link>
            <guid>https://gofeatureflag.org/blog/2023/03/17/multiple-config-file</guid>
            <pubDate>Fri, 17 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Are you tired of managing your feature flags with a single configuration flag?]]></description>
            <content:encoded><![CDATA[<p><strong>Are you tired of managing your feature flags with a single configuration flag?</strong></p>
<p>We've got good news for you <strong>GO feature flag</strong> now supports multiple configuration flags! Plus, we've added a new
feature that allows all files to be loaded in parallel, making it faster and more efficient.</p>
<p><img decoding="async" loading="lazy" alt="Retriever Flow" src="https://gofeatureflag.org/assets/images/retriever-flow-3504f9f4662e13fe654c119d1e042519.png" width="1034" height="241" class="img_ev3q"></p>
<p>Managing feature flags can be a challenging task, especially as your application grows and becomes more complex.
With multiple configuration flags, you can easily manage different feature flag configurations for different apps, user groups, or any other criteria that you need.
You can also use the same flags for multiple features, making it easier to maintain and update your code.</p>
<p>In addition to multiple configuration flags, we've also ensured that all files are downloaded in parallel.
This means that your feature flag configurations will be downloaded faster and more efficiently, improving the performance of your application.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-configure-multiple-flag-configuration-files">How to configure multiple flag configuration files<a href="https://gofeatureflag.org/blog/2023/03/17/multiple-config-file#how-to-configure-multiple-flag-configuration-files" class="hash-link" aria-label="Direct link to How to configure multiple flag configuration files" title="Direct link to How to configure multiple flag configuration files" translate="no">​</a></h2>
<p>To configure GO Feature Flag using multiple configuration flags files, simply create multiple files and store them in your favorite place.</p>
<p>Then, use the field <code>retrievers</code> in your configuration to configure all the access to your configuration flags.</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Relay Proxy Configuration</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">GO Module Configuration</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">retrievers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> http</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">url</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//raw.githubusercontent.com/thomaspoignant/go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag/main/examples/retriever_file/flags.yaml</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> file</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> /local/flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">file.yaml   </span><span class="token comment" style="color:rgb(106, 153, 85)"># Example of local path</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> http   </span><span class="token comment" style="color:rgb(106, 153, 85)"># you can have multiple time the same type of retriever</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">url</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//raw.githubusercontent.com/thomaspoignant/go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag/main/testdata/flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">config.yaml</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Before we were using the field retriever that allows only one retriever at the time</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># </span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># retriever:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">#   kind: http</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)">#   url: https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/examples/retriever_file/flags.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">err </span><span class="token operator" style="color:rgb(212, 212, 212)">:=</span><span class="token plain"> ffclient</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token function" style="color:rgb(220, 220, 170)">Init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">ffclient</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Config</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  Retrievers</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain">retriever</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Retriever</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">&amp;</span><span class="token plain">fileretriever</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Retriever</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      Path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"examples/retriever_multiple_config_files/flags.yaml"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token operator" style="color:rgb(212, 212, 212)">&amp;</span><span class="token plain">fileretriever</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Retriever</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      Path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"examples/retriever_multiple_config_files/flags2.yaml"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">//...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// Before we were using the field retriever that allows only one retriever at the time</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">//</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// Retriever: &amp;fileretriever.Retriever{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">//     Path: "examples/retriever_multiple_config_files/flags.yaml",</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)">// },</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-happen-if-2-files-have-the-same-flag">What happen if 2 files have the same flag?<a href="https://gofeatureflag.org/blog/2023/03/17/multiple-config-file#what-happen-if-2-files-have-the-same-flag" class="hash-link" aria-label="Direct link to What happen if 2 files have the same flag?" title="Direct link to What happen if 2 files have the same flag?" translate="no">​</a></h2>
<p>We are taking all the configuration files in the order of the <code>retrievers</code>. It means than the latest version of your flag will be the one from the latest file.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>example</div><div class="admonitionContent_BuS1"><p>We have 3 files that contains the flag <code>my-flag</code> and there are in this order in the retriever list :</p><ol>
<li class=""><code>flag-s3.yaml</code></li>
<li class=""><code>flag-configmap.yaml</code></li>
<li class=""><code>flag-github.yaml</code></li>
</ol><p>The flag configuration we will use to evaluate your flag will be the one that is in the file <code>flag-github.yaml</code></p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://gofeatureflag.org/blog/2023/03/17/multiple-config-file#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>We believe that multiple configuration flags and parallel downloads will make it easier for you to manage your feature flags and provide more flexibility to your development process.
We hope you find these features useful, and we look forward to hearing your feedback!</p>
<p>If you have any questions or comments, please don't hesitate to reach out to us. We're always happy to help!</p>]]></content:encoded>
            <category>GO Feature Flag</category>
            <category>Open Feature</category>
            <category>release</category>
            <category>retrievers</category>
        </item>
        <item>
            <title><![CDATA[Lint your feature flag config in you CI/CD pipelines ❌ ✅]]></title>
            <link>https://gofeatureflag.org/blog/2023/02/20/lint-your-feature-flags</link>
            <guid>https://gofeatureflag.org/blog/2023/02/20/lint-your-feature-flags</guid>
            <pubDate>Mon, 20 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[As GO Feature Flag continues to evolve, we're excited to announce a new feature that will make it easier for our users to manage their feature flags.]]></description>
            <content:encoded><![CDATA[<p>As <strong>GO Feature Flag</strong> continues to evolve, we're excited to announce a new feature that will make it easier for our users to manage their feature flags.
We are introducing the ability to <strong>lint your feature flag configuration</strong>, which will help ensure that your feature flag configurations are correct and <strong>error-free</strong>.</p>
<p><img decoding="async" loading="lazy" alt="command line output" src="https://gofeatureflag.org/assets/images/output-c9655f022f6bb296d6f3426a517b9148.png" width="1782" height="566" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introducing-go-feature-flag-lint">Introducing <code>go-feature-flag-lint</code><a href="https://gofeatureflag.org/blog/2023/02/20/lint-your-feature-flags#introducing-go-feature-flag-lint" class="hash-link" aria-label="Direct link to introducing-go-feature-flag-lint" title="Direct link to introducing-go-feature-flag-lint" translate="no">​</a></h2>
<p>Managing feature flags can be challenging, especially when it comes to configuring them correctly.
With our new command line <a class="" href="https://gofeatureflag.org/docs/tooling/linter"><code>go-feature-flag-lint</code></a>, we are providing a tool that helps you avoid making mistakes in your feature flag configuration.</p>
<p>To use the feature flag configuration linting feature, simply run the command line, it will analyze your configuration to ensure that it is free of errors.
If there are any issues, <code>go-feature-flag-lint</code> will provide you with a detailed report that identifies the problem to help you to fix it.</p>
<p>To get the maximum benefit from this feature, we recommend integrating it into your <strong>CI/CD pipelines</strong> to catch any issues before they make it to production.</p>
<p>The benefits of using our feature flag configuration linting feature, along with integrating it into your CI/CD pipelines, include:</p>
<ul>
<li class="">Ensuring that your feature flag configuration is correct, which will reduce the risk of issues and errors in your application.</li>
<li class="">Saving time and effort by automating the process of checking your feature flag configuration.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configure-your-cicd-pipelines">Configure your CI/CD pipelines<a href="https://gofeatureflag.org/blog/2023/02/20/lint-your-feature-flags#configure-your-cicd-pipelines" class="hash-link" aria-label="Direct link to Configure your CI/CD pipelines" title="Direct link to Configure your CI/CD pipelines" translate="no">​</a></h2>
<p>Integrating the feature flag configuration linting into your CI/CD pipeline is simple.
First, you will need to install the <code>go-feature-flag-lint</code> CLI tool, which can be used to run the linting process.
Next, you can add a new step to your pipeline that runs the <code>go-feature-flag-lint</code> CLI tool to lint your feature flag configuration file.</p>
<p>If there are any issues detected, the CLI tool will exit with a non-zero status code, which will cause your pipeline to fail.
By integrating the feature flag configuration linting into your CI/CD pipeline, you can catch any issues with your feature flag configuration before it is deployed to production, reducing the risk of errors and issues.</p>
<p>Here's some examples of how to integrate the feature flag configuration linting into a CI/CD pipeline for popular CI/CD services:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP github_WvKj tabs__item--active">Github Action</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP circleci_0_Jr">CircleCi</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP gitlab_mHAN">Gitlab</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"Build"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">push</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> main</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">pull_request</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">types</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"> opened</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> synchronize</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> reopened </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">Lint</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Checkout repository</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> actions/checkout@v3</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Download go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">lint</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> curl </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">L $(curl </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">s https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//api.github.com/repos/thomaspoignant/go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag/releases/latest </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> jq </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">r '.assets</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> select(.name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain">match("Linux_x86_64.tar.gz$")) </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> .browser_download_url' </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> grep 'go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">lint') </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">output release.tar.gz </span><span class="token important">&amp;&amp;</span><span class="token plain"> tar </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">zxvf release.tar.gz</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> Run go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">lint</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> ./go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">lint </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">input</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">format=yaml </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">input</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">file=flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">config.yaml </span><span class="token comment" style="color:rgb(106, 153, 85)"># please put the right file name</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2.1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">build</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">docker</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">     </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> cimg/base</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token number" style="color:rgb(181, 206, 168)">2022.05</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> checkout</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> curl </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">L $(curl </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">s https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//api.github.com/repos/thomaspoignant/go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag/releases/latest </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> jq </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">r '.assets</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> select(.name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain">match("Linux_x86_64.tar.gz$")) </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> .browser_download_url' </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> grep 'go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">lint') </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">output release.tar.gz </span><span class="token important">&amp;&amp;</span><span class="token plain"> tar </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">zxvf release.tar.gz</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> ./go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">lint </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">input</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">format=yaml </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">input</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">file=flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">config.yaml </span><span class="token comment" style="color:rgb(106, 153, 85)"># please put the right file name</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> ubuntu</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token key atrule">lint-job</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> build</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">before_script</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> apt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">get </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">qq update</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> apt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">get install </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">y jq curl</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> curl </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">L $(curl </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">s https</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">//api.github.com/repos/thomaspoignant/go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag/releases/latest </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> jq </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">r '.assets</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> select(.name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain">match("Linux_x86_64.tar.gz$")) </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> .browser_download_url' </span><span class="token punctuation" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> grep 'go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">lint') </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">output release.tar.gz </span><span class="token important">&amp;&amp;</span><span class="token plain"> tar </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">zxvf release.tar.gz</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> ./go</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">feature</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">lint </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">input</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">format=yaml </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">input</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">file=flag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">config.yaml </span><span class="token comment" style="color:rgb(106, 153, 85)"># please put the right file name</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://gofeatureflag.org/blog/2023/02/20/lint-your-feature-flags#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>We are thrilled to be introducing this new feature, which we believe will make a significant difference in how our users manage their feature flags. With the introduction of feature flag configuration linting, we are providing a tool that will make it easier for you to manage your feature flags and get the most out of GO Feature Flag.</p>
<p>If you have any questions about this feature or would like more information, please don't hesitate to get in touch with our support team. We're always here to help!</p>]]></content:encoded>
            <category>GO Feature Flag</category>
            <category>linter</category>
            <category>lint</category>
        </item>
    </channel>
</rss>