From 1ee615c0aa91b6d53317b920f8d9866c4d70e6f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Tue, 21 Apr 2026 12:33:00 +0200 Subject: [PATCH 01/16] Added link checker --- .github/workflows/link_check.yaml | 69 +++++++++++++++++ .gitignore | 2 + docs/js/custom.js | 4 +- lychee.toml | 120 ++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 5 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/link_check.yaml create mode 100644 lychee.toml diff --git a/.github/workflows/link_check.yaml b/.github/workflows/link_check.yaml new file mode 100644 index 0000000000..bd37ae134f --- /dev/null +++ b/.github/workflows/link_check.yaml @@ -0,0 +1,69 @@ +name: "Check documentation links" + +on: + push: + branches: + - master + - "[0-9]+.[0-9]+" + workflow_dispatch: + inputs: + force_recheck: + description: "Clear lychee cache and recheck all links from scratch" + type: boolean + default: false + pull_request: ~ + schedule: + - cron: "0 6 * * *" + +jobs: + link-check: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.13] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install MkDocs dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Build documentation + run: mkdocs build --strict + + - name: Restore lychee cache + if: ${{ !inputs.force_recheck }} + uses: actions/cache@v4 + with: + path: .lycheecache + key: lychee-${{ github.ref_name }}-${{ hashFiles('lychee.toml') }} + restore-keys: | + lychee-${{ github.ref_name }}- + lychee- + + - name: Check links + uses: lycheeverse/lychee-action@v2 + with: + args: >- + --config lychee.toml + --cache + --cache-exclude-status "400.." + site + fail: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload link-check report + if: always() + uses: actions/upload-artifact@v4 + with: + name: lychee-report + path: lychee-report.md + if-no-files-found: ignore diff --git a/.gitignore b/.gitignore index d243a010bd..3bc536a759 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ auth.json yarn.lock docs/css/*.map .deptrac.cache +.lycheecache +lychee-report.md diff --git a/docs/js/custom.js b/docs/js/custom.js index d67814e91e..1a50125e76 100644 --- a/docs/js/custom.js +++ b/docs/js/custom.js @@ -5,7 +5,7 @@ $(document).ready(function() { const latestVersionNumber = '5.0'; // replace edit url - let branchName = 'master'; + let branchName = '5.0'; const branchNameRegexp = /\/en\/([a-z0-9-_.]*)\//g.exec(document.location.href); const eolVersions = window.eol_versions ?? []; @@ -21,7 +21,7 @@ $(document).ready(function() { } if (!/^\d+\.\d+$/.test(branchName) && branchName !== 'latest') { - branchName = 'master'; + branchName = '5.0'; } // Insert version into header links diff --git a/lychee.toml b/lychee.toml new file mode 100644 index 0000000000..3de30ceaf5 --- /dev/null +++ b/lychee.toml @@ -0,0 +1,120 @@ +############################# Display ############################# + +# Verbose program output +verbose = "warn" + +# Output format +format = "markdown" + +# Path to report output file +output = "lychee-report.md" + +# Don't show interactive progress bar while checking links. +no_progress = false + +############################# Cache ############################### + +# Enable link caching to avoid re-checking identical links across runs. +cache = true + +# Discard cached results older than this duration. +max_cache_age = "1d" + +############################# Runtime ############################# + +# Maximum number of allowed redirects. Set to 0 to fail on any redirect — +# a redirect usually signals moved or reorganised content that should be +# updated at the source. +max_redirects = 0 + +# Maximum number of allowed retries before a link is declared dead. +max_retries = 3 + +# Minimum wait time in seconds between retries of failed requests. +retry_wait_time = 2 + +# Maximum number of concurrent link checks across all hosts. +max_concurrency = 8 + +############################# Requests ############################ + +# Website timeout from connect to response finished (seconds). +timeout = 20 + +# Comma-separated list of accepted status codes for valid links. +# 429 = Too Many Requests (rate-limited, treat as valid). +accept = ["200", "429"] + +# Proceed for server connections considered insecure (invalid TLS). +insecure = false + +# Only check external links (https/http). Local file:// paths — i.e. all +# relative and root-relative internal links — are skipped entirely. +# Internal links are already validated by `mkdocs build --strict`. +scheme = ["https", "http"] + +# Use HEAD requests — much faster than GET since no body is downloaded. +# Fragment checking requires GET, so include_fragments is disabled; +# internal anchor links are already validated by `mkdocs build --strict`. +method = "head" + +# Mimic a browser to avoid Cloudflare bot-detection (403) on sites like doc.ibexa.co. +user_agent = "Mozilla/5.0 (compatible; lychee link checker)" + +# Do NOT check anchor fragments — requires full GET downloads for every URL. +include_fragments = false + +# Do NOT check links inside and
 blocks.
+include_verbatim = false
+
+#############################  Exclusions  ##########################
+
+# Exclude URLs from checking (treated as regular expressions).
+exclude = [
+    # LinkedIn blocks automated requests
+    "^https?://(www\\.)?linkedin\\.com",
+    # Localhost and loopback addresses
+    "^https?://localhost",
+    "^https?://127\\.0\\.0\\.1",
+    # Placeholder/example domains
+    "^https?://example\\.com",
+    # GitHub login/auth pages often rate-limit or redirect bots
+    "^https?://github\\.com/login",
+]
+
+# Exclude these input paths from being scanned.
+exclude_path = [
+    # Search index, assets and sitemap contain no meaningful external links
+    "site/search",
+    "site/assets",
+    "site/404.html",
+    "site/sitemap.xml",
+    "site/robots.txt",
+]
+
+# Check the specified file extensions
+extensions = ["html"]
+
+# Exclude all private IPs from checking.
+exclude_all_private = true
+
+#############################  Local files  #########################
+
+# Required to resolve root-relative links (e.g. href="/") found in every page.
+# Combined with scheme = ["https", "http"], the resulting file:// paths are
+# silently skipped — no HTTP check, no error.
+root_dir = "site"
+
+#############################  Hosts  ###############################
+
+# Global limit: at most 2 simultaneous requests to any single host.
+host_concurrency = 2
+
+# Global minimum interval between requests to the same host.
+host_request_interval = "500ms"
+
+# Stricter throttling for Cloudflare-protected hosts.
+# [hosts] tables must come last in the file (TOML section scoping).
+[hosts."doc.ibexa.co"]
+concurrency = 1
+request_interval = "1s"
diff --git a/mkdocs.yml b/mkdocs.yml
index ca8e299822..f447455d60 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -2,6 +2,7 @@ INHERIT: plugins.yml
 
 site_name: Developer Documentation
 repo_url: https://github.com/ibexa/documentation-developer
+edit_uri: edit/5.0/docs
 site_url: https://doc.ibexa.co/en/latest/
 copyright: "Copyright 1999-2026 Ibexa AS and others"
 validation:

From 8299bee736a1de86bf9d8669b6153042d3199a1b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Tue, 21 Apr 2026 14:50:09 +0200
Subject: [PATCH 02/16] Check search doc

---
 lychee.toml | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/lychee.toml b/lychee.toml
index 3de30ceaf5..98d7a05fed 100644
--- a/lychee.toml
+++ b/lychee.toml
@@ -43,7 +43,7 @@ timeout = 20
 
 # Comma-separated list of accepted status codes for valid links.
 # 429 = Too Many Requests (rate-limited, treat as valid).
-accept = ["200", "429"]
+accept = ["200", "202", "429"]
 
 # Proceed for server connections considered insecure (invalid TLS).
 insecure = false
@@ -56,13 +56,13 @@ scheme = ["https", "http"]
 # Use HEAD requests — much faster than GET since no body is downloaded.
 # Fragment checking requires GET, so include_fragments is disabled;
 # internal anchor links are already validated by `mkdocs build --strict`.
-method = "head"
+method = "GET"
 
 # Mimic a browser to avoid Cloudflare bot-detection (403) on sites like doc.ibexa.co.
 user_agent = "Mozilla/5.0 (compatible; lychee link checker)"
 
 # Do NOT check anchor fragments — requires full GET downloads for every URL.
-include_fragments = false
+include_fragments = true
 
 # Do NOT check links inside  and 
 blocks.
 include_verbatim = false
@@ -80,12 +80,17 @@ exclude = [
     "^https?://example\\.com",
     # GitHub login/auth pages often rate-limit or redirect bots
     "^https?://github\\.com/login",
+    # Known redirects (302) that are intentional
+    "^https://support\\.ibexa\\.co/",
+    "^https://redocly\\.com/redoc/",
+    "^https://updates\\.ibexa.co",
+    "^https://console\\.cloud\\.google\\.com",
 ]
 
 # Exclude these input paths from being scanned.
 exclude_path = [
     # Search index, assets and sitemap contain no meaningful external links
-    "site/search",
+    "site/search/search_index.json",
     "site/assets",
     "site/404.html",
     "site/sitemap.xml",

From bd01f05457da70a48a95e0fd1f205c24c8197ba6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Tue, 21 Apr 2026 15:25:00 +0200
Subject: [PATCH 03/16] Removed report from gitignore

---
 .gitignore | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 3bc536a759..06b0a36a65 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,4 +13,3 @@ yarn.lock
 docs/css/*.map
 .deptrac.cache
 .lycheecache
-lychee-report.md

From 1e84637fecbaeb6b637d21aba4e7ae30e446efab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Tue, 21 Apr 2026 16:16:02 +0200
Subject: [PATCH 04/16] Changed output mode

---
 lychee.toml | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lychee.toml b/lychee.toml
index 98d7a05fed..9e5e63ee10 100644
--- a/lychee.toml
+++ b/lychee.toml
@@ -1,7 +1,7 @@
 #############################  Display  #############################
 
 # Verbose program output
-verbose = "warn"
+verbose = "error"
 
 # Output format
 format = "markdown"
@@ -95,6 +95,8 @@ exclude_path = [
     "site/404.html",
     "site/sitemap.xml",
     "site/robots.txt",
+    "site/update_and_migration/migrate_to_ibexa_dxp",
+    "site/update_and_migration/from_1.x_2.x/",
 ]
 
 # Check the specified file extensions

From e34b4d7a921958410f5c92443fcc39917363d12c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Wed, 22 Apr 2026 16:10:25 +0200
Subject: [PATCH 05/16] Disable summay

---
 .github/workflows/link_check.yaml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.github/workflows/link_check.yaml b/.github/workflows/link_check.yaml
index bd37ae134f..2101e18517 100644
--- a/.github/workflows/link_check.yaml
+++ b/.github/workflows/link_check.yaml
@@ -56,6 +56,8 @@ jobs:
                       --cache
                       --cache-exclude-status "400.."
                       site
+                  output: lychee-report.md
+                  jobSummary: false
                   fail: true
               env:
                   GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

From 5aab7012919b4dc2425c7b0d2bc7806659c707cc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Wed, 22 Apr 2026 20:59:09 +0200
Subject: [PATCH 06/16] Add local remap for doc.ibexa.co links to avoid
 Cloudflare 403s

- Clone devdoc/userdoc 4.6 and 5.0 branches into repositories/ and
  build them during CI; use lychee remap rules to resolve
  doc.ibexa.co/en/{4.6,5.0}/... and doc.ibexa.co/projects/userguide/en/{4.6,5.0}/...
  to local file:// paths instead of hitting the Cloudflare-protected host
- Add sed step in CI to rewrite local dev paths to $GITHUB_WORKSPACE
- Add file scheme to lychee config (required for file:// remap targets)
- Exclude versionless project root links (/projects/connect, /projects/userguide)
  which are theme sidebar nav, not content links
- Add repositories/ to .gitignore

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
 .github/workflows/link_check.yaml | 20 +++++++++++++
 .gitignore                        |  1 +
 lychee.toml                       | 49 ++++++++++++++++++++++++++++---
 3 files changed, 66 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/link_check.yaml b/.github/workflows/link_check.yaml
index 2101e18517..363f60ced1 100644
--- a/.github/workflows/link_check.yaml
+++ b/.github/workflows/link_check.yaml
@@ -38,6 +38,26 @@ jobs:
             - name: Build documentation
               run: mkdocs build --strict
 
+            - name: Clone versioned repositories for link remap
+              run: |
+                  mkdir -p repositories
+                  git clone --depth=1 --branch 4.6 https://github.com/ibexa/documentation-developer.git repositories/devdoc-4.6 &
+                  git clone --depth=1 --branch 5.0 https://github.com/ibexa/documentation-developer.git repositories/devdoc-5.0 &
+                  git clone --depth=1 --branch 4.6 https://github.com/ibexa/documentation-user.git repositories/userdoc-4.6 &
+                  git clone --depth=1 --branch 5.0 https://github.com/ibexa/documentation-user.git repositories/userdoc-5.0 &
+                  wait
+
+            - name: Build versioned repositories for link remap
+              run: |
+                  for dir in repositories/devdoc-4.6 repositories/devdoc-5.0 repositories/userdoc-4.6 repositories/userdoc-5.0; do
+                      (cd "$dir" && pip install -q -r requirements.txt && mkdocs build --quiet) &
+                  done
+                  wait
+
+            - name: Update remap paths for CI environment
+              run: |
+                  sed -i "s|/Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker|$GITHUB_WORKSPACE|g" lychee.toml
+
             - name: Restore lychee cache
               if: ${{ !inputs.force_recheck }}
               uses: actions/cache@v4
diff --git a/.gitignore b/.gitignore
index 06b0a36a65..7acb48f49e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,4 @@ yarn.lock
 docs/css/*.map
 .deptrac.cache
 .lycheecache
+/repositories/
diff --git a/lychee.toml b/lychee.toml
index 9e5e63ee10..7329a5b7f1 100644
--- a/lychee.toml
+++ b/lychee.toml
@@ -48,10 +48,10 @@ accept = ["200", "202", "429"]
 # Proceed for server connections considered insecure (invalid TLS).
 insecure = false
 
-# Only check external links (https/http). Local file:// paths — i.e. all
-# relative and root-relative internal links — are skipped entirely.
-# Internal links are already validated by `mkdocs build --strict`.
-scheme = ["https", "http"]
+# Check https/http and file:// (used by remap rules below).
+# Relative and root-relative internal links are still skipped because they
+# don't match any scheme — internal links are validated by mkdocs build --strict.
+scheme = ["https", "http", "file"]
 
 # Use HEAD requests — much faster than GET since no body is downloaded.
 # Fragment checking requires GET, so include_fragments is disabled;
@@ -85,6 +85,12 @@ exclude = [
     "^https://redocly\\.com/redoc/",
     "^https://updates\\.ibexa.co",
     "^https://console\\.cloud\\.google\\.com",
+    # Versionless project root links (e.g. /projects/connect, /projects/userguide) appear in
+    # the MkDocs theme sidebar as cross-project navigation and are not real content links.
+    # The https form appears as absolute links; the file:// form appears after root_dir resolution
+    # of root-relative hrefs like /projects/connect in the built HTML.
+    "^https?://doc\\.ibexa\\.co/projects/[^/]+/?$",
+    "^file://.*?/site/projects/[^/]+/?$",
 ]
 
 # Exclude these input paths from being scanned.
@@ -112,6 +118,41 @@ exclude_all_private = true
 # silently skipped — no HTTP check, no error.
 root_dir = "site"
 
+#############################  Remap  ###############################
+
+# Rewrite doc.ibexa.co links to locally-built MkDocs sites, avoiding HTTP
+# requests to Cloudflare-protected hosts.
+#
+# Two patterns per version:
+#   1. Trailing-slash pages  → /site//index.html
+#   2. Direct .html files    → /site/.html  (PHP/REST API refs)
+#
+# The `repositories/` directory must be populated via:
+#   git clone --depth=1 --branch 4.6 https://github.com/ibexa/documentation-developer.git repositories/devdoc-4.6
+#   (and similarly for devdoc-5.0, userdoc-4.6, userdoc-5.0)
+# Then build each with: python3 -m mkdocs build
+remap = [
+    # devdoc 4.6 — three patterns in priority order:
+    #   1. direct .html files (PHP/REST API reference)
+    #   2. directory paths with trailing slash → index.html
+    #   3. directory paths without trailing slash → index.html
+    "https://doc\\.ibexa\\.co/en/4\\.6/(.+\\.html)$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-4.6/site/$1",
+    "https://doc\\.ibexa\\.co/en/4\\.6/(.+)/$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-4.6/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+[^/#])$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-4.6/site/$1/index.html",
+    # devdoc 5.0
+    "https://doc\\.ibexa\\.co/en/5\\.0/(.+\\.html)$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-5.0/site/$1",
+    "https://doc\\.ibexa\\.co/en/5\\.0/(.+)/$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-5.0/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+[^/#])$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-5.0/site/$1/index.html",
+    # userdoc 4.6
+    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/(.+\\.html)$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-4.6/site/$1",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/(.+)/$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-4.6/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+[^/#])$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-4.6/site/$1/index.html",
+    # userdoc 5.0
+    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/(.+\\.html)$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-5.0/site/$1",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/(.+)/$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-5.0/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+[^/#])$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-5.0/site/$1/index.html",
+]
+
 #############################  Hosts  ###############################
 
 # Global limit: at most 2 simultaneous requests to any single host.

From d32183f17b5edc43480c155c489b508f940700f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Mon, 18 May 2026 09:08:50 +0200
Subject: [PATCH 07/16] Changes

---
 .github/workflows/link_check.yaml |  21 +-
 .gitignore                        |   2 +
 clone-repositories.sh             |  34 +++
 errors.txt                        | 474 ++++++++++++++++++++++++++++++
 lychee-report.md                  |  60 ++++
 lychee.toml => lychee.toml.dist   |  28 +-
 6 files changed, 588 insertions(+), 31 deletions(-)
 create mode 100755 clone-repositories.sh
 create mode 100644 errors.txt
 create mode 100644 lychee-report.md
 rename lychee.toml => lychee.toml.dist (77%)

diff --git a/.github/workflows/link_check.yaml b/.github/workflows/link_check.yaml
index 363f60ced1..149aea3f32 100644
--- a/.github/workflows/link_check.yaml
+++ b/.github/workflows/link_check.yaml
@@ -38,25 +38,8 @@ jobs:
             - name: Build documentation
               run: mkdocs build --strict
 
-            - name: Clone versioned repositories for link remap
-              run: |
-                  mkdir -p repositories
-                  git clone --depth=1 --branch 4.6 https://github.com/ibexa/documentation-developer.git repositories/devdoc-4.6 &
-                  git clone --depth=1 --branch 5.0 https://github.com/ibexa/documentation-developer.git repositories/devdoc-5.0 &
-                  git clone --depth=1 --branch 4.6 https://github.com/ibexa/documentation-user.git repositories/userdoc-4.6 &
-                  git clone --depth=1 --branch 5.0 https://github.com/ibexa/documentation-user.git repositories/userdoc-5.0 &
-                  wait
-
-            - name: Build versioned repositories for link remap
-              run: |
-                  for dir in repositories/devdoc-4.6 repositories/devdoc-5.0 repositories/userdoc-4.6 repositories/userdoc-5.0; do
-                      (cd "$dir" && pip install -q -r requirements.txt && mkdocs build --quiet) &
-                  done
-                  wait
-
-            - name: Update remap paths for CI environment
-              run: |
-                  sed -i "s|/Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker|$GITHUB_WORKSPACE|g" lychee.toml
+            - name: Clone and build versioned repositories for link remap
+              run: bash clone-repositories.sh
 
             - name: Restore lychee cache
               if: ${{ !inputs.force_recheck }}
diff --git a/.gitignore b/.gitignore
index 7acb48f49e..71fac772a1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,4 +13,6 @@ yarn.lock
 docs/css/*.map
 .deptrac.cache
 .lycheecache
+lychee.toml
 /repositories/
+
diff --git a/clone-repositories.sh b/clone-repositories.sh
new file mode 100755
index 0000000000..c9ec1819ef
--- /dev/null
+++ b/clone-repositories.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+# Clones and builds versioned documentation repositories used by lychee's remap rules,
+# then updates the absolute paths in lychee.toml to match the current location.
+#
+# Usage: ./clone-repositories.sh
+#
+# Run this once before running lychee. Re-run to refresh clones or after moving
+# the repository to a new path (the path in lychee.toml will be updated automatically).
+
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+
+cd "$SCRIPT_DIR"
+
+echo "==> Cloning versioned repositories..."
+mkdir -p repositories
+git clone --depth=1 --branch 4.6 https://github.com/ibexa/documentation-developer.git repositories/devdoc-4.6 &
+git clone --depth=1 --branch 5.0 https://github.com/ibexa/documentation-developer.git repositories/devdoc-5.0 &
+git clone --depth=1 --branch 4.6 https://github.com/ibexa/documentation-user.git repositories/userdoc-4.6 &
+git clone --depth=1 --branch 5.0 https://github.com/ibexa/documentation-user.git repositories/userdoc-5.0 &
+wait
+
+echo "==> Building versioned repositories..."
+for dir in repositories/devdoc-4.6 repositories/devdoc-5.0 repositories/userdoc-4.6 repositories/userdoc-5.0; do
+    (cd "$dir" && pip install -q -r requirements.txt && mkdocs build --quiet) &
+done
+wait
+
+echo "==> Generating lychee.toml from lychee.toml.dist..."
+sed "s|__BASE_DIR__|$SCRIPT_DIR|g" lychee.toml.dist > lychee.toml
+echo "    __BASE_DIR__ → '$SCRIPT_DIR'"
+
+echo "Done."
diff --git a/errors.txt b/errors.txt
new file mode 100644
index 0000000000..0ae39639fd
--- /dev/null
+++ b/errors.txt
@@ -0,0 +1,474 @@
+### Errors in site/administration/configuration/repository_configuration/index.html
+
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/administration/project_organization/bundles/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/commerce/shopping_list/shopping_list_design/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/content_management/collaborative_editing/configure_collaborative_editing/index.html
+
+* [302]  | Error (cached)
+
+### Errors in site/content_management/images/add_image_asset_from_dam/index.html
+
+* [307]  | Rejected status code: 307 Temporary Redirect (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/content_management/images/fastly_io/index.html
+
+* [308]  | Rejected status code: 308 Permanent Redirect (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [307]  | Rejected status code: 307 Temporary Redirect (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/ibexa_cloud/ibexa_cloud_guide/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/ibexa_products/editions/index.html
+
+* [302]  | Error (cached)
+
+### Errors in site/infrastructure_and_maintenance/cache/http_cache/content_aware_cache/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/infrastructure_and_maintenance/cache/http_cache/fastly/index.html
+
+* [308]  | Rejected status code: 308 Permanent Redirect (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [308]  | Rejected status code: 308 Permanent Redirect (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [307]  | Rejected status code: 307 Temporary Redirect (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/infrastructure_and_maintenance/cache/http_cache/http_cache/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/infrastructure_and_maintenance/cache/http_cache/reverse_proxy/index.html
+
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [308]  | Rejected status code: 308 Permanent Redirect (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [307]  | Rejected status code: 307 Temporary Redirect (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [307]  | Rejected status code: 307 Temporary Redirect (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/infrastructure_and_maintenance/clustering/clustering_with_aws_s3/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/infrastructure_and_maintenance/security/reporting_issues/index.html
+
+* [302]  | Error (cached)
+
+### Errors in site/infrastructure_and_maintenance/security/security_checklist/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Error (cached)
+* [TIMEOUT]  | Timeout
+
+### Errors in site/personalization/enable_personalization/index.html
+
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+
+### Errors in site/release_notes/ez_platform_v1.7.0_lts/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [301]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [301]  | Error (cached)
+* [301]  | Error (cached)
+
+### Errors in site/release_notes/ez_platform_v1.8.0/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/release_notes/ez_platform_v1.9.0/index.html
+
+* [301]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Error (cached)
+* [301]  | Error (cached)
+* [301]  | Error (cached)
+
+### Errors in site/release_notes/ez_platform_v1.10.0/index.html
+
+* [301]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [301]  | Error (cached)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [301]  | Error (cached)
+
+### Errors in site/release_notes/ez_platform_v1.11.0/index.html
+
+* [301]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [301]  | Error (cached)
+* [301]  | Error (cached)
+
+### Errors in site/release_notes/ez_platform_v1.12.0/index.html
+
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [301]  | Error (cached)
+* [404]  | Error (cached)
+* [301]  | Error (cached)
+
+### Errors in site/release_notes/ez_platform_v1.13.0_lts/index.html
+
+* [301]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [301]  | Error (cached)
+
+### Errors in site/release_notes/ez_platform_v2.0.0/index.html
+
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/release_notes/ez_platform_v2.1.0/index.html
+
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+
+### Errors in site/release_notes/ez_platform_v2.2.0/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/release_notes/ez_platform_v2.3/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Error (cached)
+* [302]  | Error (cached)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/release_notes/ez_platform_v2.4/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/release_notes/ez_platform_v2.5/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [302]  | Error (cached)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/release_notes/ez_platform_v3.0/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Error (cached)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Error (cached)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/release_notes/ez_platform_v3.0_deprecations/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [302]  | Error (cached)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/release_notes/ez_platform_v3.1/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/release_notes/ibexa_dxp_v3.2/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/release_notes/ibexa_dxp_v3.3/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/release_notes/ibexa_dxp_v4.0/index.html
+
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/release_notes/ibexa_dxp_v4.0_deprecations/index.html
+
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/release_notes/ibexa_dxp_v4.1/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/release_notes/ibexa_dxp_v4.2/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/release_notes/ibexa_dxp_v4.3/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+
+### Errors in site/release_notes/ibexa_dxp_v4.6/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Error (cached)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/release_notes/ibexa_dxp_v5.0/index.html
+
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/resources/contributing/report_and_follow_issues/index.html
+
+* [302]  | Error (cached)
+
+### Errors in site/resources/new_in_doc/index.html
+
+* [404]  | Error (cached)
+* [404]  | Error (cached)
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/resources/phpstorm_plugin/index.html
+
+* [401]  | Rejected status code: 401 Unauthorized (configurable with "accept" option)
+
+### Errors in site/resources/release_process_and_roadmap/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/snippets/release_46/index.html
+
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/snippets/release_50/index.html
+
+* [404]  | Error (cached)
+* [404]  | Error (cached)
+* [404]  | Error (cached)
+
+### Errors in site/snippets/update/finish_the_update/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/snippets/update/merge_composer/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/snippets/update/notify_support/index.html
+
+* [302]  | Error (cached)
+
+### Errors in site/templating/layout/customize_storefront_layout/index.html
+
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/templating/render_content/customize_product_view/index.html
+
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
+### Errors in site/templating/render_content/render_content_in_php/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/templating/twig_function_reference/icon_twig_functions/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/update_and_migration/from_1.x_2.x/update_app_to_2.5/index.html
+
+* [301]  | Error (cached)
+* [302]  | Error (cached)
+
+### Errors in site/update_and_migration/from_1.x_2.x/update_db_to_2.5/index.html
+
+* [301]  | Error (cached)
+* [302]  | Error (cached)
+
+### Errors in site/update_and_migration/from_2.5/to_3.2/index.html
+
+* [301]  | Error (cached)
+* [302]  | Error (cached)
+
+### Errors in site/update_and_migration/from_3.3/to_4.0/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/update_and_migration/from_3.3/update_from_3.3/index.html
+
+* [301]  | Error (cached)
+* [404]  | Error (cached)
+* [302]  | Error (cached)
+
+### Errors in site/update_and_migration/from_4.1/update_from_4.1/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/update_and_migration/from_4.6/update_from_4.6/index.html
+
+* [302]  | Error (cached)
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [302]  | Error (cached)
+
+### Errors in site/update_and_migration/from_4.6/update_to_5.0/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/update_and_migration/from_5.0/update_from_5.0/index.html
+
+* [301]  | Error (cached)
+
+### Errors in site/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish/index.html
+
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [301]  | Rejected status code: 301 Moved Permanently (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+
+### Errors in site/users/oauth_client/index.html
+
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
diff --git a/lychee-report.md b/lychee-report.md
new file mode 100644
index 0000000000..4d4716a09b
--- /dev/null
+++ b/lychee-report.md
@@ -0,0 +1,60 @@
+# Summary
+
+| Status         | Count |
+|----------------|-------|
+| 🔍 Total       | 1612  |
+| ✅ Successful  | 1566  |
+| ⏳ Timeouts    | 0     |
+| 🔀 Redirected  | 0     |
+| 👻 Excluded    | 4     |
+| ❓ Unknown     | 0     |
+| 🚫 Errors      | 42    |
+| ⛔ Unsupported | 0     |
+
+## Errors per input
+
+### Errors in site/release_notes/ibexa_dxp_v4.6/index.html
+
+* [ERROR]  | Cannot find file: File not found. Check if file exists and path is correct
+* [ERROR]  | Cannot find file: File not found. Check if file exists and path is correct
+* [ERROR]  | Cannot find file: File not found. Check if file exists and path is correct
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [302]  | Rejected status code: 302 Found (configurable with "accept" option): Redirects may have been limited by "max-redirects".
+* [404]  | Rejected status code: 404 Not Found (configurable with "accept" option)
+
diff --git a/lychee.toml b/lychee.toml.dist
similarity index 77%
rename from lychee.toml
rename to lychee.toml.dist
index 7329a5b7f1..6ac3482c39 100644
--- a/lychee.toml
+++ b/lychee.toml.dist
@@ -103,6 +103,10 @@ exclude_path = [
     "site/robots.txt",
     "site/update_and_migration/migrate_to_ibexa_dxp",
     "site/update_and_migration/from_1.x_2.x/",
+    # PHP API reference HTML is generated by phpDocumentor and uses  to resolve
+    # relative links — lychee does not honour  tags and would flag them as broken.
+    # Links pointing *to* these files from other pages are still checked.
+    "site/api/php_api/php_api_reference/",
 ]
 
 # Check the specified file extensions
@@ -136,21 +140,21 @@ remap = [
     #   1. direct .html files (PHP/REST API reference)
     #   2. directory paths with trailing slash → index.html
     #   3. directory paths without trailing slash → index.html
-    "https://doc\\.ibexa\\.co/en/4\\.6/(.+\\.html)$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-4.6/site/$1",
-    "https://doc\\.ibexa\\.co/en/4\\.6/(.+)/$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-4.6/site/$1/index.html",
-    "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+[^/#])$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-4.6/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/en/4\\.6/(.+\\.html)$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1",
+    "https://doc\\.ibexa\\.co/en/4\\.6/(.+)/$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+[^/#])$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1/index.html",
     # devdoc 5.0
-    "https://doc\\.ibexa\\.co/en/5\\.0/(.+\\.html)$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-5.0/site/$1",
-    "https://doc\\.ibexa\\.co/en/5\\.0/(.+)/$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-5.0/site/$1/index.html",
-    "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+[^/#])$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/devdoc-5.0/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/en/5\\.0/(.+\\.html)$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1",
+    "https://doc\\.ibexa\\.co/en/5\\.0/(.+)/$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+[^/#])$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1/index.html",
     # userdoc 4.6
-    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/(.+\\.html)$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-4.6/site/$1",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/(.+)/$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-4.6/site/$1/index.html",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+[^/#])$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-4.6/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/(.+\\.html)$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/(.+)/$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+[^/#])$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1/index.html",
     # userdoc 5.0
-    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/(.+\\.html)$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-5.0/site/$1",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/(.+)/$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-5.0/site/$1/index.html",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+[^/#])$ file:///Users/marek/Desktop/repos/mnocon/documentation-developer/link-checker/repositories/userdoc-5.0/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/(.+\\.html)$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/(.+)/$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+[^/#])$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html",
 ]
 
 #############################  Hosts  ###############################

From 1b18da2da9777f9f49d5903469d6a8d1caeae301 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Mon, 18 May 2026 09:38:18 +0200
Subject: [PATCH 08/16] Fix cards macro checking

---
 README.md             | 36 ++++++++++++++++++++++++++++++++++++
 clone-repositories.sh |  4 ++++
 main.py               |  4 ++--
 3 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 81daf33367..2b5406bcc0 100644
--- a/README.md
+++ b/README.md
@@ -93,6 +93,42 @@ Regenerate the baseline by running:
 vendor/bin/deptrac --formatter=baseline
 ```
 
+## Checking links
+
+External links in the built documentation are checked using [lychee](https://lychee.cli.rs).
+
+### Prerequisites
+
+Install lychee (once):
+
+```bash
+brew install lychee        # macOS
+cargo install lychee       # or build from source
+```
+
+Install Python dependencies (if not done already):
+
+```bash
+pip install -r requirements.txt
+```
+
+### Running the link checker
+
+```bash
+# 1. Build the main docs site
+mkdocs build --strict
+
+# 2. Clone and build versioned repositories, and generate lychee.toml
+#    Re-run after moving the repository to a new path or to refresh the clones.
+./clone-repositories.sh
+
+# 3. Check links
+lychee --config lychee.toml --cache --cache-exclude-status "400.." site
+```
+
+Steps 1 and 2 only need repeating when dependencies change, cloned repos need refreshing,
+or the repository is moved to a new path. After the initial setup, re-running step 3 is enough.
+
 ## Where to View
 
 https://doc.ibexa.co
diff --git a/clone-repositories.sh b/clone-repositories.sh
index c9ec1819ef..3b4b1984a0 100755
--- a/clone-repositories.sh
+++ b/clone-repositories.sh
@@ -11,6 +11,10 @@ set -euo pipefail
 
 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 
+# Prepend the local Python installation so pip/mkdocs resolve correctly.
+# Adjust this if your Python is installed elsewhere.
+export PATH="$HOME/python/bin:$PATH"
+
 cd "$SCRIPT_DIR"
 
 echo "==> Cloning versioned repositories..."
diff --git a/main.py b/main.py
index 3c38638782..c792ed6450 100644
--- a/main.py
+++ b/main.py
@@ -109,7 +109,7 @@ def cards(pages, columns=1, style="cards", force_version=False):
             elif re.search(".html$", path):
                 html = True
                 content = open("docs/%s" % path, "r").read()
-                page = '/'.join((
+                page = 'https:/' + '/'.join((
                     '/',
                     site,
                     language,
@@ -120,7 +120,7 @@ def cards(pages, columns=1, style="cards", force_version=False):
                 html = False
                 path = path.rstrip('/')
                 content = open("docs/%s.md" % path, "r").read()
-                page = '/'.join((
+                page = 'https:/' + '/'.join((
                     '/',
                     site,
                     language,

From 618e3e57782c9e515982e18ec6c236342db9fa3f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Mon, 18 May 2026 10:47:39 +0200
Subject: [PATCH 09/16] Run on CI

---
 .gitignore       |  2 +-
 lychee.toml.dist | 28 +++++++++++++++++++---------
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/.gitignore b/.gitignore
index 71fac772a1..a2c55c7b84 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,4 @@ docs/css/*.map
 .lycheecache
 lychee.toml
 /repositories/
-
+lychee-report.md
diff --git a/lychee.toml.dist b/lychee.toml.dist
index 6ac3482c39..e7c0180605 100644
--- a/lychee.toml.dist
+++ b/lychee.toml.dist
@@ -49,19 +49,19 @@ accept = ["200", "202", "429"]
 insecure = false
 
 # Check https/http and file:// (used by remap rules below).
-# Relative and root-relative internal links are still skipped because they
-# don't match any scheme — internal links are validated by mkdocs build --strict.
+# Internal file:// links (resolved via root_dir) are excluded separately — see the
+# exclude list below. Only cross-doc file:// links produced by remap rules are checked.
 scheme = ["https", "http", "file"]
 
-# Use HEAD requests — much faster than GET since no body is downloaded.
-# Fragment checking requires GET, so include_fragments is disabled;
-# internal anchor links are already validated by `mkdocs build --strict`.
+# GET is required for fragment checking (HEAD responses have no body).
 method = "GET"
 
 # Mimic a browser to avoid Cloudflare bot-detection (403) on sites like doc.ibexa.co.
 user_agent = "Mozilla/5.0 (compatible; lychee link checker)"
 
-# Do NOT check anchor fragments — requires full GET downloads for every URL.
+# Check anchor fragments in cross-doc links (remapped to explicit index.html paths).
+# Internal fragments are already validated by `mkdocs build --strict` and are excluded
+# via the file:// exclude pattern above.
 include_fragments = true
 
 # Do NOT check links inside  and 
 blocks.
@@ -85,6 +85,12 @@ exclude = [
     "^https://redocly\\.com/redoc/",
     "^https://updates\\.ibexa.co",
     "^https://console\\.cloud\\.google\\.com",
+    # Internal file:// links (resolved from root-relative/relative hrefs via root_dir) point
+    # to directory-style paths that lychee cannot resolve to index.html — fragment checking
+    # always fails. These links are already validated by `mkdocs build --strict`, so skip them.
+    # Cross-doc links produced by the remap rules below go through the `repositories/`
+    # subdirectory and are therefore NOT matched by this pattern.
+    "^file://__BASE_DIR__/site/",
     # Versionless project root links (e.g. /projects/connect, /projects/userguide) appear in
     # the MkDocs theme sidebar as cross-project navigation and are not real content links.
     # The https form appears as absolute links; the file:// form appears after root_dir resolution
@@ -117,9 +123,9 @@ exclude_all_private = true
 
 #############################  Local files  #########################
 
-# Required to resolve root-relative links (e.g. href="/") found in every page.
-# Combined with scheme = ["https", "http"], the resulting file:// paths are
-# silently skipped — no HTTP check, no error.
+# Required to resolve root-relative links (e.g. href="/…") found in every page into
+# file:// URLs. Those file:// URLs are then excluded from checking by the pattern in
+# the exclude list — internal links are validated by `mkdocs build --strict`.
 root_dir = "site"
 
 #############################  Remap  ###############################
@@ -136,6 +142,10 @@ root_dir = "site"
 #   (and similarly for devdoc-5.0, userdoc-4.6, userdoc-5.0)
 # Then build each with: python3 -m mkdocs build
 remap = [
+    # GitHub line-number fragments (#L7, #L12-L15) are rendered via JavaScript —
+    # lychee cannot find them in the raw HTML. Strip the fragment so the file
+    # existence is still verified.
+    "^(https://github\\.com/[^#]+)#L[0-9].* $1",
     # devdoc 4.6 — three patterns in priority order:
     #   1. direct .html files (PHP/REST API reference)
     #   2. directory paths with trailing slash → index.html

From d6e24207a244dfb373c8cce8b560d4822f5e6dfc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Mon, 18 May 2026 12:26:59 +0200
Subject: [PATCH 10/16] Rerun on CI

---
 lychee.toml.dist | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/lychee.toml.dist b/lychee.toml.dist
index e7c0180605..ac19faa159 100644
--- a/lychee.toml.dist
+++ b/lychee.toml.dist
@@ -133,19 +133,27 @@ root_dir = "site"
 # Rewrite doc.ibexa.co links to locally-built MkDocs sites, avoiding HTTP
 # requests to Cloudflare-protected hosts.
 #
-# Two patterns per version:
-#   1. Trailing-slash pages  → /site//index.html
-#   2. Direct .html files    → /site/.html  (PHP/REST API refs)
-#
-# The `repositories/` directory must be populated via:
-#   git clone --depth=1 --branch 4.6 https://github.com/ibexa/documentation-developer.git repositories/devdoc-4.6
-#   (and similarly for devdoc-5.0, userdoc-4.6, userdoc-5.0)
-# Then build each with: python3 -m mkdocs build
+# - en/latest/           → current build's site/ directory (self-referential links from cards() macro)
+# - en/4.6/              → repositories/devdoc-4.6/site/
+# - en/5.0/              → repositories/devdoc-5.0/site/
+# - userguide/en/latest/ → repositories/userdoc-5.0/site/ (newest available)
+# - userguide/en/4.6/    → repositories/userdoc-4.6/site/
+# - userguide/en/5.0/    → repositories/userdoc-5.0/site/
 remap = [
     # GitHub line-number fragments (#L7, #L12-L15) are rendered via JavaScript —
     # lychee cannot find them in the raw HTML. Strip the fragment so the file
     # existence is still verified.
     "^(https://github\\.com/[^#]+)#L[0-9].* $1",
+    # doc.ibexa.co/en/latest/ links are self-referential: the cards() macro generates
+    # them when READTHEDOCS_VERSION_NAME is not set (e.g. in CI). Remap to the locally
+    # built site/ directory, which is then excluded from lychee (validated by mkdocs build --strict).
+    "https://doc\\.ibexa\\.co/en/latest/(.+\\.html)$ file://__BASE_DIR__/site/$1",
+    "https://doc\\.ibexa\\.co/en/latest/(.+)/$ file://__BASE_DIR__/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/en/latest/([^#]+[^/#])$ file://__BASE_DIR__/site/$1/index.html",
+    # userguide en/latest/ — map to the newest available clone (userdoc-5.0)
+    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/(.+\\.html)$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/(.+)/$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/([^#]+[^/#])$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html",
     # devdoc 4.6 — three patterns in priority order:
     #   1. direct .html files (PHP/REST API reference)
     #   2. directory paths with trailing slash → index.html

From 3843197e89a04c1bad821143b89688c960cb77be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Mon, 18 May 2026 13:30:46 +0200
Subject: [PATCH 11/16] Remap

---
 lychee.toml.dist | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lychee.toml.dist b/lychee.toml.dist
index ac19faa159..083126c7bc 100644
--- a/lychee.toml.dist
+++ b/lychee.toml.dist
@@ -150,6 +150,7 @@ remap = [
     "https://doc\\.ibexa\\.co/en/latest/(.+\\.html)$ file://__BASE_DIR__/site/$1",
     "https://doc\\.ibexa\\.co/en/latest/(.+)/$ file://__BASE_DIR__/site/$1/index.html",
     "https://doc\\.ibexa\\.co/en/latest/([^#]+[^/#])$ file://__BASE_DIR__/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/en/latest/$ file://__BASE_DIR__/site/index.html",
     # userguide en/latest/ — map to the newest available clone (userdoc-5.0)
     "https://doc\\.ibexa\\.co/projects/userguide/en/latest/(.+\\.html)$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1",
     "https://doc\\.ibexa\\.co/projects/userguide/en/latest/(.+)/$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html",

From 5dd0a6f771e4f33b74485ad6f662954dad04c451 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Mon, 18 May 2026 16:30:23 +0200
Subject: [PATCH 12/16] Fixed redirect links

---
 docs/administration/project_organization/bundles.md    |  2 +-
 .../extending_rest_api/creating_new_rest_resource.md   |  2 +-
 docs/api/rest_api/rest_api_usage/rest_responses.md     |  2 +-
 docs/content_management/images/fastly_io.md            |  4 ++--
 docs/getting_started/requirements.md                   |  6 +++---
 docs/ibexa_cloud/ibexa_cloud_guide.md                  |  4 ++--
 .../cache/http_cache/content_aware_cache.md            | 10 +++++-----
 .../cache/http_cache/fastly.md                         |  8 ++++----
 .../cache/http_cache/http_cache.md                     |  2 +-
 .../cache/http_cache/reverse_proxy.md                  |  6 +++---
 .../security/security_checklist.md                     |  2 +-
 docs/release_notes/ez_platform_v2.0.0.md               |  2 +-
 docs/release_notes/ez_platform_v2.5.md                 |  2 +-
 docs/release_notes/ez_platform_v3.1.md                 |  2 --
 docs/release_notes/ibexa_dxp_v4.2.md                   |  2 +-
 docs/release_notes/ibexa_dxp_v4.4.md                   |  4 ++--
 docs/snippets/update/finish_the_update.md              |  3 +--
 .../templating/render_content/render_content_in_php.md |  2 +-
 .../twig_function_reference/icon_twig_functions.md     |  2 +-
 docs/update_and_migration/from_3.3/to_4.0.md           |  2 +-
 docs/update_and_migration/from_4.1/update_from_4.1.md  |  2 +-
 docs/update_and_migration/from_4.6/update_from_4.6.md  |  2 +-
 docs/update_and_migration/from_4.6/update_to_5.0.md    |  2 +-
 docs/update_and_migration/from_5.0/update_from_5.0.md  |  2 +-
 24 files changed, 37 insertions(+), 40 deletions(-)

diff --git a/docs/administration/project_organization/bundles.md b/docs/administration/project_organization/bundles.md
index d86f120710..e1743e996e 100644
--- a/docs/administration/project_organization/bundles.md
+++ b/docs/administration/project_organization/bundles.md
@@ -28,7 +28,7 @@ When overriding files, the path inside your application has to correspond to the
 
 ### Removing bundles
 
-To remove a bundle (either one you created yourself, or an out-of-the-box one that you don't need), see the [How to Remove a Bundle]([[= symfony_doc =]]/bundles/remove.html) instruction in Symfony doc.
+To remove a bundle (either one you created yourself, or an out-of-the-box one that you don't need), remove the bundle entry from `config/bundles.php`.
 
 ## Core packages
 
diff --git a/docs/api/rest_api/extending_rest_api/creating_new_rest_resource.md b/docs/api/rest_api/extending_rest_api/creating_new_rest_resource.md
index 37e53f8f0a..b3e5aafff4 100644
--- a/docs/api/rest_api/extending_rest_api/creating_new_rest_resource.md
+++ b/docs/api/rest_api/extending_rest_api/creating_new_rest_resource.md
@@ -190,7 +190,7 @@ ibexa_rest:
 The `router.generate` renders a URI based on the name of the route and its parameters.
 The parameter values can be a real value or a placeholder.
 For example, `'router.generate("ibexa.rest.load_location", {locationPath: "1/2"})'` results in `/api/ibexa/v2/content/locations/1/2` while `'router.generate("ibexa.rest.load_location", {locationPath: "{locationPath}"})'` gives `/api/ibexa/v2/content/locations/{locationPath}`.
-This syntax is based on Symfony's [expression language]([[= symfony_doc =]]/components/expression_language/index.html), an extensible component that allows limited/readable scripting to be used outside the code context.
+This syntax is based on Symfony's [expression language]([[= symfony_doc =]]/components/expression_language.html), an extensible component that allows limited/readable scripting to be used outside the code context.
 
 In this example, `app.rest.greeting` is available in every SiteAccess (`default`):
 
diff --git a/docs/api/rest_api/rest_api_usage/rest_responses.md b/docs/api/rest_api/rest_api_usage/rest_responses.md
index 4f76ab4508..40b698dea0 100644
--- a/docs/api/rest_api/rest_api_usage/rest_responses.md
+++ b/docs/api/rest_api/rest_api_usage/rest_responses.md
@@ -137,7 +137,7 @@ Content-Type: application/vnd.ibexa.api.Content+json
 
 [Cross-Origin Resource Sharing (CORS)](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) can allow the REST API to be reached from a page on another domain.
 
-For more information about CORS, see [WHATWG's CORS Protocol specification](https://fetch.spec.whatwg.org/#cors-protocol) and [Overview of CORS on developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS).
+For more information about CORS, see [WHATWG's CORS Protocol specification](https://fetch.spec.whatwg.org/#cors-protocol) and [Overview of CORS on developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS).
 
 CORS support is provided by the third party [nelmio/cors-bundle](https://packagist.org/packages/nelmio/cors-bundle). You can read more about it in [NelmioCorsBundle's README](https://github.com/nelmio/NelmioCorsBundle/blob/master/README.md).
 
diff --git a/docs/content_management/images/fastly_io.md b/docs/content_management/images/fastly_io.md
index 584604bd2b..bd3eab6c35 100644
--- a/docs/content_management/images/fastly_io.md
+++ b/docs/content_management/images/fastly_io.md
@@ -7,14 +7,14 @@ description: Configure Fastly Image Optimizer.
 The Fastly Image Optimizer (Fastly IO) is an external service that provides real-time image optimization for multiple input and output formats.
 It serves and caches image requests from your origin server, making your website faster and more efficient.
 
-To be able to configure this feature, you need [Fastly IO subscription](https://www.fastly.com/documentation/guides/full-site-delivery/about-fastly-image-optimizer/).
+To be able to configure this feature, you need [Fastly IO subscription](https://www.fastly.com/documentation/guides/full-site-delivery/image-optimization/about-fastly-image-optimizer/).
 
 ## Enable shielding
 
 To use Fastly Image Optimizer, you first need a [working setup of Ibexa DXP and Fastly](reverse_proxy.md#using-varnish-or-fastly)
 with shielding enabled.
 To enable shielding, follow the steps in [Fastly Developer Documentation](https://www.fastly.com/documentation/guides/concepts/shielding/#enabling-and-disabling-shielding).
-Remember to choose a shield location from the **Shielding** menu, as described in [Fastly User Documentation](https://www.fastly.com/documentation/guides/getting-started/hosts/shielding#enabling-shielding).
+Remember to choose a shield location from the **Shielding** menu, as described in [Fastly User Documentation](https://www.fastly.com/documentation/guides/getting-started/hosts/shielding/#enabling-shielding).
 
 ## VCL configuration
 
diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md
index d91ceb5937..18e954cdd5 100644
--- a/docs/getting_started/requirements.md
+++ b/docs/getting_started/requirements.md
@@ -298,7 +298,7 @@ For production setups it's recommended that you use Varnish/Fastly, Redis/Valkey
 
     - Linux NFS or S3/EFS (for IO, aka binary files stored in content repository, not supported with legacy)
     - Redis 7.2+, 8.4+, or Valkey 9.0+ (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/latest/develop/reference/eviction/), session instance configured for persistence)
-    - [Varnish](http://varnish-cache.org/) 6.0LTS or 7.1 with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](http_cache.md) (for HTTP Cache)
+    - [Varnish](https://www.varnish.org/) 6.0LTS or 7.1 with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](http_cache.md) (for HTTP Cache)
 
     If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release.
     For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x.
@@ -307,7 +307,7 @@ For production setups it's recommended that you use Varnish/Fastly, Redis/Valkey
 
     - Linux NFS or S3/EFS (for IO, aka binary files stored in content repository, not supported with legacy)
     - Redis 4.0+, 5.0+, 7.2+, 8.4+, or Valkey 9.0+ (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/latest/develop/reference/eviction/), session instance configured for persistence), or [Memcached](https://memcached.org/) 1.5 or higher
-    - [Varnish](http://varnish-cache.org/) 6.0LTS or 7.1 with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](http_cache.md) (for HTTP Cache)
+    - [Varnish](https://www.varnish.org/) 6.0LTS or 7.1 with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](http_cache.md) (for HTTP Cache)
 
     If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release.
     For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x.
@@ -316,7 +316,7 @@ For production setups it's recommended that you use Varnish/Fastly, Redis/Valkey
 
     - Linux NFS or S3/EFS (for IO, aka binary files stored in content repository, not supported with legacy)
     - Redis 4.0+ or 5.0+ (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/latest/develop/reference/eviction/), session instance configured for persistence) or [Memcached](https://memcached.org/) 1.5 or higher
-    - [Varnish](http://varnish-cache.org/) 6.0LTS with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](https://doc.ibexa.co/en/3.3/guide/cache/http_cache/) (for HTTP Cache)
+    - [Varnish](https://www.varnish.org/) 6.0LTS with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](https://doc.ibexa.co/en/3.3/guide/cache/http_cache/) (for HTTP Cache)
 
     If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release.
     For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x.
diff --git a/docs/ibexa_cloud/ibexa_cloud_guide.md b/docs/ibexa_cloud/ibexa_cloud_guide.md
index b85896b1af..c324dd04e1 100644
--- a/docs/ibexa_cloud/ibexa_cloud_guide.md
+++ b/docs/ibexa_cloud/ibexa_cloud_guide.md
@@ -51,7 +51,7 @@ All you have to do is access it and you can start deploying resources and develo
 
 ### Performance management
 
-Make your applications more effective, scalable, and effective by using the [Observability Suite](https://docs.upsun.com/increase-observability.html).
+Make your applications more effective, scalable, and effective by using the [Observability Suite](https://developer.upsun.com/docs/observability).
 This package gives you the ability to test, profile, and monitor your application before putting it into production.
 Observability Suite comes with each [[= product_name_cloud =]] subscription.
 
@@ -128,5 +128,5 @@ When you submit a ticket with [[= product_name_cloud =]], the support team looks
 ### Lower cost
 
 With PaaS solution there is no need to purchase and maintain hardware or software infrastructure. This reduces the total cost of ownership and operational expenses.
-According to [Forrester Total Economic Impact report](https://devcenter.upsun.com/posts/platform-sh-drives-meaningful-cost-savings/) from March 2022, a company that uses Upsun for three years achieves an investment return of 219%.
+According to Forrester Total Economic Impact report from March 2022, a company that uses Upsun for three years achieves an investment return of 219%.
 According to this in-depth analysis, Upsun reduces operating expenses for developers and IT by $1 million over the course of three years, and in as little as seven months, break-even point can be reached.
diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md
index ab84406005..698789af79 100644
--- a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md
+++ b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md
@@ -67,12 +67,12 @@ You can solve this issue in one of the following ways:
 
 Varnish configuration:
 
-- [http_resp_hdr_len](https://varnish-cache.org/docs/6.0/reference/varnishd.html#http-resp-hdr-len) (default 8k, change to for example, 32k)
-- [http_max_hdr](https://varnish-cache.org/docs/6.0/reference/varnishd.html#http-max-hdr) (default 64, change to for example, 128)
-- [http_resp_size](https://varnish-cache.org/docs/6.0/reference/varnishd.html#http-resp-size) (default 23k, change to for example, 96k)
-- [workspace_backend](https://varnish-cache.org/docs/6.0/reference/varnishd.html#workspace-backend) (default 64k, change to for example, 128k)
+- [http_resp_hdr_len](https://www.varnish.org/docs/reference/varnishd/#:~:text=http%5Fresp%5Fhdr%5Flen) (default 8k, change to for example, 32k)
+- [http_max_hdr](https://www.varnish.org/docs/reference/varnishd/#:~:text=http%5Fmax%5Fhdr) (default 64, change to for example, 128)
+- [http_resp_size](https://www.varnish.org/docs/reference/varnishd/#:~:text=http%5Fresp%5Fsize,-Units) (default 23k, change to for example, 96k)
+- [workspace_backend](https://www.varnish.org/docs/reference/varnishd/#:~:text=workspace%5Fbackend,-Units) (default 64k, change to for example, 128k)
 
-If you need to see these long headers in `varnishlog`, adapt the [vsl_reclen](https://varnish-cache.org/docs/6.0/reference/varnishd.html#vsl-reclen) setting.
+If you need to see these long headers in `varnishlog`, adapt the [vsl_reclen](https://www.varnish.org/docs/reference/varnishd/#:~:text=vsl%5Freclen,-Units) setting.
 
 Nginx has a default limit of 4k/8k when buffering responses:
 
diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md b/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md
index aeb20ed5f4..a920ec9455 100644
--- a/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md
+++ b/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md
@@ -116,7 +116,7 @@ fastly service-version activate --version=latest
 ## View and modify VCL configuration
 
 Fastly configuration is stored in Varnish Configuration Language (VCL) files.
-You can change the behaviour of Fastly by [uploading custom VCL files](https://www.fastly.com/documentation/guides/full-site-delivery/custom-vcl/uploading-custom-vcl).
+You can change the behaviour of Fastly by [uploading custom VCL files](https://www.fastly.com/documentation/guides/full-site-delivery/fastly-vcl/working-with-custom-vcl/).
 [[= product_name =]] ships with two VCL files that need to be enabled for Fastly to work correctly with the platform; `ibexa_main.vcl` and `ibexa_user_hash.vcl` (located in `vendor/ibexa/fastly/fastly/`)
 
 ### List custom `.vcl` files for specific version
@@ -216,7 +216,7 @@ fastly service-version activate --version=latest
 ## Snippets
 
 You can also add VCL code to the Fastly configuration without modifying the custom `.vcl` files directly.
-You do it by creating [snippets](https://www.fastly.com/documentation/guides/full-site-delivery/custom-vcl/about-vcl-snippets).
+You do it by creating [snippets](https://www.fastly.com/documentation/guides/full-site-delivery/fastly-vcl/vcl-snippets/about-vcl-snippets/).
 it's recommended that you use snippets instead of changing the VCL files provided by [[= product_name =]] as much as possible, which makes it easier to upgrade the [[= product_name =]] VCL configuration later.
 
 When you use snippets, the snippet code is injected into the VCL where the `#FASTLY ...` macros are placed.
@@ -339,7 +339,7 @@ To enable basic-auth, use [Fastly documentation](https://www.fastly.com/document
 
 Follow the steps below.
 
-Usernames and passwords can be stored inside the VCL file, but in this case credentials are stored in a [dictionary](https://www.fastly.com/documentation/guides/full-site-delivery/dictionaries/working-with-dictionaries#working-with-dictionaries-using-vcl-snippets).
+Usernames and passwords can be stored inside the VCL file, but in this case credentials are stored in a [dictionary](https://www.fastly.com/documentation/guides/full-site-delivery/dictionaries/working-with-dictionaries/#working-with-dictionaries-using-vcl-snippets).
 
 !!! note
     To make this example work, you must run [[= product_name =]] in version 3.3.16 or later, or 4.5.
@@ -391,7 +391,7 @@ fastly dictionary-entry list --dictionary-id=ltC6Rg4pqw4qaNKF5tEW33
 
 Now your dictionary stores new username and password. The next thing to do is to alter the Fastly VCL configuration
 and add the basic-auth support.
-This example uses [snippets](https://www.fastly.com/documentation/guides/full-site-delivery/custom-vcl/about-vcl-snippets), so that no changes are needed in the `.vcl` files that are shipped with [[= product_name =]].
+This example uses [snippets](https://www.fastly.com/documentation/guides/full-site-delivery/fastly-vcl/vcl-snippets/about-vcl-snippets/), so that no changes are needed in the `.vcl` files that are shipped with [[= product_name =]].
 You need two snippets, store these as files in your system:
 
 In `snippet_basic_auth_error.vcl`:
diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/http_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/http_cache.md
index 3ef834ec29..56d010379c 100644
--- a/docs/infrastructure_and_maintenance/cache/http_cache/http_cache.md
+++ b/docs/infrastructure_and_maintenance/cache/http_cache/http_cache.md
@@ -17,7 +17,7 @@ For content view responses coming from [[= product_name =]] itself, this means t
 All of this works across all the supported reverse proxies:
 
 - [Symfony HttpCache Proxy](reverse_proxy.md) - limited to a single server, and with limited performance/features
-- [Varnish](https://varnish-cache.org/) - high performance reverse proxy
+- [Varnish](https://www.varnish.org/) - high performance reverse proxy
 - [Fastly](https://www.fastly.com/) - Varnish-based CDN service
 
 You can use all these features in custom controllers as well.
diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md
index 8a743eb240..d126a14ed3 100644
--- a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md
+++ b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md
@@ -56,7 +56,7 @@ For reverse proxies to work properly with your installation, you need to add the
     - `ibexa_user_hash.vcl` as another custom VCL
     - `snippet_re_enable_shielding.vcl` as snippet
 
-The provided `.vcl` files work both with [Fastly Shielding](https://www.fastly.com/documentation/guides/getting-started/hosts/shielding) enabled and without it.
+The provided `.vcl` files work both with [Fastly Shielding](https://www.fastly.com/documentation/guides/getting-started/hosts/shielding/) enabled and without it.
 If you decide to use Fastly VCL, consider using [Fastly CLI](https://www.fastly.com/documentation/reference/tools/cli/#installing) with it to manage VCL files from the command line.
 To learn more, see [Prepare to use Fastly locally](fastly.md#prepare-for-using-fastly-locally) and [Introduction to Fastly CLI](fastly.md#quick-introduction-to-fastly-cli).
 
@@ -202,7 +202,7 @@ For more information about configuring Captcha fields, see [Captcha field](work_
 ### Use Fastly as HttpCache proxy
 
 [Fastly](https://www.fastly.com/) delivers Varnish as a CDN service and is supported with [[= product_name =]].
-To learn how it works, see [Fastly documentation](https://www.fastly.com/documentation/guides/getting-started/concepts/using-fastlys-global-pop-network).
+To learn how it works, see [Fastly documentation](https://www.fastly.com/documentation/guides/getting-started/concepts/using-fastlys-global-pop-network/).
 
 #### Configure Fastly in YML
 
@@ -247,7 +247,7 @@ To get the service ID, log in to https://www.fastly.com/.
 In the upper menu, click the **CONFIGURE** tab.
 The service ID is displayed next to the name of your service on any page.
 
-For instructions on how to generate a Fastly API token, see [the Fastly guide](https://www.fastly.com/documentation/guides/account-info/account-management/using-api-tokens).
+For instructions on how to generate a Fastly API token, see [the Fastly guide](https://www.fastly.com/documentation/guides/account-info/user-and-account-management/using-api-tokens/).
 The API token needs the `purge_all` an `purge_select` scopes.
 
 ### Configuration examples
diff --git a/docs/infrastructure_and_maintenance/security/security_checklist.md b/docs/infrastructure_and_maintenance/security/security_checklist.md
index 1f34f7efc6..751d9c430e 100644
--- a/docs/infrastructure_and_maintenance/security/security_checklist.md
+++ b/docs/infrastructure_and_maintenance/security/security_checklist.md
@@ -316,7 +316,7 @@ Those steps aren't needed when using [[= product_name_cloud =]], where the provi
 
 - Run servers on a recent operating system and install security patches for dependencies.
 - Configure servers to alert you about security updates from vendors. Pay special attention to dependencies used by your project directly, or by PHP. The provider of the operating system usually has a service for this.
-- Enable [GitHub Dependabot](https://docs.github.com/en/code-security/dependabot/dependabot-security-updates/about-dependabot-security-updates)
+- Enable [GitHub Dependabot](https://docs.github.com/en/code-security/concepts/supply-chain-security/about-dependabot-security-updates)
 to receive notifications when a security fix is released in a GitHub-hosted dependency.
 - If you're not using GitHub for your project, you can create a dummy project on GitHub with the same dependencies as your real project, and enable Dependabot notifications for that.
 - Ensure you get notifications about security fixes in JavaScript dependencies.
diff --git a/docs/release_notes/ez_platform_v2.0.0.md b/docs/release_notes/ez_platform_v2.0.0.md
index 68777b0234..7ed6d5fd9f 100644
--- a/docs/release_notes/ez_platform_v2.0.0.md
+++ b/docs/release_notes/ez_platform_v2.0.0.md
@@ -23,7 +23,7 @@ eZ Platform has become a pure Symfony application, based on Symfony 3, which bri
 
 !!! note
 
-    The move to [Symfony 3](https://symfony.com/roadmap?version=3.4) causes some changes, for example to the project's directory structure.
+    The move to [Symfony 3](https://symfony.com/releases/3.4) causes some changes, for example to the project's directory structure.
 
     Among others, the `var` directory now contains cache and logs.
     The `bin` directory is now used to call the `console` command, so use `bin/console` instead of `app/console`.
diff --git a/docs/release_notes/ez_platform_v2.5.md b/docs/release_notes/ez_platform_v2.5.md
index a820d2faa8..3b14dae160 100644
--- a/docs/release_notes/ez_platform_v2.5.md
+++ b/docs/release_notes/ez_platform_v2.5.md
@@ -268,7 +268,7 @@ The following PHP API methods have been added:
 With v2.5.6 you can optionally use Solr 7.7. To enable it:
 
 1. Update the `ezplatform-solr-search-engine` package version to ~2.0.
-2. Follow [Solr upgrade documentation](https://lucene.apache.org/solr/guide/7_7/solr-upgrade-notes.html).
+2. Follow [Solr upgrade documentation](https://solr.apache.org/guide/7_7/solr-upgrade-notes.html).
 3. Reindex your content.
 4. Clear cache.
 
diff --git a/docs/release_notes/ez_platform_v3.1.md b/docs/release_notes/ez_platform_v3.1.md
index a17b4471f4..1354f12dfd 100644
--- a/docs/release_notes/ez_platform_v3.1.md
+++ b/docs/release_notes/ez_platform_v3.1.md
@@ -12,8 +12,6 @@
 
 [eZ Commerce](https://github.com/ezsystems/ezcommerce) now uses Symfony 5 and is fully integrated into the eZ Platform back office.
 
-For more information, see [eZ Commerce documentation](https://doc.ezplatform.com/projects/ezcommerce/en/latest/).
-
 ## New features
 
 This release of eZ Platform introduces the following new features:
diff --git a/docs/release_notes/ibexa_dxp_v4.2.md b/docs/release_notes/ibexa_dxp_v4.2.md
index ce37151c45..1537e3c75e 100644
--- a/docs/release_notes/ibexa_dxp_v4.2.md
+++ b/docs/release_notes/ibexa_dxp_v4.2.md
@@ -120,7 +120,7 @@ With the [new Address field type](https://doc.ibexa.co/en/latest/content_managem
 Data migration now offers [repeatable migration steps](https://doc.ibexa.co/en/latest/guide/data_migration/importing_data/#repeatable-steps),
 especially useful when creating large amounts of data, for example for testing.
 
-You can vary the migration values by using the iteration counter, or by generating random data by using [`FakerPHP`](https://fakerphp.github.io/).
+You can vary the migration values by using the iteration counter, or by generating random data by using [`FakerPHP`](https://fakerphp.org/).
 
 ## Other changes
 
diff --git a/docs/release_notes/ibexa_dxp_v4.4.md b/docs/release_notes/ibexa_dxp_v4.4.md
index a5fd4c5e74..c4fb0034fe 100644
--- a/docs/release_notes/ibexa_dxp_v4.4.md
+++ b/docs/release_notes/ibexa_dxp_v4.4.md
@@ -48,7 +48,7 @@ For more information, see [Storefront](https://doc.ibexa.co/en/4.4/commerce/stor
 
 You can now use Fastly IO to serve optimized versions of your images in real time and cache them.
 Fastly can perform multiple transformations on your image, for example, cropping, resizing, and trimming before serving it to end user.
-Fastly is an external service that requires a separate subscription, to learn more see, [Fastly Image Optimizer website](https://docs.fastly.com/en/guides/about-fastly-image-optimizer).
+Fastly is an external service that requires a separate subscription, to learn more see, [Fastly Image Optimizer website](https://www.fastly.com/documentation/guides/full-site-delivery/image-optimization/about-fastly-image-optimizer/).
 
 If you already have Fastly IO subscription, you can move to [Fastly IO configuration in [[= product_name =]]](https://doc.ibexa.co/en/4.4/content_management/images/fastly_io/).
 
@@ -85,7 +85,7 @@ provide the best recommendations.
 
 ## [[= product_name_connect =]]
 
-You can now take advantage of [[[= product_name_connect =]]](https://www.ibexa.co/products/ibexa-connect),
+You can now take advantage of [[[= product_name_connect =]]](https://www.ibexa.co/products/features/integration-and-automation),
 an iPaaS (integration platform-as-a-service) which allows you to connect [[= product_name =]] with third-party applications.
 [[= product_name_connect =]] features a low-code drag-and-drop interface and hundreds of connectors to different services that help you automate business processes.
 
diff --git a/docs/snippets/update/finish_the_update.md b/docs/snippets/update/finish_the_update.md
index 3b70a38dbc..5edf59aacd 100644
--- a/docs/snippets/update/finish_the_update.md
+++ b/docs/snippets/update/finish_the_update.md
@@ -1,8 +1,7 @@
 ### A. Platform.sh changes
 
 If you're hosting your site on [[= product_name_cloud =]] be aware of the fact that Varnish is enabled by default as of v1.13.5, v2.4.3 and v2.5.0.
-If you're using Fastly, read about [how to disable Varnish](https://docs.platform.sh/frameworks/ibexa/fastly.html#remove-varnish-configuration).
-
+If you're using Fastly, read about [how to disable Varnish](https://fixed.docs.upsun.com/guides/ibexa/fastly.html#remove-varnish-configuration).
 ### B. Dump assets
 
 Dump web assets if you're using the `prod` environment. In `dev` this happens automatically:
diff --git a/docs/templating/render_content/render_content_in_php.md b/docs/templating/render_content/render_content_in_php.md
index 8d42cdbc75..50ec392e1e 100644
--- a/docs/templating/render_content/render_content_in_php.md
+++ b/docs/templating/render_content/render_content_in_php.md
@@ -16,7 +16,7 @@ While in PHP, you may need to render the view of a content item (for example, fo
 The following example is a command outputting the render of a content for a view type in the terminal.
 It works only if the view doesn't refer to the HTTP request.
 It's compatible with the default installation views such as `line` or `embed`.
-To go further with this example, you could add some dedicated views not outputting HTML but, for example, plain text, [Symfony command styled text]([[= symfony_doc =]]/console/coloring.html) or Markdown.
+To go further with this example, you could add some dedicated views not outputting HTML but, for example, plain text, [Symfony command styled text]([[= symfony_doc =]]/console/style.html#output-coloring) or Markdown.
 It doesn't work with a `full` view when the [page layout](template_configuration.md#page-layout) uses `app.request`, such as the out-of-the-box template.
 
 Create the command in `src/Command/ViewCommand.php`:
diff --git a/docs/templating/twig_function_reference/icon_twig_functions.md b/docs/templating/twig_function_reference/icon_twig_functions.md
index ca993200ad..c0a2fdfe0a 100644
--- a/docs/templating/twig_function_reference/icon_twig_functions.md
+++ b/docs/templating/twig_function_reference/icon_twig_functions.md
@@ -25,7 +25,7 @@ The icons can be displayed in different colors and sizes.
 
 ### Icon color variants
 
-By default, the icon inherits the [`fill`](https://developer.mozilla.org/en-US/docs/Web/CSS/fill) attribute from the parent element.
+By default, the icon inherits the [`fill`](https://developer.mozilla.org/docs/Web/CSS/Reference/Properties/fill) attribute from the parent element.
 You can change it by using one of the available CSS modifiers:
 
 |Modifier|Usage|
diff --git a/docs/update_and_migration/from_3.3/to_4.0.md b/docs/update_and_migration/from_3.3/to_4.0.md
index b1b46ff33e..331230a787 100644
--- a/docs/update_and_migration/from_3.3/to_4.0.md
+++ b/docs/update_and_migration/from_3.3/to_4.0.md
@@ -227,7 +227,7 @@ The v4 version of [[= product_name =]] is using Bootstrap 5 in the back office.
 #### Custom plugins and buttons
 
 If you added your own Online Editor plugins or buttons, you need to rewrite them
-using [CKEditor 5's extensibility](https://ckeditor.com/docs/ckeditor5/latest/tutorials/crash-course/plugins.html#creating-custom-plugins).
+using [CKEditor 5's extensibility](https://ckeditor.com/docs/ckeditor5/latest/framework/tutorials/crash-course/plugins.html#creating-custom-plugins).
 
 #### Custom tags
 
diff --git a/docs/update_and_migration/from_4.1/update_from_4.1.md b/docs/update_and_migration/from_4.1/update_from_4.1.md
index db04c3225e..2566d0b0d3 100644
--- a/docs/update_and_migration/from_4.1/update_from_4.1.md
+++ b/docs/update_and_migration/from_4.1/update_from_4.1.md
@@ -44,7 +44,7 @@ Follow the upgrade steps below to update them:
 3. Upload a new `snippet_re_enable_shielding.vcl` snippet file, based on `vendor/ibexa/fastly/fastly/snippet_re_enable_shielding.vcl`.
 
 Once the VCL configuration has been updated,
-you may enable [Fastly Shielding](https://docs.fastly.com/en/guides/shielding) if you prefer.
+you may enable [Fastly Shielding](https://www.fastly.com/documentation/guides/getting-started/hosts/shielding/) if you prefer.
 
 ## Update from v4.1.latest to v4.2
 
diff --git a/docs/update_and_migration/from_4.6/update_from_4.6.md b/docs/update_and_migration/from_4.6/update_from_4.6.md
index 1aadddff0c..5d833fdef0 100644
--- a/docs/update_and_migration/from_4.6/update_from_4.6.md
+++ b/docs/update_and_migration/from_4.6/update_from_4.6.md
@@ -474,7 +474,7 @@ composer require ibexa/elasticsearch8:[[= latest_tag_4_6 =]]
 Upgrade your Elasticsearch server to version 8.19 or higher.
 For detailed instructions, follow the [Elasticsearch upgrade guide](https://www.elastic.co/guide/en/elastic-stack/8.19/upgrading-elastic-stack.html#prepare-to-upgrade).
 
-When you use [[= product_name_cloud =]], see [Elasticsearch service](https://docs.upsun.com/add-services/elasticsearch.html) for a list of supported versions.
+When you use [[= product_name_cloud =]], see [Elasticsearch service](https://developer.upsun.com/docs/add-services/elasticsearch) for a list of supported versions.
 
 #### Update configuration
 
diff --git a/docs/update_and_migration/from_4.6/update_to_5.0.md b/docs/update_and_migration/from_4.6/update_to_5.0.md
index 0b9c561ce6..948abc081e 100644
--- a/docs/update_and_migration/from_4.6/update_to_5.0.md
+++ b/docs/update_and_migration/from_4.6/update_to_5.0.md
@@ -107,7 +107,7 @@ rm -r config/graphql
 
 [[= product_name =]] 5.0 is based on Symfony 7.3 and both must be updated.
 Your development packages must be updated as well.
-The example below assumes that [`symfony/debug-pack`](https://symfony.com/packages/Debug%20Pack) and `ibexa/rector` are installed.
+The example below assumes that [`symfony/debug-pack`](https://symfony.com/packages/debug-pack) and `ibexa/rector` are installed.
 Adjust the list based on your project requirements.
 Notice the use of the `--no-update` option to only edit the `composer.json` entries and avoid triggering the package update and Composer scripts.
 
diff --git a/docs/update_and_migration/from_5.0/update_from_5.0.md b/docs/update_and_migration/from_5.0/update_from_5.0.md
index e44c1b2c55..e7de658a7b 100644
--- a/docs/update_and_migration/from_5.0/update_from_5.0.md
+++ b/docs/update_and_migration/from_5.0/update_from_5.0.md
@@ -199,7 +199,7 @@ If you choose to upgrade to Elasticsearch 8, follow these steps:
 Upgrade your Elasticsearch server to version 8.19 or higher.
 For detailed instructions, follow the [Elasticsearch upgrade guide](https://www.elastic.co/guide/en/elastic-stack/8.19/upgrading-elastic-stack.html#prepare-to-upgrade).
 
-When you use [[= product_name_cloud =]], see [Elasticsearch service](https://docs.upsun.com/add-services/elasticsearch.html) for a list of supported versions.
+When you use [[= product_name_cloud =]], see [Elasticsearch service](https://developer.upsun.com/docs/add-services/elasticsearch) for a list of supported versions.
 
 #### Update configuration
 

From 95464aa4851319b019323dea705a0204f0a4a46e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Mon, 18 May 2026 20:09:19 +0200
Subject: [PATCH 13/16] Run on CI

---
 .github/workflows/link_check.yaml | 23 +++++++++++-
 clone-repositories.sh             | 24 +++++++++---
 lychee.toml.dist                  | 62 ++++++++++++++++++++-----------
 3 files changed, 81 insertions(+), 28 deletions(-)

diff --git a/.github/workflows/link_check.yaml b/.github/workflows/link_check.yaml
index 149aea3f32..af289e34e0 100644
--- a/.github/workflows/link_check.yaml
+++ b/.github/workflows/link_check.yaml
@@ -11,6 +11,22 @@ on:
                 description: "Clear lychee cache and recheck all links from scratch"
                 type: boolean
                 default: false
+            devdoc_50_branch:
+                description: "ibexa/documentation-developer branch for 5.0"
+                type: string
+                default: "5.0"
+            devdoc_46_branch:
+                description: "ibexa/documentation-developer branch for 4.6"
+                type: string
+                default: "4.6"
+            userdoc_50_branch:
+                description: "ibexa/documentation-user branch for 5.0"
+                type: string
+                default: "5.0"
+            userdoc_46_branch:
+                description: "ibexa/documentation-user branch for 4.6"
+                type: string
+                default: "4.6"
     pull_request: ~
     schedule:
         - cron: "0 6 * * *"
@@ -39,7 +55,12 @@ jobs:
               run: mkdocs build --strict
 
             - name: Clone and build versioned repositories for link remap
-              run: bash clone-repositories.sh
+              run: >-
+                  bash clone-repositories.sh
+                  "${{ inputs.devdoc_50_branch || '5.0' }}"
+                  "${{ inputs.devdoc_46_branch || '4.6' }}"
+                  "${{ inputs.userdoc_50_branch || '5.0' }}"
+                  "${{ inputs.userdoc_46_branch || '4.6' }}"
 
             - name: Restore lychee cache
               if: ${{ !inputs.force_recheck }}
diff --git a/clone-repositories.sh b/clone-repositories.sh
index 3b4b1984a0..058acc2bb5 100755
--- a/clone-repositories.sh
+++ b/clone-repositories.sh
@@ -2,13 +2,23 @@
 # Clones and builds versioned documentation repositories used by lychee's remap rules,
 # then updates the absolute paths in lychee.toml to match the current location.
 #
-# Usage: ./clone-repositories.sh
+# Usage: ./clone-repositories.sh [DEVDOC_50_BRANCH [DEVDOC_46_BRANCH [USERDOC_50_BRANCH [USERDOC_46_BRANCH]]]]
+#
+#   DEVDOC_50_BRANCH   Branch of ibexa/documentation-developer to use for 5.0 (default: 5.0)
+#   DEVDOC_46_BRANCH   Branch of ibexa/documentation-developer to use for 4.6 (default: 4.6)
+#   USERDOC_50_BRANCH  Branch of ibexa/documentation-user to use for 5.0     (default: 5.0)
+#   USERDOC_46_BRANCH  Branch of ibexa/documentation-user to use for 4.6     (default: 4.6)
 #
 # Run this once before running lychee. Re-run to refresh clones or after moving
 # the repository to a new path (the path in lychee.toml will be updated automatically).
 
 set -euo pipefail
 
+DEVDOC_50_BRANCH="${1:-5.0}"
+DEVDOC_46_BRANCH="${2:-4.6}"
+USERDOC_50_BRANCH="${3:-5.0}"
+USERDOC_46_BRANCH="${4:-4.6}"
+
 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 
 # Prepend the local Python installation so pip/mkdocs resolve correctly.
@@ -18,11 +28,15 @@ export PATH="$HOME/python/bin:$PATH"
 cd "$SCRIPT_DIR"
 
 echo "==> Cloning versioned repositories..."
+echo "    devdoc  5.0 → branch '$DEVDOC_50_BRANCH'"
+echo "    devdoc  4.6 → branch '$DEVDOC_46_BRANCH'"
+echo "    userdoc 5.0 → branch '$USERDOC_50_BRANCH'"
+echo "    userdoc 4.6 → branch '$USERDOC_46_BRANCH'"
 mkdir -p repositories
-git clone --depth=1 --branch 4.6 https://github.com/ibexa/documentation-developer.git repositories/devdoc-4.6 &
-git clone --depth=1 --branch 5.0 https://github.com/ibexa/documentation-developer.git repositories/devdoc-5.0 &
-git clone --depth=1 --branch 4.6 https://github.com/ibexa/documentation-user.git repositories/userdoc-4.6 &
-git clone --depth=1 --branch 5.0 https://github.com/ibexa/documentation-user.git repositories/userdoc-5.0 &
+git clone --depth=1 --branch "$DEVDOC_46_BRANCH"  https://github.com/ibexa/documentation-developer.git repositories/devdoc-4.6 &
+git clone --depth=1 --branch "$DEVDOC_50_BRANCH"  https://github.com/ibexa/documentation-developer.git repositories/devdoc-5.0 &
+git clone --depth=1 --branch "$USERDOC_46_BRANCH" https://github.com/ibexa/documentation-user.git repositories/userdoc-4.6 &
+git clone --depth=1 --branch "$USERDOC_50_BRANCH" https://github.com/ibexa/documentation-user.git repositories/userdoc-5.0 &
 wait
 
 echo "==> Building versioned repositories..."
diff --git a/lychee.toml.dist b/lychee.toml.dist
index 083126c7bc..81913a23f6 100644
--- a/lychee.toml.dist
+++ b/lychee.toml.dist
@@ -85,6 +85,12 @@ exclude = [
     "^https://redocly\\.com/redoc/",
     "^https://updates\\.ibexa.co",
     "^https://console\\.cloud\\.google\\.com",
+    # Ibexa Connect docs are Cloudflare-protected and not cloned locally
+    "^https://doc\\.ibexa\\.co/projects/connect/",
+    # These hosts block automated requests (403)
+    "^https?://(www\\.)?openai\\.com",
+    "^https?://help\\.openai\\.com",
+    "^https?://(www\\.)?paypal\\.com",
     # Internal file:// links (resolved from root-relative/relative hrefs via root_dir) point
     # to directory-style paths that lychee cannot resolve to index.html — fragment checking
     # always fails. These links are already validated by `mkdocs build --strict`, so skip them.
@@ -139,41 +145,53 @@ root_dir = "site"
 # - userguide/en/latest/ → repositories/userdoc-5.0/site/ (newest available)
 # - userguide/en/4.6/    → repositories/userdoc-4.6/site/
 # - userguide/en/5.0/    → repositories/userdoc-5.0/site/
+#
+# Three patterns per version handle all URL shapes.
+# NOTE: lychee applies remap BEFORE stripping the fragment, so each pattern uses
+# an optional (# .*)? group to capture and forward fragments to the local file path.
+#
+#   Pattern 1 — direct .html files (e.g. REST/PHP API reference):  ([^#]+\.html)(#.*)?
+#   Pattern 2 — directory with trailing slash:                      ([^#]+/)(#.*)?
+#   Pattern 3 — directory without trailing slash:                   ([^#]+[^/#])(#.*)?
 remap = [
     # GitHub line-number fragments (#L7, #L12-L15) are rendered via JavaScript —
     # lychee cannot find them in the raw HTML. Strip the fragment so the file
     # existence is still verified.
     "^(https://github\\.com/[^#]+)#L[0-9].* $1",
+    # MDN URLs without a locale redirect to the browser's preferred language.
+    # Remap to en-US so lychee can verify the link without following the redirect.
+    "^https://developer\\.mozilla\\.org/docs/(.+) https://developer.mozilla.org/en-US/docs/$1",
     # doc.ibexa.co/en/latest/ links are self-referential: the cards() macro generates
     # them when READTHEDOCS_VERSION_NAME is not set (e.g. in CI). Remap to the locally
     # built site/ directory, which is then excluded from lychee (validated by mkdocs build --strict).
-    "https://doc\\.ibexa\\.co/en/latest/(.+\\.html)$ file://__BASE_DIR__/site/$1",
-    "https://doc\\.ibexa\\.co/en/latest/(.+)/$ file://__BASE_DIR__/site/$1/index.html",
-    "https://doc\\.ibexa\\.co/en/latest/([^#]+[^/#])$ file://__BASE_DIR__/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/en/latest/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/site/$1$2",
+    "https://doc\\.ibexa\\.co/en/latest/([^#]+/)(#.*)?$ file://__BASE_DIR__/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/en/latest/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/site/$1/index.html$2",
     "https://doc\\.ibexa\\.co/en/latest/$ file://__BASE_DIR__/site/index.html",
     # userguide en/latest/ — map to the newest available clone (userdoc-5.0)
-    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/(.+\\.html)$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/(.+)/$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/([^#]+[^/#])$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html",
-    # devdoc 4.6 — three patterns in priority order:
-    #   1. direct .html files (PHP/REST API reference)
-    #   2. directory paths with trailing slash → index.html
-    #   3. directory paths without trailing slash → index.html
-    "https://doc\\.ibexa\\.co/en/4\\.6/(.+\\.html)$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1",
-    "https://doc\\.ibexa\\.co/en/4\\.6/(.+)/$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1/index.html",
-    "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+[^/#])$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html$2",
+    # devdoc 4.6
+    "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1$2",
+    "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1/index.html$2",
     # devdoc 5.0
-    "https://doc\\.ibexa\\.co/en/5\\.0/(.+\\.html)$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1",
-    "https://doc\\.ibexa\\.co/en/5\\.0/(.+)/$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1/index.html",
-    "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+[^/#])$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1$2",
+    "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1/index.html$2",
     # userdoc 4.6
-    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/(.+\\.html)$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/(.+)/$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1/index.html",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+[^/#])$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1/index.html$2",
     # userdoc 5.0
-    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/(.+\\.html)$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/(.+)/$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+[^/#])$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html$2",
+    # userdoc master — treated as the newest available (userdoc-5.0)
+    "https://doc\\.ibexa\\.co/projects/userguide/en/master/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/master/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/master/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html$2",
 ]
 
 #############################  Hosts  ###############################

From 80ec0bde42eb55024b54a57558ce36b996beb657 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Mon, 18 May 2026 20:13:00 +0200
Subject: [PATCH 14/16] Fixed regex

---
 lychee.toml.dist | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/lychee.toml.dist b/lychee.toml.dist
index 81913a23f6..f073dd6096 100644
--- a/lychee.toml.dist
+++ b/lychee.toml.dist
@@ -165,32 +165,32 @@ remap = [
     # them when READTHEDOCS_VERSION_NAME is not set (e.g. in CI). Remap to the locally
     # built site/ directory, which is then excluded from lychee (validated by mkdocs build --strict).
     "https://doc\\.ibexa\\.co/en/latest/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/site/$1$2",
-    "https://doc\\.ibexa\\.co/en/latest/([^#]+/)(#.*)?$ file://__BASE_DIR__/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/en/latest/([^#]+/)(#.*)?$ file://__BASE_DIR__/site/${1}index.html${2}",
     "https://doc\\.ibexa\\.co/en/latest/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/site/$1/index.html$2",
     "https://doc\\.ibexa\\.co/en/latest/$ file://__BASE_DIR__/site/index.html",
     # userguide en/latest/ — map to the newest available clone (userdoc-5.0)
     "https://doc\\.ibexa\\.co/projects/userguide/en/latest/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1$2",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/latest/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/${1}index.html${2}",
     "https://doc\\.ibexa\\.co/projects/userguide/en/latest/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html$2",
     # devdoc 4.6
     "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1$2",
-    "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/devdoc-4.6/site/${1}index.html${2}",
     "https://doc\\.ibexa\\.co/en/4\\.6/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/devdoc-4.6/site/$1/index.html$2",
     # devdoc 5.0
     "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1$2",
-    "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/devdoc-5.0/site/${1}index.html${2}",
     "https://doc\\.ibexa\\.co/en/5\\.0/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/devdoc-5.0/site/$1/index.html$2",
     # userdoc 4.6
     "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1$2",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-4.6/site/${1}index.html${2}",
     "https://doc\\.ibexa\\.co/projects/userguide/en/4\\.6/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/userdoc-4.6/site/$1/index.html$2",
     # userdoc 5.0
     "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1$2",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/${1}index.html${2}",
     "https://doc\\.ibexa\\.co/projects/userguide/en/5\\.0/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html$2",
     # userdoc master — treated as the newest available (userdoc-5.0)
     "https://doc\\.ibexa\\.co/projects/userguide/en/master/([^#]+\\.html)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1$2",
-    "https://doc\\.ibexa\\.co/projects/userguide/en/master/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1index.html$2",
+    "https://doc\\.ibexa\\.co/projects/userguide/en/master/([^#]+/)(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/${1}index.html${2}",
     "https://doc\\.ibexa\\.co/projects/userguide/en/master/([^#]+[^/#])(#.*)?$ file://__BASE_DIR__/repositories/userdoc-5.0/site/$1/index.html$2",
 ]
 

From 94c139b19f06385c3fec174f4399f67746c130c8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Mon, 18 May 2026 21:45:13 +0200
Subject: [PATCH 15/16] Run on CI

---
 README.md                                     | 15 ------------
 .../images/config/packages/images_remote.yaml |  2 +-
 .../cdp_add_clientside_tracking.md            |  2 +-
 .../storefront/configure_storefront.md        |  2 +-
 docs/content_management/images/images.md      |  4 ++--
 docs/getting_started/install_ibexa_dxp.md     |  6 ++---
 .../environments.md                           |  2 +-
 .../languages/automated_translations.md       |  2 +-
 .../personalization/enable_personalization.md |  2 +-
 .../tracking_with_ibexa-tracker.md            |  2 +-
 docs/product_catalog/quable/install_quable.md |  2 +-
 docs/product_catalog/quable/quable.md         |  2 +-
 docs/release_notes/ez_platform_v1.10.0.md     | 18 ++++----------
 docs/release_notes/ez_platform_v1.11.0.md     | 12 +---------
 docs/release_notes/ez_platform_v1.12.0.md     | 16 +++----------
 docs/release_notes/ez_platform_v1.13.0_lts.md | 12 +---------
 docs/release_notes/ez_platform_v1.7.0_lts.md  | 14 ++---------
 docs/release_notes/ez_platform_v1.8.0.md      | 16 +++----------
 docs/release_notes/ez_platform_v1.9.0.md      | 14 ++---------
 docs/release_notes/ez_platform_v2.0.0.md      |  4 ++--
 docs/release_notes/ez_platform_v2.1.0.md      |  4 ++--
 docs/release_notes/ez_platform_v2.2.0.md      | 12 +++++-----
 docs/release_notes/ez_platform_v2.3.md        | 10 ++++----
 docs/release_notes/ez_platform_v2.4.md        |  8 +++----
 docs/release_notes/ez_platform_v2.5.md        | 10 ++++----
 docs/release_notes/ez_platform_v3.0.md        |  2 +-
 .../ez_platform_v3.0_deprecations.md          |  2 +-
 docs/release_notes/ez_platform_v3.1.md        |  4 ++--
 docs/release_notes/ibexa_dxp_v3.2.md          |  4 +---
 docs/release_notes/ibexa_dxp_v3.3.md          | 24 +++++++++----------
 docs/release_notes/ibexa_dxp_v4.0.md          |  4 ++--
 docs/release_notes/ibexa_dxp_v4.1.md          |  2 +-
 docs/release_notes/ibexa_dxp_v4.2.md          |  4 ++--
 docs/release_notes/ibexa_dxp_v4.3.md          |  4 ++--
 docs/release_notes/ibexa_dxp_v4.4.md          |  2 +-
 docs/release_notes/ibexa_dxp_v4.5.md          |  2 +-
 docs/release_notes/ibexa_dxp_v4.6.md          | 12 +++++-----
 docs/release_notes/ibexa_dxp_v5.0.md          |  4 ++--
 docs/resources/new_in_doc.md                  | 23 +++++++++---------
 .../elasticsearch/configure_elasticsearch.md  |  2 +-
 .../recommendations_twig_functions.md         |  2 +-
 .../from_4.6/update_to_5.0.md                 |  2 +-
 docs/users/oauth_client.md                    |  2 +-
 lychee.toml.dist                              |  2 +-
 44 files changed, 104 insertions(+), 192 deletions(-)

diff --git a/README.md b/README.md
index 2b5406bcc0..a06a8843ed 100644
--- a/README.md
+++ b/README.md
@@ -97,21 +97,6 @@ vendor/bin/deptrac --formatter=baseline
 
 External links in the built documentation are checked using [lychee](https://lychee.cli.rs).
 
-### Prerequisites
-
-Install lychee (once):
-
-```bash
-brew install lychee        # macOS
-cargo install lychee       # or build from source
-```
-
-Install Python dependencies (if not done already):
-
-```bash
-pip install -r requirements.txt
-```
-
 ### Running the link checker
 
 ```bash
diff --git a/code_samples/back_office/images/config/packages/images_remote.yaml b/code_samples/back_office/images/config/packages/images_remote.yaml
index 130405074d..d5b7cb3f18 100644
--- a/code_samples/back_office/images/config/packages/images_remote.yaml
+++ b/code_samples/back_office/images/config/packages/images_remote.yaml
@@ -3,4 +3,4 @@ ibexa:
         default:
             provider: remote
             options:
-                url_pattern: 'https://placekitten.com/%%width%%/%%height%%'
+                url_pattern: 'https://picsum.photos/%%width%%/%%height%%'
diff --git a/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md b/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md
index b57ccf37c2..8e8a0981b6 100644
--- a/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md
+++ b/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md
@@ -32,4 +32,4 @@ Add the user ID information by using below script:
 raptor.push("setRuid","USER_ID_HERE")
 ```
 
-For more information on tracking events, see [the documentation](https://content.raptorservices.com/help-center/tracking-events-for-recommendation).
\ No newline at end of file
+For more information on tracking events, see [the documentation](https://content.raptorservices.com/help-center/tracking-events-parameters-reference).
diff --git a/docs/commerce/storefront/configure_storefront.md b/docs/commerce/storefront/configure_storefront.md
index bdc96c02c8..3d2fcd8af1 100644
--- a/docs/commerce/storefront/configure_storefront.md
+++ b/docs/commerce/storefront/configure_storefront.md
@@ -10,7 +10,7 @@ The Storefront is accessible under the `/product-catalog`.
 
 With the `ibexa/storefront` package, you can configure the product catalog and make it available to your shop users.
 
-Before you start configuring the Storefront, make sure you have created, configured, and published [catalogs]([[= user_doc =]]/pim/work_with_catalogs/#create-catalogs) in the back office.
+Before you start configuring the Storefront, make sure you have created, configured, and published [catalogs]([[= user_doc =]]/product_catalog/work_with_catalogs/#create-catalogs) in the back office.
 
 The configuration is available under the `ibexa.system..storefront.catalog` [configuration key](configuration.md#configuration-files).
 It accepts the following values:
diff --git a/docs/content_management/images/images.md b/docs/content_management/images/images.md
index fc58207a04..50f636f44e 100644
--- a/docs/content_management/images/images.md
+++ b/docs/content_management/images/images.md
@@ -141,10 +141,10 @@ The [`GenericProvider`](https://github.com/ibexa/core/blob/5.0/src/bundle/Core/I
 
 With the [`RemoteProvider`](https://github.com/ibexa/core/blob/5.0/src/bundle/Core/Imagine/PlaceholderProvider/RemoteProvider.php) you can download placeholders from:
 
- - remote sources, for example,  (see [example 2](#configuration-examples))
+ - remote sources, for example,  (see [example 2](#configuration-examples))
  - live version of a site (see [example 3](#configuration-examples))
 
-![Placeholder RemoteProvider - placekitten.com](placeholder_remote_provider.jpg "Remote placeholder images on a page")
+![Placeholder RemoteProvider - https://picsum.photos/](placeholder_remote_provider.jpg "Remote placeholder images on a page")
 
 |Option|Default value|Description|
 |------|-------------|-----------|
diff --git a/docs/getting_started/install_ibexa_dxp.md b/docs/getting_started/install_ibexa_dxp.md
index 8e6d13b984..db814210f3 100644
--- a/docs/getting_started/install_ibexa_dxp.md
+++ b/docs/getting_started/install_ibexa_dxp.md
@@ -23,7 +23,7 @@ You can install it by following your favorite tutorial, for example: [Install LA
 
 Additional requirements:
 
-- [Node.js](https://nodejs.org/en) and [Yarn](https://classic.yarnpkg.com/en/docs/install/#debian-stable) for asset management
+- [Node.js](https://nodejs.org/en) and [Yarn](https://classic.yarnpkg.com/en/docs/install/) for asset management
 - `git` for version control
 
 For production, you need to [configure an HTTP server](#configure-an-http-server), Apache or nginx (Apache is used as an example below).
@@ -366,7 +366,7 @@ Prepare a [virtual host configuration](https://en.wikipedia.org/wiki/Virtual_hos
 
 === "Apache"
 
-    You can copy [the example vhost file](https://raw.githubusercontent.com/ibexa/post-install/main/resources/templates/apache2/vhost.template)
+    You can copy [the example vhost file](https://raw.githubusercontent.com/ibexa/post-install/5.0/resources/templates/apache2/vhost.template)
     to `/etc/apache2/sites-available` as a `.conf` file and modify it to fit your project.
 
     Specify `//public` as the `DocumentRoot` and `Directory`, or ensure `BASEDIR` is set in the environment.
@@ -393,7 +393,7 @@ Prepare a [virtual host configuration](https://en.wikipedia.org/wiki/Virtual_hos
 
 === "nginx"
 
-    You can use [this example vhost file](https://raw.githubusercontent.com/ibexa/post-install/main/resources/templates/nginx/vhost.template) and modify it to fit your project. You also need the `ibexa_params.d` files that should reside in a subdirectory below where the main file is, [as is shown here](https://github.com/ibexa/post-install/tree/5.0/resources/templates/nginx).
+    You can use [this example vhost file](https://raw.githubusercontent.com/ibexa/post-install/5.0/resources/templates/nginx/vhost.template) and modify it to fit your project. You also need the `ibexa_params.d` files that should reside in a subdirectory below where the main file is, [as is shown here](https://github.com/ibexa/post-install/tree/5.0/resources/templates/nginx).
 
 
     Specify `//public` as the `root`, or ensure `BASEDIR` is set in the environment.
diff --git a/docs/infrastructure_and_maintenance/environments.md b/docs/infrastructure_and_maintenance/environments.md
index b58ba31d3a..248f865c9d 100644
--- a/docs/infrastructure_and_maintenance/environments.md
+++ b/docs/infrastructure_and_maintenance/environments.md
@@ -15,7 +15,7 @@ You can have different configuration sets for each of them.
 
 ## Web server configuration
 
-For example, when you use Apache, in the [`VirtualHost` example](https://raw.githubusercontent.com/ibexa/post-install/main/resources/templates/apache2/vhost.template) in your installation, the required `VirtualHost` configurations have been already included.
+For example, when you use Apache, in the [`VirtualHost` example](https://raw.githubusercontent.com/ibexa/post-install/5.0/resources/templates/apache2/vhost.template) in your installation, the required `VirtualHost` configurations have been already included.
 You can switch to the desired environment by setting the `ENVIRONMENT` variable to `prod`, `dev` or another custom value, like in the following example:
 
 ```apacheconf
diff --git a/docs/multisite/languages/automated_translations.md b/docs/multisite/languages/automated_translations.md
index 5bd9ee10d8..3efa6a6828 100644
--- a/docs/multisite/languages/automated_translations.md
+++ b/docs/multisite/languages/automated_translations.md
@@ -49,7 +49,7 @@ composer require ibexa/automated-translation
 
 Before you can start using the feature, you must configure access to your Google and/or DeepL account.
 
-1\. Get the [Google API key](https://developers.google.com/maps/documentation/javascript/get-api-key) and/or [DeepL Pro key](https://support.deepl.com/hc/en-us/articles/360020695820-API-Key-for-DeepL-s-API).
+1\. Get the [Google API key](https://developers.google.com/maps/documentation/javascript/get-api-key) and/or [DeepL Pro key](https://support.deepl.com/hc/en-us/articles/360020695820-API-key-for-DeepL-API).
 
 2\. Set these values in the YAML configuration files, under the `ibexa_automated_translation.system.default.configurations` key:
 
diff --git a/docs/personalization/enable_personalization.md b/docs/personalization/enable_personalization.md
index 7d3d2b4f17..c131dee26f 100644
--- a/docs/personalization/enable_personalization.md
+++ b/docs/personalization/enable_personalization.md
@@ -319,7 +319,7 @@ In the back office, go to **Personalization** > **Import** and review the list o
 
 The Personalization server is automatically kept in sync with the content in [[= product_name =]].
 
-Every time an editor creates, updates or deletes content in the back office, a notification is sent to https://admin.perso.ibexa.co/.
+Every time an editor creates, updates or deletes content in the back office, a notification is sent to the personalization server.
 The personalization service also notifies other components of the Personalization server and it eventually fetches the affected content and updates it internally.
 
 ![Subsequent content exports](incremental_content_export.png)
diff --git a/docs/personalization/tracking_with_ibexa-tracker.md b/docs/personalization/tracking_with_ibexa-tracker.md
index 8357133ab7..bc648730ed 100644
--- a/docs/personalization/tracking_with_ibexa-tracker.md
+++ b/docs/personalization/tracking_with_ibexa-tracker.md
@@ -88,7 +88,7 @@ _ycq.push(['_trackEvent', '1', 'click', '10', '']);
 | `_trackEvent` | - Executed with four additional parameters: `ItemType`, `EventType`, `ItemId`, `UserId`.
- `EventType` can be any of the [described types]([[= user_doc =]]/personalization/event_types/) | capturing an event: `_ycq.push(['_trackEvent', '1', 'buy', '10', '']);` | | `_trackTimedEvent` | - Executed with five additional parameters: `ItemType`, `EventType`, `ItemId`, `Timeout`, `UserId`.
- `EventType` can be any of the [described types]([[= user_doc =]]/personalization/event_types/).
- `Timeout` can be any integer greater than 0 representing time in ms | consume event sent after 20s: `_ycq.push(['_trackTimedEvent', '1', 'consume', '10', '20000', '']);` | | `_login` | - Executed with two additional parameters: anonymous userId, pseudonymous userId.
- It is to be triggered when a user logs in and the tracking identity is changed.
| - | -| `ycreco=true` | - If you want to send a click recommended event you can append the following parameter to the recommended item URLs: | [https://mydomain.com/mypage.html?ycreco=true](https://mydomain.com/mypage.html?ycreco=true) or
[https://mydomain.com/mypage.html?myparameter=x&ycreco=true](https://mydomain.com/mypage.html?myparameter=x&ycreco=true) | +| `ycreco=true` | - If you want to send a click recommended event you can append the following parameter to the recommended item URLs: | [https://example.com/mypage.html?ycreco=true](https://example.com/mypage.html?ycreco=true) or
[https://example.com/mypage.html?myparameter=x&ycreco=true](https://example.com/mypage.html?myparameter=x&ycreco=true) | ## Tracking with HTML event handlers diff --git a/docs/product_catalog/quable/install_quable.md b/docs/product_catalog/quable/install_quable.md index aaf32e25e9..f8ab3eed47 100644 --- a/docs/product_catalog/quable/install_quable.md +++ b/docs/product_catalog/quable/install_quable.md @@ -9,7 +9,7 @@ To integrate [[= product_name =]] with [[= pim_product_name =]] PIM, you need to ## Create [[= pim_product_name =]] instance -Before installing the [[= pim_product_name =]] connector, ensure you have access to a [[[= pim_product_name =]] PIM instance](https://quable.com). +Before installing the [[= pim_product_name =]] connector, ensure you have access to a [[[= pim_product_name =]] PIM instance](https://www.quable.com/en). ## Install package diff --git a/docs/product_catalog/quable/quable.md b/docs/product_catalog/quable/quable.md index 84bf0051ad..179ec41417 100644 --- a/docs/product_catalog/quable/quable.md +++ b/docs/product_catalog/quable/quable.md @@ -17,7 +17,7 @@ Products can be viewed, selected, and embedded in [[= product_name =]], while al [[= cards([ "product_catalog/quable/quable_guide", ("https://doc.ibexa.co/projects/userguide/en/5.0/product_catalog/quable_pim_integration/"), - ("https://quable.com/en", "Quable - PIM solution for product data management", "Manage your product data and accelerate sales with Quable. Discover the new PIM platform that revolutionizes the product experience"), + ("https://www.quable.com/en", "Quable - PIM solution for product data management", "Manage your product data and accelerate sales with Quable. Discover the new PIM platform that revolutionizes the product experience"), ("https://docs.quable.com/", "Quable resources", "Find all Quable PIM, DAM, and Portal resources: user guides, training content, product documentation, technical documentation, and the PIM API for developers."), ]) =]] diff --git a/docs/release_notes/ez_platform_v1.10.0.md b/docs/release_notes/ez_platform_v1.10.0.md index 3170ed2a9f..e628920ef4 100644 --- a/docs/release_notes/ez_platform_v1.10.0.md +++ b/docs/release_notes/ez_platform_v1.10.0.md @@ -5,7 +5,7 @@ **The FAST TRACK v1.10.0 release of eZ Platform and eZ Platform Enterprise Edition is available as of June 28, 2017.** -If you're looking for the Long Term Support (LTS) release, see [https://ezplatform.com/Blog/Long-Term-Support-is-Here](https://ezplatform.com/Blog/Long-Term-Support-is-Here) +If you're looking for the Long Term Support (LTS) release, see [eZ Platform 1.7 release notes](ez_platform_v1.7.0_lts.md). ## Notable changes since v1.9.0 @@ -25,7 +25,7 @@ This is a first step. We aim to provide more in terms of table support in the ed This is a new way to handle design, theming and design overrides, similar to what we had in eZ Publish. It enables you to define different Themes which are collections of assets and templates. You can then assemble Themes (that can override each other) to define Designs, and eventually, assign a Design to a SiteAccess. This is a powerful concept that we aim to use in our out-of-the-box templates and demo sites. It comes especially handy when using eZ Platform for a multisite installation and willing to reuse design parts. -For more information, see [Bundle documentation](https://github.com/ezsystems/ezplatform-design-engine/tree/master/doc). +For more information, see [Bundle documentation](https://github.com/ezsystems/ezplatform-design-engine/tree/v1.0/doc). ![](newdesigntable.png) @@ -91,7 +91,7 @@ Starting with 1.10, a new command `ezplatform:io:migrate-files` has been added ### eZ Platform Enterprise Edition - Studio Demo - [NovaeZSEOBundle](https://github.com/Novactive/NovaeZSEOBundle/) is now included in Studio Demo. NovaeZSEOBundle includes a new field type that lets you manage your SEO strategy in very advanced and powerful ways. -- We also improved the way we provide personalization in the site using a profiling block and letting the end user manage their preferences by themselves. In this new version, the end user, once logged on the site, can access a page where they can define their content preferences. See [here](https://ez.no/Blog/Personalization-Does-Not-Have-to-Be-that-Complex) for more information. +- We also improved the way we provide personalization in the site using a profiling block and letting the end user manage their preferences by themselves. In this new version, the end user, once logged on the site, can access a page where they can define their content preferences. ## Full list of new features, improvements and bug fixes since v1.9.0 @@ -105,21 +105,11 @@ Starting with 1.10, a new command `ezplatform:io:migrate-files` has been added Kudos to [@emodric](https://twitter.com/emodric) for the Tags bundle, [@pspanja](https://twitter.com/pspanja) for the work Solr index-time boosting, [@plopix](https://twitter.com/Plopix) for the NovaeZSEOBundle, [@jvieilledent](https://twitter.com/jvieilledent) for the initial work on the design engine and to all others who contributed bug reports, feedback and comments that made this release possible. -### Installation - -[Installation Guide](https://doc.ibexa.co/en/latest/getting_started/install_ez_platform) - -[Technical Requirements](https://doc.ibexa.co/en/latest/getting_started/requirements) - ### Download -#### eZ Platform - -- Download at [eZPlatform.com](http://ezplatform.com/#download) - #### eZ Enterprise -- [Customers: eZ Enterprise subscription (BUL License)](https://support.ez.no/Downloads) +- [Customers: eZ Enterprise subscription (BUL License)](https://support.ibexa.co/) - Partners: Test & Trial software access (TTL License) If you would like to become familiar with the products, [request a demo](https://www.ibexa.co/forms/request-a-demo). diff --git a/docs/release_notes/ez_platform_v1.11.0.md b/docs/release_notes/ez_platform_v1.11.0.md index 0956159832..a6fe789fb8 100644 --- a/docs/release_notes/ez_platform_v1.11.0.md +++ b/docs/release_notes/ez_platform_v1.11.0.md @@ -4,7 +4,7 @@ **The FAST TRACK v1.11.0 release of eZ Platform and eZ Platform Enterprise Edition is available as of August 24, 2017.** -If you're looking for the Long Term Support (LTS) release, see [https://ezplatform.com/Blog/Long-Term-Support-is-Here](https://ezplatform.com/Blog/Long-Term-Support-is-Here) +If you're looking for the Long Term Support (LTS) release, see [eZ Platform 1.7 release notes](ez_platform_v1.7.0_lts.md). ## Notable changes since v1.10.0 @@ -80,18 +80,8 @@ full support, maintenance, and priority security patch handling as they're used | [List of changes for rc1 of eZ Platform v1.11.0 on GitHub](https://github.com/ezsystems/ezplatform/releases/tag/v1.11.0-rc1) | [List of changes for rc1 for eZ Platform Enterprise Edition v1.11.0 on GitHub](https://github.com/ezsystems/ezplatform-ee/releases/tag/v1.11.0-rc1) | | [List of changes for beta1 of eZ Platform v1.11.0 on GitHub](https://github.com/ezsystems/ezplatform/releases/tag/v1.11.0-beta1) | [List of changes for beta1 of eZ Platform Enterprise Edition v1.11.0 on GitHub](https://github.com/ezsystems/ezplatform-ee/releases/tag/v1.11.0-beta1) | -### Installation - -[Installation Guide](https://doc.ibexa.co/en/latest/getting_started/install_ez_platform) - -[Technical Requirements](https://doc.ibexa.co/en/latest/getting_started/requirements) - ### Download -#### eZ Platform - -- Download at [eZPlatform.com](http://ezplatform.com/#download) - #### eZ Enterprise - [Customers: eZ Enterprise subscription (BUL License)](https://support.ez.no/Downloads) diff --git a/docs/release_notes/ez_platform_v1.12.0.md b/docs/release_notes/ez_platform_v1.12.0.md index 0d1ea28b71..b81e871df1 100644 --- a/docs/release_notes/ez_platform_v1.12.0.md +++ b/docs/release_notes/ez_platform_v1.12.0.md @@ -4,7 +4,7 @@ **The FAST TRACK v1.12.0 release of eZ Platform and eZ Platform Enterprise Edition is available as of October 31, 2017.** -If you're looking for the Long Term Support (LTS) release, see [https://ezplatform.com/Blog/Long-Term-Support-is-Here](https://ezplatform.com/Blog/Long-Term-Support-is-Here) +If you're looking for the Long Term Support (LTS) release, see [eZ Platform 1.7 release notes](ez_platform_v1.7.0_lts.md). ## Notable changes since v1.11.0 @@ -49,21 +49,11 @@ For Varnish users be aware thus change implies new VCL and requirement for varni | [List of changes for rc1 of eZ Platform v1.12.0 on GitHub](https://github.com/ezsystems/ezplatform/releases/tag/v1.12.0-rc1) | [List of changes for rc1 for eZ Platform Enterprise Edition v1.12.0 on GitHub](https://github.com/ezsystems/ezplatform-ee/releases/tag/v1.12.0-rc1) | | [List of changes for beta2 of eZ Platform v1.12.0 on GitHub](https://github.com/ezsystems/ezplatform/releases/tag/v1.12.0-beta2) | [List of changes for beta2 of eZ Platform Enterprise Edition v1.12.0 on GitHub](https://github.com/ezsystems/ezplatform-ee/releases/tag/v1.12.0-beta2) | -### Installation - -[Installation Guide](https://doc.ibexa.co/en/latest/getting_started/install_ez_platform) - -[Technical Requirements](https://doc.ibexa.co/en/latest/getting_started/requirements) - ### Download -#### eZ Platform - -- Download at eZPlatform.com - #### eZ Enterprise -- [Customers: eZ Enterprise subscription (BUL License)](https://support.ez.no/Downloads) +- [Customers: eZ Enterprise subscription (BUL License)](https://support.ibexa.co/) - Partners: Test & Trial software access (TTL License) If you would like to become familiar with the products, [request a demo](https://www.ibexa.co/forms/request-a-demo). @@ -76,7 +66,7 @@ To update to this version, follow the [updating guide](https://doc.ibexa.co/en/ This release enables the [ezplatform-http-cache](https://github.com/ezsystems/ezplatform-http-cache) Bundle by default as it has a more future-proof approach for HttpCache: - Cache tagging is more reliable at clearing all affected cache on, for instance, subtree operations - - More performant using [xkey](https://github.com/varnish/varnish-modules/blob/master/docs/vmod_xkey.rst) _("Surrogate Key")_ and soft purging, over BAN and growing ban list + - More performant using [xkey](https://github.com/varnish/varnish-modules/blob/varnish-modules-0.10.2/docs/vmod_xkey.rst) _("Surrogate Key")_ and soft purging, over BAN and growing ban list This means: - There is a new VCL diff --git a/docs/release_notes/ez_platform_v1.13.0_lts.md b/docs/release_notes/ez_platform_v1.13.0_lts.md index 75eac13483..8c3e7d9ccf 100644 --- a/docs/release_notes/ez_platform_v1.13.0_lts.md +++ b/docs/release_notes/ez_platform_v1.13.0_lts.md @@ -48,21 +48,11 @@ You can [serve Varnish through Fastly](https://doc.ibexa.co/en/latest/infrastruc | [List of changes for rc1 of eZ Platform v1.13.0 on GitHub](https://github.com/ezsystems/ezplatform/releases/tag/v1.13.0-rc1) | [List of changes for rc1 for eZ Platform Enterprise Edition v1.13.0 on GitHub](https://github.com/ezsystems/ezplatform-ee/releases/tag/v1.13.0-rc1) | | [List of changes for beta2 of eZ Platform v1.13.0 on GitHub](https://github.com/ezsystems/ezplatform/releases/tag/v1.13.0-beta2) | [List of changes for beta2 of eZ Platform Enterprise Edition v1.13.0 on GitHub](https://github.com/ezsystems/ezplatform-ee/releases/tag/v1.13.0-beta2) | -### Installation - -[Installation Guide](https://doc.ibexa.co/en/latest/getting_started/install_ez_platform) - -[Technical Requirements](https://doc.ibexa.co/en/latest/getting_started/requirements) - ### Download -#### eZ Platform - -- Download at [eZPlatform.com](http://ezplatform.com/#download) - #### eZ Enterprise -- [Customers: eZ Enterprise subscription (BUL License)](https://support.ez.no/Downloads) +- [Customers: eZ Enterprise subscription (BUL License)](https://support.ibexa.co/) - Partners: Test & Trial software access (TTL License) If you would like to become familiar with the products, [request a demo](https://www.ibexa.co/forms/request-a-demo). diff --git a/docs/release_notes/ez_platform_v1.7.0_lts.md b/docs/release_notes/ez_platform_v1.7.0_lts.md index 855ab9778a..57082423b1 100644 --- a/docs/release_notes/ez_platform_v1.7.0_lts.md +++ b/docs/release_notes/ez_platform_v1.7.0_lts.md @@ -13,7 +13,7 @@ eZ Platform Enterprise Edition v1.7.0 is the first version of the 2017 Long Ter As of v1.7.0, PHP requirements have been updated to remove PHP 5.5, leaving PHP 5.6 and 7.0 as supported PHP versions. -With the LTS release, the [new product naming](http://ez.no/Blog/eZ-Announces-Name-Changes-to-Product-Portfolio) takes effect: "eZ Platform" for the Open Source edition, and "eZ Platform Enterprise Edition" for subscribers. +With the LTS release, the new product naming takes effect: "eZ Platform" for the Open Source edition, and "eZ Platform Enterprise Edition" for subscribers. ## Notable Changes Since v1.6.0 @@ -97,21 +97,11 @@ Other improvements includes the good setup of all content type field categories ![](productcontenttype.png) -### Installation - -[Installation Guide](https://doc.ibexa.co/en/latest/getting_started/install_ez_platform) - -[Technical Requirements](https://doc.ibexa.co/en/latest/getting_started/requirements) - ### Download -#### eZ Platform - -- Download at [eZPlatform.com](http://ezplatform.com/#download) - #### eZ Enterprise -- [Customers: eZ Enterprise subscription (BUL License)](https://support.ez.no/Downloads) +- [Customers: eZ Enterprise subscription (BUL License)](https://support.ibexa.co/) - Partners: Test & Trial software access (TTL License) If you would like to become familiar with the products, [request a demo](https://www.ibexa.co/forms/request-a-demo). diff --git a/docs/release_notes/ez_platform_v1.8.0.md b/docs/release_notes/ez_platform_v1.8.0.md index f348b4038f..a991bc65ac 100644 --- a/docs/release_notes/ez_platform_v1.8.0.md +++ b/docs/release_notes/ez_platform_v1.8.0.md @@ -4,7 +4,7 @@ **The FAST TRACK v1.8.0 release of eZ Platform and eZ Platform Enterprise Edition is available as of February 16, 2017.** -If you're looking for the Long Term Support (LTS) release, see[ https://ezplatform.com/Blog/Long-Term-Support-is-Here](https://ezplatform.com/Blog/Long-Term-Support-is-Here) +If you're looking for the Long Term Support (LTS) release, see [eZ Platform 1.7 release notes](ez_platform_v1.7.0_lts.md). ## Notable Changes Since v1.7.0 LTS @@ -31,7 +31,7 @@ If you're looking for the Long Term Support (LTS) release, see[ https://ezplatf - New opt-in approach to HttpCache to improve usability and performance by means of: - Cache multi-tagging: allowing you to tag pages with, for example, path, location, type, or parent, so the repository can clear cache in a more targeted, accurate, and flexible way, getting rid of any "clear all" situations on complex operations. - - For Varnish this uses [xkey](https://github.com/varnish/varnish-modules/blob/master/docs/vmod_xkey.rst) instead of BAN, enabling greater performance by allowing you to control grace time. + - For Varnish this uses [xkey](https://github.com/varnish/varnish-modules/blob/varnish-modules-0.10.2/docs/vmod_xkey.rst) instead of BAN, enabling greater performance by allowing you to control grace time. - This also places HttpCache in a separate repo, allowing it to grow independently: see  - New `content/publish` policy to be able to configure `content/edit` rights independently from publish rights - Community-provided translations of the user interface may be imported individually to conserve resources @@ -81,21 +81,11 @@ If you're looking for the Long Term Support (LTS) release, see[ https://ezplatf | [List of changes for beta1 of eZ Platform v1.8.0 on GitHub](https://github.com/ezsystems/ezplatform/releases/tag/v1.8.0-beta1) | [List of changes for beta2 of eZ Platform Enterprise Edition v1.8.0 on GitHub](https://github.com/ezsystems/ezplatform-ee/releases/tag/v1.8.0-beta2) | -### Installation - -[Installation Guide](https://doc.ibexa.co/en/latest/getting_started/install_ez_platform) - -[Technical Requirements](https://doc.ibexa.co/en/latest/getting_started/requirements) - ### Download -#### eZ Platform - -- Download at [eZPlatform.com](http://ezplatform.com/#download) - #### eZ Enterprise -- [Customers: eZ Enterprise subscription (BUL License)](https://support.ez.no/Downloads) +- [Customers: eZ Enterprise subscription (BUL License)](https://support.ibexa.co/) - Partners: Test & Trial software access (TTL License) If you would like to become familiar with the products, [request a demo](https://www.ibexa.co/forms/request-a-demo). diff --git a/docs/release_notes/ez_platform_v1.9.0.md b/docs/release_notes/ez_platform_v1.9.0.md index 396bfe5480..ce0593be2c 100644 --- a/docs/release_notes/ez_platform_v1.9.0.md +++ b/docs/release_notes/ez_platform_v1.9.0.md @@ -5,8 +5,7 @@ **The FAST TRACK v1.9.0 release of eZ Platform and eZ Platform Enterprise Edition is available as of April 19, 2017.** -If you're looking for the Long Term Support (LTS) release, see[ https://ezplatform.com/Blog/Long-Term-Support-is-Here](https://ezplatform.com/Blog/Long-Term-Support-is-Here) - +If you're looking for the Long Term Support (LTS) release, see [eZ Platform 1.7 release notes](ez_platform_v1.7.0_lts.md). ## Notable changes since v1.8.0 @@ -71,21 +70,12 @@ The eZ Enterprise Demo now uses the [Netgen Tags bundle](https://github.com/netg | [List of changes for beta2 of eZ Platform v1.9.0 on GitHub](https://github.com/ezsystems/ezplatform/releases/tag/v1.9.0-beta2) | [List of changes for beta1 of eZ Platform Enterprise Edition v1.9.0 on GitHub](https://github.com/ezsystems/ezplatform-ee/releases/tag/v1.9.0-beta1) | -### Installation - -[Installation Guide](https://doc.ibexa.co/en/latest/getting_started/install_ez_platform) - -[Technical Requirements](https://doc.ibexa.co/en/latest/getting_started/requirements) ### Download -#### eZ Platform - -- Download at [eZPlatform.com](http://ezplatform.com/#download) - #### eZ Enterprise -- [Customers: eZ Enterprise subscription (BUL License)](https://support.ez.no/Downloads) +- [Customers: eZ Enterprise subscription (BUL License)](https://support.ibexa.co/) - Partners: Test & Trial software access (TTL License) If you would like to become familiar with the products, [request a demo](https://www.ibexa.co/forms/request-a-demo). diff --git a/docs/release_notes/ez_platform_v2.0.0.md b/docs/release_notes/ez_platform_v2.0.0.md index 7ed6d5fd9f..086d2a53f1 100644 --- a/docs/release_notes/ez_platform_v2.0.0.md +++ b/docs/release_notes/ez_platform_v2.0.0.md @@ -47,6 +47,6 @@ eZ Platform v2.0.0 requires PHP version 7.1, instead of 5.6, as before. Together ## Installation -[Installation guide](https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform) +[Installation guide](https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform/) -[Technical requirements](https://doc.ibexa.co/en/2.5/getting_started/requirements) +[Technical requirements](https://doc.ibexa.co/en/2.5/getting_started/requirements/) diff --git a/docs/release_notes/ez_platform_v2.1.0.md b/docs/release_notes/ez_platform_v2.1.0.md index 5bf2700a9e..4b7ced828a 100644 --- a/docs/release_notes/ez_platform_v2.1.0.md +++ b/docs/release_notes/ez_platform_v2.1.0.md @@ -82,6 +82,6 @@ You can now perform REST search via `POST /views` using custom `FieldCriterion`. ## Installation -[Installation guide](https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform) +[Installation guide](https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform/) -[Technical requirements](https://doc.ibexa.co/en/2.5/getting_started/requirements) +[Technical requirements](https://doc.ibexa.co/en/2.5/getting_started/requirements/) diff --git a/docs/release_notes/ez_platform_v2.2.0.md b/docs/release_notes/ez_platform_v2.2.0.md index c107c0ccd4..9505af0287 100644 --- a/docs/release_notes/ez_platform_v2.2.0.md +++ b/docs/release_notes/ez_platform_v2.2.0.md @@ -23,7 +23,7 @@ This version introduces the **Page Builder** which replaces the landing page edi They will be included again in a future release. The Places Page Builder block has been removed from the clean installation and will only be available in the demo out of the box. - If you had been using this block in your site, re-apply its configuration based on [the demo](https://github.com/ezsystems/ezplatform-ee-demo/blob/master/app/config/blocks.yaml). + If you had been using this block in your site, re-apply its configuration based on [the demo](https://github.com/ezsystems/ezplatform-ee-demo/blob/2.2/app/config/blocks.yaml). #### Modifying the Page content type @@ -39,7 +39,7 @@ In the Page block config you can now specify the CSS class with its own style fo !!! caution "Updating to 2.2" - Refer to [Updating eZ Platform](https://doc.ibexa.co/en/2.5/updating/5_update_2.2) for a database update script. + Refer to [Updating eZ Platform](https://doc.ibexa.co/en/2.5/updating/5_update_2.2/) for a database update script. To update to 2.2 with existing Content you need a [dedicated script for converting the landing page into the new Page](https://doc.ibexa.co/en/2.5/updating/5_update_2.2/#migrate-landing-pages). @@ -59,7 +59,7 @@ You can find the list of all bookmarks in *Browse content* section. There, you c ### Standard design -eZ Platform now comes with two designs that use the [design engine](https://doc.ibexa.co/en/2.5/guide/design_engine): `standard` for content view and `admin` for the back office. +eZ Platform now comes with two designs that use the [design engine](https://doc.ibexa.co/en/2.5/guide/design_engine/): `standard` for content view and `admin` for the back office. For more information, see [default designs](https://doc.ibexa.co/en/2.5/guide/design_engine/#default-designs). !!! caution @@ -81,7 +81,7 @@ Database charset is changed from UTF8 to UTF8MB4, to support 4-byte characters. !!! caution - To cover this change when upgrading, follow the instructions in the [update guide](https://doc.ibexa.co/en/2.5/updating/5_update_2.2). + To cover this change when upgrading, follow the instructions in the [update guide](https://doc.ibexa.co/en/2.5/updating/5_update_2.2/). ### URL generation pattern @@ -133,6 +133,6 @@ This release introduces a few notable simplifications to API use. Here are some ## Installation -[Installation guide](https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform) +[Installation guide](https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform/) -[Technical requirements](https://doc.ibexa.co/en/2.5/getting_started/requirements) +[Technical requirements](https://doc.ibexa.co/en/2.5/getting_started/requirements/) diff --git a/docs/release_notes/ez_platform_v2.3.md b/docs/release_notes/ez_platform_v2.3.md index 6ef3d158af..ede1b47a64 100644 --- a/docs/release_notes/ez_platform_v2.3.md +++ b/docs/release_notes/ez_platform_v2.3.md @@ -33,7 +33,7 @@ The timeline also shows other events, such a Content published with the date-based publisher. -For more information, see [advanced publishing options](https://doc.ibexa.co/projects/userguide/en/2.5/publishing/advanced_publishing_options) in User Documentation. +For more information, see [advanced publishing options](https://doc.ibexa.co/projects/userguide/en/2.5/publishing/advanced_publishing_options/) in User Documentation. ### Form Builder @@ -47,7 +47,7 @@ For more information, see [advanced publishing options](https://doc.ibexa.co/pro ![Form Builder submissions](2.3_form_builder_submissions.png) - See [Extending Form Builder](https://doc.ibexa.co/en/2.5/guide/extending/extending_form_builder) for information on how to modify and create Form fields. + See [Extending Form Builder](https://doc.ibexa.co/en/2.5/guide/extending/extending_form_builder/) for information on how to modify and create Form fields. For more information, see [forms](https://doc.ibexa.co/projects/userguide/en/2.5/creating_content_advanced/#forms) in User Documentation. @@ -55,7 +55,7 @@ For more information, see [forms](https://doc.ibexa.co/projects/userguide/en/2.5 You can now create a single source media library with images that can be reused across the system. -For more information, see [Reusing images](https://doc.ibexa.co/en/2.5/guide/images/#reusing-images) and [ImageAsset field type reference](https://doc.ibexa.co/en/2.5/api/field_types_reference/imageassetfield). +For more information, see [Reusing images](https://doc.ibexa.co/en/2.5/guide/images/#reusing-images) and [ImageAsset field type reference](https://doc.ibexa.co/en/2.5/api/field_types_reference/imageassetfield/). ![Set up multiple relations with image](2.3_image_asset.png) @@ -113,6 +113,6 @@ For more information, see [How to translate the interface using Crowdin](https:/ ## Installation -[Installation guide](https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform) +[Installation guide](https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform/) -[Technical requirements](https://doc.ibexa.co/en/2.5/getting_started/requirements) +[Technical requirements](https://doc.ibexa.co/en/2.5/getting_started/requirements/) diff --git a/docs/release_notes/ez_platform_v2.4.md b/docs/release_notes/ez_platform_v2.4.md index 90562b8ada..6a1c9cffdd 100644 --- a/docs/release_notes/ez_platform_v2.4.md +++ b/docs/release_notes/ez_platform_v2.4.md @@ -14,7 +14,7 @@ ### Editorial workflow - [Editorial Workflow](https://doc.ibexa.co/en/2.5/guide/workflow) enables you to pass content through a series of stages. + [Editorial Workflow](https://doc.ibexa.co/en/2.5/guide/workflow/) enables you to pass content through a series of stages. Each step can be used to represent for example contributions and approval of different teams and editors. For instance, an article can pass through draft, design and proofreading stages. @@ -35,7 +35,7 @@ RichText field type has been extracted to a separate bundle, [ezsystems/ezplatfo If you're implementing any interface or extending any base class from the old namespace, refer to its PHPDoc to see what to implement or extend instead. Make sure to enable the new eZ Platform RichTextBundle. -See [RichText field type Reference](https://doc.ibexa.co/en/2.5/api/field_types_reference/richtextfield). +See [RichText field type Reference](https://doc.ibexa.co/en/2.5/api/field_types_reference/richtextfield/). #### RichText block @@ -76,7 +76,7 @@ To learn how it works, see [FactBox tag](https://doc.ibexa.co/en/2.5/guide/exten You can now translate content type names and Field definitions. This possibility is available automatically when you have the target language configured -(in the same way as for translating content, see [Languages](https://doc.ibexa.co/en/2.5/guide/internationalization)). +(in the same way as for translating content, see [Languages](https://doc.ibexa.co/en/2.5/guide/internationalization/)). ![Content type with existing translations](2.4_content_type_translations.png "Available translation of a content type") @@ -213,7 +213,7 @@ The biggest benefit of this feature is saving load time on complex landing pages By default `HS256` is used as signature algorithm for generated token but we strongly recommend switching to SSH keys. - For more information, see [`LexikJWTAuthenticationBundle` installation instruction](https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Resources/doc/index.md#installation). + For more information, see [`LexikJWTAuthenticationBundle` installation instruction](https://github.com/lexik/LexikJWTAuthenticationBundle/blob/1.x/Resources/doc/index.md). 3\. Add `EzSystems\EzPlatformPageBuilder\Security\EditorialMode\TokenAuthenticator` authentication provider to `ezpublish_front` firewall before `form_login` in `app/config/security.yml`: diff --git a/docs/release_notes/ez_platform_v2.5.md b/docs/release_notes/ez_platform_v2.5.md index 3b14dae160..006cd9feb4 100644 --- a/docs/release_notes/ez_platform_v2.5.md +++ b/docs/release_notes/ez_platform_v2.5.md @@ -41,14 +41,14 @@ Database schema is now created based on [YAML configuration](https://github.com/ ### GraphQL -You can now take advantage of [GraphQL](https://doc.ibexa.co/en/2.5/api/graphql) to query and operate on content. +You can now take advantage of [GraphQL](https://doc.ibexa.co/en/2.5/api/graphql/) to query and operate on content. It uses a domain schema based on your content model. For more information, see [GraphQL documentation](https://graphql.org/). ### Matrix field type -The new [Matrix field type](https://doc.ibexa.co/en/2.5/api/field_types_reference/matrixfield) enables you to store a table of data. +The new [Matrix field type](https://doc.ibexa.co/en/2.5/api/field_types_reference/matrixfield/) enables you to store a table of data. Columns in the matrix are defined in the field definition. ![Configuring a Matrix field type](2.5_matrix_ft.png) @@ -155,7 +155,7 @@ New API improvements include: ## Requirements changes -Due to using Webpack Encore, you now need [Node.js and yarn](https://doc.ibexa.co/en/2.5/updating/updating) +Due to using Webpack Encore, you now need [Node.js and yarn](https://doc.ibexa.co/en/2.5/updating/updating/) to install or update eZ Platform. This release also changes support for versions of the following third-party software: @@ -164,7 +164,7 @@ This release also changes support for versions of the following third-party soft - Apache 2.2 is no longer supported. Use Apache 2.4 instead. - Varnish 4 is no longer supported. Use Varnish 5.1 or higher (6.0LTS recommended). -For full list of supported versions, see [Requirements](https://doc.ibexa.co/en/2.5/getting_started/requirements). +For full list of supported versions, see [Requirements](https://doc.ibexa.co/en/2.5/getting_started/requirements/). ### Password requirements @@ -243,7 +243,7 @@ This section provides a list of deprecated features to be removed in eZ Platform #### Custom Installers -- The `\EzSystems\PlatformInstallerBundle\Installer\CleanInstaller` class and its [service container](https://doc.ibexa.co/en/2.5/api/service_container) definition (`ezplatform.installer.clean_installer`) have been deprecated in favor of `EzSystems\PlatformInstallerBundle\Installer\CoreInstaller` which requires the [Doctrine Schema Bundle](https://github.com/ezsystems/doctrine-dbal-schema) to be enabled. +- The `\EzSystems\PlatformInstallerBundle\Installer\CleanInstaller` class and its service container definition (`ezplatform.installer.clean_installer`) have been deprecated in favor of `EzSystems\PlatformInstallerBundle\Installer\CoreInstaller` which requires the [Doctrine Schema Bundle](https://github.com/ezsystems/doctrine-dbal-schema) to be enabled. - The `ezplatform.installer.db_based_installer` service container definition has been deprecated in favor of its FQCN-named equivalent (`EzSystems\PlatformInstallerBundle\Installer\DbBasedInstaller`). - `vendor/ezsystems/ezpublish-kernel/data/mysql/schema.sql` has been deprecated and isn't used by the installation process anymore. diff --git a/docs/release_notes/ez_platform_v3.0.md b/docs/release_notes/ez_platform_v3.0.md index ad4246aa3f..d66428fe93 100644 --- a/docs/release_notes/ez_platform_v3.0.md +++ b/docs/release_notes/ez_platform_v3.0.md @@ -150,7 +150,7 @@ You can now duplicate a role with a single click in the back office. ### REST API reference -The REST reference has been moved from Kernel to a new page, [eZ Platform REST API](https://ezsystems.github.io/ezplatform-rest-reference). +The REST reference has been moved from Kernel to a new page, [eZ Platform REST API](https://doc.ibexa.co/en/3.0/api/rest_api_guide/). ### Search Criteria diff --git a/docs/release_notes/ez_platform_v3.0_deprecations.md b/docs/release_notes/ez_platform_v3.0_deprecations.md index a53c0491b1..816e48b31b 100644 --- a/docs/release_notes/ez_platform_v3.0_deprecations.md +++ b/docs/release_notes/ez_platform_v3.0_deprecations.md @@ -12,7 +12,7 @@ This page lists backwards compatibility breaks and deprecations introduced in eZ ## Symfony 5 v3.0 now uses Symfony 5 instead of Symfony 3. -Refer to [Symfony changelog for 4.0](https://github.com/symfony/symfony/blob/master/CHANGELOG-4.0.md), [for 5.0](https://github.com/symfony/symfony/blob/master/CHANGELOG-5.0.md), [Symfony upgrade guides for 4.0](https://github.com/symfony/symfony/blob/master/UPGRADE-4.0.md), and [for 5.0](https://github.com/symfony/symfony/blob/master/UPGRADE-5.0.md) to learn about all changes it entails. +Refer to [Symfony changelog for 4.0](https://github.com/symfony/symfony/blob/5.0/CHANGELOG-4.0.md), [for 5.0](https://github.com/symfony/symfony/blob/5.0/CHANGELOG-5.0.md), [Symfony upgrade guides for 4.0](https://github.com/symfony/symfony/blob/5.0/UPGRADE-4.0.md), and [for 5.0](https://github.com/symfony/symfony/blob/5.0/UPGRADE-5.0.md) to learn about all changes it entails. See [v3.0 project update](adapt_code_to_v3.md) for the steps you need to take to update your project to Symfony 5. See also [full requirements for installing eZ Platform](https://doc.ibexa.co/en/latest/getting_started/requirements). diff --git a/docs/release_notes/ez_platform_v3.1.md b/docs/release_notes/ez_platform_v3.1.md index 1354f12dfd..2e03ad18f8 100644 --- a/docs/release_notes/ez_platform_v3.1.md +++ b/docs/release_notes/ez_platform_v3.1.md @@ -59,7 +59,7 @@ This release of eZ Platform introduces the following new features: - Matrix - Media - For overview of additional fields, see [User documentation on Comparing versions]([[= user_doc =]]/publishing/publishing/#comparing-versions). + For overview of additional fields, see [User documentation on Comparing versions](https://doc.ibexa.co/projects/userguide/en/3.1/publishing/publishing/#comparing-versions). ### URL management UI @@ -72,7 +72,7 @@ You can create, modify or delete URL wildcards, and decide if the user should be ![URL Management UI](3_1_URL_Management.png "URL Management UI") -For more information on how to manage URLs, see [URL management](https://doc.ibexa.co/en/latest/guide/url_management). +For more information on how to manage URLs, see [URL management](https://doc.ibexa.co/en/3.1/guide/url_management). ### Tree view in the Universal Discovery Widget diff --git a/docs/release_notes/ibexa_dxp_v3.2.md b/docs/release_notes/ibexa_dxp_v3.2.md index 362635b839..4bb6b71634 100644 --- a/docs/release_notes/ibexa_dxp_v3.2.md +++ b/docs/release_notes/ibexa_dxp_v3.2.md @@ -30,7 +30,7 @@ and use assets such as images directly from the DAM in your content. [[= product_name_base =]] Platform can now save your edits in a content item or product automatically to help you preserve the progress in an event of a failure. -For more information, see [Autosave](https://doc.ibexa.co/projects/userguide/en/latest/publishing/publishing/#autosave). +For more information, see [Autosave](https://doc.ibexa.co/projects/userguide/en/3.2/publishing/publishing/#autosave). ### Aggregation API @@ -93,8 +93,6 @@ This way you can envision what content will be available in the future. Also, you can now apply new filters that are intended to help you declutter the calendar view. -For more information, see [Calendar widget](https://doc.ibexa.co/projects/userguide/en/latest/publishing/advanced_publishing_options/#calendar-widget). - ### Cloning content types When creating content types in the back office, you don't have to start from scratch. diff --git a/docs/release_notes/ibexa_dxp_v3.3.md b/docs/release_notes/ibexa_dxp_v3.3.md index 968728b0fc..3d9fcd223b 100644 --- a/docs/release_notes/ibexa_dxp_v3.3.md +++ b/docs/release_notes/ibexa_dxp_v3.3.md @@ -24,7 +24,7 @@ This release brings a completely reconstructed user interface of the Personaliza [[= product_name =]] is now installed using [Symfony Flex]([[= symfony_doc =]]/quick_tour/flex_recipes.html). -See [the updated installation instruction](https://doc.ibexa.co/en/3.3/getting_started/install_ez_platform) for a new guide to installing the product. +See [the updated installation instruction](https://doc.ibexa.co/en/3.3/getting_started/install_ez_platform/) for a new guide to installing the product. ### Image Editor @@ -35,11 +35,11 @@ that contain an `ezimage` or `ezimageasset` Field. You can modify the Image Editor's default settings to change its appearance or behavior. -For more information, see [Configuring the Image Editor](https://doc.ibexa.co/en/3.3/guide/image_editor). +For more information, see [Configuring the Image Editor](https://doc.ibexa.co/en/3.3/guide/image_editor/). ### Migration bundle -The new [migration bundle](https://doc.ibexa.co/en/3.3/guide/data_migration) enables you to export and import your Repository data by using YAML files. +The new [migration bundle](https://doc.ibexa.co/en/3.3/guide/data_migration/data_migration/) enables you to export and import your Repository data by using YAML files. ## Other changes @@ -47,9 +47,9 @@ The new [migration bundle](https://doc.ibexa.co/en/3.3/guide/data_migration) ena Search API has been extended with the following capabilities: -- [Score Sort Clause](https://doc.ibexa.co/en/3.3/guide/search/sort_clause_reference/score_sort_clause) orders search results by their score. -- [CustomField Sort Clause](https://doc.ibexa.co/en/3.3/guide/search/sort_clause_reference/customfield_sort_clause) sorts search results by raw search index fields. -- [ContentTranslatedName Sort Clause](https://doc.ibexa.co/en/3.3/guide/search/sort_clause_reference/contenttranslatedname_sort_clause) sorts search results by the content items' translated names. +- [Score Sort Clause](https://doc.ibexa.co/en/3.3/guide/search/sort_clause_reference/score_sort_clause/) orders search results by their score. +- [CustomField Sort Clause](https://doc.ibexa.co/en/3.3/guide/search/sort_clause_reference/customfield_sort_clause/) sorts search results by raw search index fields. +- [ContentTranslatedName Sort Clause](https://doc.ibexa.co/en/3.3/guide/search/sort_clause_reference/contenttranslatedname_sort_clause/) sorts search results by the content items' translated names. You can now access [additional search result data from PagerFanta](https://doc.ibexa.co/en/3.3/api/public_php_api_search/#additional-search-result-data). @@ -57,12 +57,12 @@ You can now access [additional search result data from PagerFanta](https://doc.i You can now use the following new PHP API methods: -- [`UserService::loadUserGroupByRemoteId`](https://github.com/ezsystems/ezplatform-kernel/blob/master/eZ/Publish/API/Repository/UserService.php#L71) -- [`PasswordHashService::getDefaultHashType`](https://github.com/ezsystems/ezplatform-kernel/blob/master/eZ/Publish/API/Repository/PasswordHashService.php#L18) -- [`PasswordHashService::getSupportedHashTypes`](https://github.com/ezsystems/ezplatform-kernel/blob/master/eZ/Publish/API/Repository/PasswordHashService.php#L25) -- [`PasswordHashService::isHashTypeSupported`](https://github.com/ezsystems/ezplatform-kernel/blob/master/eZ/Publish/API/Repository/PasswordHashService.php#L30) -- [`PasswordHashService::createPasswordHash`](https://github.com/ezsystems/ezplatform-kernel/blob/master/eZ/Publish/API/Repository/PasswordHashService.php#L37) -- [`PasswordHashService::isValidPassword`](https://github.com/ezsystems/ezplatform-kernel/blob/master/eZ/Publish/API/Repository/PasswordHashService.php#L44) +- [`UserService::loadUserGroupByRemoteId`](https://github.com/ezsystems/ezplatform-kernel/blob/1.3/eZ/Publish/API/Repository/UserService.php#L71) +- [`PasswordHashService::getDefaultHashType`](https://github.com/ezsystems/ezplatform-kernel/blob/1.3/eZ/Publish/API/Repository/PasswordHashService.php#L18) +- [`PasswordHashService::getSupportedHashTypes`](https://github.com/ezsystems/ezplatform-kernel/blob/1.3/eZ/Publish/API/Repository/PasswordHashService.php#L25) +- [`PasswordHashService::isHashTypeSupported`](https://github.com/ezsystems/ezplatform-kernel/blob/1.3/eZ/Publish/API/Repository/PasswordHashService.php#L30) +- [`PasswordHashService::createPasswordHash`](https://github.com/ezsystems/ezplatform-kernel/blob/1.3/eZ/Publish/API/Repository/PasswordHashService.php#L37) +- [`PasswordHashService::isValidPassword`](https://github.com/ezsystems/ezplatform-kernel/blob/1.3/eZ/Publish/API/Repository/PasswordHashService.php#L44) ### Query Field Location handling diff --git a/docs/release_notes/ibexa_dxp_v4.0.md b/docs/release_notes/ibexa_dxp_v4.0.md index 0870e0928d..185bab7b7b 100644 --- a/docs/release_notes/ibexa_dxp_v4.0.md +++ b/docs/release_notes/ibexa_dxp_v4.0.md @@ -60,7 +60,7 @@ You can now configure and use the locking feature to lock a draft of a content i so that only an assigned person can edit it, and no other user can take it over. For more information, see the [Draft locking](https://doc.ibexa.co/en/latest/guide/workflow/workflow/#draft-locking) -and relevant [User Documentation](https://doc.ibexa.co/projects/userguide/en/latest/publishing/editorial_workflow/#releasing-locked-drafts). +and relevant [User Documentation](https://doc.ibexa.co/projects/userguide/en/4.0/publishing/editorial_workflow/#releasing-locked-drafts). ### Online Editor is now based on CKEditor @@ -88,7 +88,7 @@ You can set it as required when adding the Image field to a content type. You can now select which page blocks, page layout and what edit mode are available in the Editor mode for the content type. -For more information, see [Working with Page](https://doc.ibexa.co/projects/userguide/en/latest/site_organization/working_with_page/#configure-block-display). +For more information, see [Working with Page](https://doc.ibexa.co/projects/userguide/en/4.0/site_organization/working_with_page/#configure-block-display). ### Purge all submissions of given form [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] diff --git a/docs/release_notes/ibexa_dxp_v4.1.md b/docs/release_notes/ibexa_dxp_v4.1.md index b9bed32901..0cafba6279 100644 --- a/docs/release_notes/ibexa_dxp_v4.1.md +++ b/docs/release_notes/ibexa_dxp_v4.1.md @@ -38,7 +38,7 @@ The new Measurement product attribute enables describing products with different ### Dynamic targeting block [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] -[Dynamic targeting block](https://doc.ibexa.co/projects/userguide/en/latest/site_organization/working_with_page/#dynamic-targeting-block) for the Page Builder provides recommendation items based on users related to the configured Segments. +[Dynamic targeting block](https://doc.ibexa.co/projects/userguide/en/4.1/site_organization/working_with_page/#dynamic-targeting-block) for the Page Builder provides recommendation items based on users related to the configured Segments. ![Dynamic targeting block](4.1_page_builder_dynamic_targeting.png) diff --git a/docs/release_notes/ibexa_dxp_v4.2.md b/docs/release_notes/ibexa_dxp_v4.2.md index 1537e3c75e..3c9ed7d3a9 100644 --- a/docs/release_notes/ibexa_dxp_v4.2.md +++ b/docs/release_notes/ibexa_dxp_v4.2.md @@ -40,7 +40,7 @@ For more information, see [Customer Portal documentation](https://doc.ibexa.co/p #### Inviting users -You can [invite users to create their account](https://doc.ibexa.co/projects/userguide/en/latest/users/user_management/#inviting-users) in the frontend as customers or in the back office as members of your team. +You can [invite users to create their account](https://doc.ibexa.co/projects/userguide/en/4.2/user_management/manage_users/#invite-users) in the frontend as customers or in the back office as members of your team. ![Inviting members of your team](4.2_invite_users.png) @@ -106,7 +106,7 @@ you can now get recommendations for all these content types. ### Taxonomy field type -Taxonomy is now [configured with a field type](https://doc.ibexa.co/projects/userguide/en/latest/taxonomy/#add-tag), +Taxonomy is now [configured with a field type](https://doc.ibexa.co/projects/userguide/en/latest/content_management/taxonomy/work_with_tags/#add-tag), so you can use many Fields to add different taxonomy categories, for example, tags and product categories in the same content type. ### Address field type diff --git a/docs/release_notes/ibexa_dxp_v4.3.md b/docs/release_notes/ibexa_dxp_v4.3.md index cd21993fec..25a22cd792 100644 --- a/docs/release_notes/ibexa_dxp_v4.3.md +++ b/docs/release_notes/ibexa_dxp_v4.3.md @@ -73,7 +73,7 @@ From product's **Completeness** tab you can now jump directly to editing the pro #### Catalog filters -In catalogs, you can now [configure default filters](https://doc.ibexa.co/en/5.0/pim/pim_configuration/#catalog-filters) that are always added to a catalog, define filter order, and group custom filters. +In catalogs, you can now [configure default filters](https://doc.ibexa.co/en/4.3/pim/pim_configuration/#catalog-filters) that are always added to a catalog, define filter order, and group custom filters. Built-in filters are also divided into groups now for easier browsing. Filtering by the Color attribute is now possible. @@ -104,7 +104,7 @@ The catalogs functionality in the product catalog is now covered in REST API, in ### Personalization improvements Now, as a Personalization admin, after editing a model in the back office, -[you can build this model](https://doc.ibexa.co/projects/userguide/en/master/personalization/recommendation_models/#trigger-model-build), use the **Trigger model build** button to build this model with your modifications. +[you can build this model](https://doc.ibexa.co/projects/userguide/en/master/personalization/configure_models/#trigger-model-build), use the **Trigger model build** button to build this model with your modifications. ### Taxonomy improvements diff --git a/docs/release_notes/ibexa_dxp_v4.4.md b/docs/release_notes/ibexa_dxp_v4.4.md index c4fb0034fe..bceadcea18 100644 --- a/docs/release_notes/ibexa_dxp_v4.4.md +++ b/docs/release_notes/ibexa_dxp_v4.4.md @@ -42,7 +42,7 @@ For more information, see [Commerce](https://doc.ibexa.co/en/4.4/commerce/commer Another addition is the Storefront package that provides a starting kit for the developers. It's a working set of components, which you can use to test the new capabilities, and then customize and extend to create your own implementation of a web store. -For more information, see [Storefront](https://doc.ibexa.co/en/4.4/commerce/storefront/storefront). +For more information, see [Storefront](https://doc.ibexa.co/en/4.4/commerce/storefront/storefront/). ### Fastly Image Optimizer (Fastly IO) diff --git a/docs/release_notes/ibexa_dxp_v4.5.md b/docs/release_notes/ibexa_dxp_v4.5.md index 02fb5edb6c..72189dc93d 100644 --- a/docs/release_notes/ibexa_dxp_v4.5.md +++ b/docs/release_notes/ibexa_dxp_v4.5.md @@ -207,7 +207,7 @@ It's no longer necessary to take other taxonomies into account when creating tag You can now enhance password security with a setting that prevents using passwords that have been exposed in a public breach. To do it, the system checks the password against known password dumps by using the https://haveibeenpwned.com/ API. -For more information, see [Breached passwords](https://doc.ibexa.co/en/4.5/users/user_management/#breached-passwords). +For more information, see [Breached passwords](https://doc.ibexa.co/en/4.5/users/passwords/#breached-passwords). ### [[= product_name_connect =]] diff --git a/docs/release_notes/ibexa_dxp_v4.6.md b/docs/release_notes/ibexa_dxp_v4.6.md index 46c05487bc..89c911b7c6 100644 --- a/docs/release_notes/ibexa_dxp_v4.6.md +++ b/docs/release_notes/ibexa_dxp_v4.6.md @@ -39,7 +39,7 @@ For more information, see [Product tour](https://doc.ibexa.co/en/4.6/administrat #### Taxonomy search -One [taxonomy search](https://doc.ibexa.co/en/4.6/content_management/taxonomy/taxonomy_api/search) criterion is added: +One [taxonomy search](https://doc.ibexa.co/en/4.6/content_management/taxonomy/taxonomy_api/) search criterion is added: - [`TaxonomyNoEntries`](https://doc.ibexa.co/en/4.6/search/criteria_reference/taxonomy_no_entries/) to find content items to which no taxonomy entries have been assigned. @@ -901,8 +901,8 @@ The new AI Assistant allows you to use the AI capabilities in additional places, The PHP API has been enhanced with the following new classes: -- [`Ibexa\Contracts\AdminUi\Permission\PermissionCheckContextProviderInterface`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Permission-PermissionCheckContextProviderInterface.html) -- [`Ibexa\Contracts\AdminUi\Values\PermissionCheckContext`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Values-PermissionCheckContext.html) +- [`Ibexa\Contracts\Share\Permission\PermissionCheckContextProviderInterface`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-Share-Permission-PermissionCheckContextProviderInterface.html) +- [`Ibexa\Contracts\Share\Values\PermissionCheckContext`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-Share-Values-PermissionCheckContext.html) - [`Ibexa\Contracts\Checkout\Discounts\DataMapper\DiscountsDataMapperInterface`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-Checkout-Discounts-DataMapper-DiscountsDataMapperInterface.html) - [`Ibexa\Contracts\Seo\Resolver\FieldValueResolverInterface`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-Seo-Resolver-FieldValueResolverInterface.html) @@ -1337,7 +1337,7 @@ With personal touch in mind, editors can now upload their photos (avatar), and p Also, editors and other users can customize their experience even better, with new preferences that have been added to user settings. -For more information, see [user profile and settings documentation](https://doc.ibexa.co/projects/userguide/en/master/getting_started/get_started/#edit-user-profile). +For more information, see [user profile and settings documentation](https://doc.ibexa.co/projects/userguide/en/master/getting_started/get_started/#view-and-edit-user-profile). ##### Recent activity log @@ -1439,7 +1439,7 @@ For more information, see [Create product types](https://doc.ibexa.co/projects/u VAT rates configuration has been extended to accept additional flags under the `extras` key. Developers can use them, for example, to pass additional information to the UI, or define special exclusion rules. -For more information, see [VAT rates](https://doc.ibexa.co/en/5.0/pim/pim_configuration/#vat-rates). +For more information, see [VAT rates](https://doc.ibexa.co/en/5.0/product_catalog/product_catalog_configuration/#vat-rates). ##### Ability to search through products in a catalog @@ -1447,7 +1447,7 @@ When you're reviewing catalog details, on the **Products** tab, you can now see ##### New Twig functions -The `ibexa_is_pim_local` Twig helper has been introduced, which can be used in templates to [check whether product data comes from a local or remote data source](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/storefront_twig_functions/#ibexa_is_pim_local), and adjust their behavior accordingly. +The `ibexa_is_pim_local` Twig helper has been introduced, which can be used in templates to [check whether product data comes from a local or remote data source](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/product_twig_functions/#ibexa_is_pim_local), and adjust their behavior accordingly. Also, several new Twig functions have been implemented that help [get product availability information](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/product_twig_functions/#ibexa_has_product_availability). ##### New and modified query types diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md index d853ba7738..b680c7cf21 100644 --- a/docs/release_notes/ibexa_dxp_v5.0.md +++ b/docs/release_notes/ibexa_dxp_v5.0.md @@ -167,7 +167,7 @@ The following additions were made to the PHP API: - [`Ibexa\Contracts\ProductCatalog\Events\ProductAttributeRenderEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Events-ProductAttributeRenderEvent.html) - [`Ibexa\Contracts\Taxonomy\Search\Query\Criterion\TaxonomyNoEntries`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Taxonomy-Search-Query-Criterion-TaxonomyNoEntries.html)
For more information, see [search criteria reference entry](https://doc.ibexa.co/en/5.0/search/criteria_reference/taxonomy_no_entries/). -- [`Ibexa\Contracts\ConnectorRaptor` namespace](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/namespaces/ibexa-contracts-connectorraptor.html) from the [Raptor connector add-on](https://doc.ibexa.co/en/5.0/cdp/raptor_integration/raptor_connector/) +- [`Ibexa\Contracts\ConnectorRaptor` namespace](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/namespaces/ibexa-contracts-connectorraptor.html) from the [Raptor connector add-on](https://doc.ibexa.co/en/5.0/recommendations/raptor_integration/raptor_connector/) - [`Ibexa\Contracts\IntegratedHelp` namespace](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/namespaces/ibexa-contracts-integratedhelp.html) from the [Integrated help LTS-Update](https://doc.ibexa.co/en/5.0/administration/back_office/integrated_help/) ### Full changelog @@ -209,7 +209,7 @@ Product variant querying now supports filtering by variant codes and product att You can now use the [`ProductServiceInterface::findVariants()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductServiceInterface.html#method_findVariants) method to search for variants across all products, regardless of their base product. -For more information, see [Product API - Searching variants](https://doc.ibexa.co/en/5.0/pim/product_api/#searching-for-variants-across-all-products). +For more information, see [Product API - Searching variants](https://doc.ibexa.co/en/5.0/product_catalog/product_api/#searching-for-variants-across-all-products). ### Infrastructure diff --git a/docs/resources/new_in_doc.md b/docs/resources/new_in_doc.md index 6be4a6ee76..68ba2a42c3 100644 --- a/docs/resources/new_in_doc.md +++ b/docs/resources/new_in_doc.md @@ -370,7 +370,7 @@ Installation instructions for v4.6 are not needed in v5.0, or replaced by config |:-----------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------| | [Install AI Actions](https://doc.ibexa.co/en/4.6/ai_actions/install_ai_actions/) | [Configure AI Actions](https://doc.ibexa.co/en/5.0/ai_actions/configure_ai_actions/) | | [Install Discounts](https://doc.ibexa.co/en/4.6/discounts/install_discounts/) | [Customize Discounts](https://doc.ibexa.co/en/5.0/discounts/configure_discounts/) directly | -| [Date and time attribute: Installation](https://doc.ibexa.co/en/4.6/pim/attributes/date_and_time/#installation) | [Date and time attribute: Usage](https://doc.ibexa.co/en/5.0/pim/attributes/date_and_time/#usage) | +| [Date and time attribute: Installation](https://doc.ibexa.co/en/4.6/pim/attributes/date_and_time/#installation) | [Date and time attribute: Usage](https://doc.ibexa.co/en/5.0/product_catalog/attributes/date_and_time/#usage) | | [Symbol attribute: Installation](https://doc.ibexa.co/en/4.6/pim/attributes/symbol_attribute_type/#installation) | [Symbol attribute](https://doc.ibexa.co/en/5.0/pim/attributes/symbol_attribute_type/) | #### PHP API @@ -384,7 +384,7 @@ Major additions to the PHP API Reference are [`Ibexa\Contracts\Collaboration`](h #### REST API Layout for [v5.0 REST API Reference](https://doc.ibexa.co/en/5.0/api/rest_api/rest_api_reference/rest_api_reference.html) is now changed. -As [Ibexa DXP 5.0 is OpenAPI compliant](https://doc.ibexa.co/en/5.0/api/rest_api/rest_api_usage/#openapi-support), the specification output is used to generate the online reference. +As [Ibexa DXP 5.0 is OpenAPI compliant](https://doc.ibexa.co/en/5.0/api/rest_api/rest_api_usage/rest_api_usage/#openapi-support), the specification output is used to generate the online reference. You can also check the documentation directly on your development installations at `/api/ibexa/v2/doc`. ## June 2025 @@ -644,8 +644,7 @@ Enhanced the PHP API with the following new classes and interfaces: ### PHP API - Added the following interfaces and classes to the public PHP API: - - [`Ibexa\Contracts\AdminUi\Permission\PermissionCheckContextProviderInterface`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Permission-PermissionCheckContextProviderInterface.html) - - [`Ibexa\Contracts\AdminUi\Values\PermissionCheckContext`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Values-PermissionCheckContext.html) + - [`Ibexa\Contracts\Share\Values\PermissionCheckContext`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-Share-Values-PermissionCheckContext.html) - [`Ibexa\Contracts\Checkout\Discounts\DataMapper\DiscountsDataMapperInterface`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-Checkout-Discounts-DataMapper-DiscountsDataMapperInterface.html) - [`Ibexa\Contracts\Seo\Resolver\FieldValueResolverInterface`](https://doc.ibexa.co/en/4.6/api/php_api/php_api_reference/classes/Ibexa-Contracts-Seo-Resolver-FieldValueResolverInterface.html) @@ -797,7 +796,7 @@ Enhanced the PHP API with the following new classes and interfaces: ### Infrastructure and maintenance -- Added [v4.6.4 to v4.6.8 update instructions](https://doc.ibexa.co/en/4.6/update_and_migration/from_4.5/update_from_4.5/#v468) +- Added [v4.6.4 to v4.6.8 update instructions](https://doc.ibexa.co/en/4.6/update_and_migration/from_4.6/update_from_4.6/#v468) - Modified [v3.3.x to v3.3.latest update instructions](https://doc.ibexa.co/en/4.6/update_and_migration/from_3.3/update_from_3.3/#update-the-application) - Updated the recommendations in [Performance](https://doc.ibexa.co/en/4.6/infrastructure_and_maintenance/performance/#symfony) by mentioning Symfony @@ -835,8 +834,8 @@ Enhanced the PHP API with the following new classes and interfaces: ### Infrastructure and maintenance -- [Updated [[= product_name_cloud =]] domain to ibexa.cloud](https://doc.ibexa.co/en/4.6/getting_started/install_on_ibexa_cloud/#4-push-the-project) -- [v4.6.3 to v4.6.4 update instructions](https://doc.ibexa.co/en/4.6/update_and_migration/from_4.5/update_from_4.5/#v464) +- [Updated [[= product_name_cloud =]] domain to ibexa.cloud](https://doc.ibexa.co/en/4.6/ibexa_cloud/install_on_ibexa_cloud/#4-push-the-project) +- [v4.6.3 to v4.6.4 update instructions](https://doc.ibexa.co/en/4.6/update_and_migration/from_4.6/update_from_4.6/#v464) ### Documentation @@ -860,7 +859,7 @@ Enhanced the PHP API with the following new classes and interfaces: ### Infrastructure and maintenance -- [v4.6.0 to v4.6.3 update instructions](https://doc.ibexa.co/en/4.6/update_and_migration/from_4.5/update_from_4.5/#v463) +- [v4.6.0 to v4.6.3 update instructions](https://doc.ibexa.co/en/4.6/update_and_migration/from_4.6/update_from_4.6/#v463) ### Users @@ -933,7 +932,7 @@ Enhanced the PHP API with the following new classes and interfaces: - [Updated Create custom view matcher article](https://doc.ibexa.co/en/4.6/templating/templates/create_custom_view_matcher/) - [Actito transactional email integration](https://doc.ibexa.co/en/4.6/commerce/transactional_emails/transactional_emails/#configure-actito-integration) -- [Described user profile](https://doc.ibexa.co/projects/userguide/en/latest/getting_started/get_started/#edit-user-profile) +- [Described user profile](https://doc.ibexa.co/projects/userguide/en/latest/getting_started/get_started/#view-and-edit-user-profile) ## January 2024 @@ -958,7 +957,7 @@ Enhanced the PHP API with the following new classes and interfaces: ### Getting started - [[[= product_name_headless =]] product guide](https://doc.ibexa.co/en/4.6/ibexa_products/headless/) -- [Enhanced get started article](https://doc.ibexa.co/projects/userguide/en/latest/getting_started/get_started/#edit-user-profile) in User Documentation +- [Enhanced get started article](https://doc.ibexa.co/projects/userguide/en/latest/getting_started/get_started/#view-and-edit-user-profile) in User Documentation ### Image management @@ -990,7 +989,7 @@ Enhanced the PHP API with the following new classes and interfaces: ### Templating - [Taxonomy view matchers](https://doc.ibexa.co/en/4.6/templating/templates/view_matcher_reference/#taxonomy-entry-id) -- [Get content category Twig filter](https://doc.ibexa.co/en/4.6/templating/twig_function_reference/other_twig_filters/#ibexa_taxonomy_entries_for_content) +- [Get content category Twig filter](https://doc.ibexa.co/en/4.6/templating/twig_function_reference/content_twig_functions/#ibexa_taxonomy_entries_for_content-filter) - [Updated arguments list for `ibexa_render()` method](https://doc.ibexa.co/en/4.6/templating/twig_function_reference/content_twig_functions/#ibexa_render) - [New Field information Twig functions](https://doc.ibexa.co/en/4.6/templating/twig_function_reference/field_twig_functions/#ibexa_field_group_name) - [Updated get user Twig functions](https://doc.ibexa.co/en/4.6/templating/twig_function_reference/user_twig_functions/) @@ -1134,7 +1133,7 @@ Enhanced the PHP API with the following new classes and interfaces: ### Security -- [Hidden state clarification](https://doc.ibexa.co/en/4.6/infrastructure_and_maintenance/security/security_checklist/#do-not-use-hide-for-read-access-restriction) +- [Hidden state clarification](https://doc.ibexa.co/en/4.6/infrastructure_and_maintenance/security/security_checklist/#dont-use-hide-for-read-access-restriction) - [Add timeouts information](https://doc.ibexa.co/en/4.6/infrastructure_and_maintenance/security/security_checklist/#protect-against-brute-force-attacks) ## July 2023 diff --git a/docs/search/search_engines/elasticsearch/configure_elasticsearch.md b/docs/search/search_engines/elasticsearch/configure_elasticsearch.md index 3e05c45665..e04ab4c7a4 100644 --- a/docs/search/search_engines/elasticsearch/configure_elasticsearch.md +++ b/docs/search/search_engines/elasticsearch/configure_elasticsearch.md @@ -306,7 +306,7 @@ To do this, pass the following setting under the `ssl` key: verification: false ``` -For more information, see [Elasticsearch: SSL Encryption](https://www.elastic.co/guide/en/elasticsearch/client/php-api/8.19/connecting.html#ssl-encryption). +For more information, see [Elasticsearch: Security by default](https://www.elastic.co/guide/en/elasticsearch/client/php-api/8.19/connecting.html#auth-http). ### Enable debugging diff --git a/docs/templating/twig_function_reference/recommendations_twig_functions.md b/docs/templating/twig_function_reference/recommendations_twig_functions.md index 9e586b2b3d..cbbd71c37e 100644 --- a/docs/templating/twig_function_reference/recommendations_twig_functions.md +++ b/docs/templating/twig_function_reference/recommendations_twig_functions.md @@ -69,7 +69,7 @@ ibexa_tracking_track_event( ) ``` -- **eventType** - type: string, defines the type of tracking event to be sent, for example, `visit`, `contentvisit`, `buy`, `basket`, `itemclick`. For more information, see [Tracking events for recommendations](https://content.raptorservices.com/help-center/tracking-events-for-recommendation). +- **eventType** - type: string, defines the type of tracking event to be sent, for example, `visit`, `contentvisit`, `buy`, `basket`, `itemclick`. For more information, see [Tracking events for recommendations](https://content.raptorservices.com/help-center/tracking-events-parameters-reference). - **data** (optional) - type: mixed, accepts the primary object associated with the event, such as a Product or Content, can be null if not required. For more information, see [tracking event examples](#tracking-events). - **context** (optional)- type: array, additional event data, such as quantity, basket details, or custom parameters. For more information, see [example usage](#context-parameter-example-usage). - **template** (optional) - type: string, path to a custom Twig template used to render the tracking event, allows overriding the default tracking output. diff --git a/docs/update_and_migration/from_4.6/update_to_5.0.md b/docs/update_and_migration/from_4.6/update_to_5.0.md index 948abc081e..bddbfc946b 100644 --- a/docs/update_and_migration/from_4.6/update_to_5.0.md +++ b/docs/update_and_migration/from_4.6/update_to_5.0.md @@ -505,7 +505,7 @@ use Rector\Symfony\Set\SensiolabsSetList; In the following example, you can see optimization thanks to the following features: - [Constructor parameter promoted as properties](https://www.php.net/manual/en/language.oop5.decon.php#language.oop5.decon.constructor.promotion) (available since PHP 8.0) -- [`AsCommand` attribute to register a command](https://symfony.com/doc/7.3/console.html#console_registering-the-command) (available since Symfony 6.2) +- [`AsCommand` attribute to register a command](https://symfony.com/doc/7.4/console.html#creating-a-command) (available since Symfony 6.2) ```diff +#[AsCommand(name: 'app:test', description: 'Command to test something.')] diff --git a/docs/users/oauth_client.md b/docs/users/oauth_client.md index 3c5fa443d6..f9c7437ada 100644 --- a/docs/users/oauth_client.md +++ b/docs/users/oauth_client.md @@ -50,7 +50,7 @@ In `config/packages/security.yaml`, enable the `ibexa_oauth2_connect` firewall a [[= include_file('code_samples/user_management/oauth_google/config/packages/security.yaml') =]] ``` -The `custom_authenticators` setting specifies the [custom authenticators]([[= symfony_doc =]]/current/security/custom_authenticator.html) to be used. +The `custom_authenticators` setting specifies the [custom authenticators]([[= symfony_doc =]]/security/custom_authenticator.html) to be used. By adding the `Ibexa\Bundle\OAuth2Client\Security\Authenticator\OAuth2Authenticator` authenticator you add a possibility to use OAuth2 on those routes. diff --git a/lychee.toml.dist b/lychee.toml.dist index f073dd6096..f26c60de58 100644 --- a/lychee.toml.dist +++ b/lychee.toml.dist @@ -62,7 +62,7 @@ user_agent = "Mozilla/5.0 (compatible; lychee link checker)" # Check anchor fragments in cross-doc links (remapped to explicit index.html paths). # Internal fragments are already validated by `mkdocs build --strict` and are excluded # via the file:// exclude pattern above. -include_fragments = true +include_fragments = "full" # Do NOT check links inside and
 blocks.
 include_verbatim = false

From 1ea0dfde389118cccd7a9f92855d71852014c574 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Noco=C5=84?= 
Date: Mon, 18 May 2026 22:00:54 +0200
Subject: [PATCH 16/16] Bump version

---
 .github/workflows/link_check.yaml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/link_check.yaml b/.github/workflows/link_check.yaml
index af289e34e0..13b51eee14 100644
--- a/.github/workflows/link_check.yaml
+++ b/.github/workflows/link_check.yaml
@@ -83,6 +83,7 @@ jobs:
                   output: lychee-report.md
                   jobSummary: false
                   fail: true
+                  lycheeVersion: 0.24.2
               env:
                   GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}