diff --git a/.github/workflows/update-self-hosted-changelog.yml b/.github/workflows/update-self-hosted-changelog.yml
new file mode 100644
index 0000000000..72b99d818a
--- /dev/null
+++ b/.github/workflows/update-self-hosted-changelog.yml
@@ -0,0 +1,66 @@
+name: Update Self-Hosted Changelog
+
+on:
+ schedule:
+ - cron: "0 * * * *"
+ workflow_dispatch:
+
+jobs:
+ update-self-hosted-changelog:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v5
+ with:
+ ref: main
+ - name: Sync self-hosted releases from fern-platform
+ env:
+ GH_TOKEN: ${{ secrets.FERN_GITHUB_TOKEN }}
+ run: |
+ set -euo pipefail
+ DIR="fern/products/docs/pages/self-hosted/changelog"
+ mkdir -p "$DIR"
+
+ gh api -H "Accept: application/vnd.github+json" \
+ "repos/fern-api/fern-platform/releases?per_page=50" \
+ --jq '.[] | select(.tag_name | startswith("docs@")) | "\(.tag_name)\t\(.published_at)"' \
+ | sort -k2 \
+ > /tmp/releases.tsv
+
+ while IFS=$'\t' read -r tag published; do
+ version="${tag#docs@}"
+ date="${published%%T*}"
+ file="$DIR/$date.mdx"
+ version_escaped="${version//./\\.}"
+
+ if grep -rqE "^### v${version_escaped}$" "$DIR" 2>/dev/null; then
+ continue
+ fi
+
+ if [ -s "$file" ]; then
+ printf '\n### v%s\n\n```dockerfile\nFROM fernenterprise/fern-self-hosted:%s\n```\n' "$version" "$version" >> "$file"
+ else
+ printf '### v%s\n\n```dockerfile\nFROM fernenterprise/fern-self-hosted:%s\n```\n' "$version" "$version" > "$file"
+ fi
+ done < /tmp/releases.tsv
+ - name: create PR
+ id: cpr
+ uses: peter-evans/create-pull-request@v8
+ with:
+ commit-message: "update self-hosted changelog from fern-platform releases"
+ title: "Update self-hosted changelog"
+ branch: update-self-hosted-changelog
+ base: main
+ delete-branch: true
+ - name: Enable Pull Request Automerge
+ if: steps.cpr.outputs.pull-request-operation == 'created'
+ uses: peter-evans/enable-pull-request-automerge@v3
+ with:
+ pull-request-number: ${{ steps.cpr.outputs.pull-request-number }}
+ merge-method: squash
+ - name: Approving PR
+ if: steps.cpr.outputs.pull-request-operation == 'created'
+ env:
+ GH_TOKEN: ${{ secrets.FERN_GITHUB_TOKEN }}
+ run: |
+ echo "Approving PR"
+ gh pr review ${{ steps.cpr.outputs.pull-request-number }} --approve
diff --git a/fern/products/docs/docs.yml b/fern/products/docs/docs.yml
index 61e6d04e54..a94479cf20 100644
--- a/fern/products/docs/docs.yml
+++ b/fern/products/docs/docs.yml
@@ -393,6 +393,8 @@ navigation:
slug: previews
- page: Health check endpoints
path: ./pages/self-hosted/health-check-endpoints.mdx
+ - changelog: ./pages/self-hosted/changelog
+ title: Releases
- section: Analytics & integrations
slug: integrations
collapsed: true
diff --git a/fern/products/docs/pages/self-hosted/changelog/2026-04-15.mdx b/fern/products/docs/pages/self-hosted/changelog/2026-04-15.mdx
new file mode 100644
index 0000000000..11c9612118
--- /dev/null
+++ b/fern/products/docs/pages/self-hosted/changelog/2026-04-15.mdx
@@ -0,0 +1,5 @@
+### v0.114.1
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.1
+```
diff --git a/fern/products/docs/pages/self-hosted/changelog/2026-04-17.mdx b/fern/products/docs/pages/self-hosted/changelog/2026-04-17.mdx
new file mode 100644
index 0000000000..3306947e6b
--- /dev/null
+++ b/fern/products/docs/pages/self-hosted/changelog/2026-04-17.mdx
@@ -0,0 +1,17 @@
+### v0.114.2
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.2
+```
+
+### v0.114.3
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.3
+```
+
+### v0.114.4
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.4
+```
diff --git a/fern/products/docs/pages/self-hosted/changelog/2026-04-20.mdx b/fern/products/docs/pages/self-hosted/changelog/2026-04-20.mdx
new file mode 100644
index 0000000000..6dea828cfa
--- /dev/null
+++ b/fern/products/docs/pages/self-hosted/changelog/2026-04-20.mdx
@@ -0,0 +1,11 @@
+### v0.114.5
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.5
+```
+
+### v0.114.6
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.6
+```
diff --git a/fern/products/docs/pages/self-hosted/changelog/2026-04-21.mdx b/fern/products/docs/pages/self-hosted/changelog/2026-04-21.mdx
new file mode 100644
index 0000000000..5887e6825f
--- /dev/null
+++ b/fern/products/docs/pages/self-hosted/changelog/2026-04-21.mdx
@@ -0,0 +1,11 @@
+### v0.114.7
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.7
+```
+
+### v0.114.8
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.8
+```
diff --git a/fern/products/docs/pages/self-hosted/changelog/2026-04-22.mdx b/fern/products/docs/pages/self-hosted/changelog/2026-04-22.mdx
new file mode 100644
index 0000000000..410a9585c9
--- /dev/null
+++ b/fern/products/docs/pages/self-hosted/changelog/2026-04-22.mdx
@@ -0,0 +1,23 @@
+### v0.114.9
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.9
+```
+
+### v0.114.10
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.10
+```
+
+### v0.114.11
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.11
+```
+
+### v0.114.12
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.12
+```
diff --git a/fern/products/docs/pages/self-hosted/changelog/2026-04-23.mdx b/fern/products/docs/pages/self-hosted/changelog/2026-04-23.mdx
new file mode 100644
index 0000000000..920be2f2d4
--- /dev/null
+++ b/fern/products/docs/pages/self-hosted/changelog/2026-04-23.mdx
@@ -0,0 +1,5 @@
+### v0.114.13
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.13
+```
diff --git a/fern/products/docs/pages/self-hosted/changelog/2026-04-24.mdx b/fern/products/docs/pages/self-hosted/changelog/2026-04-24.mdx
new file mode 100644
index 0000000000..9cf18c881a
--- /dev/null
+++ b/fern/products/docs/pages/self-hosted/changelog/2026-04-24.mdx
@@ -0,0 +1,17 @@
+### v0.114.14
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.14
+```
+
+### v0.114.15
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.15
+```
+
+### v0.114.16
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.16
+```
diff --git a/fern/products/docs/pages/self-hosted/changelog/2026-04-27.mdx b/fern/products/docs/pages/self-hosted/changelog/2026-04-27.mdx
new file mode 100644
index 0000000000..7d8ff2ce2d
--- /dev/null
+++ b/fern/products/docs/pages/self-hosted/changelog/2026-04-27.mdx
@@ -0,0 +1,17 @@
+### v0.114.17
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.17
+```
+
+### v0.114.18
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.18
+```
+
+### v0.114.19
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.19
+```
diff --git a/fern/products/docs/pages/self-hosted/changelog/2026-04-28.mdx b/fern/products/docs/pages/self-hosted/changelog/2026-04-28.mdx
new file mode 100644
index 0000000000..ca6fc2b57d
--- /dev/null
+++ b/fern/products/docs/pages/self-hosted/changelog/2026-04-28.mdx
@@ -0,0 +1,11 @@
+### v0.114.20
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.20
+```
+
+### v0.114.21
+
+```dockerfile
+FROM fernenterprise/fern-self-hosted:0.114.21
+```
diff --git a/fern/products/docs/pages/self-hosted/changelog/overview.mdx b/fern/products/docs/pages/self-hosted/changelog/overview.mdx
new file mode 100644
index 0000000000..bf6fe631bd
--- /dev/null
+++ b/fern/products/docs/pages/self-hosted/changelog/overview.mdx
@@ -0,0 +1,8 @@
+Release history for the Fern self-hosted Docker image. Each entry shows the `FROM` line for that release.
+
+To upgrade:
+
+- On `:latest` — rebuild and redeploy your image to pick up the new base.
+- Pinning a version — copy the `FROM` line from the release below into your Dockerfile, then rebuild and redeploy.
+
+See the [self-hosted setup guide](/learn/docs/self-hosted/set-up) for the full flow.
diff --git a/fern/products/docs/pages/self-hosted/self-hosted-set-up.mdx b/fern/products/docs/pages/self-hosted/self-hosted-set-up.mdx
index 57d98841b7..8471f09964 100644
--- a/fern/products/docs/pages/self-hosted/self-hosted-set-up.mdx
+++ b/fern/products/docs/pages/self-hosted/self-hosted-set-up.mdx
@@ -79,6 +79,10 @@ RUN fern-generate
`fern-generate` is a command available inside the Docker image that processes your documentation at build time, enabling faster container startup, air-gapped deployment, and a smaller attack surface. It's not a command you run on your host machine. You can alternatively [defer generation to runtime](#runtime-generation).
+
+See [recent releases](/learn/docs/self-hosted/releases) to pin to a specific version instead of `:latest`.
+
+
diff --git a/fern/products/docs/pages/self-hosted/self-hosted.mdx b/fern/products/docs/pages/self-hosted/self-hosted.mdx
index a88c008f27..6f7518955f 100644
--- a/fern/products/docs/pages/self-hosted/self-hosted.mdx
+++ b/fern/products/docs/pages/self-hosted/self-hosted.mdx
@@ -78,7 +78,7 @@ Fern provides your documentation site as a ready-to-run Docker container that yo
1. **Upload your fern folder** - Add your documentation source files to the container
1. **Run the container** - Start your local server using standard Docker commands
1. **Deploy** - Set up your server environment and publish the documentation
-1. **Receive updated Docker images** - Fern releases new versions of the Docker image that your team can evaluate and deploy when ready.
+1. **Receive updated Docker images** - Fern [releases new versions of the Docker image](/learn/docs/self-hosted/releases) that your team can evaluate and deploy when ready.
### Architecture diagram