diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 0000000000000000000000000000000000000000..38ad89a05eb9f77c37675132dff6d14cbcc2d874
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,56 @@
+name: Release Docs
+
+on:
+  push:
+    tags:
+      - '*'
+
+jobs:
+  build-docs:
+    permissions:
+      contents: read
+      id-token: write
+    name: Build Docs
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        python-version:
+          - "3.11"
+    env:
+      POETRY_VERSION: "1.8.3"
+    steps:
+      - uses: actions/checkout@v4
+      - name: Cache Poetry
+        uses: actions/cache@v2
+        with:
+          path: ~/.poetry
+          key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-poetry-
+      - name: Install poetry
+        run: |
+          pipx install poetry==$POETRY_VERSION
+      - name: Set up Python ${{ matrix.python-version }}
+        uses: actions/setup-python@v4
+        with:
+          python-version: ${{ matrix.python-version }}
+          cache: poetry
+      - name: Install dependencies
+        run: |
+          poetry install
+          pip install -r docs/source/requirements.txt
+      - name: Build docs
+        run: |
+          sphinx-build -M html docs/source docs/build
+      - name: Authenticate to Google Cloud
+        id: auth
+        uses: google-github-actions/auth@v2
+        with:
+          credentials_json: ${{ secrets.GOOGLE_CREDENTIALS }}
+      - name: Upload Docs
+        id: upload-directory
+        uses: google-github-actions/upload-cloud-storage@v2
+        with:
+          path: docs/build/html
+          destination: docs-bucket-production/semantic-router
+          parent: false
\ No newline at end of file