<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://openfga.dev/blog</id>
    <title>OpenFGA Blog</title>
    <updated>2026-07-21T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://openfga.dev/blog"/>
    <subtitle>OpenFGA Blog</subtitle>
    <icon>https://openfga.dev/img/openfga-icon.svg</icon>
    <entry>
        <title type="html"><![CDATA[OpenFGA's Move to Weighted Graph Resolution: What's Changing]]></title>
        <id>https://openfga.dev/blog/weighted-graph-upcoming-changes</id>
        <link href="https://openfga.dev/blog/weighted-graph-upcoming-changes"/>
        <updated>2026-07-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[OpenFGA is transitioning to a weighted graph-based resolution algorithm. Learn what's changing, why, and how to migrate your models.]]></summary>
        <content type="html"><![CDATA[<p>OpenFGA is continuing to roll out a <strong>weighted graph-based resolution algorithm</strong> across its core query endpoints — Check, BatchCheck, ListObjects, Expand, and ListUsers. ListObjects already runs on this updated algorithm, and Check is next. As a precaution, all core query endpoints currently fall back to the legacy algorithm for models that are incompatible with the weighted graph, but <strong>that fallback option will be removed soon</strong>. A date for the final changeover has not been set at this time.</p>
<p>This post explains which modeling and check patterns are incompatible with the weighted graph algorithm, and how to migrate before the fallback is removed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-a-weighted-graph">Why a Weighted Graph?<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#why-a-weighted-graph" class="hash-link" aria-label="Direct link to Why a Weighted Graph?" title="Direct link to Why a Weighted Graph?" translate="no">​</a></h2>
<p>The legacy Check algorithm resolves authorization queries by recursively traversing relation definitions at <em>request time</em>. While functional, this approach has limitations:</p>
<ul>
<li class=""><strong>Unpredictable resource usage</strong>: A shallow recursive graph can be more resource-intensive than a deep linear one, but the old algorithm used a fixed depth limit of 25 as its only complexity guard.</li>
<li class=""><strong>Non-deterministic error handling</strong>: Errors in one branch of a union could halt evaluation of other valid branches.</li>
</ul>
<p>The new approach shifts some resolution work earlier to <em>build time</em>: when a model is saved, the weighted graph is built and sub-graph weights are calculated for every relation. These weights reflect the relative complexity of traversing each part of the graph. At request time, the algorithm uses those pre-calculated weights to traverse the graph more efficiently, prioritizing lower-cost paths and managing load without arbitrary depth limits.</p>
<p>A key consequence of this shift is that <strong>if a model cannot be resolved, it will not be built</strong>. Problems that previously surfaced at query time are now caught at model validation time, before any requests are made.</p>
<p>The benefits, however, are:</p>
<ol>
<li class=""><strong>Better performance</strong> — resolution paths are informed by pre-calculated weights rather than discovered through live traversal.</li>
<li class=""><strong>Dynamic load management</strong> — datastore throttling, graph flattening, and context cancellation replace the fixed depth limit of 25.</li>
<li class=""><strong>Consistent short-circuit evaluation</strong> — failing fast on intersection/exclusion errors while being resilient to errors in union branches.</li>
<li class=""><strong>Determinism by construction</strong> — patterns that cannot be reliably resolved are rejected when the model is saved, not when a user makes a request.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-changing">What's Changing<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#whats-changing" class="hash-link" aria-label="Direct link to What's Changing" title="Direct link to What's Changing" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="model-build-errors">Model Build Errors<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#model-build-errors" class="hash-link" aria-label="Direct link to Model Build Errors" title="Direct link to Model Build Errors" translate="no">​</a></h3>
<p>The following model patterns are incompatible with the weighted graph algorithm. Today, requests using these models fall back to the legacy algorithm. When the fallback is eventually removed, these models will fail to build and return a model build error.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-missing-relation">1. Missing Relation<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#1-missing-relation" class="hash-link" aria-label="Direct link to 1. Missing Relation" title="Direct link to 1. Missing Relation" translate="no">​</a></h4>
<p>When a relation uses <code>relation from parent</code> and the <code>parent</code> relation allows multiple types, <strong>every type must define the referenced relation</strong>. Previously, a TTU was resolved at query time. If a relation didn’t exist, it would skip it and return no results (<code>allowed: false</code>). The new weighted graph builds the complete resolution graph at model build time. When the relation for a TTU doesn’t exist, there’s no node to connect, and the graph fails to build.</p>
<p><strong>Broken pattern:</strong></p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">organization</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">member</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">folder</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><span class="token comment" style="color:rgb(98, 114, 164)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    # ❌ Missing: member is not defined here</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">document</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">parent</span><span class="token plain">: </span><span class="token directly-assignable">[organization, folder]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: member </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> parent</span><span class="token comment" style="color:rgb(98, 114, 164)">  # but folder has no member, only viewer!</span><br></div></code></pre></div></div>
<p><strong>Why this fails:</strong> The weighted graph cannot build a graph with unreachable nodes. Since <code>member</code> does not exist on <code>folder</code>, when the <code>document.viewer</code> part of the graph attempts to reach all the <code>member</code> relations in <code>parent</code>, it fails and does not build.</p>
<p><strong>Fix 1:</strong> Add the missing relation to the type. If the type has an equivalent role, you can alias it:</p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">folder</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">member</span><span class="token plain">: viewer</span><span class="token comment" style="color:rgb(98, 114, 164)"> # alias of viewer</span><br></div></code></pre></div></div>
<blockquote>
<p><strong>Migration impact:</strong> No tuple changes required. The model change is additive: existing <code>viewer</code> tuples on <code>folder</code> objects continue to work, and the new <code>member</code> alias picks them up automatically. No check call changes needed either, since <code>member from parent</code> already resolves through the new <code>member</code> relation.</p>
</blockquote>
<p><strong>Fix 2:</strong> Alternatively, you can separate out the <code>parent</code> relation in <code>type document</code> into explicit per-type relations. This is more verbose but makes the intent explicit in the model.</p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">document</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">organization</span><span class="token plain">: </span><span class="token directly-assignable">[organization]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">folder</span><span class="token plain">: </span><span class="token directly-assignable">[folder]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: member </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> organization </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">or</span><span class="token plain"> viewer </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> folder</span><br></div></code></pre></div></div>
<blockquote>
<p><strong>Migration impact:</strong> This is a breaking tuple change. All existing <code>(folder:x, parent, document:y)</code> and <code>(organization:x, parent, document:y)</code> tuples must be deleted and rewritten as <code>(folder:x, folder, document:y)</code> and <code>(organization:x, organization, document:y)</code> respectively. Check calls that reference <code>parent</code> also need to be updated if your application uses that relation directly.</p>
</blockquote>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-tuple-cycles-in-intersection-or-exclusion">2. Tuple Cycles in Intersection or Exclusion<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#2-tuple-cycles-in-intersection-or-exclusion" class="hash-link" aria-label="Direct link to 2. Tuple Cycles in Intersection or Exclusion" title="Direct link to 2. Tuple Cycles in Intersection or Exclusion" translate="no">​</a></h4>
<p>Recursive relations (like nested group membership) that use <code>and</code> or <code>but not</code> create cycles that cannot be resolved deterministically.</p>
<p><strong>Broken pattern (AND):</strong></p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">group</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">approved</span><span class="token plain">: </span><span class="token directly-assignable">[user, group#member]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">member</span><span class="token plain">: </span><span class="token directly-assignable">[user, group#member]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">and</span><span class="token plain"> approved</span><span class="token comment" style="color:rgb(98, 114, 164)">  # ❌ Cycle with AND </span><br></div></code></pre></div></div>
<p><strong>Broken pattern (BUT NOT):</strong></p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">group</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">blocked</span><span class="token plain">: </span><span class="token directly-assignable">[user, group#member]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">member</span><span class="token plain">: </span><span class="token directly-assignable">[user, group#member]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">but not</span><span class="token plain"> blocked</span><span class="token comment" style="color:rgb(98, 114, 164)">  # ❌ Cycle with BUT NOT</span><br></div></code></pre></div></div>
<p><strong>Why this fails:</strong> To check if a user is a <code>member</code>, the system must resolve <code>group#member</code> (recursion) while simultaneously checking the <code>and</code>/<code>but not</code> condition, which itself depends on <code>member</code> resolution. This creates a circular dependency.</p>
<p><strong>Fix:</strong> Split into a "base" relation (allows recursion) and an "allowed" relation (applies the access gate):</p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">group</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">blocked</span><span class="token plain">: </span><span class="token directly-assignable">[user, group#member]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">member</span><span class="token plain">: </span><span class="token directly-assignable">[user, group#member]</span><span class="token comment" style="color:rgb(98, 114, 164)">              # Pure union recursion (allowed)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">allowed_member</span><span class="token plain">: member </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">but not</span><span class="token plain"> blocked</span><span class="token comment" style="color:rgb(98, 114, 164)">  # Exclusion at leaf level only</span><br></div></code></pre></div></div>
<blockquote>
<p><strong>Migration impact:</strong> Your existing <code>member</code> and <code>blocked</code> tuples stay exactly as they are; no tuple writes or deletes needed. The only change is in how your application calls Check: replace <code>check(user, "member", object)</code> with <code>check(user, "allowed_member", object)</code>. The new <code>allowed_member</code> relation reads from the same underlying data, just with the exclusion gate applied at the right level.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="check-request-errors">Check Request Errors<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#check-request-errors" class="hash-link" aria-label="Direct link to Check Request Errors" title="Direct link to Check Request Errors" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-userset-or-wildcard-requests-with-exclusion">3. Userset or Wildcard Requests with Exclusion<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#3-userset-or-wildcard-requests-with-exclusion" class="hash-link" aria-label="Direct link to 3. Userset or Wildcard Requests with Exclusion" title="Direct link to 3. Userset or Wildcard Requests with Exclusion" translate="no">​</a></h4>
<p>Sometimes you want to ask "Does this whole group have access?" (i.e. Userset <code>document:contract#owner</code>) or "Does everyone have access?" (i.e. Wildcard <code>user:*</code>) by passing the group reference or wildcard as the user in a check call. However, when the relation being checked uses <code>but not</code>, OpenFGA can't reliably answer that question. To be sure, it would need to check every individual in that group or every possible user to confirm none of them are excluded. Rather than guess, it will return an <strong>error</strong>.</p>
<p><strong>Userset example:</strong></p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">document</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">owner</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">member</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: </span><span class="token directly-assignable">[user, document#owner]</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">but not</span><span class="token plain"> member</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">check("document:contract#owner", "viewer", "document:report")</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ❌ Error — can't confirm every owner passes the exclusion</span><br></div></code></pre></div></div>
<p><strong>Wildcard example:</strong></p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">document</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">public</span><span class="token plain">: </span><span class="token directly-assignable">[user:*]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">blocked</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: public </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">but not</span><span class="token plain"> blocked</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">check("user:*", "viewer", "document:readme")</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ❌ Error — can't confirm no one in user:* is blocked</span><br></div></code></pre></div></div>
<p><strong>Fix:</strong> Check specific users individually instead:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">check("user:alice", "viewer", "document:report")  # ✓ — userset exclusion applied correctly per user</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">check("user:alice", "viewer", "document:readme")  # ✓ — wildcard exclusion applied correctly per user</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="check-resolution-changes">Check Resolution Changes<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#check-resolution-changes" class="hash-link" aria-label="Direct link to Check Resolution Changes" title="Direct link to Check Resolution Changes" translate="no">​</a></h3>
<p>These changes affect the same Check request pattern as #3: passing a group reference (e.g., userset <code>document:d1#viewer</code>) as the user. But in these scenarios, the request does not error; it completes, but may return a different answer than before. Since most applications check access for a specific user (<code>user:alice</code>), these scenarios are rare and most applications likely won't encounter them, but are still worth mentioning.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-userset-must-exist">4. Userset Must Exist<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#4-userset-must-exist" class="hash-link" aria-label="Direct link to 4. Userset Must Exist" title="Direct link to 4. Userset Must Exist" translate="no">​</a></h4>
<p>When you write a tuple granting a group access to something, the relation name used in the check must use the same as the tuple written. If your model defines two names as equivalent (i.e. aliases), that equivalence is not used when looking up group access. Only the exact name stored in the tuple is used.</p>
<p><strong>What was broken:</strong> The legacy algorithm would follow aliases in the model at resolution time by inferring they were equivalent and bridging the gap. The issue appears when subtly renaming a relation or restructuring an alias, silently changing what access checks returned.</p>
<p><strong>What is changing:</strong> The weighted graph resolves this by making stored tuples the authoritative source of truth. Alias traversal is no longer performed during a check — what's stored is what counts. This makes access decisions deterministic and independent of how relations happen to be defined at check time.</p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">document</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">reader</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">allowed</span><span class="token plain">: reader</span><span class="token comment" style="color:rgb(98, 114, 164)">        # allowed is an alias for reader</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: </span><span class="token directly-assignable">[user, document#allowed]</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Stored tuple: {document:source#allowed, viewer, document:target}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">check("document:source#allowed", "viewer", "document:target")</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ✓ Returns TRUE — matches what's stored</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">check("document:source#reader", "viewer", "document:target")</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ❌ Returns FALSE (when it previously would return TRUE) — the stored tuple only uses #allowed, not #reader.</span><br></div></code></pre></div></div>
<p><strong>Fix:</strong> Check using the exact relation name stored in the tuple. Alias relation traversal at Check time is no longer supported. Each relation is now treated as distinct.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">write(document:source#allowed, viewer, document:target)  # Already stored</span><br></div></code></pre></div></div>
<blockquote>
<p><strong>Migration impact:</strong></p>
<ol>
<li class="">First, check whether your model has any relations that accept a group reference as a value. Look for type lists that include <code>type:object#relation</code> (e.g., <code>define viewer: [user, document#allowed]</code>). If none of your relations accept group references, this change does not affect you.</li>
<li class="">If they do exist in your model, audit your check calls for any that pass a group reference as the user. Verify that the relation name in the check matches the relation name used in the model. If your application relied on alias inference (checking with <code>#reader</code> when <code>#allowed</code> was stored), update those calls to use the stored relation name.</li>
</ol>
</blockquote>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-self-referential-usersets">5. Self-Referential Usersets<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#5-self-referential-usersets" class="hash-link" aria-label="Direct link to 5. Self-Referential Usersets" title="Direct link to 5. Self-Referential Usersets" translate="no">​</a></h4>
<p><strong>What was broken:</strong> Previously, asking "do the viewers of document A have access to document A?" like <code>check("document:A#viewer", "viewer", "document:A")</code>, the legacy algorithm always evaluated <code>TRUE</code>, just because the relation existed in the model and the <code>user_id</code> and <code>object_id</code> in the query matched, not because an actual tuple granted that access.</p>
<p><strong>What is changing:</strong> The weighted graph requires both schema and data to grant access. A relation existing in the model is not sufficient evidence that a group has access to an object. Now it returns <code>FALSE</code> unless actual tuples exist to support the access decision. The weighted graph algorithm requires both schema and data, not schema alone.</p>
<p>This can be represented in three scenarios:</p>
<p><strong>Scenario A — Direct relation:</strong></p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">document</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">check("document:d1#viewer", "viewer", "document:d1")</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ❌ OLD: TRUE (just because the viewer relation exists on type document)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ✓  NEW: FALSE (since no tuple grants document:d1#viewer access to document:d1)</span><br></div></code></pre></div></div>
<p><strong>Scenario B — Computed relation:</strong></p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">document</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">editor</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">writer</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: editor </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">or</span><span class="token plain"> writer</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">check("document:d1#writer", "viewer", "document:d1")</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ❌ OLD: TRUE (model has viewer = editor or writer, and writer exists on type document)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ✓  NEW: FALSE (since no tuple grants document:d1#writer as a viewer of document:d1)</span><br></div></code></pre></div></div>
<p><strong>Scenario C — TTU (tuple-to-userset) relation:</strong></p>
<div class="language-dsl.openfga codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dsl.openfga codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">folder</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: </span><span class="token directly-assignable">[user]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">type</span><span class="token plain"> </span><span class="token type">document</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">relations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">parent</span><span class="token plain">: </span><span class="token directly-assignable">[folder]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token plain"> </span><span class="token relation">viewer</span><span class="token plain">: viewer </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> parent</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Given tuple: (folder:f2, parent, document:d1)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">check("folder:f2#viewer", "viewer", "document:d1")</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ❌ OLD: TRUE (the parent tuple exists and the schema connects them)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ✓  NEW: FALSE (since no explicit userset tuple stores folder:f2#viewer as viewer of document:d1)</span><br></div></code></pre></div></div>
<p><strong>Fix:</strong> Check individual users instead of self-referential group references:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">check("user:alice", "viewer", "document:d1")  # ✓ Checks actual data</span><br></div></code></pre></div></div>
<p>Or use ListUsers to discover who has the relation:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">listUsers("document:d1", "viewer") → [user:alice, user:bob]</span><br></div></code></pre></div></div>
<blockquote>
<p><strong>Migration impact:</strong> This self-referential userset pattern (asking whether a group defined on an object has access to that same object) is uncommon. Search your application for check calls  where the user field is a group reference and the object and the group reference share the same type and ID. If you find any, replace them with checks against specific users, or use ListUsers to find who actually has the relation.</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="timeline">Timeline<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#timeline" class="hash-link" aria-label="Direct link to Timeline" title="Direct link to Timeline" translate="no">​</a></h2>
<p><strong>Now</strong>:</p>
<ul>
<li class="">ListObjects runs on the weighted graph algorithm, with a fallback to the legacy algorithm for incompatible models.</li>
</ul>
<p><strong>Next</strong>:</p>
<ul>
<li class="">All core query endpoints will transition to the weighted graph algorithm as default, with a fallback available for a period of time.</li>
<li class="">A CLI command <code>fga model validate</code> to test if your model contains any issues and needs a migration will be coming soon.</li>
<li class="">We will be announcing a final deadline for migrating incompatible models, after which new OpenFGA versions will only support the weighted graph algorithm.</li>
</ul>
<p><strong>Later</strong>:</p>
<ul>
<li class="">Weighted graph algorithm is enforced for all core query endpoints, and the fallback algorithm is removed. Incompatible models will fail to build and requests will be rejected.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-help">Get Help<a href="https://openfga.dev/blog/weighted-graph-upcoming-changes#get-help" class="hash-link" aria-label="Direct link to Get Help" title="Direct link to Get Help" translate="no">​</a></h2>
<p>We want to hear from you. If these changes affect your deployment, reach out in our community channels and we'll help you migrate.</p>
<ul>
<li class=""><a href="https://openfga.dev/docs/community" target="_blank" rel="noopener noreferrer" class="">OpenFGA Community Slack</a></li>
<li class=""><a href="https://github.com/orgs/openfga/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a></li>
</ul>]]></content>
        <author>
            <name>Tyler Nix</name>
            <uri>https://github.com/tylernix</uri>
        </author>
        <category label="announcement" term="announcement"/>
        <category label="check" term="check"/>
        <category label="migration" term="migration"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[OpenFGA Accepted into CNCF Incubation 🎉]]></title>
        <id>https://openfga.dev/blog/incubation-announcement</id>
        <link href="https://openfga.dev/blog/incubation-announcement"/>
        <updated>2026-01-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[OpenFGA has been accepted into the Cloud Native Computing Foundation Incubation stage]]></summary>
        <content type="html"><![CDATA[<p>OpenFGA has been accepted as a CNCF <strong>Incubation</strong> project! The Cloud Native Computing Foundation (CNCF) Technical Oversight Committee (TOC) <a href="https://github.com/cncf/toc/issues/1287#issuecomment-3458442973" target="_blank" rel="noopener noreferrer" class="">voted to advance OpenFGA</a> from Sandbox to Incubation status, recognizing years of community work and real-world adoption. This places OpenFGA on the same maturity path as other CNCF projects like OpenTelemetry, Keycloak, Artifact Hub, and Backstage. Learn more at the CNCF joint announcement: <a href="https://www.cncf.io/blog/2025/11/11/openfga-becomes-a-cncf-incubating-project/" target="_blank" rel="noopener noreferrer" class="">OpenFGA becomes a CNCF Incubating Project</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-incubation-matters">Why Incubation Matters<a href="https://openfga.dev/blog/incubation-announcement#why-incubation-matters" class="hash-link" aria-label="Direct link to Why Incubation Matters" title="Direct link to Why Incubation Matters" translate="no">​</a></h2>
<p>Incubation signals that OpenFGA is production-ready with a healthy, diverse contributor base and real-world adoption at scale. For organizations evaluating OpenFGA, this milestone validates the project's maturity, governance, and long-term sustainability. The CNCF due diligence process assessed our security posture, documentation, community health, and adoption metrics—all meeting the standards required for broad enterprise use.</p>
<p>Learn more about <a href="https://www.cncf.io/projects/" target="_blank" rel="noopener noreferrer" class="">CNCF project stages</a> and review our <a href="https://github.com/cncf/toc/blob/main/projects/openfga/openfga-incubation-dd.md" target="_blank" rel="noopener noreferrer" class="">due diligence documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="technical-maturity-since-sandbox">Technical Maturity Since Sandbox<a href="https://openfga.dev/blog/incubation-announcement#technical-maturity-since-sandbox" class="hash-link" aria-label="Direct link to Technical Maturity Since Sandbox" title="Direct link to Technical Maturity Since Sandbox" translate="no">​</a></h2>
<p>Since joining CNCF as a Sandbox project in December 2022, OpenFGA has evolved significantly:</p>
<ul>
<li class=""><strong>Performance improvements</strong>: Substantial optimizations in query execution and caching, enabling sub-millisecond authorization checks at scale</li>
<li class=""><strong>Enhanced capabilities</strong>: Introduction of conditional tuples, modular models, and list users functionality to support more complex authorization scenarios</li>
<li class=""><strong>Expanded ecosystem</strong>: New SDKs, database adapters (including SQLite), Terraform provider, and IDE plugins</li>
<li class=""><strong>Production hardening</strong>: Improved observability, configuration options, and operational tooling based on real-world deployment feedback</li>
<li class=""><strong>Security posture</strong>: Comprehensive security assessments, vulnerability management processes, and regular dependency updates</li>
</ul>
<p>These improvements reflect our commitment to building a reliable, performant authorization system ready for enterprise production use.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-we-got-here">How We Got Here<a href="https://openfga.dev/blog/incubation-announcement#how-we-got-here" class="hash-link" aria-label="Direct link to How We Got Here" title="Direct link to How We Got Here" translate="no">​</a></h2>
<p>OpenFGA was open sourced in June 2022 and accepted as a CNCF Sandbox project in December 2022. Since then, we've seen incredible community support:</p>
<ul>
<li class="">Regular community meetings since 2022, available on <a href="https://www.youtube.com/@OpenFGA" target="_blank" rel="noopener noreferrer" class="">our YouTube channel</a>, along with more than 40 presentations from community members.</li>
<li class="">Contributions from the community—whether through questions, feedback, feature requests, PRs, bug reports, or guides and tools built around OpenFGA.</li>
<li class=""><a href="https://grafana.com/" target="_blank" rel="noopener noreferrer" class="">Grafana Labs</a> joined the maintainer team.</li>
<li class="">600+ contributors across the OpenFGA organization.</li>
<li class="">5,000+ GitHub stars across our repositories.</li>
<li class="">Presence at six consecutive KubeCon conferences (US and EU) with breakout sessions and a kiosk.</li>
<li class="">Production adopters include <a href="https://canonical.com/" target="_blank" rel="noopener noreferrer" class="">Canonical</a>, <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer" class="">Docker</a>, <a href="https://grafana.com/" target="_blank" rel="noopener noreferrer" class="">Grafana Labs</a>, <a href="https://read.ai/" target="_blank" rel="noopener noreferrer" class="">Read AI</a>, <a href="https://agicap.com/" target="_blank" rel="noopener noreferrer" class="">Agicap</a>, <a href="https://headspace.com/" target="_blank" rel="noopener noreferrer" class="">Headspace</a>, <a href="https://zuplo.com/" target="_blank" rel="noopener noreferrer" class="">Zuplo</a>, <a href="https://sourcegraph.com/" target="_blank" rel="noopener noreferrer" class="">Sourcegraph</a>, <a href="https://openobserve.ai/" target="_blank" rel="noopener noreferrer" class="">OpenObserve</a> and <a href="https://lakekeeper.io/" target="_blank" rel="noopener noreferrer" class="">LakeKeeper</a> along with <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md" target="_blank" rel="noopener noreferrer" class="">many others</a>.</li>
<li class="">Several adopters <a href="https://github.com/cncf/toc/tree/main/projects/openfga" target="_blank" rel="noopener noreferrer" class="">went on the record</a> in interviews with CNCF around their OpenFGA experience through the due diligence project.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thank-you">Thank You<a href="https://openfga.dev/blog/incubation-announcement#thank-you" class="hash-link" aria-label="Direct link to Thank You" title="Direct link to Thank You" translate="no">​</a></h2>
<p>OpenFGA's success is the result of contributions from many individuals and organizations. We want to highlight a few who made significant impact:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-contributors">Community Contributors<a href="https://openfga.dev/blog/incubation-announcement#community-contributors" class="hash-link" aria-label="Direct link to Community Contributors" title="Direct link to Community Contributors" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://www.linkedin.com/in/massi-gori" target="_blank" rel="noopener noreferrer" class="">Massimiliano Gori</a> believed in OpenFGA early and led integration across Canonical.</li>
<li class=""><a href="https://www.linkedin.com/in/paulinejamin" target="_blank" rel="noopener noreferrer" class="">Pauline Jamin</a> spearheaded adoption at <a href="https://agicap.com/" target="_blank" rel="noopener noreferrer" class="">Agicap</a> and presented their learnings at <a href="https://colocatedeventseu2024.sched.com/event/1YFhM/implementing-modern-cloud-native-authorization-using-openfga-andres-aguiar-okta-pauline-jamin-agicap" target="_blank" rel="noopener noreferrer" class="">KubeCon Europe 2024</a>.</li>
<li class=""><a href="https://github.com/Hawxy" target="_blank" rel="noopener noreferrer" class="">JT aka Hawxy</a> has been maintaining <a href="https://github.com/Hawxy/Fga.Net" target="_blank" rel="noopener noreferrer" class="">Fga.net</a> for years, and has been graciously providing us feedback since.</li>
<li class=""><a href="https://www.linkedin.com/in/andrew-powers-geo" target="_blank" rel="noopener noreferrer" class="">Andrew Powers</a> led <a href="https://www.read.ai/" target="_blank" rel="noopener noreferrer" class="">Read AI</a> implementation supporting collaboration and RAG for enterprise search.</li>
<li class=""><a href="https://www.linkedin.com/in/joguer" target="_blank" rel="noopener noreferrer" class="">Joao Guerreiro</a> led the implementation at <a href="https://grafana.com/" target="_blank" rel="noopener noreferrer" class="">Grafana</a> and presented their journey at <a href="https://kccnceu2025.sched.com/event/1txIJ/from-chaos-to-control-migrating-access-control-to-openfga-in-a-multi-tenant-world-jo-guerreiro-grafana-labs-poovamraj-thanganadar-thiagarajan-okta" target="_blank" rel="noopener noreferrer" class="">KubeCon Europe 2025</a>.</li>
<li class=""><a href="https://www.linkedin.com/in/dancech" target="_blank" rel="noopener noreferrer" class="">Dan Cech</a> from <a href="https://grafana.com/" target="_blank" rel="noopener noreferrer" class="">Grafana</a> contributed the SQLite adapter and serves as a maintainer.</li>
<li class=""><a href="https://www.linkedin.com/in/nathantotten" target="_blank" rel="noopener noreferrer" class="">Nathan Totten</a> led <a href="https://zuplo.com/" target="_blank" rel="noopener noreferrer" class="">Zuplo</a> integration, implementing <a href="https://zuplo.com/examples/openfga" target="_blank" rel="noopener noreferrer" class="">authorization at the edge</a> for the API gateway.</li>
<li class=""><a href="https://www.linkedin.com/in/gurleensethi" target="_blank" rel="noopener noreferrer" class="">Gurleen Sethi</a> led the implementation of organization and team management at <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer" class="">Docker, Inc</a>.</li>
<li class=""><a href="https://github.com/Siddhant-K-code" target="_blank" rel="noopener noreferrer" class="">Siddhant Khare</a> was the first independent contributor who onboarded as a maintainer of the OpenFGA project.</li>
<li class=""><a href="https://github.com/mauriceackel" target="_blank" rel="noopener noreferrer" class="">Maurice Ackel</a> donated the <a href="https://registry.terraform.io/providers/openfga/openfga/latest/docs" target="_blank" rel="noopener noreferrer" class="">OpenFGA Terraform Provider</a>, and joined as a maintainer.</li>
<li class=""><a href="https://www.linkedin.com/in/yann-d-19851110" target="_blank" rel="noopener noreferrer" class="">Yann D'Isanto</a> from <a href="https://agicap.com/" target="_blank" rel="noopener noreferrer" class="">Agicap</a>, who contributed the JetBrains IDE plugin.</li>
<li class=""><a href="https://www.linkedin.com/in/embesozzi" target="_blank" rel="noopener noreferrer" class="">Martin Besozzi</a> has been involved in the OpenFGA community from the beginning, driving integrations with <a href="https://www.keycloak.org/" target="_blank" rel="noopener noreferrer" class="">Keycloak</a>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cncf-support">CNCF Support<a href="https://openfga.dev/blog/incubation-announcement#cncf-support" class="hash-link" aria-label="Direct link to CNCF Support" title="Direct link to CNCF Support" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://www.linkedin.com/in/caniszczyk" target="_blank" rel="noopener noreferrer" class="">Chris Aniszczyk</a> helped guide the project donation and acceptance.</li>
<li class=""><a href="https://www.linkedin.com/in/knight1776" target="_blank" rel="noopener noreferrer" class="">Eddie Knight</a>, <a href="https://www.linkedin.com/in/evankanderson" target="_blank" rel="noopener noreferrer" class="">Evan Anderson</a>, <a href="https://www.linkedin.com/in/marina-moore-5a7242105" target="_blank" rel="noopener noreferrer" class="">Marina Moore</a> and <a href="https://github.com/JustinCappos" target="_blank" rel="noopener noreferrer" class="">Justin Cappos</a> from <a href="https://tag-security.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF TAG Security</a> supported the self-assessment and helped strengthen our posture for due diligence.</li>
<li class=""><a href="https://www.linkedin.com/in/karenaangell" target="_blank" rel="noopener noreferrer" class="">Karena Angell</a> and <a href="https://www.linkedin.com/in/faseela-k-42178528" target="_blank" rel="noopener noreferrer" class="">Faseela K</a> helped us navigate the due diligence process and carried much of the heavy lift to make it happen.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://openfga.dev/blog/incubation-announcement#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h2>
<p>Incubation is a milestone, not a destination. Our focus continues on:</p>
<ul>
<li class=""><strong>Performance</strong>: Optimizing latency and throughput for large-scale deployments</li>
<li class=""><strong>Developer Experience</strong>: Enhanced tooling, IDE plugins, and debugging capabilities</li>
<li class=""><strong>Integrations</strong>: Expanding our ecosystem with more identity providers, frameworks, and platforms</li>
<li class=""><strong>Documentation</strong>: Comprehensive guides, tutorials, and real-world implementation patterns</li>
<li class=""><strong>Governance</strong>: Strengthening our contributor pathways and security practices</li>
</ul>
<p>Our next milestone: CNCF Graduation. Track our progress on the <a href="https://github.com/orgs/openfga/projects/1" target="_blank" rel="noopener noreferrer" class="">project roadmap</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-involved">Get Involved<a href="https://openfga.dev/blog/incubation-announcement#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>This achievement belongs to every contributor, user, and community member who has supported OpenFGA. Thank you for being part of our journey!</p>
<p><strong>New to OpenFGA?</strong> Start here:</p>
<ul>
<li class=""><a href="https://openfga.dev/docs/getting-started" target="_blank" rel="noopener noreferrer" class="">Try OpenFGA locally</a> and explore the documentation</li>
<li class=""><a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">Join our CNCF Slack community</a> to ask questions and connect with users</li>
</ul>
<p><strong>Already using OpenFGA?</strong></p>
<ul>
<li class=""><a href="https://github.com/openfga/openfga" target="_blank" rel="noopener noreferrer" class="">Star the repo</a> and follow development</li>
<li class="">Share your adoption story—add your organization to our <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md" target="_blank" rel="noopener noreferrer" class="">ADOPTERS.md</a></li>
<li class="">Check out the <a href="https://github.com/orgs/openfga/projects/1" target="_blank" rel="noopener noreferrer" class="">roadmap</a> and contribute to upcoming features</li>
</ul>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <author>
            <name>Jakub Hertyk</name>
            <uri>https://github.com/curfew-marathon</uri>
        </author>
        <category label="announcement" term="announcement"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Ignore Duplicate Tuples On Write]]></title>
        <id>https://openfga.dev/blog/ignore-duplicate-writes-announcement</id>
        <link href="https://openfga.dev/blog/ignore-duplicate-writes-announcement"/>
        <updated>2025-10-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[OpenFGA now supports ignoring duplicate writes and missing deletes, making data imports much easier and more efficient.]]></summary>
        <content type="html"><![CDATA[<p>We've added two new optional parameters to the Write API endpoint to improve the experience of writing data to FGA. You can now gracefully <a href="https://openfga.dev/docs/getting-started/update-tuples#05-ignoring-duplicate-or-missing-tuples" target="_blank" rel="noopener noreferrer" class="">"ignore" duplicate writes and missing deletes</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem">The Problem<a href="https://openfga.dev/blog/ignore-duplicate-writes-announcement#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>When you're writing tuples to OpenFGA, it's almost inevitable that you'll try to write a relationship tuple that already exists (e.g., <code>user:anne</code> is already a <code>viewer</code> of <code>document:123</code>) or try to delete one that's already gone. In the past, OpenFGA would reject the entire Write request containing that single duplicate operation.</p>
<p>This forced developers to build complex error-handling and retry logic on the client-side, just to filter out the single problematic tuple and resend the rest of the batch. This adds latency and operational overhead.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-solution">The Solution<a href="https://openfga.dev/blog/ignore-duplicate-writes-announcement#the-solution" class="hash-link" aria-label="Direct link to The Solution" title="Direct link to The Solution" translate="no">​</a></h2>
<p>The Write API now accepts two new optional parameters to gracefully handle these use cases:</p>
<ul>
<li class="">
<p><strong><code>on_duplicate: "ignore"</code></strong>: When included in the <code>writes</code> section, this tells OpenFGA to simply skip any tuples that already exist instead of failing the request.</p>
</li>
<li class="">
<p><strong><code>on_missing: "ignore"</code></strong>: When included in the <code>deletes</code> section, this tells OpenFGA to skip any tuples that don't exist.</p>
</li>
</ul>
<p>Now, you can send large batches of writes and deletes without worrying about these common conditions breaking your import.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-it-in-action">See it in Action<a href="https://openfga.dev/blog/ignore-duplicate-writes-announcement#see-it-in-action" class="hash-link" aria-label="Direct link to See it in Action" title="Direct link to See it in Action" translate="no">​</a></h2>
<p>For writes:</p>
<div style="margin-top:-5px"><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">Node.js</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">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">Python</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">CLI</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">curl</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> options </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token literal-property property">authorizationModelId</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"01HVMMBCMGZNT3SED4Z17ECXCA"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token literal-property property">conflict</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">onDuplicateWrites</span><span class="token operator">:</span><span class="token plain"> </span><span class="token maybe-class-name">OnDuplicateWrites</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access maybe-class-name">Ignore</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> fgaClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token literal-property property">writes</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-property property">"user"</span><span class="token operator">:</span><span class="token string" style="color:rgb(255, 121, 198)">"user:anne"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token string-property property">"relation"</span><span class="token operator">:</span><span class="token string" style="color:rgb(255, 121, 198)">"viewer"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token string-property property">"object"</span><span class="token operator">:</span><span class="token string" style="color:rgb(255, 121, 198)">"document:roadmap"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">options </span><span class="token operator">:=</span><span class="token plain"> ClientWriteOptions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    AuthorizationModelId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> openfga</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">PtrString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"01HVMMBCMGZNT3SED4Z17ECXCA"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Conflict</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ClientWriteConflictOptions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        OnDuplicateWrites</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> CLIENT_WRITE_REQUEST_ON_DUPLICATE_WRITES_IGNORE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">body </span><span class="token operator">:=</span><span class="token plain"> ClientWriteRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Writes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">ClientTupleKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">             User</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user:anne"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">             Relation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"viewer"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">             Object</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"document:roadmap"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> fgaClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Background</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Execute</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// .. Handle error</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token boolean">_</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> data </span><span class="token comment" style="color:rgb(98, 114, 164)">// use the response</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-dotnet codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dotnet codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> options </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ClientWriteOptions</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    AuthorizationModelId </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"01HVMMBCMGZNT3SED4Z17ECXCA"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Conflict </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ConflictOptions</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        OnDuplicateWrites </span><span class="token operator">=</span><span class="token plain"> OnDuplicateWrites</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Ignore</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> body </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ClientWriteRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Writes </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">List</span><span class="token constructor-invocation class-name punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token constructor-invocation class-name">ClientTupleKey</span><span class="token constructor-invocation class-name punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">       </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  User </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user:anne"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  Relation </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"viewer"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                  Object </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"document:roadmap"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> response </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> fgaClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">options </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"authorization_model_id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"01HVMMBCMGZNT3SED4Z17ECXCA"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"conflict"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ConflictOptions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        on_duplicate_writes</span><span class="token operator">=</span><span class="token plain">ClientWriteRequestOnDuplicateWrites</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">IGNORE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">body </span><span class="token operator">=</span><span class="token plain"> ClientWriteRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        writes</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                ClientTuple</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    user</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"user:anne"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    relation</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"viewer"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token builtin" style="color:rgb(189, 147, 249)">object</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"document:roadmap"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">response </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> fga_client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> options </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">ClientWriteOptions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">authorizationModelId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"01HVMMBCMGZNT3SED4Z17ECXCA"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">onDuplicate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">WriteRequestWrites</span><span class="token class-name punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token class-name">OnDuplicateEnum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">IGNORE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> body </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">ClientWriteRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">writes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">List</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">of</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">ClientTupleKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"user:anne"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">relation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"viewer"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">_object</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"document:roadmap"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> response </span><span class="token operator">=</span><span class="token plain"> fgaClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">fga tuple </span><span class="token function" style="color:rgb(80, 250, 123)">write</span><span class="token plain"> --store-id</span><span class="token operator">=</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">${FGA_STORE_ID}</span><span class="token plain"> --model-id</span><span class="token operator">=</span><span class="token plain">01HVMMBCMGZNT3SED4Z17ECXCA user:anne viewer document:roadmap  --on-duplicate ignore</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$FGA_API_URL</span><span class="token plain">/stores/</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$FGA_STORE_ID</span><span class="token plain">/write </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization: Bearer </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$FGA_API_TOKEN</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Not needed if service does not require authorization</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"content-type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'{</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  "writes": {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "tuple_keys": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">      {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        "user": "user:anne",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        "relation": "viewer",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        "object": "document:roadmap"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">      }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    ],</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "on_duplicate": "ignore"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  "authorization_model_id": "01HVMMBCMGZNT3SED4Z17ECXCA"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">}'</span><br></div></code></pre></div></div></div></div></div></div>
<p>And deletes:</p>
<div style="margin-top:-5px"><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">Node.js</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">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">Python</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">CLI</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">curl</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> options </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token literal-property property">authorizationModelId</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"01HVMMBCMGZNT3SED4Z17ECXCA"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token literal-property property">conflict</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token literal-property property">onMissingDeletes</span><span class="token operator">:</span><span class="token plain"> </span><span class="token maybe-class-name">OnMissingDeletes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access maybe-class-name">Ignore</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> fgaClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token literal-property property">deletes</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token literal-property property">user</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'user:anne'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token literal-property property">relation</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'owner'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token literal-property property">object</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'document:roadmap'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">options </span><span class="token operator">:=</span><span class="token plain"> ClientWriteOptions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    AuthorizationModelId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> openfga</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">PtrString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"01HVMMBCMGZNT3SED4Z17ECXCA"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Conflict</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ClientWriteConflictOptions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        OnMissingDeletes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> CLIENT_WRITE_REQUEST_ON_MISSING_DELETES_IGNORE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">body </span><span class="token operator">:=</span><span class="token plain"> ClientWriteRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Deletes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">ClientTupleKeyWithoutCondition</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">             User</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user:anne"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">             Relation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"owner"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">             Object</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"document:roadmap"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> err </span><span class="token operator">:=</span><span class="token plain"> fgaClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Background</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Execute</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> err </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token boolean">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// .. Handle error</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token boolean">_</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> data </span><span class="token comment" style="color:rgb(98, 114, 164)">// use the response</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-dotnet codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dotnet codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> options </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ClientWriteOptions</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    AuthorizationModelId </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"01HVMMBCMGZNT3SED4Z17ECXCA"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Conflict </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ConflictOptions</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        OnMissingDeletes </span><span class="token operator">=</span><span class="token plain"> OnMissingDeletes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Ignore</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> body </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ClientWriteRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Deletes </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">List</span><span class="token constructor-invocation class-name punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token constructor-invocation class-name">ClientTupleKeyWithoutCondition</span><span class="token constructor-invocation class-name punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> User </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user:anne"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Relation </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"owner"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Object </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"document:roadmap"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token class-name keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> response </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> fgaClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">Write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">options </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"authorization_model_id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"01HVMMBCMGZNT3SED4Z17ECXCA"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"conflict"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ConflictOptions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        on_missing_deletes</span><span class="token operator">=</span><span class="token plain">ClientWriteRequestOnMissingDeletes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">IGNORE</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">body </span><span class="token operator">=</span><span class="token plain"> ClientWriteRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        deletes</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                ClientTuple</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    user</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"user:anne"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    relation</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"owner"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token builtin" style="color:rgb(189, 147, 249)">object</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"document:roadmap"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">response </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> fga_client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> options </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">ClientWriteOptions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">authorizationModelId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"01HVMMBCMGZNT3SED4Z17ECXCA"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">onMissing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">WriteRequestDeletes</span><span class="token class-name punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token class-name">OnMissingEnum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">IGNORE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> body </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">ClientWriteRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">deletes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">List</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">of</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">ClientTupleKey</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"user:anne"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">relation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"owner"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">_object</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"document:roadmap"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> response </span><span class="token operator">=</span><span class="token plain"> fgaClient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">write</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> options</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">fga tuple delete --store-id</span><span class="token operator">=</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">${FGA_STORE_ID}</span><span class="token plain"> user:anne owner document:roadmap  --on-missing ignore</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$FGA_API_URL</span><span class="token plain">/stores/</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$FGA_STORE_ID</span><span class="token plain">/write </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization: Bearer </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$FGA_API_TOKEN</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Not needed if service does not require authorization</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"content-type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'{</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  "deletes": {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "tuple_keys": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">      {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        "user": "user:anne",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        "relation": "owner",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        "object": "document:roadmap"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">      }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    ],</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "on_missing": "ignore"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  "authorization_model_id": "01HVMMBCMGZNT3SED4Z17ECXCA"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">}'</span><br></div></code></pre></div></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started">Get Started<a href="https://openfga.dev/blog/ignore-duplicate-writes-announcement#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h2>
<p>This is supported in the latest versions of the OpenFGA API, SDKs and CLI. Try it out and let us know what you think!</p>
<ul>
<li class=""><a href="https://openfga.dev/api/service#/Relationship%20Tuples/Write" target="_blank" rel="noopener noreferrer" class="">API Docs</a></li>
<li class=""><a href="https://github.com/openfga/js-sdk?tab=readme-ov-file#conflict-options-for-write-operations" target="_blank" rel="noopener noreferrer" class="">JavaScript SDK</a></li>
<li class=""><a href="https://github.com/openfga/go-sdk?tab=readme-ov-file#conflict-options-for-write-operations" target="_blank" rel="noopener noreferrer" class="">Go SDK</a></li>
<li class=""><a href="https://github.com/openfga/dotnet-sdk?tab=readme-ov-file#conflict-options-for-write-operations" target="_blank" rel="noopener noreferrer" class="">.NET SDK</a></li>
<li class=""><a href="https://github.com/openfga/python-sdk?tab=readme-ov-file#conflict-options-for-write-operations" target="_blank" rel="noopener noreferrer" class="">Python SDK</a></li>
<li class=""><a href="https://github.com/openfga/java-sdk?tab=readme-ov-file#conflict-options-for-write-operations" target="_blank" rel="noopener noreferrer" class="">Java SDK</a></li>
</ul>
<p>Special thanks to <a href="https://github.com/phamhieu" target="_blank" rel="noopener noreferrer" class="">@phamhieu</a> for his <a href="https://github.com/openfga/js-sdk/pull/276" target="_blank" rel="noopener noreferrer" class="">contribution</a> to the JavaScript SDK! 🙏</p>
<p>Learn more about <a href="https://openfga.dev/docs/getting-started/update-tuples#05-ignoring-duplicate-or-missing-tuples" target="_blank" rel="noopener noreferrer" class="">Writing Tuples in OpenFGA</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-want-your-feedback">We want your feedback!<a href="https://openfga.dev/blog/ignore-duplicate-writes-announcement#we-want-your-feedback" class="hash-link" aria-label="Direct link to We want your feedback!" title="Direct link to We want your feedback!" translate="no">​</a></h2>
<p>Please reach out through our <a href="https://openfga.dev/docs/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> with any questions or feedback.</p>]]></content>
        <author>
            <name>Tyler Nix</name>
            <uri>https://github.com/tylernix</uri>
        </author>
        <category label="openfga" term="openfga"/>
        <category label="features" term="features"/>
        <category label="api" term="api"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - October 2025]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2025-10</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2025-10"/>
        <updated>2025-10-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to OpenFGA's Fine-Grained News, October edition!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-openfga-to-cncf-incubation">🎉 OpenFGA to CNCF Incubation!<a href="https://openfga.dev/blog/fine-grained-news-2025-10#-openfga-to-cncf-incubation" class="hash-link" aria-label="Direct link to 🎉 OpenFGA to CNCF Incubation!" title="Direct link to 🎉 OpenFGA to CNCF Incubation!" translate="no">​</a></h2>
<p>The CNCF completed the Due Diligence process to approve moving OpenFGA to the CNCF Incubation stage, and it's now <a href="https://github.com/cncf/toc/pull/1923" target="_blank" rel="noopener noreferrer" class="">open for comments</a>. Support emojis are appreciated! 🚀 ❤️!</p>
<p>Thanks to Grafana, Docker, Read.AI, Agicap, and Zuplo for taking the time to talk to the CNCF about their experience!</p>
<p>Moving to the Incubation maturity level is great news for the OpenFGA community and we are super excited about it!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-what-weve-shipped">🚀 What We've Shipped<a href="https://openfga.dev/blog/fine-grained-news-2025-10#-what-weve-shipped" class="hash-link" aria-label="Direct link to 🚀 What We've Shipped" title="Direct link to 🚀 What We've Shipped" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga-v1100-performance-improvements">OpenFGA v1.10.0 Performance Improvements<a href="https://openfga.dev/blog/fine-grained-news-2025-10#openfga-v1100-performance-improvements" class="hash-link" aria-label="Direct link to OpenFGA v1.10.0 Performance Improvements" title="Direct link to OpenFGA v1.10.0 Performance Improvements" translate="no">​</a></h3>
<p>Starting with <a href="https://github.com/openfga/openfga/releases/tag/v1.10.0" target="_blank" rel="noopener noreferrer" class="">OpenFGA v1.10.0</a>, we've included a query planner that selects resolution strategies based on runtime statistics, behind the <code>enable-check-optimization</code> flag. The planner can pick different strategies per-relation, and we've seen significant improvements in performance for some models/relations. In-depth engineering blog post coming soon!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="write-endpoint-enhancements">Write Endpoint Enhancements<a href="https://openfga.dev/blog/fine-grained-news-2025-10#write-endpoint-enhancements" class="hash-link" aria-label="Direct link to Write Endpoint Enhancements" title="Direct link to Write Endpoint Enhancements" translate="no">​</a></h3>
<p>In case you missed it, we also included in <a href="https://github.com/openfga/openfga/releases/tag/v1.10.0" target="_blank" rel="noopener noreferrer" class="">v1.10.0</a> two new (optional) parameters to the <a href="https://openfga.dev/api/service#/Relationship%20Tuples/Write" target="_blank" rel="noopener noreferrer" class=""><code>/write</code></a> endpoint that allow specifying the expected behavior when duplicated tuples are written or non-existing tuples are deleted. The Go, Java, and .NET SDK already support them, and we'll be completing support for Python, and Javascript in the next few weeks.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdk--tooling-updates">SDK &amp; Tooling Updates<a href="https://openfga.dev/blog/fine-grained-news-2025-10#sdk--tooling-updates" class="hash-link" aria-label="Direct link to SDK &amp; Tooling Updates" title="Direct link to SDK &amp; Tooling Updates" translate="no">​</a></h3>
<ul>
<li class="">
<p><a href="https://github.com/openfga/go-sdk/releases/tag/v0.7.3" target="_blank" rel="noopener noreferrer" class="">Go SDK 0.7.3</a> adds support for specifying <a href="https://github.com/openfga/go-sdk#custom-headers" target="_blank" rel="noopener noreferrer" class="">custom headers per request</a>, and for specifying <a href="https://github.com/openfga/go-sdk/blob/v0.7.3/README.md#conflict-options-for-write-operations" target="_blank" rel="noopener noreferrer" class="">conflict resolution options for Write operations</a>. Also, <a href="https://github.com/openfga/go-sdk/releases/tag/v0.7.2" target="_blank" rel="noopener noreferrer" class="">v0.7.2</a> brings fixes to retry handling and other improvements, including allowing filtering stores by name and contextual tuples in Expand requests. Thanks to <a href="https://github.com/Oscmage" target="_blank" rel="noopener noreferrer" class="">Oscar Evertsson</a> and <a href="https://github.com/Tennyx" target="_blank" rel="noopener noreferrer" class="">Cale Switzer
</a> for their contributions!</p>
</li>
<li class="">
<p><a href="https://github.com/openfga/dotnet-sdk/releases/tag/v0.8.0" target="_blank" rel="noopener noreferrer" class="">.NET SDK 0.8.0</a> adds support for specifying <a href="https://github.com/openfga/dotnet-sdk?tab=readme-ov-file#per-request-headers" target="_blank" rel="noopener noreferrer" class="">custom headers per request</a>, and for specifying <a href="https://github.com/openfga/dotnet-sdk?tab=readme-ov-file#conflict-options-for-write-operations" target="_blank" rel="noopener noreferrer" class="">conflict resolution options for Write operations</a>. It builds on <a href="https://github.com/openfga/dotnet-sdk/releases/tag/v0.7.0" target="_blank" rel="noopener noreferrer" class="">.NET SDK 0.7.0</a> that added support for .NET Standard 2.0, .NET 8 and .NET 9.</p>
</li>
<li class="">
<p><a href="https://github.com/openfga/java-sdk/releases/tag/v0.9.2" target="_blank" rel="noopener noreferrer" class="">Java SDK 0.9.2</a> adds support for specifying <a href="https://github.com/openfga/java-sdk?tab=readme-ov-file#conflict-options-for-write-operations" target="_blank" rel="noopener noreferrer" class="">conflict resolution options for Write operations</a>. It builds on <a href="https://github.com/openfga/java-sdk/releases/tag/v0.9.1" target="_blank" rel="noopener noreferrer" class="">Java SDK 0.9.1</a> which fixes issues when overriding request headers. Thanks to <a href="https://github.com/Oscmage" target="_blank" rel="noopener noreferrer" class="">Oscar Evertsson</a> and <a href="https://github.com/varkart" target="_blank" rel="noopener noreferrer" class="">Vakart</a> for their contributions!</p>
</li>
<li class="">
<p><a href="https://github.com/openfga/python-sdk/releases/tag/v0.9.7" target="_blank" rel="noopener noreferrer" class="">Python SDK 0.9.7</a> adds support for specifying <a href="https://github.com/openfga/python-sdk?tab=readme-ov-file#custom-headers" target="_blank" rel="noopener noreferrer" class="">custom headers per request</a>, and <a href="https://github.com/openfga/python-sdk/releases/tag/v0.9.6" target="_blank" rel="noopener noreferrer" class="">v0.9.6</a> also includes some enhancements.</p>
</li>
<li class="">
<p><a href="https://github.com/openfga/cli/releases/tag/v0.7.5" target="_blank" rel="noopener noreferrer" class="">CLI 0.7.5</a> simplifies retrieving all tuples and ignores duplicate writes when importing tuples from a file.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-community-spotlight">🌟 Community Spotlight<a href="https://openfga.dev/blog/fine-grained-news-2025-10#-community-spotlight" class="hash-link" aria-label="Direct link to 🌟 Community Spotlight" title="Direct link to 🌟 Community Spotlight" translate="no">​</a></h2>
<p><a href="https://read.ai/" target="_blank" rel="noopener noreferrer" class="">Read.AI</a>, one of the earliest OpenFGA adopters, <a href="https://www.linkedin.com/posts/readinc_huge-shout-out-to-this-crew-and-all-read-activity-7384229591386783744-noSI" target="_blank" rel="noopener noreferrer" class="">was recognized by OpenAI for processing 1 trillion tokens</a>. They use OpenAI for RAG use cases powered by OpenFGA :).</p>
<p>Congrats to <a href="https://www.linkedin.com/in/lukewoloszyn/" target="_blank" rel="noopener noreferrer" class="">Luke Woloszyn</a>, <a href="https://www.linkedin.com/in/andrew-powers-geo/" target="_blank" rel="noopener noreferrer" class="">Andrew Powers</a>, and <a href="https://www.linkedin.com/in/mapsam/" target="_blank" rel="noopener noreferrer" class="">Sam Matthews</a> for such a great achievement!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-community-updates--events">📣 Community Updates &amp; Events<a href="https://openfga.dev/blog/fine-grained-news-2025-10#-community-updates--events" class="hash-link" aria-label="Direct link to 📣 Community Updates &amp; Events" title="Direct link to 📣 Community Updates &amp; Events" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recent-talks--content">Recent Talks &amp; Content<a href="https://openfga.dev/blog/fine-grained-news-2025-10#recent-talks--content" class="hash-link" aria-label="Direct link to Recent Talks &amp; Content" title="Direct link to Recent Talks &amp; Content" translate="no">​</a></h3>
<ul>
<li class="">
<p><a href="https://www.linkedin.com/in/carlastabile/" target="_blank" rel="noopener noreferrer" class="">Carla Urrea</a> published <a href="https://www.linkedin.com/learning/openfga-implementacion-de-fine-grained-authorization/que-es-openfga-y-por-que-usarlo" target="_blank" rel="noopener noreferrer" class="">a LinkedIn Course about OpenFGA en Español</a> and a blog post about <a href="https://auth0.com/blog/rebac-abac-openfga-cedar/" target="_blank" rel="noopener noreferrer" class="">Understanding ReBAC and ABAC Through OpenFGA and Cedar</a>. A repository with the examples used in the blog post is <a href="https://github.com/openfga/openfga-cedar-comparison" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
</li>
<li class="">
<p><a href="https://www.linkedin.com/in/deepu05/" target="_blank" rel="noopener noreferrer" class="">Deepu K Sasidharan</a> presented about <a href="https://www.youtube.com/watch?v=-V251N-pYYI" target="_blank" rel="noopener noreferrer" class="">Delay the AI Overlords: How OAuth and OpenFGA Can Keep Your AI Agents from Going Rogue</a> at DevOxx.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upcoming-events">Upcoming Events<a href="https://openfga.dev/blog/fine-grained-news-2025-10#upcoming-events" class="hash-link" aria-label="Direct link to Upcoming Events" title="Direct link to Upcoming Events" translate="no">​</a></h3>
<ul>
<li class="">
<p><a href="https://www.linkedin.com/in/joseapadilla/" target="_blank" rel="noopener noreferrer" class="">Jose Padilla</a> from Okta will be presenting at KubeCon North America, together with <a href="https://www.linkedin.com/in/alicejgibbons/" target="_blank" rel="noopener noreferrer" class="">Alice Gibbons</a> from Diagrid about <a href="https://kccncna2025.sched.com/event/27Fek" target="_blank" rel="noopener noreferrer" class="">Design Patterns for Consistent Centralized Authorization</a>. Great chance to see <a href="https://www.cncf.io/projects/dapr/" target="_blank" rel="noopener noreferrer" class="">OpenFGA and Dapr</a> working together!</p>
</li>
<li class="">
<p><a href="https://www.linkedin.com/in/tylernix/" target="_blank" rel="noopener noreferrer" class="">Tyler Nix</a> from Okta will host the OpenFGA Project Lightning talk <a href="https://kccncna2025.sched.com/event/27d4i" target="_blank" rel="noopener noreferrer" class="">OpenFGA: Google Zanzibar Style Authorization Made Developer-Friendly</a>.</p>
</li>
</ul>
<p>OpenFGA will also have a kiosk at the KubeCon Project Pavilion. <a href="https://www.linkedin.com/in/tylernix/" target="_blank" rel="noopener noreferrer" class="">Tyler Nix</a> and <a href="https://www.linkedin.com/in/joseapadilla/" target="_blank" rel="noopener noreferrer" class="">José Padilla</a> will be there!</p>
<p>The OpenFGA community submitted six proposals to present at KubeCon Europe! A great way to celebrate the upcoming CNCF Incubation stage!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-soon"><strong>See you soon!</strong><a href="https://openfga.dev/blog/fine-grained-news-2025-10#see-you-soon" class="hash-link" aria-label="Direct link to see-you-soon" title="Direct link to see-you-soon" translate="no">​</a></h2>
<p>Fine-Grained News is published monthly. If you have any feedback, want to share your OpenFGA story, or have a noteworthy update, please let us know on any of our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> or at <a href="mailto:community@openfga.dev" target="_blank" rel="noopener noreferrer" class="">community@openfga.dev</a>.</p>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine Grained News - September 2025]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2025-09</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2025-09"/>
        <updated>2025-09-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine Grained News]]></summary>
        <content type="html"><![CDATA[<p>After a long hiatus, we are back with Fine Grained News! The best way to keep up to date with the OpenFGA community!</p>
<p>First of all, we want to thank the OpenFGA community for helping the <a href="https://github.com/openfga/" target="_blank" rel="noopener noreferrer" class="">OpenFGA Repository</a> get beyond 4k stars!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-have-we-been-up-to">What have we been up to<a href="https://openfga.dev/blog/fine-grained-news-2025-09#what-have-we-been-up-to" class="hash-link" aria-label="Direct link to What have we been up to" title="Direct link to What have we been up to" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga-performance">OpenFGA Performance<a href="https://openfga.dev/blog/fine-grained-news-2025-09#openfga-performance" class="hash-link" aria-label="Direct link to OpenFGA Performance" title="Direct link to OpenFGA Performance" translate="no">​</a></h3>
<p>The OpenFGA team has been mostly focused on performance improvements, and we are close to finishing a big round of improvements.</p>
<ul>
<li class="">The <code>/check</code> endpoint is now <strong>up to 10x faster</strong> in some scenarios.</li>
<li class="">The <code>/list-objects</code> endpoint is <strong>up to 5x faster</strong> in some scenarios (the enhancements are still behind an experimental flag).</li>
<li class="">The caching implementation has a more sophisticated eviction mechanism that allows OpenFGA to cache entries for a longer time.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-write-api">Improved Write API<a href="https://openfga.dev/blog/fine-grained-news-2025-09#improved-write-api" class="hash-link" aria-label="Direct link to Improved Write API" title="Direct link to Improved Write API" translate="no">​</a></h3>
<p>OpenFGA v1.10 adds additional parameters to the <a href="https://openfga.dev/api/service#/Relationship%20Tuples/Write" target="_blank" rel="noopener noreferrer" class=""><code>/write</code></a> endpoint that allow specifying the behavior when duplicated tuples are written or non-existing tuples are deleted. This was a much requested feature - we're looking forward for your feedback on it!</p>
<p>The SDKs and the CLI will add support for these options over the coming month.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="terraform-provider">Terraform Provider<a href="https://openfga.dev/blog/fine-grained-news-2025-09#terraform-provider" class="hash-link" aria-label="Direct link to Terraform Provider" title="Direct link to Terraform Provider" translate="no">​</a></h3>
<p><a href="https://www.linkedin.com/in/maurice-ackel/" target="_blank" rel="noopener noreferrer" class="">Maurice Ackel</a> contributed the official <a href="https://github.com/openfga/terraform-provider-openfga" target="_blank" rel="noopener noreferrer" class="">OpenFGA Terraform Provider</a>. Take a look at it, and let Maurice know if you are using it!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdks-and-tooling">SDKs and Tooling<a href="https://openfga.dev/blog/fine-grained-news-2025-09#sdks-and-tooling" class="hash-link" aria-label="Direct link to SDKs and Tooling" title="Direct link to SDKs and Tooling" translate="no">​</a></h3>
<ul>
<li class="">
<p>We shipped several improvements across all SDKs:</p>
<ul>
<li class="">Improved how the SDKs retry when getting 429 errors</li>
<li class="">BatchCheck support (.NET coming soon!)</li>
<li class="">.NET Standard 2.0 support for .NET is in Alpha, and will be released soon.</li>
</ul>
</li>
<li class="">
<p>The CLI has several improvements:</p>
<ul>
<li class="">Supports running tests using glob patterns (<code>fga model test --tests *.yaml</code>)</li>
<li class="">Supports <code>jsonl</code> format for tuples</li>
<li class="">Allows specifying multiple tuple files in store tests</li>
<li class="">Enables grouping users/objects in store tests, avoiding duplication:</li>
</ul>
</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">    - object: group:employees</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      users:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        - user:1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        - user:2</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      assertions:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        member: true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    - objects:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        - group:admins</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        - group:employees</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      user: user:1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      assertions:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          member: true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<ul>
<li class="">OpenFGA includes now a <a href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client" target="_blank" rel="noopener noreferrer" class="">REST Client</a> <a href="https://github.com/openfga/openfga/tree/main/docs/http" target="_blank" rel="noopener noreferrer" class="">HTTP file</a> to make it simple to use the OpenFGA API.</li>
</ul>
<ul>
<li class="">We've been playing with an OpenFGA MCP to help with modeling. You can add the MCP by pointing your MCP client (e.g., VS Code) to <a href="https://mcp.openfga.dev/mcp" target="_blank" rel="noopener noreferrer" class="">https://mcp.openfga.dev/mcp</a>. You can find the code <a href="https://github.com/aaguiarz/openfga-modeling-mcp" target="_blank" rel="noopener noreferrer" class="">here</a>, or see it in action <a href="https://www.youtube.com/watch?v=JNBtf-1NrPM" target="_blank" rel="noopener noreferrer" class="">here</a>. It's pretty awesome! :)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-openfga-adopters">New OpenFGA Adopters<a href="https://openfga.dev/blog/fine-grained-news-2025-09#new-openfga-adopters" class="hash-link" aria-label="Direct link to New OpenFGA Adopters" title="Direct link to New OpenFGA Adopters" translate="no">​</a></h2>
<p>The list of companies/projects keeps increasing! These adopters were added since the last edition of Fine Grained News:</p>
<ul>
<li class=""><a href="https://www.headspace.com/join-us" target="_blank" rel="noopener noreferrer" class="">Headspace</a>: Headspace uses OpenFGA to manage entitlements for its users based on their subscriptions. OpenFGA is also used to determine availability of features and content based on regionality and language.</li>
<li class=""><a href="https://www.earthscope.org/" target="_blank" rel="noopener noreferrer" class="">EarthScope Consortium</a>: EarthScope Consortium supports transformative global geophysical research and education. They leverage OpenFGA to authorize researcher access to hundreds of thousands of data streams from geophysical sensors located all over the world.</li>
<li class=""><a href="https://linuxcontainers.org/incus/" target="_blank" rel="noopener noreferrer" class="">Incus</a>: The Incus project uses OpenFGA as its primary authorization mechanism for fine grained access control to all its resources.</li>
<li class=""><a href="https://virv.ai/" target="_blank" rel="noopener noreferrer" class="">virv.ai</a>: virv.ai uses OpenFGA as the core authorization model that enables individuals, agents and organizations to access artifacts such as data, credentials, and documents. OpenFGA allows us to meet the needs of the AI-enabled Enterprise where trust is essential.</li>
<li class=""><a href="https://x-hr.co/" target="_blank" rel="noopener noreferrer" class="">X-HR LABS</a>: X-HR is a modern HR tech platform that empowers businesses with full freedom to use and grow on their own terms. They leverage OpenFGA to implement robust, relationship-based access control across company data and organizational structures.</li>
<li class=""><a href="https://appscode.com/" target="_blank" rel="noopener noreferrer" class="">AppsCode</a>: AppsCode uses OpenFGA to implement authorization functionality for their AppsCode Container Engine (ACE) Platform.</li>
<li class=""><a href="https://grafana.com/" target="_blank" rel="noopener noreferrer" class="">Grafana Labs</a>: Grafana user authorization and Role Based Access Control (RBAC) are migrating to OpenFGA.</li>
</ul>
<p>You can also learn how OpenFGA powers <a href="https://neonephos.org/" target="_blank" rel="noopener noreferrer" class="">NeoNephos</a>, a new Linux Foundation project that's dedicated to advancing open source projects that align with the strategic objectives of the EU's IPCEI-CIS, in <a href="https://www.youtube.com/watch?v=vpDGQgCaLt8" target="_blank" rel="noopener noreferrer" class="">this Open Source Summit</a> presentation by <a href="https://www.linkedin.com/in/bastianechterhoelter/" target="_blank" rel="noopener noreferrer" class="">Bastian Echterhölter</a> &amp; <a href="https://www.linkedin.com/in/aaron-schweig-471707199/" target="_blank" rel="noopener noreferrer" class="">Aaron Schweig</a> from SAP.</p>
<p>The <a href="https://www.linuxfoundation.org/" target="_blank" rel="noopener noreferrer" class="">Linux Foundation</a> is using OpenFGA for their new platform. You can see their OpenFGA authorization model <a href="https://github.com/linuxfoundation/lfx-v2-helm/blob/f40018f3031ad106f52cfb29b3f9103821ad63b5/charts/lfx-platform/templates/openfga/model.yaml#L25" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p><a href="https://www.nagarro.com/" target="_blank" rel="noopener noreferrer" class="">Nagarro</a> published <a href="https://www.linkedin.com/posts/nagarro_schneider-success-story-activity-7366395183585763329-up7m/" target="_blank" rel="noopener noreferrer" class="">a case study</a> detailing how they helped <a href="https://www.se.com/" target="_blank" rel="noopener noreferrer" class="">Schneider Electric</a> with an OpenFGA implementation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga-security-posture">OpenFGA Security Posture<a href="https://openfga.dev/blog/fine-grained-news-2025-09#openfga-security-posture" class="hash-link" aria-label="Direct link to OpenFGA Security Posture" title="Direct link to OpenFGA Security Posture" translate="no">​</a></h2>
<p>All OpenFGA repositories now have a <a href="https://github.com/openfga/openfga/blob/main/.github/SECURITY-INSIGHTS.yml" target="_blank" rel="noopener noreferrer" class="">Security Insights file</a> and are integrated with <a href="https://securityscorecards.dev/viewer/?uri=github.com/openfga/openfga" target="_blank" rel="noopener noreferrer" class="">OpenSSF Scorecard</a>.</p>
<p>OpenFGA is also included in the <a href="https://insights.linuxfoundation.org/project/openfga" target="_blank" rel="noopener noreferrer" class="">LFX Insights website</a>, scoring an <strong>Excellent</strong> score.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga-to-cncf-incubation">OpenFGA to CNCF Incubation!<a href="https://openfga.dev/blog/fine-grained-news-2025-09#openfga-to-cncf-incubation" class="hash-link" aria-label="Direct link to OpenFGA to CNCF Incubation!" title="Direct link to OpenFGA to CNCF Incubation!" translate="no">​</a></h2>
<p>We are going through the due diligence process to be approved for the CNCF Incubation stage with the <a href="https://www.cncf.io/people/technical-oversight-committee/" target="_blank" rel="noopener noreferrer" class="">CNCF Technical Oversight Committee</a>. They are currently interviewing OpenFGA adopters. Thanks to Canonical, Grafana, Docker, Read.AI, Agicap, Sourcegraph, Zuplo, and Custodian for agreeing to be interviewed by the CNCF!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upcoming-events-kubecon-north-america--all-things-open">Upcoming Events: KubeCon North America &amp; All Things Open<a href="https://openfga.dev/blog/fine-grained-news-2025-09#upcoming-events-kubecon-north-america--all-things-open" class="hash-link" aria-label="Direct link to Upcoming Events: KubeCon North America &amp; All Things Open" title="Direct link to Upcoming Events: KubeCon North America &amp; All Things Open" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://www.linkedin.com/in/sambellen/" target="_blank" rel="noopener noreferrer" class="">Sam Bellen</a> will be presenting at <a href="https://2025.allthingsopen.org/" target="_blank" rel="noopener noreferrer" class="">All Things Open</a> about the <a href="https://2025.allthingsopen.org/sessions/paradigm-shift" target="_blank" rel="noopener noreferrer" class="">Paradigm Shift</a> that ReBAC and the Zanzibar approach brought to the industry</p>
</li>
<li class="">
<p><a href="https://www.linkedin.com/in/joseapadilla/" target="_blank" rel="noopener noreferrer" class="">Jose Padilla</a> from Okta will be presenting at KubeCon North America, together with <a href="https://www.linkedin.com/in/alicejgibbons/" target="_blank" rel="noopener noreferrer" class="">Alice Gibbons</a> from Diagrid about <a href="https://kccncna2025.sched.com/event/27Fek" target="_blank" rel="noopener noreferrer" class="">Design Patterns for Consistent Centralized Authorization</a></p>
</li>
<li class="">
<p><a href="https://kccncna2025.sched.com/speaker/siddhant_khare.28kd1xzv" target="_blank" rel="noopener noreferrer" class="">Siddhant Khare</a>, an OpenFGA maintainer from Gitpod, will host the OpenFGA Project Lightning talk <a href="https://kccncna2025.sched.com/event/27d4i" target="_blank" rel="noopener noreferrer" class="">OpenFGA: Google Zanzibar Style Authorization Made Developer-Friendly</a>.</p>
</li>
</ul>
<p>OpenFGA will also have a kiosk at the KubeCon Project Pavilion. <a href="https://www.linkedin.com/in/tyler-nix/" target="_blank" rel="noopener noreferrer" class="">Tyler Nix</a> and <a href="https://www.linkedin.com/in/joseapadilla/" target="_blank" rel="noopener noreferrer" class="">José Padilla</a> will be there!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-soon"><strong>See you soon!</strong><a href="https://openfga.dev/blog/fine-grained-news-2025-09#see-you-soon" class="hash-link" aria-label="Direct link to see-you-soon" title="Direct link to see-you-soon" translate="no">​</a></h2>
<p>Fine Grained News used to be published every month, and we plan to go back to our monthly cadence! :) If you have any feedback, want to share your OpenFGA story, or have a noteworthy update, please let us know on any of our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> or at <a href="mailto:community@openfga.dev" target="_blank" rel="noopener noreferrer" class="">community@openfga.dev</a>.</p>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - February 2025]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2025-02</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2025-02"/>
        <updated>2025-02-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the second Fine-Grained News edition of 2025!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="just-shipped">Just Shipped!<a href="https://openfga.dev/blog/fine-grained-news-2025-02#just-shipped" class="hash-link" aria-label="Direct link to Just Shipped!" title="Direct link to Just Shipped!" translate="no">​</a></h2>
<ul>
<li class="">
<p>We shipped 3 minor versions of OpenFGA which include:</p>
<ul>
<li class="">
<p>Fixes for <a href="https://github.com/openfga/openfga/security/advisories/GHSA-g4v5-6f5p-m38j" target="_blank" rel="noopener noreferrer" class="">CVE-2025-25196</a> and <a href="https://github.com/openfga/openfga/security/advisories/GHSA-32q6-rr98-cjqv" target="_blank" rel="noopener noreferrer" class="">CVE-2024-56323</a></p>
</li>
<li class="">
<p>Several performance improvements that are enabled with the <code>enable-check-optimizations</code> experimental flag.</p>
</li>
<li class="">
<p>Dynamic TLS certificate reloading for HTTP and gRPC servers. Thanks <a href="https://github.com/RokibulHasan7" target="_blank" rel="noopener noreferrer" class="">Rokibul Hasan</a> for your contribution!</p>
</li>
<li class="">
<p>A <code>name</code> filter to ListStores. The name parameter instructs the API to only include results that match that name. Thanks <a href="https://github.com/kalleep" target="_blank" rel="noopener noreferrer" class="">Karl Persson</a> for your contribution!</p>
</li>
<li class="">
<p>Optimized database dialect handling by setting it during initialization instead of per-call, fixing SQL syntax errors in MySQL. Thanks <a href="https://github.com/Siddhant-K-code" target="_blank" rel="noopener noreferrer" class="">Siddhant Khare</a> for your contribution!</p>
</li>
<li class="">
<p>Support for Go 1.24. We follow Go's version support policy and will only support the latest two major versions of Go. Now that Go 1.24 is out, we have dropped support for Go &lt; 1.23.</p>
</li>
</ul>
</li>
<li class="">
<p>Two minor versions of the <a href="https://github.com/openfga/java-sdk" target="_blank" rel="noopener noreferrer" class="">Java SDK</a>, with support for server-side <a href="https://github.com/openfga/js-sdk?tab=readme-ov-file#batch-check" target="_blank" rel="noopener noreferrer" class="">BatchCheck</a>. Thanks <a href="https://github.com/piotrooo" target="_blank" rel="noopener noreferrer" class="">Piotr Olaszewski</a> for your contribution!</p>
</li>
<li class="">
<p>A minor release of the <a href="https://github.com/openfga/go-sdk" target="_blank" rel="noopener noreferrer" class="">Go SDK</a>, with support for the <code>StartTime</code> parameter in the <a href="https://github.com/openfga/go-sdk?tab=readme-ov-file#read-relationship-tuple-changes-watch" target="_blank" rel="noopener noreferrer" class="">ReadChanges method</a> and support for specifying contextual tuples and context parameters in assertions.</p>
</li>
<li class="">
<p>A minor release of the <a href="https://github.com/openfga/cli" target="_blank" rel="noopener noreferrer" class="">FGA CLI</a>, with support for the <code>start-time</code> parameter for the <code>changes</code> command and importing assertions during <code>fga store import</code>. Thanks <a href="https://github.com/sujitha-av" target="_blank" rel="noopener noreferrer" class="">Sujitha A V</a> for your contribution!</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-openfga-for-genai-and-retrieval-augmented-generation-rag">Using OpenFGA for GenAI and Retrieval Augmented Generation (RAG)<a href="https://openfga.dev/blog/fine-grained-news-2025-02#using-openfga-for-genai-and-retrieval-augmented-generation-rag" class="hash-link" aria-label="Direct link to Using OpenFGA for GenAI and Retrieval Augmented Generation (RAG)" title="Direct link to Using OpenFGA for GenAI and Retrieval Augmented Generation (RAG)" translate="no">​</a></h2>
<p>We are seeing a lot of interest in using OpenFGA for RAG scenarios and we wanted to share a list of interesting articles and repositories that were published lately:</p>
<ul>
<li class=""><a href="https://auth0.com/blog/rag-and-access-control-where-do-you-start/" target="_blank" rel="noopener noreferrer" class="">RAG and Access Control: Where Do You Start?</a></li>
<li class=""><a href="https://auth0.com/blog/building-a-secure-rag-with-python-langchain-and-openfga/" target="_blank" rel="noopener noreferrer" class="">Building a Secure RAG with Python, LangChain, and OpenFGA</a></li>
<li class=""><a href="https://auth0.com/blog/genai-langchain-js-fga/" target="_blank" rel="noopener noreferrer" class="">GenAI, LangChain.js, and FGA</a></li>
<li class=""><a href="https://www.useparagon.com/learn/ai-knowledge-chatbot-with-permissions-chapter-2/" target="_blank" rel="noopener noreferrer" class="">Building a Permissions System For Your RAG Application</a></li>
<li class=""><a href="https://github.com/ranfysvalle02/mdb-openfga" target="_blank" rel="noopener noreferrer" class="">mdb-openfga: OpenFGA + MongoDB</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learning-openfga">Learning OpenFGA<a href="https://openfga.dev/blog/fine-grained-news-2025-02#learning-openfga" class="hash-link" aria-label="Direct link to Learning OpenFGA" title="Direct link to Learning OpenFGA" translate="no">​</a></h2>
<p>We've been busy creating blog posts and videos that help you adopt OpenFGA, check them out!</p>
<ul>
<li class=""><a href="https://www.youtube.com/watch?v=5Lwy9aHXXHE&amp;list=PLUR5l-oTFZqWaDdhEOVt_IfPOIbKo1Ypt" target="_blank" rel="noopener noreferrer" class="">OpenFGA: Modeling Guide</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=v1Io8TtB4bg&amp;list=PLUR5l-oTFZqXGikFJolWJfP7zDK4GRYJ6" target="_blank" rel="noopener noreferrer" class="">OpenFGA: The Basics</a></li>
<li class=""><a href="https://auth0.com/blog/fine-grained-access-control-with-python-flask/" target="_blank" rel="noopener noreferrer" class="">OpenFGA for Python Flask Applications</a></li>
<li class=""><a href="https://auth0.com/blog/what-is-rebac-and-how-to-implement-rails-api/" target="_blank" rel="noopener noreferrer" class="">How to Implement Relationship-Based Access Control (ReBAC) in a Ruby On Rails API?</a></li>
<li class=""><a href="https://vercel.com/blog/securing-data-in-your-next-js-app-with-okta-and-openfga" target="_blank" rel="noopener noreferrer" class="">Securing data in your Next.js app with Okta and OpenFGA</a></li>
<li class=""><a href="https://auth0.com/blog/express-typescript-fga/" target="_blank" rel="noopener noreferrer" class="">OpenFGA for an Express + Typescript Node.js API</a></li>
<li class=""><a href="https://auth0.com/blog/add-fga-to-spring-boot-api-with-openfga/" target="_blank" rel="noopener noreferrer" class="">OpenFGA for Spring Boot Applications</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga-to-cncf-incubation">OpenFGA to CNCF Incubation<a href="https://openfga.dev/blog/fine-grained-news-2025-02#openfga-to-cncf-incubation" class="hash-link" aria-label="Direct link to OpenFGA to CNCF Incubation" title="Direct link to OpenFGA to CNCF Incubation" translate="no">​</a></h2>
<p>The <a href="https://www.cncf.io/people/technical-oversight-committee/" target="_blank" rel="noopener noreferrer" class="">CNCF Technical Oversight Committee</a> triaged OpenFGA's application to be accepted as an "Incubation" project, decided we had provided the appropriate information and references, and <a href="https://github.com/orgs/cncf/projects/27/views/9" target="_blank" rel="noopener noreferrer" class="">moved the project to the next step</a>. We now need to wait for a TOC member to pick the project and do their due diligence.</p>
<p>Thanks to Canonical, Grafana, Docker, Read.AI, Agicap, Sourcegraph, Zuplo, and Stacklok for agreeing to be interviewed by the CNCF as reference adopters!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga-in-london">OpenFGA in London<a href="https://openfga.dev/blog/fine-grained-news-2025-02#openfga-in-london" class="hash-link" aria-label="Direct link to OpenFGA in London" title="Direct link to OpenFGA in London" translate="no">​</a></h2>
<p>OpenFGA will be present in two high-profile events in London:</p>
<ul>
<li class=""><a href="https://www.linkedin.com/in/sambellen/" target="_blank" rel="noopener noreferrer" class="">Sam Bellen</a> will participate in the <a href="https://www.gartner.com/en/conferences/emea/identity-access-management-uk" target="_blank" rel="noopener noreferrer" class="">Gartner IAM EMEA event</a> demoing <a href="https://openid.net/authzen-at-gartner-iam/" target="_blank" rel="noopener noreferrer" class="">OpenFGA interoperability with the AuthZen standard</a>.</li>
</ul>
<ul>
<li class="">
<p><a href="https://www.linkedin.com/in/poovamraj/" target="_blank" rel="noopener noreferrer" class="">Poovamraj Thanganadar Thiagarajan</a> from Okta will be presenting at KubeCon Europe, together with <a href="https://www.linkedin.com/in/jmlguerreiro/" target="_blank" rel="noopener noreferrer" class="">Jo Guerreiro</a> from Grafana Labs about <a href="https://kccnceu2025.sched.com/event/1txIJ/from-chaos-to-control-migrating-access-control-to-openfga-in-a-multi-tenant-world-jo-guerreiro-grafana-labs-poovamraj-thanganadar-thiagarajan-okta" target="_blank" rel="noopener noreferrer" class="">From Chaos To Control: Migrating Access Control To OpenFGA in a Multi-Tenant World</a>.</p>
</li>
<li class="">
<p><a href="https://www.linkedin.com/in/aaguiar/" target="_blank" rel="noopener noreferrer" class="">Andres Aguiar</a> from Okta was invited to present on the Maintainer's Summit at KubeCon Europe about our experiences collaborating with the CNCF TAG-Security team: <a href="https://maintainersummiteu2025.sched.com/event/1tj8v/a-project-maintainers-guide-to-tag-security-marina-moore-edera-andres-aguiar-okta" target="_blank" rel="noopener noreferrer" class="">A Project Maintainers Guide To TAG Security</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month"><strong>See You Next Month:</strong><a href="https://openfga.dev/blog/fine-grained-news-2025-02#see-you-next-month" class="hash-link" aria-label="Direct link to see-you-next-month" title="Direct link to see-you-next-month" translate="no">​</a></h2>
<p>Fine-Grained News is published every month. If you have any feedback, want to share your OpenFGA story, or have a noteworthy update, please let us know on any of our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> or at <a href="mailto:community@openfga.dev" target="_blank" rel="noopener noreferrer" class="">community@openfga.dev</a>.</p>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - January 2025]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2025-01</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2025-01"/>
        <updated>2025-01-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the first Fine-Grained News edition of 2025! January is always a good month to look back at what the OpenFGA community accomplished over the past year.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="major-features">Major features<a href="https://openfga.dev/blog/fine-grained-news-2025-01#major-features" class="hash-link" aria-label="Direct link to Major features" title="Direct link to Major features" translate="no">​</a></h2>
<p>Below is a list of the major features that were shipped in 2024:</p>
<ul>
<li class=""><a href="https://openfga.dev/docs/modeling/modular-models" target="_blank" rel="noopener noreferrer" class="">Modular Models</a></li>
<li class=""><a href="https://github.com/openfga/spring-boot-starter" target="_blank" rel="noopener noreferrer" class="">Java Spring Boot Integration</a></li>
<li class=""><a href="https://plugins.jetbrains.com/plugin/24394-openfga" target="_blank" rel="noopener noreferrer" class="">JetBrains Integration</a></li>
<li class=""><a href="https://openfga.dev/docs/getting-started/configure-telemetry" target="_blank" rel="noopener noreferrer" class="">Telemetry in OpenFGA SDKs</a></li>
<li class=""><a href="https://openfga.dev/docs/getting-started/perform-list-users" target="_blank" rel="noopener noreferrer" class="">ListUsers Endpoint</a></li>
<li class=""><a href="https://openfga.dev/docs/interacting/relationship-queries#batch-check" target="_blank" rel="noopener noreferrer" class="">Batch Check Endpoint</a></li>
<li class=""><a href="https://openfga.dev/docs/interacting/consistency" target="_blank" rel="noopener noreferrer" class="">Query Consistency Options</a></li>
<li class=""><a href="https://openfga.dev/docs/getting-started/setup-openfga/configure-openfga#sqlite" target="_blank" rel="noopener noreferrer" class="">Storage adapter for SQLite </a>, contributed by <a href="https://github.com/DanCech" target="_blank" rel="noopener noreferrer" class="">DanCech</a> from Grafana Labs</li>
<li class=""><a href="https://openfga.dev/docs/getting-started/setup-openfga/access-control" target="_blank" rel="noopener noreferrer" class="">Experimental Access Control for the OpenFGA server</a></li>
</ul>
<p>We heavily invested in OpenFGA performance, reducing latency by 90% in several cases. We'll continue improving performance in the following months.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="but-thats-not-all">But that's not all!<a href="https://openfga.dev/blog/fine-grained-news-2025-01#but-thats-not-all" class="hash-link" aria-label="Direct link to But that's not all!" title="Direct link to But that's not all!" translate="no">​</a></h2>
<p>We are very grateful with the OpenFGA community, who helped shipping <strong>126</strong> releases and improvements across the board:</p>
<ul>
<li class=""><a href="https://github.com/openfga/openfga" target="_blank" rel="noopener noreferrer" class="">OpenFGA Server</a>: <a href="https://github.com/openfga/openfga" target="_blank" rel="noopener noreferrer" class="">23 releases</a>. Thanks <a href="https://github.com/kalleep" target="_blank" rel="noopener noreferrer" class="">kalleep</a>, <a href="https://github.com/DanCech" target="_blank" rel="noopener noreferrer" class="">DanCech</a>,<a href="https://github.com/golanglemonade," target="_blank" rel="noopener noreferrer" class="">golanglemonade</a> <a href="https://github.com/tranngoclam" target="_blank" rel="noopener noreferrer" class="">tranngoclam</a>, <a href="https://github.com/lalalalatt" target="_blank" rel="noopener noreferrer" class="">lalalalatt</a>, <a href="https://github.com/Code2Life" target="_blank" rel="noopener noreferrer" class="">Code2Life</a>, <a href="https://github.com/JAORMX" target="_blank" rel="noopener noreferrer" class="">JAORMX</a>, <a href="https://github.com/Zach-Johnson" target="_blank" rel="noopener noreferrer" class="">Zach-Johnson</a>, <a href="https://github.com/cmmoran" target="_blank" rel="noopener noreferrer" class="">cmmoran</a>, <a href="https://github.com/00chorch" target="_blank" rel="noopener noreferrer" class="">00chorch</a>, <a href="https://github.com/chenrui333" target="_blank" rel="noopener noreferrer" class="">chenrui333</a>, <a href="https://github.com/le-yams" target="_blank" rel="noopener noreferrer" class="">le-yams</a>, <a href="https://github.com/lekaf974" target="_blank" rel="noopener noreferrer" class="">lekaf974</a>, <a href="https://github.com/raj-saxena" target="_blank" rel="noopener noreferrer" class="">raj-saxena</a>!</li>
<li class=""><a href="https://github.com/openfga/go-sdkk" target="_blank" rel="noopener noreferrer" class="">Python SDK</a>: <a href="https://github.com/openfga/go-sdk/releases" target="_blank" rel="noopener noreferrer" class="">16 Releases</a>. Thanks <a href="https://github.com/Oscmage" target="_blank" rel="noopener noreferrer" class="">Oscmage</a> <a href="https://github.com/ovindu-a" target="_blank" rel="noopener noreferrer" class="">ovindu-a</a>, <a href="https://github.com/GMorris-professional" target="_blank" rel="noopener noreferrer" class="">GMorris-professional</a>, <a href="https://github.com/Divan009" target="_blank" rel="noopener noreferrer" class="">Divan009</a>!</li>
<li class=""><a href="https://github.com/openfga/go-sdk" target="_blank" rel="noopener noreferrer" class="">Go SDK</a>: <a href="https://github.com/openfga/go-sdk/releases" target="_blank" rel="noopener noreferrer" class="">10 releases</a>. Thanks <a href="https://github.com/le-yams" target="_blank" rel="noopener noreferrer" class="">le-yams</a>, <a href="https://github.com/HeroicHorizon" target="_blank" rel="noopener noreferrer" class="">le-yams</a>, <a href="https://github.com/gurleensethi" target="_blank" rel="noopener noreferrer" class="">gurleensethi</a>, <a href="https://github.com/gurleensethi" target="_blank" rel="noopener noreferrer" class="">gurleensethi</a>, <a href="https://github.com/wonyx" target="_blank" rel="noopener noreferrer" class="">wonyx</a>, <a href="https://github.com/Code2Life" target="_blank" rel="noopener noreferrer" class="">Code2Life</a>, <a href="https://github.com/Kryvchun" target="_blank" rel="noopener noreferrer" class="">Kryvchun</a>!</li>
<li class=""><a href="https://github.com/openfga/java-sdk" target="_blank" rel="noopener noreferrer" class="">Java SDK</a>: <a href="https://github.com/openfga/java-sdk/releases" target="_blank" rel="noopener noreferrer" class="">10 releases</a>. Thanks <a href="https://github.com/le-yams" target="_blank" rel="noopener noreferrer" class="">le-yams</a>, <a href="https://github.com/paulosuzart" target="_blank" rel="noopener noreferrer" class="">paulosuzart</a> and <a href="https://github.com/Didier-SimpleCommeDev" target="_blank" rel="noopener noreferrer" class="">Didier-SimpleCommeDev</a>!</li>
<li class=""><a href="https://github.com/openfga/js-sdk" target="_blank" rel="noopener noreferrer" class="">JS SDK</a>: <a href="https://github.com/openfga/js-sdk/releases" target="_blank" rel="noopener noreferrer" class="">13 releases</a>. Thanks <a href="https://github.com/sccalabr" target="_blank" rel="noopener noreferrer" class="">sccalabr</a>, <a href="https://github.com/Siddhant-K-code" target="_blank" rel="noopener noreferrer" class="">Siddhant-K-code</a>, <a href="https://github.com/vil02" target="_blank" rel="noopener noreferrer" class="">vil02</a>, <a href="https://github.com/Waheedsys" target="_blank" rel="noopener noreferrer" class="">Waheedsys</a>, <a href="https://github.com/tmsagarofficial" target="_blank" rel="noopener noreferrer" class="">tmsagarofficial</a>!</li>
<li class=""><a href="https://github.com/openfga/dotnet-sdk" target="_blank" rel="noopener noreferrer" class="">.NET SDK</a>: <a href="https://github.com/openfga/dotnet-sdk/releases" target="_blank" rel="noopener noreferrer" class="">5 releases</a>.</li>
<li class=""><a href="https://github.com/openfga/spring-boot-starter" target="_blank" rel="noopener noreferrer" class="">Spring Boot</a>: <a href="https://github.com/openfga/spring-boot-starter/releases" target="_blank" rel="noopener noreferrer" class="">2 releases</a>. Thanks <a href="https://github.com/eddumelendez" target="_blank" rel="noopener noreferrer" class="">eddumelendez</a> and <a href="https://github.com/dheid" target="_blank" rel="noopener noreferrer" class="">dheid</a>!</li>
<li class=""><a href="https://github.com/openfga/helm-charts" target="_blank" rel="noopener noreferrer" class="">Helm Chart</a>: <a href="https://github.com/openfga/helm-charts" target="_blank" rel="noopener noreferrer" class="">31 releases</a>. Thanks
<a href="https://github.com/jliedy" target="_blank" rel="noopener noreferrer" class="">jliedy</a>, <a href="https://github.com/aaronschweig" target="_blank" rel="noopener noreferrer" class="">aaronschweig</a>, <a href="https://github.com/bagnaram" target="_blank" rel="noopener noreferrer" class="">bagnaram</a>, <a href="https://github.com/vil02" target="_blank" rel="noopener noreferrer" class="">vil02</a>, <a href="https://github.com/jagregory" target="_blank" rel="noopener noreferrer" class="">jagregory</a> <a href="https://github.com/danielloader" target="_blank" rel="noopener noreferrer" class="">danielloader</a>, <a href="https://github.com/wenzel-felix%5D" target="_blank" rel="noopener noreferrer" class="">wenzel-felix</a>, <a href="https://github.com/aballet" target="_blank" rel="noopener noreferrer" class="">aballet</a>, <a href="https://github.com/tamalsaha" target="_blank" rel="noopener noreferrer" class="">tamalsaha</a>, <a href="https://github.com/Oscmage" target="_blank" rel="noopener noreferrer" class="">Oscmage</a>, <a href="https://github.com/rorynickolls-skyral" target="_blank" rel="noopener noreferrer" class="">rorynickolls-skyral</a>,
<a href="https://github.com/juusujanar" target="_blank" rel="noopener noreferrer" class="">juusujanar</a>, <a href="https://github.com/cstruck" target="_blank" rel="noopener noreferrer" class="">cstruck</a>, <a href="https://github.com/almeynman" target="_blank" rel="noopener noreferrer" class="">almeynman</a>, <a href="https://github.com/JAORMX" target="_blank" rel="noopener noreferrer" class="">JAORMX</a>!</li>
<li class=""><a href="https://github.com/openfga/openfga.dev" target="_blank" rel="noopener noreferrer" class="">openfga.dev</a>: Our website received contributions from <a href="https://github.com/Siddhant-K-code" target="_blank" rel="noopener noreferrer" class="">Siddhant-K-code</a>, <a href="https://github.com/tazarov" target="_blank" rel="noopener noreferrer" class="">tazarov</a>, <a href="https://github.com/sarthak-kumar-shailendra" target="_blank" rel="noopener noreferrer" class="">sarthak-kumar-shailendra</a>,  <a href="https://github.com/nimakarimi97" target="_blank" rel="noopener noreferrer" class="">nimakarimi97</a>, <a href="https://github.com/soura-ba" target="_blank" rel="noopener noreferrer" class="">soura-b</a>, <a href="https://github.com/asenawritescode" target="_blank" rel="noopener noreferrer" class="">asenawritescode</a>, <a href="https://github.com/kwiky" target="_blank" rel="noopener noreferrer" class="">kwiky</a>, <a href="https://github.com/lupeterm" target="_blank" rel="noopener noreferrer" class="">lupeterm</a>, <a href="https://github.com/RobertKielty" target="_blank" rel="noopener noreferrer" class="">RobertKielty</a>, <a href="https://github.com/t3hmrman" target="_blank" rel="noopener noreferrer" class="">t3hmrman</a>, <a href="https://github.com/mwangersjo" target="_blank" rel="noopener noreferrer" class="">mwangersjo</a>, <a href="https://github.com/josxha" target="_blank" rel="noopener noreferrer" class="">josxha</a>, <a href="https://github.com/tbcvl" target="_blank" rel="noopener noreferrer" class="">tbcvl</a>, <a href="https://github.com/sujitha-av" target="_blank" rel="noopener noreferrer" class="">sujitha-av</a>, <a href="https://github.com/jamct" target="_blank" rel="noopener noreferrer" class="">jamct</a>, <a href="https://github.com/lhchingit" target="_blank" rel="noopener noreferrer" class="">lhchingit</a>, <a href="https://github.com/DanCech" target="_blank" rel="noopener noreferrer" class="">DanCech</a>. Thanks to everyone!</li>
<li class=""><a href="https://github.com/openfga/vscode-ext" target="_blank" rel="noopener noreferrer" class="">Visual Studio Code Extension</a>: <a href="https://github.com/openfga/vscode-ext/releases" target="_blank" rel="noopener noreferrer" class="">11 releases</a>. Thanks <a href="https://github.com/solon" target="_blank" rel="noopener noreferrer" class="">solon</a>!</li>
<li class=""><a href="https://github.com/openfga/intellij-plugin" target="_blank" rel="noopener noreferrer" class="">IntelliJ Plugin</a>: <a href="https://github.com/openfga/intellij-plugin/releases" target="_blank" rel="noopener noreferrer" class="">5 releases</a>. Thanks <a href="https://github.com/le-yams" target="_blank" rel="noopener noreferrer" class="">le-yams</a> and <a href="https://github.com/edlundin" target="_blank" rel="noopener noreferrer" class="">edlundin</a>!</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-community-accomplishments">More community accomplishments<a href="https://openfga.dev/blog/fine-grained-news-2025-01#more-community-accomplishments" class="hash-link" aria-label="Direct link to More community accomplishments" title="Direct link to More community accomplishments" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/openfga/openfga" target="_blank" rel="noopener noreferrer" class="">OpenFGA</a> repository’s stars increased 70%, crossing the 3k mark.</li>
<li class=""><a href="https://github.com/openfga/openfga/graphs/contributors" target="_blank" rel="noopener noreferrer" class="">External contributors</a> to the OpenFGA repository doubled.</li>
<li class="">There are <a href="https://github.com/search?q=openfga&amp;type=repositories" target="_blank" rel="noopener noreferrer" class="">more than 140 repositories</a> in Github that have ‘openfga’ in its name or description and are not maintained by the OpenFGA team.</li>
<li class="">We onboarded <a href="https://grafana.com/" target="_blank" rel="noopener noreferrer" class="">Grafana Labs</a> as a new maintainer for the OpenFGA project.</li>
<li class="">We just launched a <a href="https://www.linkedin.com/company/openfga" target="_blank" rel="noopener noreferrer" class="">LinkedIn Page</a>. We need more followers!</li>
<li class="">There are <a href="https://github.com/openfga/sample-stores?tab=readme-ov-file#openfga-models-in-open-source-projects" target="_blank" rel="noopener noreferrer" class="">15 Production OpenFGA Models</a> in different projects in Github.</li>
<li class="">We applied to CNCF Incubation in April 2024, <a href="https://github.com/orgs/cncf/projects/27/views/9" target="_blank" rel="noopener noreferrer" class="">we are third in the line</a> waiting for being evaluated.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="future-community-presentations">Future community presentations<a href="https://openfga.dev/blog/fine-grained-news-2025-01#future-community-presentations" class="hash-link" aria-label="Direct link to Future community presentations" title="Direct link to Future community presentations" translate="no">​</a></h2>
<p><a href="https://www.linkedin.com/in/sambellen/" target="_blank" rel="noopener noreferrer" class="">Sam Bellen</a> will present <a href="https://web.archive.org/web/20250814171248/https://jfokus.se/talks/1839" target="_blank" rel="noopener noreferrer" class="">Can’t Touch This!</a>, a talk about access control, including OpenFGA at JFokus Stockholm.</p>
<p><a href="https://www.linkedin.com/in/poovamraj/" target="_blank" rel="noopener noreferrer" class="">Poovamraj Thanganadar Thiagarajan</a> from Okta will be presenting at KubeCon Europe, together with <a href="https://www.linkedin.com/in/jmlguerreiro/" target="_blank" rel="noopener noreferrer" class="">Jo Guerreiro</a> from Grafana Labs about <a href="https://kccnceu2025.sched.com/event/1txIJ/from-chaos-to-control-migrating-access-control-to-openfga-in-a-multi-tenant-world-jo-guerreiro-grafana-labs-poovamraj-thanganadar-thiagarajan-okta" target="_blank" rel="noopener noreferrer" class="">From Chaos To Control: Migrating Access Control To OpenFGA in a Multi-Tenant World</a>.</p>
<p><a href="https://www.linkedin.com/in/aaguiar/" target="_blank" rel="noopener noreferrer" class="">Andres Aguiar</a> from Okta was invited to present on the Maintainer’s Summit at KubeCon Europe aaout our experiences collaborating with the CNCF TAG-Security team: <a href="https://maintainersummiteu2025.sched.com/event/1tj8v/a-project-maintainers-guide-to-tag-security-marina-moore-edera-andres-aguiar-okta" target="_blank" rel="noopener noreferrer" class="">A Project Maintainers Guide To TAG Security</a>.</p>
<p><a href="https://www.linkedin.com/in/mark-laing/" target="_blank" rel="noopener noreferrer" class="">Mark Laing</a> from Canonical will present at FOSDEM about <a href="https://archive.fosdem.org/2025/schedule/event/fosdem-2025-6194-fine-grained-access-control-in-lxd-with-openfga/" target="_blank" rel="noopener noreferrer" class="">Fine-grained access control in LXD with OpenFGA</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month"><strong>See You Next Month:</strong><a href="https://openfga.dev/blog/fine-grained-news-2025-01#see-you-next-month" class="hash-link" aria-label="Direct link to see-you-next-month" title="Direct link to see-you-next-month" translate="no">​</a></h2>
<p>Fine-Grained News is published every month. If you have any feedback, want to share your OpenFGA story, or have a noteworthy update, please let us know on any of our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> or at <a href="mailto:community@openfga.dev" target="_blank" rel="noopener noreferrer" class="">community@openfga.dev</a>.</p>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - November 2024]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2024-11</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2024-11"/>
        <updated>2024-11-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the November edition of Fine-Grained News! As we enter the final stretch of 2024, there are exciting developments in the OpenFGA to share.</p>
<p>🌟 <strong>We hit 3,000 stars on the OpenFGA repo!:</strong> 🌟 Because of this great community, we've just this incredible milestone! Thank you so much for all the support you've shown this project. Let's keep the momentum going! If you haven't yet, we'd greatly appreciate you <a href="https://github.com/openfga/openfga" target="_blank" rel="noopener noreferrer" class="">starring the repo</a> to help push us toward 4,000 stars and grow our amazing community!</p>
<p><img decoding="async" loading="lazy" alt="Celebrating OpenFGA reaching 3,000 GitHub stars" src="https://openfga.dev/assets/images/fgn-2024-11-stars-d961d19917669492d95418e8f8ab7233.png" width="324" height="274" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="just-shipped">Just Shipped<a href="https://openfga.dev/blog/fine-grained-news-2024-11#just-shipped" class="hash-link" aria-label="Direct link to Just Shipped" title="Direct link to Just Shipped" translate="no">​</a></h2>
<p><strong>v1.8.1:</strong> This release focuses on performance and monitoring enhancements. It introduces two new flags for better control over check operations, optimizes performance for TTU relationships with set operations, and expands metrics tracking with duration measurements. Additionally, deduplication logic has been added to the <code>BatchCheck</code> API, along with new logging fields for authz calls. Read more in the <a href="https://github.com/openfga/openfga/releases/tag/v1.8.1" target="_blank" rel="noopener noreferrer" class="">Read more in the Changelog...</a></p>
<p>For more about the new OPENFGA_CHECK_ITERATOR_TTL and OPENFGA_CHECK_CACHE_LIMIT flags, run <code>./openfga run --help</code></p>
<p><strong>Batch Check API:</strong> Introduced in v1.8.0, the <code>BatchCheck</code> API significantly reduces network latency by batching authorization checks in a single request. With v1.8.1, deduplication logic increasing its efficiency further. v1.8.0 also added support for Contextual Tuples in the <code>Expand</code> API, time-based filtering in the <code>ReadChanges</code> API, and additional performance improvements. <a href="https://github.com/openfga/openfga/releases/tag/v1.8.0" target="_blank" rel="noopener noreferrer" class="">Read more in the Changelog</a> or the <a href="https://openfga.dev/docs/interacting/relationship-queries#batch-check" target="_blank" rel="noopener noreferrer" class=""><code>BatchCheck</code> API docs</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="coming-up"><strong>Coming Up</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-11#coming-up" class="hash-link" aria-label="Direct link to coming-up" title="Direct link to coming-up" translate="no">​</a></h2>
<p><strong>SDK Updates:</strong> We will be updating the SDKs next to take advantage of the new BatchCheck, starting  with Python and JavaScript. If you want to see an SDK prioritized, let us know!</p>
<p>Check out our roadmap to see what we're working on. Feature requests and ideas can be shared in <a href="https://github.com/orgs/openfga/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-highlights"><strong>Community Highlights</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-11#community-highlights" class="hash-link" aria-label="Direct link to community-highlights" title="Direct link to community-highlights" translate="no">​</a></h2>
<p><strong>OpenFGA at KubeCon:</strong> In November, <a href="https://www.linkedin.com/in/andresaguiar/" target="_blank" rel="noopener noreferrer" class="">Andres Aguiar</a> represented OpenFGA at KubeCon/CloudNativeCon. OpenFGA had a kiosk in the Project Pavilion, where Andres delivered a lightning talk and participated in <em>The Policy Engines Showdown</em> with other authorization solution providers. <a href="https://www.youtube.com/watch?v=AVA32aYObRE" target="_blank" rel="noopener noreferrer" class="">Watch the panel discussion...</a></p>
<p><img decoding="async" loading="lazy" alt="Andres Aguiar at OpenFGA&amp;#39;s KubeCon booth" src="https://openfga.dev/assets/images/fgn-2024-11-kubecon1-85f27733b8385fd1339ec1c2e168741c.jpg" width="288" height="216" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Andres Aguiar participating in The Policy Engines Showdown" src="https://openfga.dev/assets/images/fgn-2024-11-kubecon2-10ef89f7b795d8b870ad8deca04926aa.jpg" width="288" height="216" class="img_ev3q"></p>
<p><em>Andres Aguiar representing OpenFGA at KubeCon</em></p>
<p><strong>OpenFGA in Italy:</strong> <a href="https://www.linkedin.com/in/andreachiarelli/" target="_blank" rel="noopener noreferrer" class="">Andrea Chiarelli</a> presented <em>Authorize in the Cloud with OpenFGA</em> at Cloud Day 2024 in Milan.</p>
<p><img decoding="async" loading="lazy" alt="Andrea Chiarelli presenting OpenFGA in Milan" src="https://openfga.dev/assets/images/fgn-2024-11-andrea-chiarelli1-8b865d5915d209e4ba425ec08706268e.png" width="432" height="243" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Andrea Chiarelli during his talk at Cloud Day 2024" src="https://openfga.dev/assets/images/fgn-2024-11-andrea-chiarelli2-678faee102f1bf7a25d178f91f8bbc92.png" width="432" height="224" class="img_ev3q"></p>
<p><em>Andrea Chiarelli presenting at Cloud Day 2024</em></p>
<p><strong>OpenFGA Offsite:</strong> The team that works hard to bring you OpenFGA met in Chicago this November for a fun and productive offsite, diving deep into our vision, developer needs, and the roadmap ahead.</p>
<p><img decoding="async" loading="lazy" alt="OpenFGA team group photo in Chicago" src="https://openfga.dev/assets/images/fgn-2024-11-chicago-offsite-team-photo-eb4af67e361d204336a083503595de2f.png" width="1771" height="1328" class="img_ev3q"></p>
<p><em>The OpenFGA team in Chicago</em></p>
<p><strong>New Modeling Demos Available!:</strong> Learn how to model fine-grained authorization in OpenFGA's domain-specific language step-by-step with our <a href="https://www.youtube.com/playlist?list=PLUR5l-oTFZqWaDdhEOVt_IfPOIbKo1Ypt" target="_blank" rel="noopener noreferrer" class="">new demo video series</a>! Starting with the basics and gradually adding complexity, this playlist is your guide to mastering OpenFGA modeling.</p>
<p><strong>Monthly Community Meeting:</strong> Join our in depth monthly community discussions every second Thursday at <a href="https://www.worldtimebuddy.com/?qm=1&amp;lid=12,100,5,8&amp;h=5&amp;sln=11-12&amp;hf=1" target="_blank" rel="noopener noreferrer" class="">11 AM Eastern Time (US)</a>. Check out our <a href="https://github.com/openfga/community/blob/main/community-meetings.md#:~:text=OpenFGA%20Community%20Meetings" target="_blank" rel="noopener noreferrer" class="">meeting details</a> for more information.</p>
<p>November's highlights included:</p>
<ul>
<li class=""><a href="https://www.linkedin.com/in/katallaxie/" target="_blank" rel="noopener noreferrer" class="">Sebastian Döll</a> from ZEISS showcasing their Terraform/OpenFGA integration.</li>
<li class=""><a href="https://www.linkedin.com/in/justincoh/" target="_blank" rel="noopener noreferrer" class="">Justin Cohen</a> demonstrating the new Batch Check functionality.</li>
</ul>
<p>Can't make it? Catch up on our <a href="https://youtu.be/4MGF4rTzhbA?si=iGcoZTw8T99E0LKs" target="_blank" rel="noopener noreferrer" class="">latest recording</a> or browse previous sessions on our <a href="https://www.youtube.com/@OpenFGA" target="_blank" rel="noopener noreferrer" class="">YouTube channel</a>.</p>
<p><strong>Blogs and Videos for AuthZ Fans:</strong></p>
<ul>
<li class="">Granting TTL based permissions in OpenFGA: Implement TTL-based permissions in OpenFGA for time-limited access control. <a href="https://medium.com/@shruti1810/granting-ttl-based-permissions-in-openfga-2ed2073931c3" target="_blank" rel="noopener noreferrer" class="">Read more on Medium...</a></li>
</ul>
<ul>
<li class="">Overcoming Security Challenges in Protecting Shared Generative AI Environments: Explore solutions for ensuring secure, scalable, and efficient multi-tenancy in generative AI environments. <a href="https://towardsdatascience.com/overcoming-security-challenges-in-protecting-shared-generative-ai-environments-1ffb27da1bde" target="_blank" rel="noopener noreferrer" class="">Read more on Medium...</a></li>
</ul>
<ul>
<li class="">Fine-Grained Authorization for Backstage using OpenFGA: Learn how OpenFGA enables dynamic fine-grained authorization in Backstage through ReBAC models and seamless policy updates. <a href="https://www.youtube.com/watch?v=wWFbLPvwOyQ" target="_blank" rel="noopener noreferrer" class="">See the webinar on YouTube...</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-adopters"><strong>New Adopters</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-11#new-adopters" class="hash-link" aria-label="Direct link to new-adopters" title="Direct link to new-adopters" translate="no">​</a></h2>
<ul>
<li class="">
<p>Are you using OpenFGA in production? Join our growing community of adopters! Add your company to our <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md#companiesprojects-using-openfga-in-production" target="_blank" rel="noopener noreferrer" class="">ADOPTERS.md</a> file with a quick PR.</p>
</li>
<li class="">
<p>Do you offer OpenFGA implementation services? Get listed in our <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md#companies-offering-openfga-implementation-services" target="_blank" rel="noopener noreferrer" class="">Implementation Services</a> directory. Note: Listings are community-contributed and not officially endorsed by the OpenFGA project.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="announcements"><strong>Announcements</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-11#announcements" class="hash-link" aria-label="Direct link to announcements" title="Direct link to announcements" translate="no">​</a></h2>
<p><strong>OpenFGA Ranked #5 in CNCF Project Contributions!</strong>
Thanks to our amazing community, OpenFGA soared to become the 5th most active CNCF project during Hacktoberfest in October! Your contributions made this possible, and hope to continue the engagement!</p>
<p>Ready to join our community of contributors? We have opportunities for every skill level:</p>
<ul>
<li class="">Start with our <a href="https://github.com/search?q=org%3Aopenfga+is%3Aopen+label%3A%22good+first+issue%22+&amp;type=issues&amp;s=created&amp;o=desc" target="_blank" rel="noopener noreferrer" class="">Good First Issues</a> for beginner-friendly tasks.</li>
<li class="">Take on more complex challenges in our <a href="https://github.com/openfga/openfga/issues" target="_blank" rel="noopener noreferrer" class="">Issue queue</a>.</li>
<li class="">Follow our <a href="https://github.com/openfga/.github/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">Contribution Guide</a> to get started.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="CNCF projects ranked by commits during Hacktoberfest" src="https://openfga.dev/assets/images/fgn-2024-11-open-fga-ranks-5th-3bc380d0478b8988d07beaeca665cca2.jpeg" width="360" height="250" class="img_ev3q"></p>
<p><em>CNCF Projects Ranked by Commits during Hacktoberfest</em></p>
<p><strong>Follow OpenFGA on LinkedIn</strong>
Connect with a growing community of fine-grained authorization enthusiasts and expand your professional network by following our new
<a href="http://linkedin.com/company/openfga" target="_blank" rel="noopener noreferrer" class="">OpenFGA LinkedIn</a> page!</p>
<p><img decoding="async" loading="lazy" alt="OpenFGA&amp;#39;s LinkedIn page" src="https://openfga.dev/assets/images/fgn-2024-11-linkedin-9463378da14cb33d27b81eb8fb461a86.png" width="432" height="354" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month"><strong>See You Next Month:</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-11#see-you-next-month" class="hash-link" aria-label="Direct link to see-you-next-month" title="Direct link to see-you-next-month" translate="no">​</a></h2>
<p>Fine-Grained News is published every month. If you have any feedback, want to share your OpenFGA story, or have a noteworthy update, please let us know on any of our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> or at <a href="mailto:community@openfga.dev" target="_blank" rel="noopener noreferrer" class="">community@openfga.dev</a>.</p>]]></content>
        <author>
            <name>Caleb Hunter</name>
            <uri>https://github.com/hello-caleb</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - October 2024]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2024-10</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2024-10"/>
        <updated>2024-10-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the October edition of Fine-Grained News! As we approach the end of the year, we're excited to bring you the latest updates, improvements, and community contributions shaping the future of OpenFGA.</p>
<p>As always, if you’re finding the OpenFGA project to be a valuable resource, we would greatly appreciate if you would <a href="https://github.com/openfga/openfga" target="_blank" rel="noopener noreferrer" class="">star our repo</a> on GitHub to show your support!⭐</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="just-shipped">Just Shipped<a href="https://openfga.dev/blog/fine-grained-news-2024-10#just-shipped" class="hash-link" aria-label="Direct link to Just Shipped" title="Direct link to Just Shipped" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>OpenFGA v1.7.0:</strong> In our latest release, we’ve introduced Access Control. This experimental feature allows you to control access to your OpenFGA server, and of course, we built it using OpenFGA! We’ve updated our Docs to show you <a href="https://openfga.dev/docs/getting-started/setup-openfga/access-control" target="_blank" rel="noopener noreferrer" class="">how to enable this feature</a>; please share your feedback in the <a href="https://github.com/orgs/openfga/discussions/382" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a>!</p>
</li>
<li class="">
<p>This month, we’ve also added documentation of our <a href="https://github.com/openfga/openfga/pull/1923" target="_blank" rel="noopener noreferrer" class="">OpenFGA release process</a>.</p>
</li>
<li class="">
<p>We’ve <a href="https://github.com/openfga/openfga/pull/2025" target="_blank" rel="noopener noreferrer" class="">improved performance for checks involving nested tuple-to-userset relations</a>. This is commonly used when implementing nested groups. Users can enable this with the experimental flag <code>enable-check-optimizations</code>.</p>
</li>
<li class="">
<p>Following last month’s launch of OpenFGA SDK support for telemetry data using OpenTelemetry, we’ve also <a href="https://openfga.dev/docs/getting-started/configure-telemetry" target="_blank" rel="noopener noreferrer" class="">updated our Docs</a> to guide users through configuration to collect tracing data and metrics.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-progress">In Progress<a href="https://openfga.dev/blog/fine-grained-news-2024-10#in-progress" class="hash-link" aria-label="Direct link to In Progress" title="Direct link to In Progress" translate="no">​</a></h2>
<p><strong>Batch Check API Endpoint:</strong> We’re close to releasing a <a href="https://github.com/orgs/openfga/projects/1/views/1?pane=issue&amp;itemId=28481432&amp;issue=openfga%7Croadmap%7C35" target="_blank" rel="noopener noreferrer" class="">new feature</a> to enable sending multiple check operations in a single network request.</p>
<p>Check out our roadmap to see what’s in the works. Feature requests and ideas can be shared in <a href="https://github.com/orgs/openfga/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-highlights">Community Highlights<a href="https://openfga.dev/blog/fine-grained-news-2024-10#community-highlights" class="hash-link" aria-label="Direct link to Community Highlights" title="Direct link to Community Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>OpenFGA at Open Source Strategy Forum 2024:</strong> <a href="https://www.linkedin.com/in/kiah-tolliver/" target="_blank" rel="noopener noreferrer" class="">Kiah Imani</a> presented “Role-Based Access Is So Yesterday: Revolutionizing Authorization with OpenFGA” at the OSSF 2024 earlier this month. The presentation is now <a href="https://www.youtube.com/watch?v=uHKeE4DAHpE" target="_blank" rel="noopener noreferrer" class="">available in Youtube</a>
<img decoding="async" loading="lazy" alt="Kiah Imani" src="https://openfga.dev/assets/images/fgn-2024-10-kiah-imani-eceac7fa9e3d3ea9257956280ed9007c.jpeg" width="108" height="108" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>OpenFGA at KubeCon:</strong> <a href="https://www.linkedin.com/in/aaguiar/" target="_blank" rel="noopener noreferrer" class="">Andres Aguiar</a> will participate in KubeCon/CloudNativeCon in November! OpenFGA will have a Kiosk in the Project Pavilion. He'll present a <a href="https://kccncna2024.sched.com/event/1iWA6/openfga-the-cloud-native-way-to-implement-fine-grained-authorization-project-lightning-talk" target="_blank" rel="noopener noreferrer" class="">lightning talk on OpenFGA</a> and participate in <a href="https://kccncna2024.sched.com/event/1i7qp/the-policy-engines-showdown-gabriel-l-manor-permitio-andres-aguiar-okta-omri-gazitt-aserto-anders-eknert-styra-sarah-cecchetti-aws?iframe=no" target="_blank" rel="noopener noreferrer" class="">The Policy Engines Showdown</a>.<br>
<img decoding="async" loading="lazy" alt="Andres Aguiar" src="https://openfga.dev/assets/images/fgn-2024-10-andres-aguiar-68c2e8b22fedf6e908b5f6bb6ccbc920.jpg" width="108" height="108" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>OpenFGA in Italy:</strong> <a href="https://www.linkedin.com/in/andreachiarelli" target="_blank" rel="noopener noreferrer" class="">Andrea Chiarelli</a> will present <a href="https://www.cloudday.it/e/sessione/3533/Autorizzare-nel-cloud-con-OpenFGA" target="_blank" rel="noopener noreferrer" class="">Authorize in the Cloud with OpenFGA</a> at <a href="https://www.cloudday.it/e/3486/Cloud-Day-2024" target="_blank" rel="noopener noreferrer" class="">Cloud Day 2024</a> in Milan on November 20, 2024.<br>
<img decoding="async" loading="lazy" alt="Andrea Chiarelli" src="https://openfga.dev/assets/images/fgn-2024-10-andrea-chiarelli-c078f103fd5b28ef4dfff0b1245aae0e.jpeg" width="108" height="108" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>New Demp Flask App Added:</strong> To complement our OpenFGA examples and guides, we have published an <a href="https://github.com/openfga/flask-demo" target="_blank" rel="noopener noreferrer" class="">example app demonstrating the integration of OpenFGA</a>. This app utilizes several FGA features to provide a multi-user system for folder and text file sharing. Thanks to @<a href="https://github.com/openfga/flask-demo/commits?author=ryanpq" target="_blank" rel="noopener noreferrer" class="">ryanpq</a> for your contribution!<br>
<img decoding="async" loading="lazy" alt="Ryan Quinn" src="data:image/jpeg;base64,/9j/4QDKRXhpZgAATU0AKgAAAAgABgESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAAITAAMAAAABAAEAAIdpAAQAAAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAeQAAAHAAAABDAyMjGRAQAHAAAABAECAwCgAAAHAAAABDAxMDCgAQADAAAAAQABAACgAgAEAAAAAQAAAcygAwAEAAAAAQAAAcykBgADAAAAAQAAAAAAAAAAAAD/2wCEAAEBAQEBAQIBAQIDAgICAwQDAwMDBAUEBAQEBAUGBQUFBQUFBgYGBgYGBgYHBwcHBwcICAgICAkJCQkJCQkJCQkBAQEBAgICBAICBAkGBQYJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCf/dAAQAB//AABEIAGwAbAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP4B6KKKACiiigAooooAKK99+Hn7O3j3xxpKeLLuH+ytCY8X10pVHA6mFeGlAPBK8Z4BJGKm8S/s7+KtJsZ9Q0CeLWEtiN624bftPQovO/3A5GOhoA+fKKUgqcMMUlABRRRQAUUUUAf/0P4DmT1qEjFaLR1AUx0oAqUVIU9KjxjigBVUsQqjJPAAr9wf+CZH/BHnx5+2RBP8ZPik0/hv4aaJdi0u74bVub27AybKyVv4o+PtExG2H/VjMgfy/wApf2evC8fjL4zeHPDbxyStd30UaJFt3MxztVdwYZLbccdM8V/f38LvDMnws/Z98C/s9eDp10/S9BhitsSt891KPmmkIGNzvISzt3JNAHp3w1/4J0fsT+F/Btj4M0PwJp8tnaW6QxSXu67n8tRxmWYsfwGBXFeMf+CRP7IniMyTeHPDkfh+4c7t+mO1uC3UNtU7QwIBzjrX2/o0k2jQWdqTklVGB09wK+hNEkElr52AfegD+DL/AIKif8ExdQ/Zz8W2OqKkX9ieI7iSKx1pIwu28CAi3vwOB5wBKuoxuHGCQp/AHWdF1Pw9qk+i6zC1vc2rtFLG3VWXgj0+mOCMYr/U5/bU8A+GviT+zR4r8OeIrOO5jWzMyBlBIaPn5Tg7TjuK/wA7/wD4KA/DS1+Gni7TtHuYWF5GpWO5fG65tCA0ZYg4Yx52bsDjg54wAfnlRRRQAUUUUAf/0f4KHixVV466KSD2rPkgx0oAxWjqBk9RWq0eKrNH2oA+7/2IfgP4+1rxTa/tA2yfZNA8FapZXU91Ko8qW4jxPFYhgwZZbmLPlnaVAHJBwp/Wzxz/AMFFfilrniRfiFfz6XZjTZj9l0xi3CKf3arKFHzY+9xX5nf8E3PiTZ2PxCvfgh4thuLvw/4zVftCxTlDbvp8bSLJHGcozupCZwGUAYPav1K0r9lP4feMvGemaJDZPFYapeJbW/8AaB+xGRXP+seQ7zEqj5nfHKqcDJFAH6D/AAS/bj+N3j79nW4+NvjjQn8PQsst5Z6lcPGbEQQuIvK2g+c0xJwiKhBHOe1dj8Ev+Csfxh8YeKD4UmHhYw53RQXRura4aJe+4Kyn8BxX6t/DT9nj4dad+yWP2fdWs4NV0dtPNnkAIDxtLxNg+We6t1HFfG/7O/7DVn8GvF19rNzp+m62p3Q2N3JChuUgb7yvkEDOBnbwSM8UAfXHg39sL4efFDT9b8J+MdD1bRobazH2nUHtJJ9JxNG2PLvYhtYfKc5UbeA2Miv4cv8AgrXZeI774lWOrRM2o6Bp/mQWupQxSNZyfacSxpHchPJZvLjz5e/eAM7cV/oCeCPCNt4F0oabZxIlswx5S/cAb7y/THavxn/4LTDQtL/4JXaj4cs0tkksr7S4rNdqJ+/XVbUoVA43GAvz12Bu1AH8CtFAxjiigAooooA//9L+F2a19RWZLbEV281rWRNa+lAHHSQVQeHFdXNbCsyS39qAPrb/AIJ+3Onaf+1R4Xub88ob0xj1f7PwPyzX7RfGXxxb+JdNvI31B7a6eNvJ2feB+6CfQDI4r+eD4S+JrzwH8T9D8U2ClprO5DBV+9tZWjfAHbDc1+j2gyeI/iVql7rgu57eE7VNvbDexUkE5zkjoOBigD97/wBhH9vf4pXtp4e+E3jsXQttEXy7jUyy7rlGGP3lsYzuj6BZFdWzyRiv3F+D2peHri4lTw/qSapYGQkDeGeAt1jOOwPT0HFfi/8AsceEfhnq+mad4Q1nTNTaBIkRL6C5ZpI3YbyDjkKO67iF4GOa+2tH+AF/+zl8V7T4j/DbXbq40DUZHTUtPvijunmj5Z4nULkBsAoRwOnpQB+qWt4tbQKuOxr+If8A4L8fto+A/iYngn9lj4T6pHf2/hR7298R+SuY11nebeO3ZjwZLaIylwOFZ16Yr+oT9pz9q/Rfg98L5tZ1W5WLVJE+zwIcnE7kRLnA+4HZfm4r/Nw+M0/jO4+KXiF/iC7Sa1/ad59tZs4Nw0zNIV3fwknK8AYoA8wooooAKKKKAP/T/ilntfao9M8Naz4j1SLQ/D1nPf3lwcRwW0Zkkbt0HQDjLMQq9yK9M8NeCPEXjnxDbeFfClqbu+ujhEB2qqj7zu3RI1/iY/QAkgH7+0r4T2n7MNrpuu2t219f3ckNpq84yiJHJICFji+8seeCfvHjccCgD4n0T9jn4263NsvLOz0uNP8AWtc3QZoxnBzHEp3Ef3VfHbNb1v8AsqeHfDZfU/HfiCO+iiJUWNtC1qZGH96dmYqgA52gE9Olfprqup6NqGqTa5dJJABGUVYRwAvAwBz83sMV8g/H7RBpA07WbF2m0+8k8m8XH3A/3W9vTPb0oA89+MF38PvhTb+FtE+G2lW2k22p5vb+aFcy3EMMTlFaQ87QxBxkZPWuu/YQ/aW8DaDrM+na1FIl9NJ+4Z4t6jgkbmXjkseuM7RXD/Fbw/oHinxjpfhXVUlKDQ5EtiCAAQ0KZDEg8BvfPtivJ4/gPL8Pf2iz4S0eR00u5t2uIGKu4AQhWX5ct8h/j2nCnnA5AB/Tz4B/4KGfDvQvKm0YfZLuFY7OXJUxqQpM8rbcLs4+Q/Qda9k1X9rf4rftRjQ2+DXh6Sy07SC15f6xqf8Ao9nHHCCdpJG4jYM5x0PtX5oeB/2P/g7r37Pl34pl8Q6THrkFyfkkl2v5BX5keMFgwLDKuvGKt/8ABQf9tPS/hP8AsZ2n7LfgnUbT+1/EdisGsmyIbytPwBJEWxgPdY8s9xHuxg4oA8Dh/by1v9qT4seNPDOr2i6poSQwXlpPtcNLHp90sluqIceRHMy+bgks67d2BlR8+/thfsTxeOvH918TfC2sLY6hrUCXt1Z36Zh8/wArny5o8FV2x7iCGx1HHFYn7Dnw51Lw54Kn+I2uRkHxPIpVTtVfssZ/d5PON5zjA6HgZr3bxp43uviR8bYfBltK9v8AYUJuijEDzWChYgDyoRFCheuOvJNAH5I/Ez9kj4q/Dbwsnje6ittQ0llLG5sJDIsajAzIjqrqOfvgFR3218uMrIxRxgjgj0xX9APxZ8QzS/Hfwx8NPDzs9tollm7RlVVlN4o3wsOAyeV95SByVPUAjzP43fsFfATRdMg8SafqOpaM965hWJWjubWFiCVx5ibgq9Nu8DGMEUAfiRRX0j8cP2ZvHHwWis9euGi1Tw/qjFLHU7X/AFUrgFvKZG+aOXaM7DkEfdZug+bqAP/U/Bf4EfDe18CeE5Lm9sVvdR1NEe7Ec4jnhUcpGgB6oOdv8TZ7Vk/GvTru8+GGo6ta3E88NqDNbvIpF3amM5McyjPmwvjDdGXt0r2KTwNr1+ia1rTaXeXKKr+fbK9rcRjsNyNgkDqe/SnXELX+nzQ3V28jTKI2Mu0lkzjaSApZe3zDcOOTQByegJ/wmuiWuoyRq/nWQbMYIUhkxyR046d68G1gW/in4Dvr9zEFVrSZDyfmliU7XTjtgGvSPhvrl/8AD74Qa7eakrWj+G477z48M237MreUUP3SrRlSMY4I4rzTSLy60T9jEwXUSG9ktRbLIR8yz3eBjbxghmJAA/woA8F+Nmm6m/w58JfFnR0K3ENstpMWOF/fR+ZGWHBz5saLxwQcemPt/TbDw14h+LHw5+Kd+HlgsdVtvtbxckWmowGLeMA5xN5bsOgRTnGK5f4vfDtLr9lu5trfY1xZWcVxEPe1CyoBxlnyuOO3GK3v2HLu2+IHwn0zSLpztsX/ALM3D7qxLIIYjjjczRSAjJA9KAP02/aB8KeFvg1os/xJ1+3sbmzsSS3yDMhPIiQ7dxZvTJA6ZxX882reGfF/7VXx9htdaijtoNUla7mtrZQv2ewQ4ijZtxIMrbV+UjuccV/QJ/wUP8RR6p+x34JkgIYeIbiznZYwAAIrbzn46dV28euOK/LT9mHwybPwv44+JrQqbkSywQSDaR5dlAF2ZJAA8+SQfVR6UAeu6r40t/CGi/8ACL+FDGYdGtxGZJF4jQAjauRjlh97jOBjivN/2OdCm1LxDdeMLv5oN8ks7yYVsKTIxyRyTg8emenFef8AxS1iw034Vo1uQs92mwDJwdo/edcE7ccE/h616/8ACWKPwB+x34n8eqE+0TQG3iTGGV7ltiMqk4z2Pt0oA+PNO+IK6p8drvxveKPM1i9eZG4wqyMFh6nHyxLGo9MV9a/tP+IpL3SfCugSTFWuUa5dDtYEM4Rc7eM4JHPavij4waHp3hjwhoviK3XbOkKzSR553R4ydv8Adx2619KfFy9tvE/xB8K2EHzA2drHLtPGAdzH8vx/lQB+lXgzwh8Krz4E2/g/4q6Aus2OvCHTIrO6C4jaUZMysOVaNQGjdSGBHFfzF/tC/AfXfgH8Z/EHwj1+VGl0W6MUU7MqC4gYB4JlDbeHjZc4GN2Rk4r+oX4h6p4M8OeEbAeMA4bR2gubWzgIR55XgKbSxwEh2/efgjsM4rV0rUrH4q6Ta+JvEHwxs9WdYxBFPcQIZPKTlVOQemTt5Py4oA//1fyb1O60C52PaebA6pyY90mFJ+TnpuUdT2FYU43fKj4BGc4KjI7luvX1+oqp4gmu9L0WDVdPmaJy7oVG3Zt+7jGPSo9PZjpz6o53TW6qVLcg4UkAjoRkdKAPD/ijcWGl/Db4qrC7QyzaMcoclHMkBj4PY4C9Bg1zmqR2uv6d4R+Gem7DLDtvJSM4cRgCNT2PzevQCsz9oXV72Tw948tZCrG8tbO2kfaN3ltsGB2GNxxxxVb9m3Z4g8c/atXUTP8AaUhGR91UA27fTHagD7t8d6Lc3nw2vtFPko8ljIwWNfLGNnQN25BPp2NfD3/BLC+j1bV/7DOzyvteiylGJG6R7gwbF5x0tlbHrzX3ZrtxO1jqNwXJ/dyxlTypHlk9D0/DFfnF/wAEwL57Lxg1vGiMh1Dw/wAEf9Re4Xtjtx+HFAH6AftJ+Ok+Ifw9+CvwuQ4hTUvFizyKD+7t9BvprT5sdvuge3tXkP7NIOofs3ac13G8RvbHUNScgAqW1C9mlRRnHzqmMHGOOPSuV+KWs6jp3w3k1KykMc9honxTe3cdY2fxFEpK+hwxxiul+BOo3tt8C/CvkSFR/wAI1YAAHgY44/OgD8/PjT4iuf7dTwdAx8nT3EaqSesmCWPbjpX3l4w0VdE/YTEFiD9pdtOadDyWBnTONuAMfeZT2PpX50/E2EH4wywbmxLeqGOeeG6/pX6j/E2+uZP2UdY0ByDbrNYnG1c8n6e3btQB+Vn7R3iOOb+yNBhlLxtYqskbFSIyx+6COgx+QFfWf7PV9p/xI+L2j6jqQylnDEmQuCdm2P5sfmT61+bfxIuZL3xNG02PkO0YHQYFfo5+wnLINQeXcc+WT/46ePwxxQB754l8cRfEb496xeIg1+DS7r+z7WyJH9mWS2o2GW6l/wCW028Mdoyq4UFQRmv0G8L/ABK8WJocCXWradG6jG1bfzAB/DzwOmOBwOlfiH8G7+/8Q3t5a3czx28PnXnkxHYjyyO0jF+7fMxOCa/Tnw1p1rbaeYAu7awG48E/KvJ24GfwoA//2Q==" width="108" height="108" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>Monthly Community Meeting:</strong> Join us for our monthly <a href="https://github.com/openfga/community/blob/main/community-meetings.md#:~:text=OpenFGA%20Community%20Meetings" target="_blank" rel="noopener noreferrer" class="">Community Meetings</a>, held on the second Thursday of every month at <a href="https://www.worldtimebuddy.com/?qm=1&amp;lid=12,100,5,6,8&amp;h=5&amp;sln=11-12&amp;hf=1" target="_blank" rel="noopener noreferrer" class="">11 AM Eastern Time (US)</a>. Our next meeting is on Thursday, November 14, 2024. Our community meetings are a great way to stay updated with the latest developments, ask questions, and engage with the OpenFGA community. If you can’t join the meetings live, our <a href="https://youtu.be/LITUfwqpNIo?si=ze7dhGG46rhatWBN" target="_blank" rel="noopener noreferrer" class="">latest month's video</a> will always be posted on our <a href="https://www.youtube.com/@OpenFGA" target="_blank" rel="noopener noreferrer" class="">YouTube channel</a>!</p>
<p>As always, we welcome community members to demo their use cases. If you want to demo your implementation of OpenFGA, please contact any of the OpenFGA team on our community channels linked below.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-adopters">New Adopters<a href="https://openfga.dev/blog/fine-grained-news-2024-10#new-adopters" class="hash-link" aria-label="Direct link to New Adopters" title="Direct link to New Adopters" translate="no">​</a></h2>
<ul>
<li class="">
<p>This month, we welcome <a href="https://www.gilion.com/" target="_blank" rel="noopener noreferrer" class="">Gillion</a> and <a href="https://flex.team/" target="_blank" rel="noopener noreferrer" class="">Flex</a> as OpenFGA adopters! If you or your company have implemented OpenFGA, we would love to hear about it! Please add your name as an adopter by updating the <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md#companiesprojects-using-openfga-in-production" target="_blank" rel="noopener noreferrer" class="">ADOPTERS.md</a> file and sending us a PR.</p>
</li>
<li class="">
<p>If you or your company provides implementation services for OpenFGA, we invite you to share your information with the community in our <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md#companies-offering-openfga-implementation-services" target="_blank" rel="noopener noreferrer" class="">Implementation Services</a> section of the ADOPTERS.md file by sending us a PR! However, please note that the OpenFGA project has not evaluated or endorsed the individuals and companies listed, and inclusion does not imply endorsement.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="announcements">Announcements<a href="https://openfga.dev/blog/fine-grained-news-2024-10#announcements" class="hash-link" aria-label="Direct link to Announcements" title="Direct link to Announcements" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Hacktoberfest Highlights:</strong> This Hacktoberfest, we welcomed 13 new contributors making their first commit to OpenFGA! Thanks to the incredible community participation, we saw a 28% increase in pull requests compared to September and a remarkable 260% increase in PRs on the SDK Generator. A huge thanks to this community for your continued participation and contributions!</p>
</li>
<li class="">
<p><strong>OpenFGA Community Meeting Updates:</strong> We are adding chapters to our <a href="https://www.youtube.com/@OpenFGA" target="_blank" rel="noopener noreferrer" class="">YouTube channel</a> videos to simplify content navigation. We’ve begun with the most recent videos and will add chapters as time goes on. We have also begun releasing <a href="https://www.youtube.com/playlist?list=PLUR5l-oTFZqXYaB3W_OEEsUhI4l8iLYNe" target="_blank" rel="noopener noreferrer" class="">demos</a> as individual videos for easier content consumption. You can catch this month’s demos on <a href="https://www.youtube.com/watch?v=ws9BjricJu4" target="_blank" rel="noopener noreferrer" class="">Modular Authorization</a> and  <a href="https://www.youtube.com/watch?v=sst9PyvPHSk" target="_blank" rel="noopener noreferrer" class="">Client-Side Caching</a>, with Materialize Integration coming soon!</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month">See you Next Month<a href="https://openfga.dev/blog/fine-grained-news-2024-10#see-you-next-month" class="hash-link" aria-label="Direct link to See you Next Month" title="Direct link to See you Next Month" translate="no">​</a></h2>
<p>Fine-Grained News is published every month. If you have any feedback, want to share your OpenFGA story, or have a noteworthy update, please let us know on any of our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> or at <a href="mailto:community@openfga.dev" target="_blank" rel="noopener noreferrer" class="">community@openfga.dev</a>.</p>]]></content>
        <author>
            <name>Caleb Hunter</name>
            <uri>https://github.com/hello-caleb</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - September 2024]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2024-09</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2024-09"/>
        <updated>2024-09-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the September edition of Fine-Grained News! As we transition into the fall season, we’re excited to bring you the latest updates on the progress of OpenFGA.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="just-shipped"><strong>Just Shipped</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-09#just-shipped" class="hash-link" aria-label="Direct link to just-shipped" title="Direct link to just-shipped" translate="no">​</a></h2>
<ul>
<li class="">
<p>We shipped <a href="https://github.com/openfga/openfga/releases/tag/v1.6.1" target="_blank" rel="noopener noreferrer" class="">OpenFGA v1.6.1</a> with performance fixes, bug fixes, and a new SQLite storage adapter contributed by <a href="https://grafana.com/" target="_blank" rel="noopener noreferrer" class="">Grafana</a>. Thanks <a href="https://github.com/DanCech" target="_blank" rel="noopener noreferrer" class="">@DanCech</a>!</p>
</li>
<li class="">
<p>This month we released improved <a href="https://openfga.dev/docs/getting-started/configure-telemetry" target="_blank" rel="noopener noreferrer" class="">OpenTelemetry metrics support</a> for <a href="https://github.com/openfga/dotnet-sdk/releases" target="_blank" rel="noopener noreferrer" class="">.NET SDK</a>, <a href="https://github.com/openfga/go-sdk/releases/tag/v0.6.1" target="_blank" rel="noopener noreferrer" class="">Go SDK</a>, <a href="https://github.com/openfga/java-sdk/releases/tag/v0.7.1" target="_blank" rel="noopener noreferrer" class="">Java SDK</a>, and <a href="https://github.com/openfga/js-sdk/releases/tag/v0.7.0" target="_blank" rel="noopener noreferrer" class="">JavaScript SDK</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-progress"><strong>In Progress</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-09#in-progress" class="hash-link" aria-label="Direct link to in-progress" title="Direct link to in-progress" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>Authorization for OpenFGA</strong>: OpenFGA currently supports global pre-shared keys and OIDC for API authentication, but <a href="https://github.com/openfga/roadmap/issues/30" target="_blank" rel="noopener noreferrer" class="">we’re exploring more granular authorization options</a>, such as store-specific credentials and varying permissions for stores, modules, and types.</p>
</li>
<li class="">
<p><strong>Batch Check</strong>: OpenFGA SDKs currently implement BatchCheck by issuing multiple parallel request to the OpenFGA server. We'll be implementing a <a href="https://github.com/openfga/roadmap/issues/35" target="_blank" rel="noopener noreferrer" class="">BatchCheck server endpoint</a> to improve performance and reduce network overhead.</p>
</li>
</ul>
<p>Check out our <a href="https://github.com/orgs/openfga/projects/1/views/1" target="_blank" rel="noopener noreferrer" class="">roadmap</a> to see what’s in the works. Feature requests and ideas can be shared in <a href="https://github.com/orgs/openfga/discussions/categories/ideas" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-highlights"><strong>Community Highlights</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-09#community-highlights" class="hash-link" aria-label="Direct link to community-highlights" title="Direct link to community-highlights" translate="no">​</a></h2>
<ul>
<li class=""><strong>OpenFGA at Open Source Summit Europe:</strong> <a href="https://www.linkedin.com/in/jcchavezs/" target="_blank" rel="noopener noreferrer" class="">José Carlos Chávez</a> gave a talk on <a href="https://osseu2024.sched.com/event/1ej2u/fine-grained-policies-rbac-with-openfga-jose-carlos-chavez-okta" target="_blank" rel="noopener noreferrer" class="">RBAC with OpenFGA</a> at OSS Europe 2024 in Vienna, Austria this month. You can see the presentation deck <a href="https://speakerdeck.com/jcchavezs/fine-grained-policies-rbac-with-openfga" target="_blank" rel="noopener noreferrer" class="">here</a>.</li>
<li class=""><strong>OpenFGA at Open Source Strategy Forum 2024:</strong> <a href="https://www.linkedin.com/in/kiah-tolliver/" target="_blank" rel="noopener noreferrer" class="">Kiah Imani</a> will present <a href="https://sossfusion2024.sched.com/event/1hcQa?iframe=no" target="_blank" rel="noopener noreferrer" class="">Role-Based Access Is So Yesterday: Revolutionizing Authorization with OpenFGA</a> at OSSF on Wednesday, October 23, 2024. In this session, attendees will learn how OpenFGA addresses the limitations of RBAC, enhancing security, performance, and access management across various systems.</li>
<li class=""><strong>OpenFGA at KubeCon:</strong> <a href="https://www.linkedin.com/in/aaguiar/" target="_blank" rel="noopener noreferrer" class="">Andres Aguiar</a> will participate in KubeCon/CloudNativeCon in November! OpenFGA will have a Kiosk in the Project Pavilion. He'll present a <a href="https://kccncna2024.sched.com/event/1iWA6/openfga-the-cloud-native-way-to-implement-fine-grained-authorization-project-lightning-talk" target="_blank" rel="noopener noreferrer" class="">lightning talk on OpenFGA</a> and participate in <a href="https://kccncna2024.sched.com/event/1i7qp/the-policy-engines-showdown-gabriel-l-manor-permitio-andres-aguiar-okta-omri-gazitt-aserto-anders-eknert-styra-sarah-cecchetti-aws?iframe=no" target="_blank" rel="noopener noreferrer" class="">The Policy Engines Showdown</a>.</li>
<li class="">We added new authorization model examples for <a href="https://github.com/openfga/sample-stores/tree/main/stores/multitenant-rbac" target="_blank" rel="noopener noreferrer" class="">multi-tenant RBAC</a> and how to define <a href="https://github.com/openfga/sample-stores/tree/main/stores/abac-with-rebac" target="_blank" rel="noopener noreferrer" class="">ABAC policies using ReBAC</a>.</li>
<li class=""><strong>Guide to Building Auth Systems:</strong> Level Up Coding offers a <a href="https://levelup.gitconnected.com/complete-guide-to-building-authorization-systems-using-rbac-rebac-and-abac-0a2ce5311d25" target="_blank" rel="noopener noreferrer" class="">comprehensive guide</a> to building authorization systems using RBAC, ReBAC, and ABAC models. The guide covers the differences between these approaches and when to use each.</li>
<li class=""><strong>High Marks for OpenFGA Policy Languages:</strong> Trial Of Bits published a report comparing the security of the <a href="https://github.com/trailofbits/publications/blob/master/reports/Policy_Language_Security_Comparison_and_TM.pdf" target="_blank" rel="noopener noreferrer" class="">Cedar, OPA, and OpenFGA policy languages</a>. OpenFGA was very well evaluated!</li>
<li class=""><strong>September Community Meeting:</strong> Check out the <a href="https://www.youtube.com/watch?v=p_ERXS8Dsu4&amp;list=PLUR5l-oTFZqUneyHz-h4WzaJssgxBXdxB&amp;index=18" target="_blank" rel="noopener noreferrer" class="">September Community Meeting</a>, which is posted on YouTube! In last month’s meeting, we reviewed recent updates, demos with <a href="https://github.com/openfga/openfga-envoy" target="_blank" rel="noopener noreferrer" class="">Envoy</a>, an OpenFGA Kubernetes Operator, fine-grained access for OpenFGA, and reviewed the results of the 2024 Community Survey.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-adopters"><strong>New Adopters</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-09#new-adopters" class="hash-link" aria-label="Direct link to new-adopters" title="Direct link to new-adopters" translate="no">​</a></h2>
<ul>
<li class="">If you or your company have implemented OpenFGA, we would love to hear about it! Please add your name as yourself as an adopter by updating the <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md#companiesprojects-using-openfga-in-production" target="_blank" rel="noopener noreferrer" class="">Adopters.md</a> file and send us a PR.</li>
<li class="">If you or your company provides implementation services for OpenFGA, we invite you to share your information with the community in our <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md#companies-offering-openfga-implementation-services" target="_blank" rel="noopener noreferrer" class="">Implementation Services</a> section of the Adopters.md file by sending us a PR! However, please note that the listed individuals and companies have not been evaluated or endorsed by the OpenFGA project, and inclusion on the list does not imply endorsement.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="announcements"><strong>Announcements</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-09#announcements" class="hash-link" aria-label="Direct link to announcements" title="Direct link to announcements" translate="no">​</a></h2>
<ul>
<li class=""><strong>Hacktoberfest 2024:</strong> <a href="https://hacktoberfest.com/" target="_blank" rel="noopener noreferrer" class="">Hacktoberfest</a> is a month long celebration of open source software which encourages new and experienced developers alike to contribute code to open source projects during the month of October. This makes October a great time to become an OpenFGA contributor! We have labeled a number of issues on GitHub with "Hacktoberfest" and "Good First Issue" labels making it easy to find a way to get involved and have your code included in OpenFGA.</li>
<li class=""><strong>Monthly Community Meeting:</strong> Join us for our monthly Community Meetings, held on the second Thursday of every month at 11 AM Eastern Time (US). Our next meeting is on Thursday, October 10, 2024. Our community meetings are a great way to stay updated with the latest developments, ask questions, and engage with the OpenFGA community. If you would like to demo your implementation of OpenFGA, please reach out to us on any of our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> or at <a href="mailto:community@openfga.dev" target="_blank" rel="noopener noreferrer" class="">community@openfga.dev</a>. You can find the link to the meeting invite <a href="https://openfga.dev/docs/community#monthly-community-meetings" target="_blank" rel="noopener noreferrer" class="">here</a>. We look forward to seeing you there!</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month"><strong>See You Next Month!</strong><a href="https://openfga.dev/blog/fine-grained-news-2024-09#see-you-next-month" class="hash-link" aria-label="Direct link to see-you-next-month" title="Direct link to see-you-next-month" translate="no">​</a></h2>
<p>Fine-Grained News is published every month. If you have any feedback, want to share your OpenFGA story, or have a noteworthy update, please let us know on any of our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> or at <a href="mailto:community@openfga.dev" target="_blank" rel="noopener noreferrer" class="">community@openfga.dev</a>.</p>]]></content>
        <author>
            <name>Caleb Hunter</name>
            <uri>https://github.com/hello-caleb</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - August 2024]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2024-08</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2024-08"/>
        <updated>2024-08-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the August 2024 edition of Fine-Grained News! We are excited to bring you the latest updates, features, and community highlights from OpenFGA.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="just-shipped">Just Shipped!<a href="https://openfga.dev/blog/fine-grained-news-2024-08#just-shipped" class="hash-link" aria-label="Direct link to Just Shipped!" title="Direct link to Just Shipped!" translate="no">​</a></h2>
<ul>
<li class="">
<p><strong>OpenFGA v1.6.0:</strong> The <a href="https://github.com/openfga/openfga/releases/tag/v1.6.0" target="_blank" rel="noopener noreferrer" class="">latest OpenFGA release</a> enables support for <a href="https://openfga.dev/docs/interacting/consistency" target="_blank" rel="noopener noreferrer" class="">query consistency options</a> and includes additional performance enhancements.</p>
</li>
<li class="">
<p><strong>Query Consistency Options in SDKs:</strong> All OpenFGA SDKs now support specifying <a href="https://openfga.dev/docs/interacting/consistency" target="_blank" rel="noopener noreferrer" class="">a query consistency parameter</a> for OpenFGA query endpoints. Make sure to update to the latest versions of the SDKs and OpenFGA to take advantage of this feature.</p>
</li>
<li class="">
<p><strong>Metrics Telemetry for SDKs:</strong> We already supported OpenTelemetry metrics in the <a href="https://github.com/openfga/python-sdk/" target="_blank" rel="noopener noreferrer" class="">Python</a> and <a href="https://github.com/openfga/js-sdk/" target="_blank" rel="noopener noreferrer" class="">Javascript</a> SDKs. We’ve just added support in <a href="https://github.com/openfga/java-sdk/releases/tag/v0.6.1" target="_blank" rel="noopener noreferrer" class="">the Java SDK</a>, and <a href="https://github.com/openfga/go-sdk/releases/v0.6.0" target="_blank" rel="noopener noreferrer" class="">the GO SDK</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-advisory">Security Advisory<a href="https://openfga.dev/blog/fine-grained-news-2024-08#security-advisory" class="hash-link" aria-label="Direct link to Security Advisory" title="Direct link to Security Advisory" translate="no">​</a></h2>
<p>We recently addressed a security issue, identified as GHSA-3f6g-m4hr-59h8, that was present in OpenFGA v1.5.7 and v1.5.8. This issue has been fixed starting v1.5.9, and we strongly recommend all users update to the latest version to ensure their systems remain secure. For more details, please refer to the <a href="https://github.com/openfga/openfga/security/advisories/GHSA-3f6g-m4hr-59h8" target="_blank" rel="noopener noreferrer" class="">security advisory</a> on our GitHub page.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-progress">In Progress<a href="https://openfga.dev/blog/fine-grained-news-2024-08#in-progress" class="hash-link" aria-label="Direct link to In Progress" title="Direct link to In Progress" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/openfga/roadmap/issues/41" target="_blank" rel="noopener noreferrer" class="">Support for OpenTelemetry tracing and logging</a></li>
<li class=""><a href="https://github.com/openfga/roadmap/issues/61" target="_blank" rel="noopener noreferrer" class="">Performance Improvements for OpenFGA queries</a></li>
<li class=""><a href="https://github.com/openfga/roadmap/issues/30" target="_blank" rel="noopener noreferrer" class="">Additional OpenFGA API Authorization Options</a></li>
<li class=""><a href="https://github.com/openfga/roadmap/issues/56" target="_blank" rel="noopener noreferrer" class="">SQLite Storage Adapter</a>, thanks to <a href="https://grafana.com/" target="_blank" rel="noopener noreferrer" class="">Grafana</a> for the contribution!</li>
</ul>
<p>Curious about what’s coming next for OpenFGA? Check out our <a href="https://github.com/orgs/openfga/projects/1/views/1" target="_blank" rel="noopener noreferrer" class="">roadmap</a> to see what’s in store. We also welcome your feature requests and ideas in <a href="https://github.com/orgs/openfga/discussions/categories/ideas" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-highlights">Community Highlights<a href="https://openfga.dev/blog/fine-grained-news-2024-08#community-highlights" class="hash-link" aria-label="Direct link to Community Highlights" title="Direct link to Community Highlights" translate="no">​</a></h2>
<ul>
<li class=""><strong>CNCF Security TAG:</strong> This month, <a href="https://www.linkedin.com/in/aaguiar/" target="_blank" rel="noopener noreferrer" class="">Andrés Aguiar</a> presented OpenFGA to the <a href="https://tag-security.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF Security Technical Advisory Group (TAG)</a>, where he discussed the project's current <a href="https://github.com/cncf/tag-security/issues/1339" target="_blank" rel="noopener noreferrer" class="">status</a> and showcased various use cases. You can see the presentation deck <a href="https://docs.google.com/presentation/d/1-TFfvKPi3jJ-jO-bjsHb3Soj_kKcQCf4Y_UvST7z744/edit#slide=id.p" target="_blank" rel="noopener noreferrer" class="">here</a>. It’s a great way to see how OpenFGA is being utilized and what’s on the horizon for the project.</li>
<li class=""><strong>API Security: APISIX + OpenFGA:</strong> Check out this <a href="https://dev.to/kaankahraman/supercharging-api-security-apisix-with-openfga-45da" target="_blank" rel="noopener noreferrer" class="">blog post</a> by Kaan Kahraman on enhancing API security by integrating <a href="https://apisix.apache.org/" target="_blank" rel="noopener noreferrer" class="">APISIX</a> with OpenFGA.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="upcoming-events">Upcoming Events<a href="https://openfga.dev/blog/fine-grained-news-2024-08#upcoming-events" class="hash-link" aria-label="Direct link to Upcoming Events" title="Direct link to Upcoming Events" translate="no">​</a></h3>
<ul>
<li class=""><strong>Join Us at Open Source Summit Europe 2024:</strong> <a href="https://www.linkedin.com/in/jcchavezs/" target="_blank" rel="noopener noreferrer" class="">José Carlos Chávez</a> will present at Open Source Summit Europe 2024 in Vienna, Austria on September 16, 2024! He will discuss <a href="https://osseu2024.sched.com/event/1ej2u/fine-grained-policies-rbac-with-openfga-jose-carlos-chavez-okta" target="_blank" rel="noopener noreferrer" class="">Fine-Grained Policies: RBAC with OpenFGA</a>. We look forward to seeing you there!</li>
<li class=""><strong>OpenFGA at Open Source Strategy Forum 2024:</strong> <a href="https://www.linkedin.com/in/kiah-tolliver/" target="_blank" rel="noopener noreferrer" class="">Kiah Imani</a> will present <a href="https://sossfusion2024.sched.com/event/1hcQa?iframe=no" target="_blank" rel="noopener noreferrer" class="">Role-Based Access Is So Yesterday: Revolutionizing Authorization with OpenFGA</a> at OSSF on Wednesday, October 23, 2024. In this session, attendees will learn how OpenFGA addresses the limitations of RBAC, enhancing security, performance, and access management across various systems.</li>
<li class="">We'll be participating of KubeCon / CloudNativeCon North America! OpenFGA will have a Kiosk in the Project Pavilion, we'll present a <a href="https://kccncna2024.sched.com/event/1iWA6/openfga-the-cloud-native-way-to-implement-fine-grained-authorization-project-lightning-talk" target="_blank" rel="noopener noreferrer" class="">lightning talk on OpenFGA</a> and participate in <a href="https://kccncna2024.sched.com/event/1i7qp/the-policy-engines-showdown-gabriel-l-manor-permitio-andres-aguiar-okta-omri-gazitt-aserto-anders-eknert-styra-sarah-cecchetti-aws?iframe=no" target="_blank" rel="noopener noreferrer" class="">The Policy Engines Showdown</a>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-adopters">New Adopters<a href="https://openfga.dev/blog/fine-grained-news-2024-08#new-adopters" class="hash-link" aria-label="Direct link to New Adopters" title="Direct link to New Adopters" translate="no">​</a></h3>
<p>We want to welcome <a href="https://patikaglobal.com/" target="_blank" rel="noopener noreferrer" class="">Patika Global Technology</a> as an OpenFGA adopter! If you're using OpenFGA in production, we encourage you to add your company or project to our <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md" target="_blank" rel="noopener noreferrer" class="">Adopters list</a> by opening a PR. Please include a short description of your use case in your submission. If you’ve previously added your company or project to the adopter's list, we would appreciate you updating it to include a short description. Your contributions help the community, and we greatly appreciate your support!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga-service-providers">OpenFGA Service Providers<a href="https://openfga.dev/blog/fine-grained-news-2024-08#openfga-service-providers" class="hash-link" aria-label="Direct link to OpenFGA Service Providers" title="Direct link to OpenFGA Service Providers" translate="no">​</a></h3>
<p>We’ve added a new section within the Adopters list for those offering OpenFGA <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md#companies-offering-openfga-implementation-services" target="_blank" rel="noopener noreferrer" class="">implementation services</a>. If your organization wants help adopting OpenFGA, this resource can connect you with professionals specializing in our technology. If your company provides implementation services for OpenFGA, we invite you to add your details by sending us a PR!  Please note that the listed companies have not been individually evaluated or endorsed by the OpenFGA project, and inclusion on the list does not imply endorsement.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="announcements">Announcements<a href="https://openfga.dev/blog/fine-grained-news-2024-08#announcements" class="hash-link" aria-label="Direct link to Announcements" title="Direct link to Announcements" translate="no">​</a></h3>
<ul>
<li class=""><strong>OpenFGA Joins Docker-Sponsored Open Source Program:</strong> We’re excited to share that OpenFGA has been accepted into the Docker-Sponsored Open Source Program! This partnership allows us to distribute <a href="https://hub.docker.com/r/openfga/openfga" target="_blank" rel="noopener noreferrer" class="">our container image</a> more efficiently and securely, ensuring that our community can easily access and trust the latest versions of OpenFGA on Docker Hub with higher rate limits.</li>
<li class=""><strong>2024 Community Survey Participation:</strong> A huge thank you to everyone who participated in the 2024 Community Survey! Your insights are invaluable in helping us shape the future of OpenFGA. We truly appreciate the time and thought you put into sharing your experiences and suggestions. Remember, we always welcome feedback across our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> — your input is what drives us forward.</li>
<li class=""><strong>Monthly Community Meeting:</strong> Join us for our monthly Community Meetings, held on the second Thursday of every month at 11 AM Eastern Time (US). Our next meeting is on Thursday, September 12, 2024. These meetings are a fantastic opportunity to stay updated with the latest developments, ask questions, and engage with the OpenFGA community. You can find the link to the meeting invite <a href="https://openfga.dev/docs/community#monthly-community-meetings" target="_blank" rel="noopener noreferrer" class="">here</a>. We look forward to seeing you there!</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month">See You Next Month!<a href="https://openfga.dev/blog/fine-grained-news-2024-08#see-you-next-month" class="hash-link" aria-label="Direct link to See You Next Month!" title="Direct link to See You Next Month!" translate="no">​</a></h2>
<p>Fine-Grained News is published every month. Although we have transitioned from Discord to the CNCF Slack channel, we want to continue to hear from you! Whether you have questions or feedback or just want to connect with others using OpenFGA, our community channels are the best place to do so. You can reach us at:</p>
<ul>
<li class=""><strong>CNCF Slack:</strong> Join the conversation in the <a href="https://cloud-native.slack.com/archives/C06G1NNH47N" target="_blank" rel="noopener noreferrer" class="">#openfga</a> channel. Please note: If you are not currently part of the CNCF Slack channel, you will need to click <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">here</a> to join the channel first.</li>
<li class=""><strong>GitHub Discussions:</strong> Share your feedback, ask questions, and engage with the community on <a href="https://github.com/orgs/openfga/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a>.</li>
<li class=""><strong>Twitter:</strong> Follow us <a href="https://twitter.com/openfga" target="_blank" rel="noopener noreferrer" class="">@openfga</a> for updates and news.</li>
</ul>
<p>Visit our <a href="https://openfga.dev/docs/community" target="_blank" rel="noopener noreferrer" class="">community page</a> for more details and to join these channels. We look forward to your contributions and conversations!</p>]]></content>
        <author>
            <name>Caleb Hunter</name>
            <uri>https://github.com/hello-caleb</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - July 2024]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2024-07</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2024-07"/>
        <updated>2024-07-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the July 2024 edition of Fine-Grained News! We are thrilled to bring you the latest updates, features, and community highlights from OpenFGA. This month has included releases, performance improvements, and insights shared through our community meetings and presentations.</p>
<p>We value your feedback and invite you to participate in our <a href="https://www.surveymonkey.com/r/OPENFGA2024" target="_blank" rel="noopener noreferrer" class="">2024 OpenFGA Community Survey</a>. Your insights help us understand your needs better and improve our offerings. Please take a few minutes to complete the survey and let your voice be heard.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improvements">Improvements<a href="https://openfga.dev/blog/fine-grained-news-2024-07#improvements" class="hash-link" aria-label="Direct link to Improvements" title="Direct link to Improvements" translate="no">​</a></h2>
<p><strong>Latest Features</strong></p>
<ul>
<li class="">
<p>We’ve introduced consistency options for query requests. This new, experimental, feature provides more flexibility and control over how queries are executed, enhancing the accuracy and reliability of query results. <a href="https://openfga.dev/blog/query-consistency-options-announcement" target="_blank" rel="noopener noreferrer" class="">Learn more about this update</a>.</p>
</li>
<li class="">
<p>We’re now publishing images to <code>ghcr.io/openfga/openfga</code> as an alternative to DockerHub, thanks to the contribution from <a href="https://github.com/JAORMX" target="_blank" rel="noopener noreferrer" class="">@JAORMX</a>. This provides an additional option for accessing and deploying our containers. <a href="https://github.com/openfga/openfga/pull/1775" target="_blank" rel="noopener noreferrer" class="">Read more</a>.</p>
</li>
</ul>
<p><strong>Performance Improvements</strong></p>
<ul>
<li class="">We've improved our Check latency up to 20X in some scenarios in OpenFGA <a href="https://github.com/openfga/openfga/releases/tag/v1.5.7" target="_blank" rel="noopener noreferrer" class="">v1.5.7</a> and <a href="https://github.com/openfga/openfga/releases/tag/v1.5.6" target="_blank" rel="noopener noreferrer" class="">v1.5.6</a>.</li>
</ul>
<p>If you have any feedback, or want to try a feature early, or are interested to learn more, please reach out!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://openfga.dev/blog/fine-grained-news-2024-07#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>Several breaking changes related to the storage interface <a href="https://github.com/openfga/openfga/releases/tag/v1.5.7" target="_blank" rel="noopener noreferrer" class="">have been introduced</a>. These changes should not impact your usage of OpenFGA unless you are implementing a custom storage adapter for OpenFGA.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-progress">In Progress<a href="https://openfga.dev/blog/fine-grained-news-2024-07#in-progress" class="hash-link" aria-label="Direct link to In Progress" title="Direct link to In Progress" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://github.com/openfga/roadmap/issues/54" target="_blank" rel="noopener noreferrer" class="">Additional Consistency Options for OpenFGA queries</a>: We've just shipped the first iteration of this feature, we're working on adding support for it in more SDKs. We’ll also be working on adding a consistency token in the future.</p>
</li>
<li class="">
<p><a href="https://github.com/openfga/roadmap/issues/41" target="_blank" rel="noopener noreferrer" class="">Telemetry for SDKs</a>: We shipped OpenTelemetry Metrics support for Python and Javascript. We’ll be adding metrics support to the rest of the SDKs and then add support for tracing and logging. If you have feedback regarding our OpenTelemetry support, please do reach out on any of our community channels.</p>
</li>
<li class="">
<p>We’ll keep working on <a href="https://github.com/openfga/roadmap/issues/61" target="_blank" rel="noopener noreferrer" class="">Performance Improvements</a> for Check, List Objects and List Users APIs.</p>
</li>
<li class="">
<p>We’ll be adding additional <a href="https://github.com/openfga/roadmap/issues/30" target="_blank" rel="noopener noreferrer" class="">authorization options for OpenFGA</a> to restrict API credentials to performing specific actions in OpenFGA stores.</p>
</li>
<li class="">
<p>We collaborated with members of the CNCF <a href="https://github.com/cncf/tag-security" target="_blank" rel="noopener noreferrer" class="">TAG-Security team</a> for a few weeks to get it wrapped up (thanks <a href="https://github.com/krishnakv" target="_blank" rel="noopener noreferrer" class="">Krishna Krishna</a> and <a href="https://github.com/eddie-knight" target="_blank" rel="noopener noreferrer" class="">Eddie</a> for your help).</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-highlights">Community Highlights<a href="https://openfga.dev/blog/fine-grained-news-2024-07#community-highlights" class="hash-link" aria-label="Direct link to Community Highlights" title="Direct link to Community Highlights" translate="no">​</a></h2>
<ul>
<li class="">
<p>Check out <a href="https://www.youtube.com/watch?v=GvgeQcQlUuU&amp;t=212s&amp;pp=ygUHT3BlbkZHQQ%3D%3D" target="_blank" rel="noopener noreferrer" class="">July’s Community Meeting</a>! It's a great opportunity to stay updated with the latest developments, ask questions, and engage with the OpenFGA community.</p>
</li>
<li class="">
<p><a href="https://www.linkedin.com/in/miparnisari/" target="_blank" rel="noopener noreferrer" class="">Maria Ines Parnisari</a> from the OpenFGA team and <a href="https://www.linkedin.com/in/evankanderson/" target="_blank" rel="noopener noreferrer" class="">Evan Anderson</a> from Stacklok presented on Implementing a Multi-Tenant, Relationship-Based Authorization Model with OpenFGA at CloudNative SecurityCon North America. If you didn’t attend the conference in June, the presentation recording is now <a href="https://www.youtube.com/watch?v=zIJOBLbaZOc" target="_blank" rel="noopener noreferrer" class="">live</a>.</p>
</li>
<li class="">
<p>This month, <a href="https://www.linkedin.com/in/aaguiar/" target="_blank" rel="noopener noreferrer" class="">Andres Aguiar</a> and <a href="https://www.linkedin.com/in/damianschenkelman/" target="_blank" rel="noopener noreferrer" class="">Damian Schenkelman</a> appeared in the <a href="https://www.youtube.com/watch?v=Ups1FFxK3VE&amp;pp=ygUHT3BlbkZHQQ%3D%3D" target="_blank" rel="noopener noreferrer" class="">Identerati Office Hours</a> livestream for an in-depth exploration of OpenFGA. This video covers advanced topics and provides valuable insights into the capabilities and implementation of OpenFGA. Whether you're a seasoned user or new to OpenFGA, this deep dive is packed with information that will enhance your understanding and usage of the platform.</p>
</li>
<li class="">
<p>Andres Aguiar sat down with Open at Intel host Katherine Druckman during KubeCon Europe to discuss OpenFGA. You can hear that podcast
<a href="https://www.intel.com/content/www/us/en/developer/articles/community/fine-grained-authorization-with-openfga.html" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-adopters">New Adopters<a href="https://openfga.dev/blog/fine-grained-news-2024-07#new-adopters" class="hash-link" aria-label="Direct link to New Adopters" title="Direct link to New Adopters" translate="no">​</a></h2>
<p>We’re happy to share that <a href="https://www.bump-charge.com/" target="_blank" rel="noopener noreferrer" class="">Bump</a> is now an OpenFGA adopter! If you are using OpenFGA in production, please consider adding your company or project to our <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md" target="_blank" rel="noopener noreferrer" class="">list</a>. Your contribution will be greatly appreciated!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="announcements">Announcements<a href="https://openfga.dev/blog/fine-grained-news-2024-07#announcements" class="hash-link" aria-label="Direct link to Announcements" title="Direct link to Announcements" translate="no">​</a></h2>
<p>Join us for our monthly Community Meetings, held on the second Thursday of every month at 11am Eastern Time (US). Our next meeting is on Thursday, August 8, 2024. These meetings are a fantastic opportunity to stay updated with the latest developments, ask questions, and engage with the OpenFGA community. You can find the link to the meeting invite <a href="https://openfga.dev/docs/community#monthly-community-meetings" target="_blank" rel="noopener noreferrer" class="">here</a>. We look forward to seeing you there!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="transitioning-from-discord-to-cncfs-slack">Transitioning from Discord to CNCF's Slack<a href="https://openfga.dev/blog/fine-grained-news-2024-07#transitioning-from-discord-to-cncfs-slack" class="hash-link" aria-label="Direct link to Transitioning from Discord to CNCF's Slack" title="Direct link to Transitioning from Discord to CNCF's Slack" translate="no">​</a></h2>
<p>As a reminder, we transitioned out from Discord for OpenFGA and are now using the CNCF <a href="https://cloud-native.slack.com/archives/C06G1NNH47N" target="_blank" rel="noopener noreferrer" class="">#openfga Slack channel</a>. If you are not part of the CNCF Slack workspace, you need to join the <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a> first.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month">See You Next Month!<a href="https://openfga.dev/blog/fine-grained-news-2024-07#see-you-next-month" class="hash-link" aria-label="Direct link to See You Next Month!" title="Direct link to See You Next Month!" translate="no">​</a></h2>
<p>Fine-Grained News is published every month. If you have any feedback, want to share your OpenFGA story, or have a noteworthy update, please let us know on any of our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> or at <a href="mailto:community@openfga.dev" target="_blank" rel="noopener noreferrer" class="">community@openfga.dev</a>.</p>]]></content>
        <author>
            <name>Caleb Hunter</name>
            <uri>https://github.com/hello-caleb</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Query Consistency Options in OpenFGA]]></title>
        <id>https://openfga.dev/blog/query-consistency-options-announcement</id>
        <link href="https://openfga.dev/blog/query-consistency-options-announcement"/>
        <updated>2024-07-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Query Consistency Options in OpenFGA]]></summary>
        <content type="html"><![CDATA[<p>OpenFGA query APIs now allow specifying the desired consistency of query results. By default, OpenFGA does not use a cache. However, when caching is enabled, it applies to all requests. This means that any changes in permissions won't be reflected in authorization checks during the cache TTL period.</p>
<p>The community expressed the need for flexibility in using the cache on a per-request basis. In response, starting with <a href="https://github.com/openfga/openfga/releases/tag/v1.5.7" target="_blank" rel="noopener noreferrer" class="">OpenFGA v1.5.7</a>, all query APIs can accept a consistency parameter with the following values:</p>
<table><thead><tr><th>Name</th><th>Description</th></tr></thead><tbody><tr><td>MINIMIZE_LATENCY (default)</td><td>OpenFGA will try to minimize latency (e.g. by making use of the cache)</td></tr><tr><td>HIGHER_CONSISTENCY</td><td>OpenFGA will try to optimize for stronger consistency (e.g. by bypassing cache)</td></tr></tbody></table>
<p>When <code>HIGHER_CONSISTENCY</code> is specified, OpenFGA reads directly from the database, even when the cache is enabled.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use-it">How to use it?<a href="https://openfga.dev/blog/query-consistency-options-announcement#how-to-use-it" class="hash-link" aria-label="Direct link to How to use it?" title="Direct link to How to use it?" translate="no">​</a></h2>
<p>The new consistency parameter is available in OpenFGA starting <a href="https://github.com/openfga/openfga/releases/tag/v1.5.7" target="_blank" rel="noopener noreferrer" class="">v1.5.7</a>.</p>
<p>The parameter is supported by all OpenFGA SDKs.</p>
<p>For more information on enabling the cache and best practices for specifying consistency values, refer to the <a href="https://openfga.dev/docs/interacting/consistency" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-database-adapter-implementations">Custom database adapter implementations<a href="https://openfga.dev/blog/query-consistency-options-announcement#custom-database-adapter-implementations" class="hash-link" aria-label="Direct link to Custom database adapter implementations" title="Direct link to Custom database adapter implementations" translate="no">​</a></h2>
<p>For those with a custom database adapter for a multi-region database, the behavior of the HIGHER_CONSISTENCY parameter can be defined according to your needs. With an eventually consistent database (e.g., Dynamo DB) in a multi-region setup, there will be replication lag even if the cache is bypassed. If the database supports strong reads, you can choose to perform those at an extra cost. Otherwise, you can perform an eventually consistent read without providing full consistency semantics to the caller. In some other databases where you have Read/Write replicas, you may choose to go to the Write replica when the <code>HIGHER_CONSISTENCY</code> preference is selected.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="future-work">Future work<a href="https://openfga.dev/blog/query-consistency-options-announcement#future-work" class="hash-link" aria-label="Direct link to Future work" title="Direct link to Future work" translate="no">​</a></h2>
<p><a href="https://zanzibar.academy/" target="_blank" rel="noopener noreferrer" class="">Google Zanzibar</a> features a consistency token called <code>Zookies</code>, returned from write operations. This token can be stored in a resource table and specified in subsequent query API calls. We are considering introducing a similar feature in future releases.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-want-your-feedback">We want your feedback!<a href="https://openfga.dev/blog/query-consistency-options-announcement#we-want-your-feedback" class="hash-link" aria-label="Direct link to We want your feedback!" title="Direct link to We want your feedback!" translate="no">​</a></h2>
<p>We want to learn how you use this API and how we can improve it!</p>
<p>Please reach out through our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> with any questions or feedback.</p>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <category label="openfga" term="openfga"/>
        <category label="features" term="features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - June 2024]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2024-06</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2024-06"/>
        <updated>2024-06-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to Fine-Grained News, June 2024 edition!</p>
<p>This is where we share what has been going on in the OpenFGA community during the last 30 days :).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-we-working-on">What are we working on?<a href="https://openfga.dev/blog/fine-grained-news-2024-06#what-are-we-working-on" class="hash-link" aria-label="Direct link to What are we working on?" title="Direct link to What are we working on?" translate="no">​</a></h2>
<ul>
<li class="">
<p>We started adding <a href="https://github.com/openfga/roadmap/issues/41" target="_blank" rel="noopener noreferrer" class="">OpenTelemetry instrumentation</a> to our SDKs. We just shipped metrics support for Python and Javascript. We'll continue with tracing and logging, and we'll be adding support for Java, Go and .NET next.</p>
</li>
<li class="">
<p>We are close to ship a first iteration to <a href="https://github.com/orgs/openfga/projects/1?pane=issue&amp;itemId=49635084" target="_blank" rel="noopener noreferrer" class="">add additional consistency options</a> for OpenFGA.</p>
</li>
<li class="">
<p>We are working with <a href="https://github.com/krishnakv" target="_blank" rel="noopener noreferrer" class="">Krishna Kumar</a> and <a href="https://github.com/eddie-knight" target="_blank" rel="noopener noreferrer" class="">Eddie Knight</a> from the CNCF Tag-Security team on a joint security assessment for OpenFGA. We are pretty close to wrapping it up! You can follow the progress in <a href="https://github.com/cncf/tag-security/pull/1289" target="_blank" rel="noopener noreferrer" class="">this PR</a>.</p>
</li>
<li class="">
<p>We'll be working on adding <a href="https://github.com/openfga/roadmap/issues/30" target="_blank" rel="noopener noreferrer" class="">authorization for OpenFGA APIs</a>.</p>
</li>
<li class="">
<p>We've identified a few areas where we can improve performance and we are actively working on them.</p>
</li>
</ul>
<p>If you have any feedback, or want to try a feature early, or are interested to learn more, please reach out!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-adopters">New Adopters<a href="https://openfga.dev/blog/fine-grained-news-2024-06#new-adopters" class="hash-link" aria-label="Direct link to New Adopters" title="Direct link to New Adopters" translate="no">​</a></h2>
<p>We are thrilled to welcome <a href="https://sourcegraph.com/" target="_blank" rel="noopener noreferrer" class="">Sourcegraph</a> to the list of companies in our <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md" target="_blank" rel="noopener noreferrer" class="">Adopters list</a>! We are proud to be addressing their fine-grained authorization needs.</p>
<p>If you are using OpenFGA in production, please consider adding your company/project to the <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md" target="_blank" rel="noopener noreferrer" class="">list</a>, it will be greatly appreciated!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community">Community<a href="https://openfga.dev/blog/fine-grained-news-2024-06#community" class="hash-link" aria-label="Direct link to Community" title="Direct link to Community" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://zuplo.com/" target="_blank" rel="noopener noreferrer" class="">Zuplo</a> released an <a href="https://zuplo.com/docs/policies/openfga-authz-inbound" target="_blank" rel="noopener noreferrer" class="">OpenFGA Authorization Inbound Policy</a> that makes it super simple to add fine-grained authorization to your APIs. They are also using OpenFGA deployed globally in GCP for Zuplo itself. You can learn more about their OpenFGA integration journey <a href="https://landing.zuplo.com/oktafgawebinarreg" target="_blank" rel="noopener noreferrer" class="">in this webinar</a>.</p>
</li>
<li class="">
<p><a href="https://github.com/embesozzi" target="_blank" rel="noopener noreferrer" class="">Martin Besozzi</a> built an <a href="https://github.com/embesozzi/apisix-authz-openfga" target="_blank" rel="noopener noreferrer" class="">APISIX plugin for OpenFGA</a>. He also published a blog post about <a href="https://embesozzi.medium.com/mastering-access-control-implementing-low-code-authorization-based-on-rebac-and-decoupling-pattern-f6f54f70115e" target="_blank" rel="noopener noreferrer" class="">Mastering Access Control: Implementing Low-Code Authorization Based on ReBAC and Decoupling Pattern</a> demonstrating how to use it.</p>
</li>
<li class="">
<p><a href="https://github.com/aaguiarz" target="_blank" rel="noopener noreferrer" class="">Andres Aguiar</a> and <a href="https://github.com/dschenkelman" target="_blank" rel="noopener noreferrer" class="">Damian Schenkelman</a> will do an OpenFGA Deep Dive in the <a href="https://www.linkedin.com/feed/update/urn:li:activity:7211830083366322176/" target="_blank" rel="noopener noreferrer" class="">July 17 episode of Identirati Office Hours</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga--cloudnative-securitycon">OpenFGA @ CloudNative SecurityCon<a href="https://openfga.dev/blog/fine-grained-news-2024-06#openfga--cloudnative-securitycon" class="hash-link" aria-label="Direct link to OpenFGA @ CloudNative SecurityCon" title="Direct link to OpenFGA @ CloudNative SecurityCon" translate="no">​</a></h2>
<p>OpenFGA was present in <a href="https://events.linuxfoundation.org/cloudnativesecuritycon-north-america/" target="_blank" rel="noopener noreferrer" class="">CloudNative SecurityCon North America</a>!</p>
<p><a href="https://github.com/miparnisari" target="_blank" rel="noopener noreferrer" class="">Maria Ines Parnisari</a> from the OpenFGA team and <a href="https://github.com/evankanderson" target="_blank" rel="noopener noreferrer" class="">Evan Anderson</a> from <a href="https://stacklok.com/" target="_blank" rel="noopener noreferrer" class="">Stacklok</a> presented on <a href="https://cloudnativesecurityconna24.sched.com/event/1dCVn/implementing-a-multi-tenant-relationship-based-authorization-model-with-openfga-evan-anderson-stacklok-maria-ines-parnisari-okta" target="_blank" rel="noopener noreferrer" class="">Implementing a Multi-Tenant, Relationship-Based Authorization Model with OpenFGA</a>.</p>
<p><img decoding="async" loading="lazy" alt="CloudNative SecurityCon Presentation" src="https://openfga.dev/assets/images/fgn-2024-06-securitycon-talk-57abfc6e4e3f7e573481a2fdfe30692c.jpg" width="800" height="481" class="img_ev3q"></p>
<p>We also got a last-minute kiosk to showcase OpenFGA at the event:</p>
<p><img decoding="async" loading="lazy" alt="OpenFGA Kiosk" src="https://openfga.dev/assets/images/fgn-2024-06-securitycon-booth-b547906de2fa364259b5ba8c112ba91c.png" width="800" height="567" class="img_ev3q"></p>
<p>Thanks to everyone that stopped by!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="latest-features">Latest Features<a href="https://openfga.dev/blog/fine-grained-news-2024-06#latest-features" class="hash-link" aria-label="Direct link to Latest Features" title="Direct link to Latest Features" translate="no">​</a></h2>
<p>In case you missed them, here are some of the latest major features we've added to OpenFGA:</p>
<ul>
<li class="">
<p><a href="https://openfga.dev/blog/list-users-announcement" target="_blank" rel="noopener noreferrer" class="">List Users API</a> allows you to retrieve all the users that have a specific relation with a resource.</p>
</li>
<li class="">
<p><a href="https://openfga.dev/blog/modular-models-announcement" target="_blank" rel="noopener noreferrer" class="">Modular Models</a> makes it easy for multiple teams to collaborate on a single OpenFGA model.</p>
</li>
<li class="">
<p><a href="https://plugins.jetbrains.com/plugin/24394-openfga" target="_blank" rel="noopener noreferrer" class="">JetBrain's IDEs plugin</a> to allow syntax coloring and validation of OpenFGA models.</p>
</li>
<li class="">
<p><a href="https://openfga.dev/blog/conditional-tuples-announcement" target="_blank" rel="noopener noreferrer" class="">Conditional Tuples</a> allows you to define tuples that are only valid under certain conditions</p>
</li>
<li class="">
<p><a href="https://github.com/openfga/spring-boot-starter" target="_blank" rel="noopener noreferrer" class="">Spring Boot Starter for OpenFGA</a> simplifies integrating OpenFGA with Spring Security applications.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="transitioning-from-discord-to-cncfs-slack">Transitioning from Discord to CNCF's Slack<a href="https://openfga.dev/blog/fine-grained-news-2024-06#transitioning-from-discord-to-cncfs-slack" class="hash-link" aria-label="Direct link to Transitioning from Discord to CNCF's Slack" title="Direct link to Transitioning from Discord to CNCF's Slack" translate="no">​</a></h2>
<p>As we mentioned before, we transitioned out from Discord for OpenFGA and are now using the CNCF <a href="https://cloud-native.slack.com/archives/C06G1NNH47N" target="_blank" rel="noopener noreferrer" class="">#openfga Slack channel</a>. If you are not part of the CNCF Slack workspace, you need to join the <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a> first.</p>
<p>Checkout <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">https://openfga.dev/community</a> for all the places to find us.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month">See you next month!<a href="https://openfga.dev/blog/fine-grained-news-2024-06#see-you-next-month" class="hash-link" aria-label="Direct link to See you next month!" title="Direct link to See you next month!" translate="no">​</a></h2>
<p>Fine-Grained News are published every month. If you have any feedback, want to share your OpenFGA story, or know about something that you think is worth mentioning, please let us know!</p>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - May 2024]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2024-05</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2024-05"/>
        <updated>2024-05-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to Fine-Grained News, May edition!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-releases">New Releases!<a href="https://openfga.dev/blog/fine-grained-news-2024-05#new-releases" class="hash-link" aria-label="Direct link to New Releases!" title="Direct link to New Releases!" translate="no">​</a></h2>
<ul>
<li class="">
<p>We shipped the <a href="https://openfga.dev/blog/list-users-announcement" target="_blank" rel="noopener noreferrer" class="">a ListUsers API</a>. ListUsers allows you to retrieve all the users that have a specific relation with a resource (e.g. all users that can view a document).</p>
</li>
<li class="">
<p>In collaboration with <a href="https://github.com/yann-disanto" target="_blank" rel="noopener noreferrer" class="">Yann D'Isanto</a> we shipped a <a href="https://plugins.jetbrains.com/plugin/24394-openfga" target="_blank" rel="noopener noreferrer" class="">plugin for JetBrain's IDEs</a> to allow syntax coloring and validation of OpenFGA models. Together with the <a href="https://marketplace.visualstudio.com/items?itemName=openfga.openfga-vscode" target="_blank" rel="noopener noreferrer" class="">Visual Studio Code integration</a> and the <a href="https://github.com/matoous/tree-sitter-fga" target="_blank" rel="noopener noreferrer" class="">Tree sitter grammar</a> from <a href="https://github.com/matoous/" target="_blank" rel="noopener noreferrer" class="">Matouš Dzivjak</a>, OpenFGA has get great coverage for major IDEs and editors.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://openfga.dev/blog/fine-grained-news-2024-05#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h2>
<ul>
<li class="">We've identified a few areas where we can improve performance and we are actively working on them.</li>
<li class="">We'll be <a href="https://github.com/openfga/roadmap/issues/41" target="_blank" rel="noopener noreferrer" class="">instrumenting our SDKs</a> to provide metrics / tracing and logging through OpenTelemetry APIs.</li>
<li class="">We'll be adding <a href="https://github.com/openfga/roadmap/issues/54" target="_blank" rel="noopener noreferrer" class="">additional consistency options</a> for OpenFGA query APIs.</li>
<li class="">We'll be working on adding <a href="https://github.com/openfga/roadmap/issues/30" target="_blank" rel="noopener noreferrer" class="">authorization for OpenFGA APIs</a>.</li>
</ul>
<p>Please check the items above and let us know if you have any feedback or idea.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga--cloudnative-securitycon">OpenFGA @ CloudNative SecurityCon<a href="https://openfga.dev/blog/fine-grained-news-2024-05#openfga--cloudnative-securitycon" class="hash-link" aria-label="Direct link to OpenFGA @ CloudNative SecurityCon" title="Direct link to OpenFGA @ CloudNative SecurityCon" translate="no">​</a></h2>
<p>OpenFGA will be present in <a href="https://events.linuxfoundation.org/cloudnativesecuritycon-north-america/" target="_blank" rel="noopener noreferrer" class="">CloudNative SecurityCon North America</a>!</p>
<p><a href="https://github.com/miparnisari" target="_blank" rel="noopener noreferrer" class="">Maria Ines Parnisari</a> from the OpenFGA team and <a href="https://github.com/evankanderson" target="_blank" rel="noopener noreferrer" class="">Evan Anderson</a> from <a href="https://stacklok.com/" target="_blank" rel="noopener noreferrer" class="">Stacklok</a> will be presenting on <a href="https://cloudnativesecurityconna24.sched.com/event/1dCVn/implementing-a-multi-tenant-relationship-based-authorization-model-with-openfga-evan-anderson-stacklok-maria-ines-parnisari-okta" target="_blank" rel="noopener noreferrer" class="">Implementing a Multi-Tenant, Relationship-Based Authorization Model with OpenFGA</a>.</p>
<p>We hope to see you there!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="latest-features">Latest Features<a href="https://openfga.dev/blog/fine-grained-news-2024-05#latest-features" class="hash-link" aria-label="Direct link to Latest Features" title="Direct link to Latest Features" translate="no">​</a></h2>
<p>In case you missed them, here are some of the latest major features we've added to OpenFGA:</p>
<ul>
<li class=""><a href="https://openfga.dev/blog/conditional-tuples-announcement" target="_blank" rel="noopener noreferrer" class="">Conditional Tuples</a> allows you to define tuples that are only valid under certain conditions.</li>
<li class=""><a href="https://openfga.dev/blog/modular-models-announcement" target="_blank" rel="noopener noreferrer" class="">Modular Models</a> makes it easy for multiple teams to collaborate on a single OpenFGA model.</li>
<li class=""><a href="https://openfga.dev/blog/list-users-announcement" target="_blank" rel="noopener noreferrer" class="">List Users API</a> allowing you to retrieve all the users that have a specific relation with a resource.</li>
<li class=""><a href="https://github.com/openfga/spring-boot-starter" target="_blank" rel="noopener noreferrer" class="">Spring Boot Starter for OpenFGA</a> simplifies integrating OpenFGA with Spring Security applications.</li>
<li class=""><a href="https://plugins.jetbrains.com/plugin/24394-openfga" target="_blank" rel="noopener noreferrer" class="">JetBrain's IDEs plugin</a> to allow syntax coloring and validation of OpenFGA models.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="transitioning-from-discord-to-cncfs-slack">Transitioning from Discord to CNCF's Slack<a href="https://openfga.dev/blog/fine-grained-news-2024-05#transitioning-from-discord-to-cncfs-slack" class="hash-link" aria-label="Direct link to Transitioning from Discord to CNCF's Slack" title="Direct link to Transitioning from Discord to CNCF's Slack" translate="no">​</a></h2>
<p>As we mentioned before, we transitioned out from Discord for OpenFGA and are now using the CNCF <a href="https://cloud-native.slack.com/archives/C06G1NNH47N" target="_blank" rel="noopener noreferrer" class="">#openfga Slack channel</a>. If you are not part of the CNCF Slack workspace, you need to join the <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a> first.</p>
<p>Checkout <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">https://openfga.dev/community</a> for all the places to find us.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month">See you next month!<a href="https://openfga.dev/blog/fine-grained-news-2024-05#see-you-next-month" class="hash-link" aria-label="Direct link to See you next month!" title="Direct link to See you next month!" translate="no">​</a></h2>
<p>Fine-Grained News are published every month. If you have any feedback, want to share your OpenFGA story, or know about something that you think is worth mentioning, please let us know!</p>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[List Users API]]></title>
        <id>https://openfga.dev/blog/list-users-announcement</id>
        <link href="https://openfga.dev/blog/list-users-announcement"/>
        <updated>2024-05-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[List Users API]]></summary>
        <content type="html"><![CDATA[<p>Today we are launching a new API for OpenFGA: ListUsers.</p>
<p>This API will answer the question "what users have relation X with object Y?". This will be useful, for example, in UIs that want to display the list of users that a resource has been shared with, e.g. the "share" dialog in Google Docs.</p>
<p>You can read more about it in the <a href="https://openfga.dev/api/service#/Relationship%20Queries/ListUsers" target="_blank" rel="noopener noreferrer" class="">API docs</a> and the <a href="https://openfga.dev/docs/getting-started/perform-list-users" target="_blank" rel="noopener noreferrer" class="">product documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use-it">How to use it?<a href="https://openfga.dev/blog/list-users-announcement#how-to-use-it" class="hash-link" aria-label="Direct link to How to use it?" title="Direct link to How to use it?" translate="no">​</a></h2>
<p>ListUsers is available in OpenFGA starting with <a href="https://github.com/openfga/openfga/releases/tag/v1.5.4" target="_blank" rel="noopener noreferrer" class="">v1.5.4</a>.</p>
<p>To be able to call this API, you must turn on this flag on the server: <code>--experimentals enable-list-users</code>. Be sure to also check out the various configuration flags that were added to control its behavior.</p>
<p>The new functionality is available on the latest versions of the <a href="https://github.com/openfga/java-sdk/" target="_blank" rel="noopener noreferrer" class="">Java</a>, <a href="https://github.com/openfga/dotnet-sdk/" target="_blank" rel="noopener noreferrer" class="">.NET</a>, <a href="https://github.com/openfga/go-sdk/" target="_blank" rel="noopener noreferrer" class="">Go</a> and <a href="https://github.com/openfga/js-sdk/" target="_blank" rel="noopener noreferrer" class="">Javascript SDK</a>, <a href="https://github.com/openfga/cli?tab=readme-ov-file#list-users" target="_blank" rel="noopener noreferrer" class="">CLI</a> and <a href="https://marketplace.visualstudio.com/items?itemName=openfga.openfga-vscode" target="_blank" rel="noopener noreferrer" class="">VS Code integration</a>.</p>
<p>We'll be releasing support for the Python SDK soon.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-want-your-feedback">We want your feedback!<a href="https://openfga.dev/blog/list-users-announcement#we-want-your-feedback" class="hash-link" aria-label="Direct link to We want your feedback!" title="Direct link to We want your feedback!" translate="no">​</a></h2>
<p>We want to learn how you use this API and how we can improve it!</p>
<p>Please reach out through our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> with any questions or feedback.</p>]]></content>
        <author>
            <name>Maria Ines Parnisari</name>
            <uri>https://github.com/miparnisari</uri>
        </author>
        <category label="openfga" term="openfga"/>
        <category label="features" term="features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - April 2024]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2024-04</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2024-04"/>
        <updated>2024-04-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to Fine-Grained News, April edition!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-releases">New Releases!<a href="https://openfga.dev/blog/fine-grained-news-2024-04#new-releases" class="hash-link" aria-label="Direct link to New Releases!" title="Direct link to New Releases!" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://openfga.dev/blog/modular-models-announcement" target="_blank" rel="noopener noreferrer" class="">Modular Models</a> is now part of the OpenFGA core, making it easy for multiple teams to collaborate on a single OpenFGA model. Check it out, we love the feature! :)</p>
</li>
<li class="">
<p>Thanks to the help provided by the <a href="https://github.com/spring-projects/spring-security/issues/14121" target="_blank" rel="noopener noreferrer" class="">Spring Security team</a> there's now a <a href="https://github.com/openfga/spring-boot-starter" target="_blank" rel="noopener noreferrer" class="">Spring Boot Starter for OpenFGA</a>!</p>
</li>
<li class="">
<p>We shipped an OpenFGA Release Candidate with <a href="https://openfga.dev/blog/list-users-announcement" target="_blank" rel="noopener noreferrer" class="">a new ListUsers API</a>, that can be enabled with an experimental flag. ListUsers allows you to retrieve all the users that have a specific relation with a resource, for example, all users that can view a document.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga-hackathon">OpenFGA Hackathon<a href="https://openfga.dev/blog/fine-grained-news-2024-04#openfga-hackathon" class="hash-link" aria-label="Direct link to OpenFGA Hackathon" title="Direct link to OpenFGA Hackathon" translate="no">​</a></h2>
<p>A few weeks ago we hosted a Hackathon where multiple team members experimented new ideas around OpenFGA. You'll need to wait until the next <a href="https://github.com/openfga/community/blob/main/community-meetings.md" target="_blank" rel="noopener noreferrer" class="">community meeting</a> to learn more :).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga-security-assessment">OpenFGA Security Assessment<a href="https://openfga.dev/blog/fine-grained-news-2024-04#openfga-security-assessment" class="hash-link" aria-label="Direct link to OpenFGA Security Assessment" title="Direct link to OpenFGA Security Assessment" translate="no">​</a></h2>
<p>We are working with the CNCF Tag-Security team on a <a href="https://github.com/cncf/tag-security/issues/1236" target="_blank" rel="noopener noreferrer" class="">joint security assessment</a>, which is a step required to get accepted as a CNCF Incubation project.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://openfga.dev/blog/fine-grained-news-2024-04#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h2>
<ul>
<li class="">
<p>In collaboration with <a href="https://github.com/le-yams" target="_blank" rel="noopener noreferrer" class="">Yann D'Isanto</a> we are building a <a href="https://github.com/le-yams/openfga4intellij" target="_blank" rel="noopener noreferrer" class="">plugin for JetBrain's IDEs</a> to allow syntax coloring and validation of OpenFGA models. Together with the <a href="https://marketplace.visualstudio.com/items?itemName=openfga.openfga-vscode" target="_blank" rel="noopener noreferrer" class="">Visual Studio Code integration</a> and the <a href="https://github.com/matoous/tree-sitter-fga" target="_blank" rel="noopener noreferrer" class="">Tree sitter grammar</a> from <a href="https://github.com/matoous/" target="_blank" rel="noopener noreferrer" class="">Matouš Dzivjak</a> OpenFGA will get great coverage for major IDEs and editors.</p>
</li>
<li class="">
<p>We'll be <a href="https://github.com/openfga/roadmap/issues/41" target="_blank" rel="noopener noreferrer" class="">instrumenting our SDKs</a> to provide metrics / tracing and logging through OpenTelemetry APIs.</p>
</li>
<li class="">
<p>We'll be adding <a href="https://github.com/openfga/roadmap/issues/54" target="_blank" rel="noopener noreferrer" class="">additional consistency options</a> for OpenFGA query APIs.</p>
</li>
<li class="">
<p>We'll be working on adding <a href="https://github.com/openfga/roadmap/issues/30" target="_blank" rel="noopener noreferrer" class="">authorization for OpenFGA APIs</a>.</p>
</li>
</ul>
<p>Please check the items above and let us know if you have any feedback or idea.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="transitioning-from-discord-to-cncfs-slack">Transitioning from Discord to CNCF's Slack<a href="https://openfga.dev/blog/fine-grained-news-2024-04#transitioning-from-discord-to-cncfs-slack" class="hash-link" aria-label="Direct link to Transitioning from Discord to CNCF's Slack" title="Direct link to Transitioning from Discord to CNCF's Slack" translate="no">​</a></h2>
<p>As we mentioned in the last edition, we transitioned out from Discord for OpenFGA and are now using the CNCF <a href="https://cloud-native.slack.com/archives/C06G1NNH47N" target="_blank" rel="noopener noreferrer" class="">#openfga Slack channel</a>. If you are not part of the CNCF Slack workspace, you need to join the <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a> first.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month">See you next month!<a href="https://openfga.dev/blog/fine-grained-news-2024-04#see-you-next-month" class="hash-link" aria-label="Direct link to See you next month!" title="Direct link to See you next month!" translate="no">​</a></h2>
<p>Fine-Grained News are published every month. If you have any feedback, want to share your OpenFGA story, or know about something that you think is worth mentioning, please let us know!</p>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Modular Models]]></title>
        <id>https://openfga.dev/blog/modular-models-announcement</id>
        <link href="https://openfga.dev/blog/modular-models-announcement"/>
        <updated>2024-04-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Modular Models]]></summary>
        <content type="html"><![CDATA[<p>Modular models aims to improve the model authoring experience when multiple teams are maintaining a model, such as:</p>
<ul>
<li class="">A model can grow large and difficult to understand</li>
<li class="">As more teams begin to contribute to a model, the ownership boundaries may not be clear and code review processes might not scale</li>
</ul>
<p>With modular models, a single model can be separated across multiple files allow grouping of types and conditions into modules. This means that a model can be organized more easily in terms of team or organizational structure. Used in conjunction with features such as <a href="https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners" target="_blank" rel="noopener noreferrer" class="">GitHub</a>, <a href="https://docs.gitlab.com/ee/user/project/codeowners/" target="_blank" rel="noopener noreferrer" class="">GitLab</a> or <a href="https://docs.gitea.com/usage/repository/code-owners" target="_blank" rel="noopener noreferrer" class="">Gitea's</a> code owners, it should become easier to ensure the owners of a portion of your model are correctly assigned to review it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-use-it">How to use it?<a href="https://openfga.dev/blog/modular-models-announcement#how-to-use-it" class="hash-link" aria-label="Direct link to How to use it?" title="Direct link to How to use it?" translate="no">​</a></h2>
<p>Modular models is available in the latest version of OpenFGA. To use it you need to:</p>
<ul>
<li class="">Update to the <a href="https://github.com/openfga/cli/releases/tag/v0.3.0" target="_blank" rel="noopener noreferrer" class="">v0.3.0 release</a> of the CLI</li>
<li class="">Update to <a href="https://github.com/openfga/vscode-ext/releases/tag/v0.2.21" target="_blank" rel="noopener noreferrer" class="">v0.2.21</a> of the VS Code Extension</li>
<li class="">Download <a href="https://github.com/openfga/openfga/releases/tag/v1.5.3" target="_blank" rel="noopener noreferrer" class="">v1.5.3</a> of OpenFGA</li>
<li class="">Check out the modular models sample store in the <a href="https://github.com/openfga/sample-stores/tree/main/stores/modular" target="_blank" rel="noopener noreferrer" class="">sample-stores repo</a></li>
<li class="">Review the <a href="https://openfga.dev/docs/modeling/modular-models" target="_blank" rel="noopener noreferrer" class="">documentation for this feature</a></li>
<li class="">Check a <a href="https://youtu.be/oeqroL8-wCQ" target="_blank" rel="noopener noreferrer" class="">demo video in Youtube</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next?<a href="https://openfga.dev/blog/modular-models-announcement#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>Looking beyond the near term, modular models allows us to implement <a href="https://github.com/openfga/roadmap/issues/30" target="_blank" rel="noopener noreferrer" class="">additional API authorization options for OpenFGA</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reach-out">Reach out!<a href="https://openfga.dev/blog/modular-models-announcement#reach-out" class="hash-link" aria-label="Direct link to Reach out!" title="Direct link to Reach out!" translate="no">​</a></h2>
<p>We want to learn how you use this feature and how we can improve it!</p>
<p>Please reach out through our <a href="https://openfga.dev/community" target="_blank" rel="noopener noreferrer" class="">community channels</a> with any questions or feedback.</p>]]></content>
        <author>
            <name>Ewan Harris</name>
            <uri>https://github.com/ewanharris</uri>
        </author>
        <category label="openfga" term="openfga"/>
        <category label="features" term="features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - March 2024]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2024-03</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2024-03"/>
        <updated>2024-03-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to Fine-Grained News, KubeCon Edition!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubecon-europe-2024-was-super-busy">KubeCon Europe 2024 was super-busy!<a href="https://openfga.dev/blog/fine-grained-news-2024-03#kubecon-europe-2024-was-super-busy" class="hash-link" aria-label="Direct link to KubeCon Europe 2024 was super-busy!" title="Direct link to KubeCon Europe 2024 was super-busy!" translate="no">​</a></h2>
<p>You can now watch online:</p>
<ul>
<li class="">
<p>An AppDeveloperCon session about <a href="https://www.youtube.com/watch?v=5NkJHeToEwo" target="_blank" rel="noopener noreferrer" class="">Implementing Modern Cloud Native Authorization Using OpenFGA</a> where <a href="https://github.com/paulinejamin" target="_blank" rel="noopener noreferrer" class="">Pauline Jamin</a> and <a href="https://github.com/aaguiarz" target="_blank" rel="noopener noreferrer" class="">Andres Aguiar</a> go over how OpenFGA is helping Agicap to implement fine-grained authorization.</p>
</li>
<li class="">
<p>A 7-min Lightning Talk about <a href="https://www.youtube.com/watch?v=K7Me3OjFxJ0" target="_blank" rel="noopener noreferrer" class="">OpenFGA: The Cloud Native way to implement Fine-Grained Authorization</a>.</p>
</li>
<li class="">
<p><a href="https://www.linkedin.com/in/jonathan-whitaker-5a8b2484/" target="_blank" rel="noopener noreferrer" class="">Jonathan Whitaker</a>'s talk about <a href="https://www.youtube.com/watch?v=UaK1EnRgrng" target="_blank" rel="noopener noreferrer" class="">Federated IAM for Kubernetes with OpenFGA</a>, demoing how to use OpenFGA and KeyCloak to implement fine-grained authorization in a Kubernetes cluster, in ways it's not possible today, like giving access to a user for 90 seconds.</p>
</li>
<li class="">
<p>We also participated in <a href="https://app.myonvent.com/event/operator-day" target="_blank" rel="noopener noreferrer" class="">Canonical's Operator Day</a> sharing how Canonical is using OpenFGA, but the presentation is not online yet.</p>
</li>
</ul>
<p>Also, thanks to everyone who stopped by the OpenFGA Kiosk in the Project Pavilion to share their feedback about the project or learn more about it!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cncf-incubation">CNCF incubation<a href="https://openfga.dev/blog/fine-grained-news-2024-03#cncf-incubation" class="hash-link" aria-label="Direct link to CNCF incubation" title="Direct link to CNCF incubation" translate="no">​</a></h2>
<p>As you may know, the CNCF has three stages for projects: Sandbox, Incubation, and Graduation. OpenFGA is currently a Sandbox project.</p>
<p>We are very happy to announce that we just <a href="https://github.com/cncf/toc/pull/1276" target="_blank" rel="noopener noreferrer" class="">applied for Incubation</a>! We are excited about this step and will keep you posted on the progress.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-adopters">New Adopters<a href="https://openfga.dev/blog/fine-grained-news-2024-03#new-adopters" class="hash-link" aria-label="Direct link to New Adopters" title="Direct link to New Adopters" translate="no">​</a></h2>
<p>The OpenFGA community <a href="https://github.com/openfga/community/blob/main/ADOPTERS.md" target="_blank" rel="noopener noreferrer" class="">maintains a list</a> of products/projects/companies that are using OpenFGA in production. We'd like to thank thank the following adopters for adding themselves to the list in the last month:</p>
<ul>
<li class=""><a href="https://www.instill.tech/" target="_blank" rel="noopener noreferrer" class="">Instill AI</a></li>
<li class=""><a href="https://zuplo.com/" target="_blank" rel="noopener noreferrer" class="">Zuplo</a></li>
<li class=""><a href="https://openobserve.ai/" target="_blank" rel="noopener noreferrer" class="">OpenObserve</a></li>
<li class=""><a href="https://datum.net/" target="_blank" rel="noopener noreferrer" class="">Datum</a></li>
</ul>
<p>If you are using OpenFGA in production, please consider adding your company/project to the list.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-news">Community News<a href="https://openfga.dev/blog/fine-grained-news-2024-03#community-news" class="hash-link" aria-label="Direct link to Community News" title="Direct link to Community News" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://github.com/rhamzeh/" target="_blank" rel="noopener noreferrer" class="">Raghd Hamzeh</a> represented OpenFGA in an <a href="https://www.youtube.com/watch?v=VyHbFwfrf04" target="_blank" rel="noopener noreferrer" class="">episode on Authorizing Access</a> within a series called "You Choose - Choose Your Own Adventure: The Treacherous Trek to Security”. This episode was comparing OpenFGA with Hexa and Paralus. OpenFGA was the project viewers voted for as most interested in being featured in a demo.</p>
</li>
<li class="">
<p><a href="https://github.com/Sambego" target="_blank" rel="noopener noreferrer" class="">Sam Bellen</a> published a <a href="https://github.com/Sambego/fga-drive-example/" target="_blank" rel="noopener noreferrer" class="">Google Drive example</a> using OpenFGA. It's a Next.js project, written in TypeScript and ready to deploy on Vercel.</p>
</li>
<li class="">
<p><a href="https://github.com/bytefish" target="_blank" rel="noopener noreferrer" class="">Philipp Wagner</a> is working on a <a href="https://github.com/bytefish/gitclub-dotnet" target="_blank" rel="noopener noreferrer" class="">.NET example</a> inspired by the Github model.</p>
</li>
<li class="">
<p><a href="https://github.com/paulinejamin" target="_blank" rel="noopener noreferrer" class="">Pauline Jamin</a> and <a href="https://github.com/geoffroybraun" target="_blank" rel="noopener noreferrer" class="">Geoffroy Braun</a> will present about Infuser du métier dans les autorisations avec ReBAC at <a href="https://www.devoxx.fr/" target="_blank" rel="noopener noreferrer" class="">Devoxx France 2024</a> in April 17th.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-releases">New Releases<a href="https://openfga.dev/blog/fine-grained-news-2024-03#new-releases" class="hash-link" aria-label="Direct link to New Releases" title="Direct link to New Releases" translate="no">​</a></h2>
<p>We just shipped a <a href="https://openfga.dev/blog/modular-models-announcement" target="_blank" rel="noopener noreferrer" class="">release candidate of Modular Models</a>, that makes it easy for multiple teams to collaborate in a single OpenFGA model. It requires the following components:</p>
<ul>
<li class=""><a href="https://github.com/openfga/js-sdk/releases/tag/v0.3.5" target="_blank" rel="noopener noreferrer" class="">OpenFGA v.1.5.1</a></li>
<li class=""><a href="https://github.com/openfga/cli/releases/tag/v0.3.0" target="_blank" rel="noopener noreferrer" class="">CLI v0.3.0</a></li>
<li class=""><a href="https://github.com/openfga/vscode-ext/releases/tag/v0.2.20" target="_blank" rel="noopener noreferrer" class="">Visual Studio Code Extension v0.2.20</a></li>
</ul>
<p>We also shipped new version of our SDKs with several fixes:</p>
<ul>
<li class=""><a href="https://github.com/openfga/js-sdk/releases/tag/v0.3.5" target="_blank" rel="noopener noreferrer" class="">Javascript SDK 0.3.5</a>.</li>
<li class=""><a href="https://github.com/openfga/go-sdk/releases/tag/v0.3.5" target="_blank" rel="noopener noreferrer" class="">Go SDK v0.3.5</a></li>
<li class=""><a href="https://github.com/openfga/java-sdk/releases/tag/v0.4.0" target="_blank" rel="noopener noreferrer" class="">Java SDK v0.4.0</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="transitioning-from-discord-to-cncfs-slack">Transitioning from Discord to CNCF's Slack<a href="https://openfga.dev/blog/fine-grained-news-2024-03#transitioning-from-discord-to-cncfs-slack" class="hash-link" aria-label="Direct link to Transitioning from Discord to CNCF's Slack" title="Direct link to Transitioning from Discord to CNCF's Slack" translate="no">​</a></h2>
<p>As we mentioned in the last edition, we transitioned out from Discord for OpenFGA and are now using the CNCF <a href="https://cloud-native.slack.com/archives/C06G1NNH47N" target="_blank" rel="noopener noreferrer" class="">#openfga Slack channel</a>. If you are not part of the CNCF Slack workspace, you need to join the <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a> first.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month">See you next month!<a href="https://openfga.dev/blog/fine-grained-news-2024-03#see-you-next-month" class="hash-link" aria-label="Direct link to See you next month!" title="Direct link to See you next month!" translate="no">​</a></h2>
<p>Fine-Grained News are published every month. If you have any feedback, want to share your OpenFGA story, or know about something that you think is worth mentioning, please let us know!</p>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fine-Grained News - February 2024]]></title>
        <id>https://openfga.dev/blog/fine-grained-news-2024-02</id>
        <link href="https://openfga.dev/blog/fine-grained-news-2024-02"/>
        <updated>2024-02-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fine-Grained News]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the 3rd edition of Fine-Grained News!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubecon-europe-2024-is-getting-closer">KubeCon Europe 2024 is getting closer!<a href="https://openfga.dev/blog/fine-grained-news-2024-02#kubecon-europe-2024-is-getting-closer" class="hash-link" aria-label="Direct link to KubeCon Europe 2024 is getting closer!" title="Direct link to KubeCon Europe 2024 is getting closer!" translate="no">​</a></h2>
<p>We'll be pretty busy during <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/" target="_blank" rel="noopener noreferrer" class="">KubeCon Europe 2024</a>:</p>
<ul>
<li class="">
<p><a href="https://www.linkedin.com/in/jonathan-whitaker-5a8b2484/" target="_blank" rel="noopener noreferrer" class="">Jonathan Whitaker</a> from Okta will talk about <a href="https://kccnceu2024.sched.com/event/1YeQD" target="_blank" rel="noopener noreferrer" class="">Federated IAM for Kubernetes with OpenFGA</a></p>
</li>
<li class="">
<p><a href="https://www.linkedin.com/in/paulinejamin/" target="_blank" rel="noopener noreferrer" class="">Pauline Jamin</a> from Agicap and <a href="https://www.linkedin.com/in/aaguiar/" target="_blank" rel="noopener noreferrer" class="">Andres Aguiar</a> from Okta will present on <a href="https://colocatedeventseu2024.sched.com/event/1YFhM/implementing-modern-cloud-native-authorization-using-openfga-andres-aguiar-okta-pauline-jamin-agicap" target="_blank" rel="noopener noreferrer" class="">Implementing Modern Cloud Native Authorization Using OpenFGA</a></p>
</li>
<li class="">
<p>OpenFGA will be present in <a href="https://app.myonvent.com/event/operator-day/" target="_blank" rel="noopener noreferrer" class="">Canonical's Operator's day</a>, co-located at KubeCon EU. Andres Aguiar and Massimilano Gori from Canonical, will talk about how Canonical adopted OpenFGA for implementing authorization in <a href="https://juju.is/" target="_blank" rel="noopener noreferrer" class="">Juju</a>.</p>
</li>
<li class="">
<p>Andres Aguiar will also be delivering a Lightning Talk titled <strong>OpenFGA - The Cloud Native way to implement Fine-Grained Authorization</strong> (link not available yet :) ).</p>
</li>
</ul>
<p>We'll also have a kiosk in the CNCF Project Pavilion, so if you plan to attend let us know and we can schedule some time together!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation-improvements">Documentation Improvements<a href="https://openfga.dev/blog/fine-grained-news-2024-02#documentation-improvements" class="hash-link" aria-label="Direct link to Documentation Improvements" title="Direct link to Documentation Improvements" translate="no">​</a></h2>
<p>We keep improving our documentation, and added a few new documents that you might find interesting:</p>
<ul>
<li class="">
<p>Learn how to <a href="https://openfga.dev/docs/getting-started/cli" target="_blank" rel="noopener noreferrer" class="">use the FGA CLI</a> to perform every possible operation on OpenFGA and simplify most common workflows.</p>
</li>
<li class="">
<p>Learn how you can <a href="https://openfga.dev/docs/modeling/testing" target="_blank" rel="noopener noreferrer" class="">test FGA models</a> as part of your development flow or CI/CD pipelines, without the need to run an OpenFGA server.</p>
</li>
<li class="">
<p>Learn how you can include <a href="https://openfga.dev/docs/modeling/token-claims-contextual-tuples" target="_blank" rel="noopener noreferrer" class="">identity token claims contextual tuples</a> to model ABAC-like scenarios or simplify data integrations with OpenFGA.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openfga-in-the-java-ecosystem">OpenFGA in the Java Ecosystem<a href="https://openfga.dev/blog/fine-grained-news-2024-02#openfga-in-the-java-ecosystem" class="hash-link" aria-label="Direct link to OpenFGA in the Java Ecosystem" title="Direct link to OpenFGA in the Java Ecosystem" translate="no">​</a></h2>
<p>OpenFGA is getting bigger on the Java world! We are <a href="https://github.com/spring-projects/spring-security/issues/14121" target="_blank" rel="noopener noreferrer" class="">working with the Spring Security team</a> to build an Spring Security integration for OpenFGA. You can check the ideas we are exploring in <a href="https://github.com/jimmyjames/fga-spring-examples" target="_blank" rel="noopener noreferrer" class="">this repository</a>.</p>
<p>Also, the Testcontainers team added <a href="https://java.testcontainers.org/modules/openfga/" target="_blank" rel="noopener noreferrer" class="">an OpenFGA integration for Java</a> to make it simple to write integration tests for applications using OpenFGA.</p>
<p>We'd love to hear your feedback!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdk-improvements">SDK Improvements<a href="https://openfga.dev/blog/fine-grained-news-2024-02#sdk-improvements" class="hash-link" aria-label="Direct link to SDK Improvements" title="Direct link to SDK Improvements" translate="no">​</a></h2>
<p>New releases with bug fixes and improvements:</p>
<ul>
<li class=""><a href="https://github.com/openfga/js-sdk/releases/tag/v0.3.3" target="_blank" rel="noopener noreferrer" class="">Javascript SDK 0.3.3</a>.</li>
<li class=""><a href="https://github.com/openfga/go-sdk/releases/tag/v0.3.5" target="_blank" rel="noopener noreferrer" class="">Go SDK v0.3.5</a></li>
<li class=""><a href="https://github.com/openfga/python-sdk/releases/tag/v0.4.1" target="_blank" rel="noopener noreferrer" class="">Python SDK v0.4.1</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="modular-models">Modular Models<a href="https://openfga.dev/blog/fine-grained-news-2024-02#modular-models" class="hash-link" aria-label="Direct link to Modular Models" title="Direct link to Modular Models" translate="no">​</a></h2>
<p>We wrapped up the <a href="https://github.com/openfga/rfcs/blob/main/20231212-modular-models.md" target="_blank" rel="noopener noreferrer" class="">RFC for Modular Models</a>, which will enable multiple teams to work on different parts of the model independently and we are now working on the implementation. We'd love feedback on the RFC.</p>
<p>Wait for a demo on our next <a href="https://github.com/openfga/community/blob/main/community-meetings.md" target="_blank" rel="noopener noreferrer" class="">Community Meeting</a>!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-news">Community News<a href="https://openfga.dev/blog/fine-grained-news-2024-02#community-news" class="hash-link" aria-label="Direct link to Community News" title="Direct link to Community News" translate="no">​</a></h2>
<ul>
<li class="">
<p>Learn <a href="https://stacklok.com/blog/using-openfga-to-build-a-relationship-based-authorization-model-in-minder" target="_blank" rel="noopener noreferrer" class="">how stacklok is using OpenFGA</a> to implement authorization in Minder, an open source project that makes it easier to apply and automate the enforcement of security checks and policies across multiple GitHub repositories.</p>
</li>
<li class="">
<p>Check this <a href="https://www.albertcoronado.com/2024/02/08/tutorial-openfga/" target="_blank" rel="noopener noreferrer" class="">OpenFGA tutorial</a> by <a href="https://twitter.com/acoronadoc" target="_blank" rel="noopener noreferrer" class="">Alberto Coronado</a> (in Spanish!).</p>
</li>
<li class="">
<p><a href="https://www.linkedin.com/in/raghdhamzeh/" target="_blank" rel="noopener noreferrer" class="">Raghd Hamzeh</a> joined <a href="https://twitter.com/wiggitywhitney" target="_blank" rel="noopener noreferrer" class="">Whitney Lee</a> in an in-depth Tanzu ⚡️Enlightning <a href="https://www.youtube.com/watch?v=yTgtAzhvC28" target="_blank" rel="noopener noreferrer" class="">session</a> about OpenFGA.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="transitioning-from-discord-to-cncfs-slack">Transitioning from Discord to CNCF's Slack<a href="https://openfga.dev/blog/fine-grained-news-2024-02#transitioning-from-discord-to-cncfs-slack" class="hash-link" aria-label="Direct link to Transitioning from Discord to CNCF's Slack" title="Direct link to Transitioning from Discord to CNCF's Slack" translate="no">​</a></h2>
<p>As you may know, we've been using Discord for the OpenFGA community. We’ll transition it to the CNCF <a href="https://cloud-native.slack.com/archives/C06G1NNH47N" target="_blank" rel="noopener noreferrer" class="">OpenFGA Slack channel</a>. If you are not part of the CNCF Slack workspace, you need to join the <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">CNCF Slack</a> first.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-you-next-month">See you next month!<a href="https://openfga.dev/blog/fine-grained-news-2024-02#see-you-next-month" class="hash-link" aria-label="Direct link to See you next month!" title="Direct link to See you next month!" translate="no">​</a></h2>
<p>Fine-Grained News are published every month, after the OpenFGA community meeting. If you have any feedback, you want to share your OpenFGA story, or know about something that you think is worth mentioning, please let us know!</p>]]></content>
        <author>
            <name>Andres Aguiar</name>
            <uri>https://github.com/aaguiarz</uri>
        </author>
        <category label="newsletter" term="newsletter"/>
    </entry>
</feed>