Prepare to tag release v2.12.0.
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..d161509
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,24 @@
+name: Release
+on:
+  push:
+    tags: ['v**']
+permissions:
+  contents: read
+jobs:
+  create:
+    permissions:
+      # Required to create the release
+      # and upload the release assets.
+      contents: write
+    runs-on: ubuntu-latest
+    env:
+      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      GH_REPO: ${{ GITHUB_REPOSITORY }}
+    steps:
+      - uses: actions/checkout@v4.1.1
+      - run: |
+          gh release create ${{ GITHUB_REF_NAME }} --generate-notes --latest --verify-tag
+          gh release download ${{ GITHUB_REF_NAME }} --archive tar.gz
+          gh release download ${{ GITHUB_REF_NAME }} --archive zip
+          gh release upload ${{ GITHUB_REF_NAME }} *.tar.gz *.zip
+        shell: bash
diff --git a/MODULE.bazel b/MODULE.bazel
index bdcb872..cf1aa86 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -5,7 +5,7 @@
 )
 
 bazel_dep(name = "bazel_skylib", version = "1.5.0")
-bazel_dep(name = "platforms", version = "0.0.8")
+bazel_dep(name = "platforms", version = "0.0.9")
 bazel_dep(name = "rules_cc", version = "0.0.9")
 bazel_dep(name = "rules_python", version = "0.31.0")