Skip to content

Commit b6de853

Browse files
authored
Merge branch 'main' into feat/streamed-list-objects-docs
2 parents a613721 + e50f259 commit b6de853

32 files changed

+720
-282
lines changed

.github/workflows/checks.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
uses: nschloe/action-cached-lfs-checkout@f46300cd8952454b9f0a21a3d133d4bd5684cfc2
1818

1919
- name: Set up node
20-
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903
20+
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f
2121
with:
2222
node-version: '22'
2323
registry-url: 'https://registry.npmjs.org'
@@ -52,8 +52,8 @@ jobs:
5252
markdown-link-check-md:
5353
runs-on: ubuntu-latest
5454
steps:
55-
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
56-
- uses: tcort/github-action-markdown-link-check@f3d33029dca1c4a24b87e2df648f9f4604ef6533 # v1.1.1
55+
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
56+
- uses: tcort/github-action-markdown-link-check@e7c7a18363c842693fadde5d41a3bd3573a7a225 # v1.1.2
5757
with:
5858
file-extension: '.md'
5959
use-quiet-mode: 'yes'
@@ -62,8 +62,8 @@ jobs:
6262
markdown-link-check:
6363
runs-on: ubuntu-latest
6464
steps:
65-
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
66-
- uses: tcort/github-action-markdown-link-check@f3d33029dca1c4a24b87e2df648f9f4604ef6533 # v1.1.1
65+
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
66+
- uses: tcort/github-action-markdown-link-check@e7c7a18363c842693fadde5d41a3bd3573a7a225 # v1.1.2
6767
with:
6868
file-extension: '.mdx'
6969
use-quiet-mode: 'yes'

.github/workflows/deploy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
uses: nschloe/action-cached-lfs-checkout@f46300cd8952454b9f0a21a3d133d4bd5684cfc2
2323

2424
- name: Set up node
25-
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903
25+
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f
2626
with:
2727
node-version: '22'
2828
registry-url: 'https://registry.npmjs.org'

.github/workflows/preview.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ jobs:
2828
uses: nschloe/action-cached-lfs-checkout@f46300cd8952454b9f0a21a3d133d4bd5684cfc2
2929

3030
- name: Set up node
31-
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903
31+
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f
3232
with:
3333
node-version: '22'
3434
registry-url: 'https://registry.npmjs.org'
@@ -43,7 +43,7 @@ jobs:
4343
BASE_URL: /pr-preview/pr-${{ github.event.number }}
4444

4545
- name: Deploy preview
46-
uses: rossjrw/pr-preview-action@9f77b1d057b494e662c50b8ca40ecc63f21e0887
46+
uses: rossjrw/pr-preview-action@5fd5f8e2f88e735fc3d1151302b32242037e3962
4747
id: preview-step
4848
with:
4949
source-dir: ./build/

.github/workflows/scorecard.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434

3535
steps:
3636
- name: "Checkout code"
37-
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
37+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
3838
with:
3939
persist-credentials: false
4040

@@ -64,7 +64,7 @@ jobs:
6464
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
6565
# format to the repository Actions tab.
6666
- name: "Upload artifact"
67-
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
67+
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
6868
with:
6969
name: SARIF file
7070
path: results.sarif

.github/workflows/test-deploy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
- name: Cached LFS checkout
1818
uses: nschloe/action-cached-lfs-checkout@f46300cd8952454b9f0a21a3d133d4bd5684cfc2
1919
- name: Set up node
20-
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903
20+
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f
2121
with:
2222
node-version: '22'
2323
registry-url: 'https://registry.npmjs.org'

blog/authors.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ eharris:
77
name: Ewan Harris
88
url: https://github.com/ewanharris
99
image_url: /img/blog/authors/ewan.jpg
10+
jakub:
11+
name: Jakub Hertyk
12+
url: https://github.com/curfew-marathon
13+
image_url: /img/blog/authors/jakub.jpg
1014
miparnisari:
1115
name: Maria Ines Parnisari
1216
url: https://github.com/miparnisari
@@ -15,4 +19,9 @@ hello-caleb:
1519
name: Caleb Hunter
1620
title: Community Engagement
1721
url: https://github.com/hello-caleb
18-
image_url: /img/blog/authors/caleb.jpg
22+
image_url: /img/blog/authors/caleb.jpg
23+
tylernix:
24+
name: Tyler Nix
25+
title: Product Manager
26+
url: https://github.com/tylernix
27+
image_url: /img/blog/authors/tyler.jpg
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
---
2+
title: Ignore Duplicate Tuples On Write
3+
description: OpenFGA now supports ignoring duplicate writes and missing deletes, making data imports much easier and more efficient.
4+
slug: ignore-duplicate-writes-announcement
5+
date: 2025-10-31
6+
authors: tylernix
7+
tags: [openfga,features,api]
8+
image: https://openfga.dev/img/og-rich-embed.png
9+
hide_table_of_contents: false
10+
---
11+
12+
import {
13+
SupportedLanguage,
14+
WriteRequestViewer,
15+
} from '@components/Docs';
16+
17+
# Announcing "Ignore Duplicate Writes" in OpenFGA
18+
19+
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 ["ignore" duplicate writes and missing deletes](https://openfga.dev/docs/getting-started/update-tuples#05-ignoring-duplicate-or-missing-tuples).
20+
21+
## The Problem
22+
23+
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., `user:anne` is already a `viewer` of `document:123`) or try to delete one that's already gone. In the past, OpenFGA would reject the entire Write request containing that single duplicate operation.
24+
25+
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.
26+
27+
## The Solution
28+
29+
The Write API now accepts two new optional parameters to gracefully handle these use cases:
30+
31+
- **`on_duplicate: "ignore"`**: When included in the `writes` section, this tells OpenFGA to simply skip any tuples that already exist instead of failing the request.
32+
33+
- **`on_missing: "ignore"`**: When included in the `deletes` section, this tells OpenFGA to skip any tuples that don't exist.
34+
35+
Now, you can send large batches of writes and deletes without worrying about these common conditions breaking your import.
36+
37+
## See it in Action
38+
39+
For writes:
40+
41+
<WriteRequestViewer
42+
relationshipTuples={[
43+
{
44+
user: 'user:anne',
45+
relation: 'viewer',
46+
object: 'document:roadmap'
47+
},
48+
]}
49+
conflictOptions={{
50+
onDuplicateWrites: 'ignore',
51+
}}
52+
skipSetup={true}
53+
allowedLanguages={[
54+
SupportedLanguage.JS_SDK,
55+
SupportedLanguage.GO_SDK,
56+
SupportedLanguage.DOTNET_SDK,
57+
SupportedLanguage.PYTHON_SDK,
58+
SupportedLanguage.JAVA_SDK,
59+
SupportedLanguage.CLI,
60+
SupportedLanguage.CURL,
61+
]}
62+
/>
63+
64+
And deletes:
65+
66+
<WriteRequestViewer
67+
deleteRelationshipTuples={[
68+
{
69+
user: 'user:anne',
70+
relation: 'owner',
71+
object: 'document:roadmap'
72+
},
73+
]}
74+
conflictOptions={{
75+
onMissingDeletes: 'ignore',
76+
}}
77+
skipSetup={true}
78+
allowedLanguages={[
79+
SupportedLanguage.JS_SDK,
80+
SupportedLanguage.GO_SDK,
81+
SupportedLanguage.DOTNET_SDK,
82+
SupportedLanguage.PYTHON_SDK,
83+
SupportedLanguage.JAVA_SDK,
84+
SupportedLanguage.CLI,
85+
SupportedLanguage.CURL,
86+
]}
87+
/>
88+
89+
## Get Started
90+
91+
This is supported in the latest versions of the OpenFGA API, SDKs and CLI. Try it out and let us know what you think!
92+
93+
- [API Docs](https://openfga.dev/api/service#/Relationship%20Tuples/Write)
94+
- [JavaScript SDK](https://github.com/openfga/js-sdk?tab=readme-ov-file#conflict-options-for-write-operations)
95+
- [Go SDK](https://github.com/openfga/go-sdk?tab=readme-ov-file#conflict-options-for-write-operations)
96+
- [.NET SDK](https://github.com/openfga/dotnet-sdk?tab=readme-ov-file#conflict-options-for-write-operations)
97+
- [Python SDK](https://github.com/openfga/python-sdk?tab=readme-ov-file#conflict-options-for-write-operations)
98+
- [Java SDK](https://github.com/openfga/java-sdk?tab=readme-ov-file#conflict-options-for-write-operations)
99+
100+
Special thanks to [@phamhieu](https://github.com/phamhieu) for his [contribution](https://github.com/openfga/js-sdk/pull/276) to the JavaScript SDK! 🙏
101+
102+
Learn more about [Writing Tuples in OpenFGA](https://openfga.dev/docs/getting-started/update-tuples#05-ignoring-duplicate-or-missing-tuples).
103+
104+
## We want your feedback!
105+
106+
Please reach out through our [community channels](https://openfga.dev/docs/community) with any questions or feedback.

blog/incubation-announcement.md

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
---
2+
title: OpenFGA Accepted into CNCF Incubation 🎉
3+
description: OpenFGA has been accepted into the Cloud Native Computing Foundation Incubation stage
4+
slug: incubation-announcement
5+
date: 2026-01-07
6+
authors: [aaguiar, jakub]
7+
tags: [announcement]
8+
image: /img/og-rich-embed.png
9+
hide_table_of_contents: false
10+
---
11+
# OpenFGA Accepted into CNCF Incubation 🎉
12+
13+
OpenFGA has been accepted as a CNCF **Incubation** project! The Cloud Native Computing Foundation (CNCF) Technical Oversight Committee (TOC) [voted to advance OpenFGA](https://github.com/cncf/toc/issues/1287#issuecomment-3458442973) 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: [OpenFGA becomes a CNCF Incubating Project](https://www.cncf.io/blog/2025/11/11/openfga-becomes-a-cncf-incubating-project/).
14+
15+
## Why Incubation Matters
16+
17+
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.
18+
19+
Learn more about [CNCF project stages](https://www.cncf.io/projects/) and review our [due diligence documentation](https://github.com/cncf/toc/blob/main/projects/openfga/openfga-incubation-dd.md).
20+
21+
## Technical Maturity Since Sandbox
22+
23+
Since joining CNCF as a Sandbox project in December 2022, OpenFGA has evolved significantly:
24+
25+
- **Performance improvements**: Substantial optimizations in query execution and caching, enabling sub-millisecond authorization checks at scale
26+
- **Enhanced capabilities**: Introduction of conditional tuples, modular models, and list users functionality to support more complex authorization scenarios
27+
- **Expanded ecosystem**: New SDKs, database adapters (including SQLite), Terraform provider, and IDE plugins
28+
- **Production hardening**: Improved observability, configuration options, and operational tooling based on real-world deployment feedback
29+
- **Security posture**: Comprehensive security assessments, vulnerability management processes, and regular dependency updates
30+
31+
These improvements reflect our commitment to building a reliable, performant authorization system ready for enterprise production use.
32+
33+
## How We Got Here
34+
35+
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:
36+
37+
- Regular community meetings since 2022, available on [our YouTube channel](https://www.youtube.com/@OpenFGA), along with more than 40 presentations from community members.
38+
- Contributions from the community—whether through questions, feedback, feature requests, PRs, bug reports, or guides and tools built around OpenFGA.
39+
- [Grafana Labs](https://grafana.com/) joined the maintainer team.
40+
- 600+ contributors across the OpenFGA organization.
41+
- 5,000+ GitHub stars across our repositories.
42+
- Presence at six consecutive KubeCon conferences (US and EU) with breakout sessions and a kiosk.
43+
- Production adopters include [Canonical](https://canonical.com/), [Docker](https://www.docker.com), [Grafana Labs](https://grafana.com), [Read AI](https://read.ai/), [Agicap](https://agicap.com), [Headspace](https://headspace.com), [Zuplo](https://zuplo.com), [Sourcegraph](https://sourcegraph.com/), [OpenObserve](https://openobserve.ai/) and [LakeKeeper](https://lakekeeper.io/) along with [many others](https://github.com/openfga/community/blob/main/ADOPTERS.md).
44+
- Several adopters [went on the record](https://github.com/cncf/toc/tree/main/projects/openfga) in interviews with CNCF around their OpenFGA experience through the due diligence project.
45+
46+
## Thank You
47+
48+
OpenFGA's success is the result of contributions from many individuals and organizations. We want to highlight a few who made significant impact:
49+
50+
### Community Contributors
51+
52+
- [Massimiliano Gori](https://www.linkedin.com/in/massi-gori) believed in OpenFGA early and led integration across Canonical.
53+
- [Pauline Jamin](https://www.linkedin.com/in/paulinejamin) spearheaded adoption at [Agicap](https://agicap.com) and presented their learnings at [KubeCon Europe 2024](https://colocatedeventseu2024.sched.com/event/1YFhM/implementing-modern-cloud-native-authorization-using-openfga-andres-aguiar-okta-pauline-jamin-agicap).
54+
- [JT aka Hawxy](https://github.com/Hawxy) has been maintaining [Fga.net](https://github.com/Hawxy/Fga.Net) for years, and has been graciously providing us feedback since.
55+
- [Andrew Powers](https://www.linkedin.com/in/andrew-powers-geo) led [Read AI](https://www.read.ai/) implementation supporting collaboration and RAG for enterprise search.
56+
- [Joao Guerreiro](https://www.linkedin.com/in/joguer) led the implementation at [Grafana](https://grafana.com/) and presented their journey at [KubeCon Europe 2025](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).
57+
- [Dan Cech](https://www.linkedin.com/in/dancech) from [Grafana](https://grafana.com/) contributed the SQLite adapter and serves as a maintainer.
58+
- [Nathan Totten](https://www.linkedin.com/in/nathantotten) led [Zuplo](https://zuplo.com/) integration, implementing [authorization at the edge](https://zuplo.com/examples/openfga) for the API gateway.
59+
- [Gurleen Sethi](https://www.linkedin.com/in/gurleensethi) led the implementation of organization and team management at [Docker, Inc](https://www.docker.com/).
60+
- [Siddhant Khare](https://github.com/Siddhant-K-code) was the first independent contributor who onboarded as a maintainer of the OpenFGA project.
61+
- [Maurice Ackel](https://github.com/mauriceackel) donated the [OpenFGA Terraform Provider](https://registry.terraform.io/providers/openfga/openfga/latest/docs), and joined as a maintainer.
62+
- [Yann D'Isanto](https://www.linkedin.com/in/yann-d-19851110) from [Agicap](https://agicap.com), who contributed the JetBrains IDE plugin.
63+
- [Martin Besozzi](https://www.linkedin.com/in/embesozzi) has been involved in the OpenFGA community from the beginning, driving integrations with [Keycloak](https://www.keycloak.org/).
64+
65+
### CNCF Support
66+
67+
- [Chris Aniszczyk](https://www.linkedin.com/in/caniszczyk) helped guide the project donation and acceptance.
68+
- [Eddie Knight](https://www.linkedin.com/in/knight1776), [Evan Anderson](https://www.linkedin.com/in/evankanderson), [Marina Moore](https://www.linkedin.com/in/marina-moore-5a7242105) and [Justin Cappos](https://github.com/JustinCappos) from [CNCF TAG Security](https://tag-security.cncf.io/) supported the self-assessment and helped strengthen our posture for due diligence.
69+
- [Karena Angell](https://www.linkedin.com/in/karenaangell) and [Faseela K](https://www.linkedin.com/in/faseela-k-42178528) helped us navigate the due diligence process and carried much of the heavy lift to make it happen.
70+
71+
## What's Next
72+
73+
Incubation is a milestone, not a destination. Our focus continues on:
74+
75+
- **Performance**: Optimizing latency and throughput for large-scale deployments
76+
- **Developer Experience**: Enhanced tooling, IDE plugins, and debugging capabilities
77+
- **Integrations**: Expanding our ecosystem with more identity providers, frameworks, and platforms
78+
- **Documentation**: Comprehensive guides, tutorials, and real-world implementation patterns
79+
- **Governance**: Strengthening our contributor pathways and security practices
80+
81+
Our next milestone: CNCF Graduation. Track our progress on the [project roadmap](https://github.com/orgs/openfga/projects/1).
82+
83+
## Get Involved
84+
85+
This achievement belongs to every contributor, user, and community member who has supported OpenFGA. Thank you for being part of our journey!
86+
87+
**New to OpenFGA?** Start here:
88+
- [Try OpenFGA locally](https://openfga.dev/docs/getting-started) and explore the documentation
89+
- [Join our CNCF Slack community](https://openfga.dev/community) to ask questions and connect with users
90+
91+
**Already using OpenFGA?**
92+
- [Star the repo](https://github.com/openfga/openfga) and follow development
93+
- Share your adoption story—add your organization to our [ADOPTERS.md](https://github.com/openfga/community/blob/main/ADOPTERS.md)
94+
- Check out the [roadmap](https://github.com/orgs/openfga/projects/1) and contribute to upcoming features
95+
96+

docs/content/getting-started/perform-check.mdx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,13 +172,12 @@ If you want to check multiple user-object-relationship combinations in a single
172172
:::note
173173
The BatchCheck endpoint is currently supported by:
174174
- JS SDK (>=[v0.8.0](https://github.com/openfga/js-sdk/releases/tag/v0.8.0))
175+
- .NET SDK (>= [v0.9.0](https://github.com/openfga/dotnet-sdk/releases/tag/v0.9.0))
175176
- Python SDK (>=[v0.9.0](https://github.com/openfga/python-sdk/releases/tag/v0.9.0))
176177
- Go SDK (>=[v0.7.0](https://github.com/openfga/go-sdk/releases/tag/v0.7.0))
177178
- Java SDK (>=[v0.8.0](https://github.com/openfga/java-sdk/releases/tag/v0.8.0))
178179

179-
Support in the other SDKs is being worked on.
180-
181-
In the SDKs that don't support the server-side `BatchCheck`, the `BatchCheck` method performs client-side batch checks by making multiple check requests with limited parallelization. In SDK versions that do support the server-side `BatchCheck`, the existing method has been renamed to `ClientBatchCheck`.
180+
In SDK versions that support the server-side `BatchCheck`, the existing method has been renamed to `ClientBatchCheck`.
182181

183182
Refer to the README for each SDK for more information. Refer to the release notes of the relevant SDK version for more information on how to migrate from client-side to the server-side `BatchCheck`.
184183
:::

0 commit comments

Comments
 (0)