diff --git a/.gitlab-ci/build-documentation.sh b/.gitlab-ci/build-documentation.sh
new file mode 100755
index 000000000000..33484bd48c0a
--- /dev/null
+++ b/.gitlab-ci/build-documentation.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# SPDX-License-Identifier: GPL-2.0-or-later
+# SPDX-FileCopyrightText: © 2025 Kieran Bingham <kieran.bingham@ideasonboard.com>
+#
+# Build libcamera Documentation only and perform a link check
+
+set -e
+
+source "$(dirname "$0")/lib.sh"
+source "$(dirname "$0")/build-libcamera-common.sh"
+
+libcamera_documentation() {
+	echo "Building libcamera documentation"
+
+	meson compile -C build documentation
+}
+
+libcamera_documentation_linkcheck() {
+	echo "Documentation link-check"
+
+	meson compile -C build documentation-linkcheck
+}
+
+run libcamera_install_pkgs collapsed
+run libcamera_setup collapsed
+run libcamera_documentation
+run libcamera_documentation_linkcheck
diff --git a/gitlab-ci.yml b/gitlab-ci.yml
index ceb0fd215b89..777456529ac3 100644
--- a/gitlab-ci.yml
+++ b/gitlab-ci.yml
@@ -170,7 +170,6 @@ build-full:debian:12:
   variables:
     MESON_OPTIONS: >-
       ${MESON_ALL_OPTIONS}
-      -D doc_werror=true
   parallel:
     matrix:
       - ARCH: amd64
@@ -312,9 +311,26 @@ build-package:cros:
       dotenv: env
 
 # ------------------------------------------------------------------------------
-# Lint stage - Run checkstyle.py and check merge suitability
+# Lint stage - Run checkstyle.py and check merge suitability and validate Docs
 # ------------------------------------------------------------------------------
 
+documentation:
+  extends:
+    - .fdo.distribution-image@debian
+    - .libcamera-ci.scripts
+    - .libcamera-ci.debian:12
+  stage: lint
+  needs:
+    - job: container-debian:12
+      artifacts: false
+  script:
+    - $CI_PROJECT_DIR/.gitlab-ci/build-documentation.sh
+  variables:
+    BUILD_TYPE: release
+    MESON_OPTIONS: >-
+      ${MESON_ALL_OPTIONS}
+      -D doc_werror=true
+
 lint:
   extends:
     - .fdo.distribution-image@debian
