diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml
new file mode 100644
index 0000000..6e15850
--- /dev/null
+++ b/.github/workflows/release-please.yml
@@ -0,0 +1,48 @@
+name: release-please
+
+permissions:
+ contents: read
+
+on:
+ push:
+ branches: [main]
+ workflow_dispatch:
+ inputs:
+ bump-type:
+ description: >
+ Version bump type. Select 'explicit' to supply an exact version via
+ the 'release-version' field below. Select 'auto' to let
+ conventional-commits determine the bump automatically.
+ required: false
+ type: choice
+ default: 'auto'
+ options:
+ - auto
+ - patch
+ - minor
+ - major
+ - explicit
+ release-version:
+ description: >
+ Explicit version to release (e.g. 1.2.3 or 1.4.0-beta.1).
+ required: false
+ type: string
+
+jobs:
+ release:
+ permissions:
+ contents: write
+ pull-requests: write
+ if: |
+ github.event_name == 'workflow_dispatch' ||
+ startsWith(github.event.head_commit.message, 'release:')
+ uses: openfga/sdk-generator/.github/workflows/release-please.yml@main
+ with:
+ trigger-event: ${{ github.event_name }}
+ bump-type: ${{ inputs.bump-type || 'auto' }}
+ release-version: ${{ inputs.release-version || '' }}
+ secrets:
+ RELEASER_APP_ID: ${{ secrets.RELEASER_APP_ID }}
+ RELEASER_APP_PRIVATE_KEY: ${{ secrets.RELEASER_APP_PRIVATE_KEY }}
+ GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
+ GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
new file mode 100644
index 0000000..7d9b009
--- /dev/null
+++ b/.release-please-manifest.json
@@ -0,0 +1,3 @@
+{
+ ".": "0.10.0"
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3686236..17bea86 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,5 @@
# Changelog
-## [Unreleased](https://github.com/openfga/dotnet-sdk/compare/v0.10.0...HEAD)
-
## v0.10.0
### [0.10.0](https://github.com/openfga/dotnet-sdk/compare/v0.9.1...v0.10.0) (2026-03-24)
diff --git a/RELEASE.md b/RELEASE.md
new file mode 100644
index 0000000..c202c92
--- /dev/null
+++ b/RELEASE.md
@@ -0,0 +1,103 @@
+# Release guide
+
+This project uses [release-please](https://github.com/googleapis/release-please) via a
+`workflow_dispatch`-triggered GitHub Actions workflow. This document explains how to cut
+a release and what to watch out for.
+
+---
+
+## Versioning rules for this project
+
+We are pre-1.0.0. Semver conventions are relaxed:
+
+| Change type | Bump | Example |
+|--- |--- |--- |
+| Breaking change | **Minor** (`0.x.0`) | `0.10.0` → `0.11.0` |
+| Everything else | **Patch** (`0.0.x`) | `0.10.0` → `0.10.1` |
+
+Major bumps (`1.0.0`) are reserved for a deliberate stable-API graduation decision — not for
+routine breaking changes.
+
+---
+
+## Cutting a release
+
+1. Go to **Actions → release-please** and click **Run workflow**.
+2. Choose a bump type:
+ - `patch` — bugfixes, docs, small changes
+ - `minor` — breaking changes (see above)
+ - `explicit` — you specify the exact version string (e.g. `0.11.0` or `0.11.0-beta.1`)
+3. The workflow creates a release PR. Review it, then merge.
+4. The GitHub Release and tag are created automatically on merge.
+
+> **Note — release-please only understands `auto` or an explicit version string.**
+> The `patch`, `minor`, and `major` options in the workflow dropdown are conveniences
+> implemented in the workflow. The workflow reads the current manifest version, computes
+> the next version (e.g. `0.10.0` + patch = `0.10.1`), and passes that computed string
+> to release-please as an explicit `Release-As:` commit — exactly the same as choosing
+> `explicit` and typing it yourself. There is no native patch/minor/major mode in
+> release-please. This is why `explicit` is always the safest option when in doubt —
+> you are just skipping the arithmetic step.
+
+---
+
+## When to use `explicit`
+
+Use `explicit` and type the version yourself in any of these situations:
+
+**After a beta or non-conventional tag.**
+If the previous release was something like `0.10.0-beta.1`, release-please tracks the
+base semver (`0.10.0`) but cannot reliably decide whether the next release should be
+`0.10.0`, `0.10.1`, or `0.11.0`. It will often guess wrong.
+
+The rule of thumb: **if the last tag had a pre-release suffix, always use `explicit` for
+the next release.**
+
+**After a manually created tag.**
+Any tag created outside of the release-please workflow (e.g. hotfixes, manual git tags)
+is invisible to release-please's version logic. Use `explicit` to anchor the next version
+correctly.
+
+**When you want a beta.**
+Release-please does not increment pre-release suffixes automatically. Use `explicit` for
+every beta, incrementing the suffix manually:
+```
+0.11.0-beta.1 → explicit: 0.11.0-beta.2 → explicit: 0.11.0
+```
+
+---
+
+## What goes in the changelog
+
+Commit messages must follow [Conventional Commits](https://www.conventionalcommits.org/)
+for release-please to group them correctly:
+
+```
+feat: add support for batch check → Added
+fix: correct retry logic for transient errors → Fixed
+docs: update API reference → Documentation
+perf: cache DNS lookups → Changed
+refactor: extract auth helper → (hidden)
+chore: bump dependencies → (hidden)
+```
+
+---
+
+## Troubleshooting
+
+**"Invalid previous_tag parameter" error.**
+The manifest version does not have a corresponding GitHub Release object. Reset the
+manifest to the last valid tag:
+```bash
+echo '{ ".": "0.x.y" }' > .release-please-manifest.json
+git commit -am "chore: reset manifest to v0.x.y"
+git push origin main
+```
+
+**Duplicate release PRs.**
+Close all stale ones. The workflow auto-closes stale open PRs on each dispatch, but
+merged duplicates need manual labelling with `autorelease: tagged`.
+
+**Changelog shows everything ungrouped.**
+Make sure `changelog-type` in `release-please-config.json` is set to `"default"`, not
+`"github"`.
diff --git a/example/Example1/Example1.csproj b/example/Example1/Example1.csproj
index fcf98fd..51d91bd 100644
--- a/example/Example1/Example1.csproj
+++ b/example/Example1/Example1.csproj
@@ -11,7 +11,7 @@
- all
+ all
diff --git a/release-please-config.json b/release-please-config.json
new file mode 100644
index 0000000..aa6d18e
--- /dev/null
+++ b/release-please-config.json
@@ -0,0 +1,29 @@
+{
+ "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
+ "release-type": "simple",
+ "packages": {
+ ".": {
+ "include-component-in-tag": false,
+ "changelog-path": "CHANGELOG.md",
+ "changelog-type": "default",
+ "bump-minor-pre-major": true,
+ "bump-patch-for-minor-pre-major": true,
+ "changelog-sections": [
+ { "type": "feat", "section": "Added", "hidden": false },
+ { "type": "fix", "section": "Fixed", "hidden": false },
+ { "type": "perf", "section": "Changed", "hidden": false },
+ { "type": "refactor", "section": "Changed", "hidden": false },
+ { "type": "revert", "section": "Removed", "hidden": false },
+ { "type": "docs", "section": "Documentation", "hidden": false },
+ { "type": "test", "section": "Tests", "hidden": true },
+ { "type": "ci", "section": "CI", "hidden": true },
+ { "type": "chore", "section": "Miscellaneous", "hidden": true }
+ ],
+ "extra-files": [
+ { "type": "generic", "path": "src/OpenFga.Sdk/OpenFga.Sdk.csproj" },
+ { "type": "generic", "path": "src/OpenFga.Sdk/Constants/FgaConstants.cs" },
+ { "type": "generic", "path": "example/Example1/Example1.csproj" }
+ ]
+ }
+ }
+}
diff --git a/src/OpenFga.Sdk/Constants/FgaConstants.cs b/src/OpenFga.Sdk/Constants/FgaConstants.cs
index 799eca6..de8e1a7 100644
--- a/src/OpenFga.Sdk/Constants/FgaConstants.cs
+++ b/src/OpenFga.Sdk/Constants/FgaConstants.cs
@@ -20,12 +20,12 @@ public static class FgaConstants {
///
/// Version of the OpenFGA .NET SDK.
///
- public const string SdkVersion = "0.10.0";
+ public const string SdkVersion = "0.10.0"; // x-release-please-version
///
/// User agent used in HTTP requests.
///
- public const string UserAgent = "openfga-sdk dotnet/0.10.0";
+ public const string UserAgent = "openfga-sdk dotnet/0.10.0"; // x-release-please-version
///
/// Example API domain for documentation/tests.
diff --git a/src/OpenFga.Sdk/OpenFga.Sdk.csproj b/src/OpenFga.Sdk/OpenFga.Sdk.csproj
index 6c13f82..83df8dd 100644
--- a/src/OpenFga.Sdk/OpenFga.Sdk.csproj
+++ b/src/OpenFga.Sdk/OpenFga.Sdk.csproj
@@ -13,7 +13,7 @@
.NET SDK for OpenFGA
OpenFGA
OpenFga.Sdk
- 0.10.0
+ 0.10.0
bin\$(Configuration)\$(TargetFramework)\OpenFga.Sdk.xml
Apache-2.0
README.md