+[[% set version = 'v4.6.33' %]]
+
+[[= release_note_entry_begin("Ibexa DXP " + version, '2026-10-27', ['Headless', 'Experience', 'Commerce']) =]]
+
+
+### Security
+
+This release includes security fixes.
+To learn more, see the [corresponding security advisory](https://developers.ibexa.co/security-advisories).
+
+### [[= product_name_base =]] Doctrine migrations
+
+Applying database schema upgrades no longer requires that you find and run SQL scripts manually.
+[[= product_name_base =]] Doctrine migrations ships with every Ibexa package and allows you to manages schema changes through a single console command:
+
+```bash
+php bin/console ibexa:doctrine:migrations:migrate
+```
+
+The command safely detects which changes are already applied to your database and only runs what's missing.
+You can run it at any time, even on an already up-to-date or freshly installed database.
+
+For more information, see [Database update](https://doc.ibexa.co/en/5.0/update_and_migration/from_5.0/update_from_5.0/#database-update).
+
+### Flysystem 3 support
+
+[[= product_name =]] now supports Flysystem 3.x for file storage adapters, in addition to Flysystem 2.x.
+On PHP 8, `league/flysystem` now installs as 3.36 or later.
+Projects on PHP 7.4 stay on Flysystem 2.5.
+
+If you use a custom storage adapter, a [custom `local:` IO handler](https://doc.ibexa.co/en/4.6/infrastructure_and_maintenance/clustering/clustering/#configuring-the-dfs-io-handler), or a cloud adapter such as `league/flysystem-aws-s3-v3`, review the [Flysystem 3 support notes](https://doc.ibexa.co/en/4.6/update_and_migration/from_4.6/update_from_4.6/#flysystem-3-support) before updating.
+
+### Full changelog
+
+[[% include 'snippets/release_46.md' %]]
+
+[[= release_note_entry_end() =]]
+
[[% set version = 'v4.6.32' %]]
[[= release_note_entry_begin("Ibexa DXP " + version, '2026-08-20', ['Headless', 'Experience', 'Commerce']) =]]
diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md
index c1c49bd622..341a447d54 100644
--- a/docs/release_notes/ibexa_dxp_v5.0.md
+++ b/docs/release_notes/ibexa_dxp_v5.0.md
@@ -10,6 +10,79 @@ month_change: false
+[[% set version = 'v5.0.11' %]]
+[[% set date = '2026-10-27' %]]
+
+[[= release_note_entry_begin(
+ 'MCP Servers ' + version,
+ date,
+ ['Headless', 'Experience', 'Commerce', 'LTS Update']
+) =]]
+
+### Tools
+
+Several new [MCP tools](mcp_config.md#built-in-tools) have been added to the MCP Servers feature:
+
+- `Ibexa\McpExperimental\Tool\Taxonomy\TaxonomyTools`
+ - `list_taxonomies`
+- `Ibexa\Workflow\Mcp\Tool\WorkflowTools`
+ - `list_workflows`
+ - `get_content_workflow_status`
+ - `apply_workflow_transition`
+- `Ibexa\Mcp\Tool\Content\ContentTools`
+ - `ibexa/mcp:update_content`
+ - `ibexa/mcp:create_content`
+ - `ibexa/mcp:convert_to_richtext_xml`
+ - `ibexa/mcp:create_content_draft`
+ - `ibexa/mcp:list_locations`
+ - `ibexa/mcp:get_content_info`
+ - `ibexa/mcp:get_content_version_info`
+ - `ibexa/mcp:get_default_language_code`
+ - `ibexa/mcp:get_root_location`
+ - `ibexa/mcp:get_content`
+ - `ibexa/mcp:get_language`
+ - `publish_version`
+
+[[= release_note_entry_end() =]]
+
+[[= release_note_entry_begin(
+ product_name + ' ' + version,
+ date,
+ ['Headless', 'Experience', 'Commerce', 'New feature']
+) =]]
+
+### Security
+
+This release includes security fixes.
+To learn more, see the [corresponding security advisory](https://developers.ibexa.co/security-advisories).
+
+### [[= product_name_base =]] Doctrine migrations
+
+Applying database schema upgrades no longer requires that you find and run SQL scripts manually.
+[[= product_name_base =]] Doctrine migrations ships with every Ibexa package and allows you to manages schema changes through a single console command:
+
+```bash
+php bin/console ibexa:doctrine:migrations:migrate
+```
+
+The command safely detects which changes are already applied to your database and only runs what's missing.
+You can run it at any time, even on an already up-to-date or freshly installed database.
+
+For more information, see [Database update](https://doc.ibexa.co/en/5.0/update_and_migration/from_5.0/update_from_5.0/#database-update).
+
+### Flysystem 3 support
+
+[[= product_name =]] now supports Flysystem 3.x for file storage adapters, in addition to Flysystem 2.x.
+Since [[= product_name =]] 5.0 requires PHP 8.3 or later, `league/flysystem` now installs as 3.36 or later by default.
+
+If you use a custom storage adapter, a custom [`local:` IO handler](https://doc.ibexa.co/en/5.0/infrastructure_and_maintenance/clustering/clustering/#configuring-the-dfs-io-handler), or a cloud adapter such as `league/flysystem-aws-s3-v3`, review the [Flysystem 3 support notes](https://doc.ibexa.co/en/5.0/update_and_migration/from_5.0/update_from_5.0/#flysystem-3-support) before updating.
+
+### Full changelog
+
+[[% include 'snippets/release_50.md' %]]
+
+[[= release_note_entry_end() =]]
+
[[% set version = 'v5.0.10' %]]
[[% set date = '2026-08-20' %]]
diff --git a/mkdocs.yml b/mkdocs.yml
index 2a0d484018..db7c787f80 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1037,8 +1037,8 @@ extra:
latest_tag_4_3: '4.3.5'
latest_tag_4_4: '4.4.4'
latest_tag_4_5: '4.5.7'
- latest_tag_4_6: '4.6.32'
- latest_tag_5_0: '5.0.10'
+ latest_tag_4_6: '4.6.33'
+ latest_tag_5_0: '5.0.11'
symfony_version: '7.4'
symfony_doc: 'https://symfony.com/doc/7.4'
From 85b3085a6dc9dc2bff36a29ff5b98cc1830ed243 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Tue, 20 Oct 2026 21:06:59 +0200
Subject: [PATCH 02/23] Add MCP note to RNs
---
docs/release_notes/ibexa_dxp_v5.0.md | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md
index 341a447d54..f64a31bcc0 100644
--- a/docs/release_notes/ibexa_dxp_v5.0.md
+++ b/docs/release_notes/ibexa_dxp_v5.0.md
@@ -21,7 +21,7 @@ month_change: false
### Tools
-Several new [MCP tools](mcp_config.md#built-in-tools) have been added to the MCP Servers feature:
+Several new [MCP tools](mcp_config.md#built-in-tools) have been added for [content management](https://doc.ibexa.co/en/5.0/content_management/content_management/), [taxonomy](https://doc.ibexa.co/en/5.0/content_management/taxonomy/taxonomy/) and [workflow](https://doc.ibexa.co/en/5.0/content_management/workflow/workflow/):
- `Ibexa\McpExperimental\Tool\Taxonomy\TaxonomyTools`
- `list_taxonomies`
@@ -43,6 +43,11 @@ Several new [MCP tools](mcp_config.md#built-in-tools) have been added to the MCP
- `ibexa/mcp:get_language`
- `publish_version`
+### Schemas
+
+Input and output formats have been optimized for several tools.
+If you have prompts, skill files, or other resources to help your agents produce inputs or interpret outputs, you must adapt them to those format changes.
+
[[= release_note_entry_end() =]]
[[= release_note_entry_begin(
From 1ebe46b1db8f8e5a059ac6affef3b2b54d45b9a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Wed, 21 Oct 2026 21:28:21 +0200
Subject: [PATCH 03/23] Implement reviewer comments
---
docs/release_notes/ibexa_dxp_v5.0.md | 53 +++++++++++++++-------------
1 file changed, 29 insertions(+), 24 deletions(-)
diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md
index f64a31bcc0..e80606b978 100644
--- a/docs/release_notes/ibexa_dxp_v5.0.md
+++ b/docs/release_notes/ibexa_dxp_v5.0.md
@@ -20,32 +20,37 @@ month_change: false
) =]]
### Tools
+
+Several new tools have been added to the [MCP package](https://doc.ibexa.co/en/5.0/ai/mcp/mcp_config/#built-in-tools):
+
+- `get_field_type_list`
+- `get_content_info`
+- `get_content_version_info`
+- `get_content`
+- `create_content`
+- `create_content_draft`
+- `update_content`
+- `publish_version`
+- `list_locations`
+- `get_root_location`
+- `get_default_language_code`
+- `get_language`
+- `convert_to_richtext_xml`
+
+The following tools were added to their respective packages: [Taxonomy](https://doc.ibexa.co/en/5.0/content_management/taxonomy/taxonomy/) and [Workflow](https://doc.ibexa.co/en/5.0/content_management/workflow/workflow/):
+
+- `list_taxonomies`
+- `list_workflows`
+- `get_content_workflow_status`
+- `apply_workflow_transition`
+
+### Removed tools
-Several new [MCP tools](mcp_config.md#built-in-tools) have been added for [content management](https://doc.ibexa.co/en/5.0/content_management/content_management/), [taxonomy](https://doc.ibexa.co/en/5.0/content_management/taxonomy/taxonomy/) and [workflow](https://doc.ibexa.co/en/5.0/content_management/workflow/workflow/):
-
-- `Ibexa\McpExperimental\Tool\Taxonomy\TaxonomyTools`
- - `list_taxonomies`
-- `Ibexa\Workflow\Mcp\Tool\WorkflowTools`
- - `list_workflows`
- - `get_content_workflow_status`
- - `apply_workflow_transition`
-- `Ibexa\Mcp\Tool\Content\ContentTools`
- - `ibexa/mcp:update_content`
- - `ibexa/mcp:create_content`
- - `ibexa/mcp:convert_to_richtext_xml`
- - `ibexa/mcp:create_content_draft`
- - `ibexa/mcp:list_locations`
- - `ibexa/mcp:get_content_info`
- - `ibexa/mcp:get_content_version_info`
- - `ibexa/mcp:get_default_language_code`
- - `ibexa/mcp:get_root_location`
- - `ibexa/mcp:get_content`
- - `ibexa/mcp:get_language`
- - `publish_version`
+- `get_content_type_by_identifier` is removed. Use `get_content_type` instead, which now accepts a content type ID or identifier
### Schemas
-Input and output formats have been optimized for several tools.
+Input and output formats have been optimized for several tools.
If you have prompts, skill files, or other resources to help your agents produce inputs or interpret outputs, you must adapt them to those format changes.
[[= release_note_entry_end() =]]
@@ -64,7 +69,7 @@ To learn more, see the [corresponding security advisory](https://developers.ibex
### [[= product_name_base =]] Doctrine migrations
Applying database schema upgrades no longer requires that you find and run SQL scripts manually.
-[[= product_name_base =]] Doctrine migrations ships with every Ibexa package and allows you to manages schema changes through a single console command:
+[[= product_name_base =]] Doctrine migrations ships with every [[= product_name =]] package and allows you to manages schema changes through a single console command:
```bash
php bin/console ibexa:doctrine:migrations:migrate
@@ -77,7 +82,7 @@ For more information, see [Database update](https://doc.ibexa.co/en/5.0/update_a
### Flysystem 3 support
-[[= product_name =]] now supports Flysystem 3.x for file storage adapters, in addition to Flysystem 2.x.
+[[= product_name =]] now supports Flysystem 3.x for file storage adapters, in addition to Flysystem 2.x.
Since [[= product_name =]] 5.0 requires PHP 8.3 or later, `league/flysystem` now installs as 3.36 or later by default.
If you use a custom storage adapter, a custom [`local:` IO handler](https://doc.ibexa.co/en/5.0/infrastructure_and_maintenance/clustering/clustering/#configuring-the-dfs-io-handler), or a cloud adapter such as `league/flysystem-aws-s3-v3`, review the [Flysystem 3 support notes](https://doc.ibexa.co/en/5.0/update_and_migration/from_5.0/update_from_5.0/#flysystem-3-support) before updating.
From f20029417ce3d3626ac8cf93a6f031b235726389 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Wed, 21 Oct 2026 21:30:57 +0200
Subject: [PATCH 04/23] Fix indentation issue
---
docs/release_notes/ibexa_dxp_v5.0.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md
index e80606b978..bade1fbf60 100644
--- a/docs/release_notes/ibexa_dxp_v5.0.md
+++ b/docs/release_notes/ibexa_dxp_v5.0.md
@@ -19,8 +19,9 @@ month_change: false
['Headless', 'Experience', 'Commerce', 'LTS Update']
) =]]
-### Tools
+### Tools
+
Several new tools have been added to the [MCP package](https://doc.ibexa.co/en/5.0/ai/mcp/mcp_config/#built-in-tools):
- `get_field_type_list`
From c3f0fa446b781cfa42ec660a68f4213b66ad385c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Fri, 23 Oct 2026 18:12:02 +0200
Subject: [PATCH 05/23] Add bumped nodejs requirement
---
docs/getting_started/requirements.md | 2 +-
docs/release_notes/ibexa_dxp_v5.0.md | 11 +++++++++++
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md
index 03cfc86425..c8912e1806 100644
--- a/docs/getting_started/requirements.md
+++ b/docs/getting_started/requirements.md
@@ -267,7 +267,7 @@ For production setups it's recommended that you use Varnish/Fastly, Redis/Valkey
=== "[[= product_name =]] v5.0"
- - `Node.js` 22+
+ - `Node.js` 24+
- `yarn` 1.15.2+
If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release.
diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md
index bade1fbf60..83184d8dbe 100644
--- a/docs/release_notes/ibexa_dxp_v5.0.md
+++ b/docs/release_notes/ibexa_dxp_v5.0.md
@@ -41,6 +41,9 @@ Several new tools have been added to the [MCP package](https://doc.ibexa.co/en/5
The following tools were added to their respective packages: [Taxonomy](https://doc.ibexa.co/en/5.0/content_management/taxonomy/taxonomy/) and [Workflow](https://doc.ibexa.co/en/5.0/content_management/workflow/workflow/):
- `list_taxonomies`
+- `assign_to_taxonomy_entry`
+- `list_taxonomy_entry_content`
+- `unassign_from_taxonomy_entry`
- `list_workflows`
- `get_content_workflow_status`
- `apply_workflow_transition`
@@ -88,6 +91,14 @@ Since [[= product_name =]] 5.0 requires PHP 8.3 or later, `league/flysystem` now
If you use a custom storage adapter, a custom [`local:` IO handler](https://doc.ibexa.co/en/5.0/infrastructure_and_maintenance/clustering/clustering/#configuring-the-dfs-io-handler), or a cloud adapter such as `league/flysystem-aws-s3-v3`, review the [Flysystem 3 support notes](https://doc.ibexa.co/en/5.0/update_and_migration/from_5.0/update_from_5.0/#flysystem-3-support) before updating.
+### Infrastructure
+
+#### Updated Node.js requirement
+
+Node.js 24 or higher is now required for asset building.
+
+For more information, see [Requirements](https://doc.ibexa.co/en/5.0/getting_started/requirements/#asset-manager).
+
### Full changelog
[[% include 'snippets/release_50.md' %]]
From b3c92d3dcdcd8ed06ab8d644f829f8109da2735a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Mon, 26 Oct 2026 16:30:42 +0100
Subject: [PATCH 06/23] Fix link
---
docs/release_notes/ibexa_dxp_v4.6.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/release_notes/ibexa_dxp_v4.6.md b/docs/release_notes/ibexa_dxp_v4.6.md
index d7ac31ce07..b79c66d79e 100644
--- a/docs/release_notes/ibexa_dxp_v4.6.md
+++ b/docs/release_notes/ibexa_dxp_v4.6.md
@@ -32,7 +32,7 @@ php bin/console ibexa:doctrine:migrations:migrate
The command safely detects which changes are already applied to your database and only runs what's missing.
You can run it at any time, even on an already up-to-date or freshly installed database.
-For more information, see [Database update](https://doc.ibexa.co/en/5.0/update_and_migration/from_5.0/update_from_5.0/#database-update).
+For more information, see [Database update](https://doc.ibexa.co/en/4.6/update_and_migration/from_4.6/update_from_4.6/#database-update).
### Flysystem 3 support
From c45810af164d83cee343888619372fb25943f641 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Tue, 27 Oct 2026 17:35:24 +0100
Subject: [PATCH 07/23] Add a note about IBX-11181
---
docs/release_notes/ibexa_dxp_v5.0.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md
index 83184d8dbe..dc7b530d7e 100644
--- a/docs/release_notes/ibexa_dxp_v5.0.md
+++ b/docs/release_notes/ibexa_dxp_v5.0.md
@@ -99,6 +99,13 @@ Node.js 24 or higher is now required for asset building.
For more information, see [Requirements](https://doc.ibexa.co/en/5.0/getting_started/requirements/#asset-manager).
+#### Fastly on [[= product_name_cloud =]]
+
+[[= product_name =]] now automatically trusts the proxy headers set by the [[= product_name_cloud =]] router for requests coming from Fastly.
+Therefore, you don't need to add Fastly's IP ranges to `trusted_proxies`, as long as `framework.trusted_proxies` isn't empty.
+
+For more information, see [Configure Symfony front controller](https://doc.ibexa.co/en/5.0/infrastructure_and_maintenance/cache/http_cache/reverse_proxy/#configure-symfony-front-controller).
+
### Full changelog
[[% include 'snippets/release_50.md' %]]
From 66d26c631a0a5ae02d47fae4bf4a42813f12b401 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Wed, 28 Oct 2026 14:45:32 +0100
Subject: [PATCH 08/23] Add findEntries method announcement.
---
docs/release_notes/ibexa_dxp_v5.0.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md
index dc7b530d7e..166884e594 100644
--- a/docs/release_notes/ibexa_dxp_v5.0.md
+++ b/docs/release_notes/ibexa_dxp_v5.0.md
@@ -106,6 +106,10 @@ Therefore, you don't need to add Fastly's IP ranges to `trusted_proxies`, as lon
For more information, see [Configure Symfony front controller](https://doc.ibexa.co/en/5.0/infrastructure_and_maintenance/cache/http_cache/reverse_proxy/#configure-symfony-front-controller).
+### Developer experience
+
+You can now use the [`TaxonomyServiceInterface::findEntries()`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Taxonomy-Service-TaxonomyServiceInterface.html#methods) method to list the entries of a taxonomy, or the direct children of an entry, paginated and ordered by ID.
+
### Full changelog
[[% include 'snippets/release_50.md' %]]
From a95352de5504fdcbdd4ee5220f9a8e05bd324916 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Wed, 28 Oct 2026 16:27:06 +0100
Subject: [PATCH 09/23] Bump nodjs in ddev instructions
---
docs/getting_started/install_with_ddev.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/getting_started/install_with_ddev.md b/docs/getting_started/install_with_ddev.md
index 0dda9850d9..9662e47ce8 100644
--- a/docs/getting_started/install_with_ddev.md
+++ b/docs/getting_started/install_with_ddev.md
@@ -32,7 +32,7 @@ mkdir my-ddev-project && cd my-ddev-project
Next, configure your DDEV environment with the following command:
```bash
-ddev config --project-type=php --php-version 8.4 --nodejs-version 22 --docroot=public
+ddev config --project-type=php --php-version 8.4 --nodejs-version 24 --docroot=public
```
This command sets the project type to PHP, the PHP version to 8.4, the document root to `public` directory, and creates the document root if it doesn't exist.
From 56a5b464151a6112183fefeccf42257e5e886b56 Mon Sep 17 00:00:00 2001
From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com>
Date: Wed, 28 Oct 2026 17:06:59 +0100
Subject: [PATCH 10/23] Update MCP (#3440)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* mcp_config.md: Add new incoming built-in tools
* Add list_taxonomy_entries
---------
Co-authored-by: Tomasz Dąbrowski <64841871+dabrt@users.noreply.github.com>
---
code_samples/mcp/mcp.matrix.yaml | 1 +
docs/ai/mcp/mcp_config.md | 83 +++++++++++++++++++++-----------
docs/ai/mcp/mcp_usage.md | 6 +--
3 files changed, 60 insertions(+), 30 deletions(-)
diff --git a/code_samples/mcp/mcp.matrix.yaml b/code_samples/mcp/mcp.matrix.yaml
index c5d1371e91..39e6aef7af 100644
--- a/code_samples/mcp/mcp.matrix.yaml
+++ b/code_samples/mcp/mcp.matrix.yaml
@@ -9,6 +9,7 @@ ibexa:
tools:
- Ibexa\Mcp\Tool\TranslationTools
- Ibexa\Mcp\Tool\SeoTools
+ - Ibexa\Workflow\Mcp\Tool\WorkflowTools
discovery_cache:
session:
type:
diff --git a/docs/ai/mcp/mcp_config.md b/docs/ai/mcp/mcp_config.md
index 1f0e8a4210..b1bb1d829e 100644
--- a/docs/ai/mcp/mcp_config.md
+++ b/docs/ai/mcp/mcp_config.md
@@ -60,8 +60,8 @@ You define MCP servers within a repository configuration and then assign those s
``` yaml
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 1, 8) =]]
-[[= include_code('code_samples/mcp/mcp.matrix.yaml', 12, 17) =]]
-[[= include_code('code_samples/mcp/mcp.matrix.yaml', 31, 35) =]]
+[[= include_code('code_samples/mcp/mcp.matrix.yaml', 13, 18) =]]
+[[= include_code('code_samples/mcp/mcp.matrix.yaml', 32, 36) =]]
```
Servers are automatically registered as services with an ID following the pattern `ibexa.mcp.server..`.
@@ -118,30 +118,59 @@ There are two ways to associate tools with a server:
MCP Servers LTS Update comes with the following **experimental** built-in tools:
+- `Ibexa\Mcp\Tool\Content\ContentTools`
+ - `get_content_info` - gets version-independent metadata of a content item
+ - `get_content_version_info` - gets metadata of a specific version of a content item (current by default)
+ - `get_content` - gets a content item with its metadata, a version and the field values of that version
+ - `create_content` - creates an unpublished draft
+ - `create_content_draft` - creates a new draft from the published or archived version
+ - `update_content` - sets field values on a draft, in the draft's initial language (unless `initialLanguageCode` is given)
+ - `publish_version` - publishes a draft
+- `Ibexa\Mcp\Tool\ContentType\ContentTypeGroupTools`
+ - `get_content_type_groups` - gets all content type groups
- `Ibexa\Mcp\Tool\ContentType\ContentTypeTools`
- - `get_content_type` - gets a content type by its ID.
- - `get_content_type_by_identifier` - gets a content type by its identifier.
- - `get_content_type_list` - gets content types by their IDs.
- - `create_content_type` - creates a draft for a new content type.
- - `create_content_type_draft` - creates a draft for an existing content type.
- - `get_content_type_draft` - gets a content type draft by content type ID.
- - `publish_content_type_draft` - publishes a content type draft by content type ID.
+ - `get_content_type` - gets a content type by its ID or identifier
+ - `get_content_type_list` - gets content types by their IDs
+ - `create_content_type` - creates a draft for a new content type
+ - `create_content_type_draft` - creates a draft for an existing content type
+ - `get_content_type_draft` - gets a content type draft by content type ID
+ - `publish_content_type_draft` - publishes a content type draft by content type ID
- `Ibexa\Mcp\Tool\ContentType\FieldDefinitionTools`
- - `add_field_definition` - adds a field definition to a content type draft.
- - `update_field_definition` - updates a field definition in a content type draft.
- - `remove_field_definition` - removes a field definition from a content type draft.
-- `Ibexa\Mcp\Tool\ContentType\ContentTypeGroupTools`
- - `get_content_type_groups` - gets all content type groups.
-- `Ibexa\Mcp\Tool\TranslationTools`
- - `list_languages` - lists all languages in the current SiteAccess.
- - `list_content_languages` - lists languages which have translations for a given content item.
- - `list_non_translated_content_ids` - lists IDs of content which have missing translations for a given language code.
+ - `add_field_definition` - adds a field definition to a content type draft
+ - `update_field_definition` - updates a field definition in a content type draft
+ - `remove_field_definition` - removes a field definition from a content type draft
+ - `get_field_type_list` - lists all available field types with identifiers, empty value structure, settings, and validator configuration
+- `Ibexa\Mcp\Tool\Language\LanguageTools`
+ - `get_language` - gets a language by its language code, together with information whether it is enabled
+ - `get_default_language_code` - gets the first configured language of the current SiteAccess
+- `Ibexa\Mcp\Tool\Location\LocationTools`
+ - `list_locations` - lists direct children of a parent location, and/or locations that match a pattern, paginated
+ - `get_root_location` - gets the root location of the content tree of a SiteAccess (current if no SiteAccess name is given)
+- `Ibexa\Mcp\Tool\RichText\RichTextTools`
+ - `convert_to_richtext_xml` - converts plain text, HTML fragments or complete DocBook / XHTML5 edit documents into the DocBook XML stored in RichText fields
- `Ibexa\Mcp\Tool\SeoTools`
- - `get_non_seo_content_ids` - returns IDs of content items that are missing SEO optimization (no meta title tag). Useful for identifying content that needs SEO attention.
-
-``` yaml hl_lines="5-7"
+ - `get_non_seo_content_ids` - returns IDs of content items that are missing SEO optimization (no meta title tag). You can use it to identify content that needs SEO attention
+- `Ibexa\Mcp\Tool\TranslationTools`
+ - `list_languages` - lists all languages in the current SiteAccess
+ - `list_content_languages` - lists languages which have translations for a given content item
+ - `list_non_translated_content_ids` - lists IDs of content which have missing translations for a given language code
+
+The following tools are included with their respective packages, [Taxonomy](taxonomy.md) and [Workflow](workflow.md):
+
+- `Ibexa\Taxonomy\Mcp\Tool\TaxonomyTools`
+ - `list_taxonomies` - lists the taxonomies
+ - `list_taxonomy_entries` - lists entries of a taxonomy, paginated and ordered by entry ID
+ - `assign_to_taxonomy_entry` - assigns up to 100 content items to a taxonomy entry
+ - `list_taxonomy_entry_content` - lists the content items assigned to a taxonomy entry
+ - `unassign_from_taxonomy_entry` - removes the assignment of content items to a taxonomy entry
+- `Ibexa\Workflow\Mcp\Tool\WorkflowTools`
+ - `list_workflows` - lists the editorial workflows
+ - `get_content_workflow_status` - gets the workflow status of a content version
+ - `apply_workflow_transition` - applies a workflow transition to a content version
+
+``` yaml hl_lines="5-8"
[[= include_code('code_samples/mcp/mcp.matrix.yaml', 4, 7) =]]
-[[= include_code('code_samples/mcp/mcp.matrix.yaml', 9, 11) =]]
+[[= include_code('code_samples/mcp/mcp.matrix.yaml', 9, 12) =]]
# …
```
@@ -162,7 +191,7 @@ You must provide a PSR-6 or PSR-16 cache pool for this caching.
For example, you could set up a dedicated Redis/Valkey:
``` yaml
-[[= include_code('code_samples/mcp/mcp.matrix.yaml', 19, 19) =]]
+[[= include_code('code_samples/mcp/mcp.matrix.yaml', 20, 20) =]]
```
For a production cluster, it's recommended to use a Redis/Valkey cache pool so the cache can be shared by all nodes.
@@ -205,8 +234,8 @@ Optionally, you could use a more specific `prefix` option than the default `mcp_
Such setup is suitable for production environments.
``` yaml
-[[= include_code('code_samples/mcp/mcp.matrix.yaml', 20, 23) =]]
-[[= include_code('code_samples/mcp/mcp.matrix.yaml', 36, 45) =]]
+[[= include_code('code_samples/mcp/mcp.matrix.yaml', 21, 24) =]]
+[[= include_code('code_samples/mcp/mcp.matrix.yaml', 37, 46) =]]
```
#### File
@@ -218,7 +247,7 @@ Such setup is suitable for development environments.
In this example, sessions are stored in the `var/cache//mcp/sessions/` directory (for example, `var/cache/dev/mcp/session/` for the `dev` environment, and `var/cache/prod/mcp/sessions/` for the `prod` environment):
``` yaml
-[[= include_code('code_samples/mcp/mcp.matrix.yaml', 25, 27) =]]
+[[= include_code('code_samples/mcp/mcp.matrix.yaml', 26, 28) =]]
```
### Allowed hosts
@@ -232,7 +261,7 @@ IPv6 addresses must be bracketed, for example `[::1]`.
In this example, only requests from `admin.example.com` domain, `my-ddev-project.ddev.site` domain, or from 127.0.0.1 IP are accepted:
``` yaml
-[[= include_code('code_samples/mcp/mcp.matrix.yaml', 16, 16) =]]
+[[= include_code('code_samples/mcp/mcp.matrix.yaml', 17, 17) =]]
- 'www.example.com'
- 'my-ddev-project.ddev.site'
- '127.0.0.1'
diff --git a/docs/ai/mcp/mcp_usage.md b/docs/ai/mcp/mcp_usage.md
index 9741037921..7af03b3473 100644
--- a/docs/ai/mcp/mcp_usage.md
+++ b/docs/ai/mcp/mcp_usage.md
@@ -93,8 +93,8 @@ The server:
Filesystem storage is convenient for the sake of this example and for testing.
For production, it is recommended that you use Redis or Valkey to share cache among the cluster and improve performance.
- For development, you can set `discovery_cache: ~` to avoid clearing the cache after each change.
- This example uses the filesystem storage to illustrate that you have to clear the cache pool to refresh the available capabilities, exactly as when deploying into production.
+ For development, you can set `discovery_cache: ~` to avoid clearing the cache after each change.
+ This example uses the filesystem storage to illustrate that you have to clear the cache pool to refresh the available capabilities, exactly as when deploying into production.
In a new `config/packages/mcp.yaml` file, define a new MCP server for the `default` repository and assign it to all SiteAccesses:
@@ -294,7 +294,7 @@ You can select and test it in the right column.
### Perform Copilot or Claude Code test
-You can test your MCP server with [Copilot CLI](https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-copilot-cli) or [Claude Code CLI](https://code.claude.com/docs/en/overview), as illustrated here, or with any other agent or interface.
+You can test your MCP server with [GitHub Copilot CLI](https://docs.github.com/en/copilot/concepts/copilot-surfaces/copilot-cli) or [Claude Code CLI](https://code.claude.com/docs/en/overview), as illustrated here, or with any other agent or interface.
#### Add MCP server to agent CLI
From a965f3d8f7270a4cf07b51a59dbcd6c29d2dd05b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Mon, 2 Nov 2026 15:51:18 +0100
Subject: [PATCH 11/23] Update CKE (#3455)
* Add Update CKE note
---
docs/release_notes/ibexa_dxp_v5.0.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md
index 166884e594..8379dc76fd 100644
--- a/docs/release_notes/ibexa_dxp_v5.0.md
+++ b/docs/release_notes/ibexa_dxp_v5.0.md
@@ -99,6 +99,12 @@ Node.js 24 or higher is now required for asset building.
For more information, see [Requirements](https://doc.ibexa.co/en/5.0/getting_started/requirements/#asset-manager).
+#### CKEditor 5 update
+
+Online Editor now uses version v48.5.1 of CKEditor 5 as its base.
+
+If your system uses [custom CKEditor plugins](https://doc.ibexa.co/en/5.0/content_management/rich_text/extend_online_editor/#add-ckeditor-plugins), ensure that they use the updated version of CKEditor dependencies.
+
#### Fastly on [[= product_name_cloud =]]
[[= product_name =]] now automatically trusts the proxy headers set by the [[= product_name_cloud =]] router for requests coming from Fastly.
From efb4e9b19a33228fd284ed1d82672a5bab6087d8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Mon, 2 Nov 2026 16:43:01 +0100
Subject: [PATCH 12/23] Document IBX-12797 - league/flysystem v3 (#3447)
* Document IBX-12797 - league/flysystem v3
---
.../file_management/file_management.md | 27 ++++++++++++++++---
.../clustering/clustering_with_aws_s3.md | 10 +++++--
.../from_4.6/update_from_4.6.md | 22 +++++++++++++++
.../from_5.0/update_from_5.0.md | 20 ++++++++++++++
4 files changed, 73 insertions(+), 6 deletions(-)
diff --git a/docs/content_management/file_management/file_management.md b/docs/content_management/file_management/file_management.md
index 0f105cab03..f2cd924f12 100644
--- a/docs/content_management/file_management/file_management.md
+++ b/docs/content_management/file_management/file_management.md
@@ -40,8 +40,27 @@ ibexa:
binarydata_handler: nfs
```
-The adapter is the *driver* used by Flysystem v2 to read/write files. Adapters are declared using `oneup_flysystem`.
-Metadata and binary data handlers are configured under `ibexa_io`. See below the configuration for the default handlers. It declares a metadata handler and a binary data handler, both labeled `default`. Both handlers are of type `flysystem`, and use the same Flysystem v2 adapter, labeled `default` as well.
+The adapter is the **driver** used by Flysystem to read/write files.
+You declare adapters with `oneup_flysystem`.
+Metadata and binary data handlers are configured under `ibexa_io`.
+For the configuration of the default handlers, see below.
+The configuration declares a metadata handler and a binary data handler, both labeled `default`.
+Both handlers are of type `flysystem`, and use the same Flysystem adapter, labeled `default` as well.
+
+!!! note "Flysystem version"
+
+ [[= product_name =]] 5.0 requires PHP 8.3 or later, therefore, as of v.5.0.11, `league/flysystem` installs as 3.36 or later by default.
+ However, Flysystem 2.5 is also supported to provide backward compatibility.
+
+ Take the following into account:
+
+ - If you use a custom adapter, make sure that the class that implements `League\Flysystem\FilesystemAdapter` also implements `directoryExists(string $path): bool`, which Flysystem 3.x requires.
+ Otherwise, Flysystem throws a fatal error.
+
+ - If you use Flysystem's `local` adapter type as an IO handler, it only accepts `mimeTypeDetector` as a string, so a detector service can't be configured through it directly.
+ Flysystem 3.x's default detector returns no MIME type for ambiguous files, such as extensionless text or empty files, which can cause downloads to fail.
+ To preserve the previous behavior, define your own service for `League\Flysystem\Local\LocalFilesystemAdapter` with `$mimeTypeDetector` set to `League\MimeTypeDetection\FinfoMimeTypeDetector`, then configure it as a `custom` adapter pointing to that service instead of `local`.
+ [[= product_name =]]'s own adapters already do this.
``` yaml
ibexa_io:
@@ -95,10 +114,10 @@ Default values:
service: ibexa.io.nfs.adapter.site_access_aware
```
-### Native Flysystem v2 handler
+### Native Flysystem handler
[[= product_name =]] uses it as the default way to read and write content in form of binary files.
-Flysystem v2 can use the `local` filesystem, but is also able to read/write to `sftp`, `zip` or cloud filesystems (`azure`, `rackspace`, `S3`).
+Flysystem can use the `local` filesystem, but is also able to read/write to `sftp`, `zip` or cloud filesystems (`azure`, `rackspace`, `S3`).
[league/flysystem](https://flysystem.thephpleague.com/docs/) (along with [FlysystemBundle](https://github.com/1up-lab/OneupFlysystemBundle/)) is an abstract file handling library.
#### Handler options
diff --git a/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md b/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md
index 9e824cb49f..cebc35b38c 100644
--- a/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md
+++ b/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md
@@ -33,7 +33,7 @@ The secret key cannot be retrieved again after the key has been created, so don'
## Set up [[= product_name =]] for AWS S3
-In your [[= product_name =]] root directory, run `php composer require league/flysystem-aws-s3-v3:^2.0`.
+In your [[= product_name =]] root directory, run `php composer require league/flysystem-aws-s3-v3:^3.0`.
Then, register the AWS S3 client as a service:
``` yaml
@@ -48,7 +48,13 @@ services:
secret: abc123... # Your AWS secret key
```
-Set up the Flysystem v2 adapter that uses the S3 client under the `oneup_flysystem.adapters` [configuration key](configuration.md#configuration-files):
+!!! note "Flysystem version"
+
+ Cloud adapters such as `league/flysystem-aws-s3-v3` are versioned together with Flysystem itself.
+ If your project still requires the `^2.0` adapter elsewhere, Composer silently keeps Flysystem on 2.5.
+ To use Flysystem 3.x, require `^3.0` of the adapter instead.
+
+Set up the Flysystem adapter that uses the S3 client under the `oneup_flysystem.adapters` [configuration key](configuration.md#configuration-files):
``` yaml
oneup_flysystem:
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 157a477af4..72b736be90 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
@@ -738,6 +738,28 @@ No additional steps needed.
No additional steps needed.
+## v4.6.33
+
+### Flysystem 3 support
+
+Depending on a [PHP version](requirements.md#php), your [[= product_name =]] supports different Flysystem versions:
+
+- On PHP 8.x, `league/flysystem` installs version 3.36 by default, and Flysystem 2.5 is also supported.
+- On PHP 7.4, only Flysystem 2.5 is supported.
+
+!!! note "Custom and local adapters"
+
+ - If you have a custom adapter, any class that implements `League\Flysystem\FilesystemAdapter` must add `directoryExists(string $path): bool`.
+ Otherwise, Flysystem 3 throws a fatal error.
+
+ - If you use `league/flysystem-aws-s3-v3`, `-azure-blob-storage`, `-google-cloud-storage`, `-sftp-v3`, or a similar cloud adapter, these are versioned together with Flysystem.
+ If your project still requires a `2.x` adapter, Composer silently keeps Flysystem on 2.5, and you must bump the adapter requirement manually to `^3.0` to get Flysystem 3.x.
+
+ - If you use Flysystem's `local` adapter type as an IO handler, it only accepts `mimeTypeDetector` as a string, so a detector service can't be configured through it directly.
+ Flysystem 3.x's default detector returns no MIME type for ambiguous files, such as extensionless text or empty files, which can cause downloads to fail.
+ To preserve the previous behavior, define your own service for `League\Flysystem\Local\LocalFilesystemAdapter` with `$mimeTypeDetector` set to `League\MimeTypeDetection\FinfoMimeTypeDetector`, then configure it as a `custom` adapter pointing to that service instead of `local`.
+ [[= product_name =]]'s own adapters already do this.
+
## LTS Updates
[LTS Updates](https://doc.ibexa.co/en/4.6/ibexa_products/editions/#lts-updates) are standalone packages with their own update procedures.
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 8eed969fff..ab269743c7 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
@@ -489,6 +489,26 @@ No additional steps needed for [[= product_name =]].
You don't need to run it.
The tables added by the script are required only by the [Translation Management LTS update](https://doc.ibexa.co/en/5.0/multisite/translations_management/translations_management/) and adding them is part of its [configuration procedure](https://doc.ibexa.co/en/5.0/multisite/translations_management/configure_translations_management/#modify-database-schema).
+## v5.0.11
+
+### Flysystem 3 support
+
+[[= product_name =]] 5.0 requires PHP 8.3 or later, therefore, as of v.5.0.11, `league/flysystem` installs as 3.36 or later by default.
+However, Flysystem 2.5 is also supported to provide backward compatibility.
+
+!!! note "Custom and local adapters"
+
+ - If you have a custom adapter, any class that implements `League\Flysystem\FilesystemAdapter` must add `directoryExists(string $path): bool`.
+ Otherwise, Flysystem 3 throws a fatal error.
+
+ - If you use `league/flysystem-aws-s3-v3`, `-azure-blob-storage`, `-google-cloud-storage`, `-sftp-v3`, or a similar cloud adapter, these are versioned together with Flysystem.
+ If your project still requires a `2.x` adapter, Composer silently keeps Flysystem on 2.5, and you must bump the adapter requirement manually to `^3.0` to get Flysystem 3.x.
+
+ - If you use Flysystem's `local` adapter type as an IO handler, it only accepts `mimeTypeDetector` as a string, so a detector service can't be configured through it directly.
+ Flysystem 3.x's default detector returns no MIME type for ambiguous files, such as extensionless text or empty files, which can cause downloads to fail.
+ To preserve the previous behavior, define your own service for `League\Flysystem\Local\LocalFilesystemAdapter` with `$mimeTypeDetector` set to `League\MimeTypeDetection\FinfoMimeTypeDetector`, then configure it as a `custom` adapter pointing to that service instead of `local`.
+ [[= product_name =]]'s own adapters already do this.
+
## LTS Updates and additional packages
[LTS Updates](editions.md#lts-updates) are standalone packages with their own update procedures.
From 2ce6bd359ce41ca3ea2add750979081b9c1b1cd1 Mon Sep 17 00:00:00 2001
From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com>
Date: Mon, 2 Nov 2026 18:09:46 +0100
Subject: [PATCH 13/23] Fix code validation (#3459)
* composer.json: add ibexa/doctrine-migrations
* composer.json: fix ibexa/phpstan constraint
* Update yaml-validation-baseline.yaml
---
composer.json | 5 +++--
tests/yaml-validation-baseline.yaml | 12 ++++++------
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/composer.json b/composer.json
index b6fa91384e..a22879a84b 100644
--- a/composer.json
+++ b/composer.json
@@ -86,7 +86,7 @@
"ibexa/messenger": "~5.0.x-dev",
"ibexa/collaboration": "~5.0.x-dev",
"ibexa/share": "~5.0.x-dev",
- "ibexa/phpstan": "~5.0.-dev",
+ "ibexa/phpstan": "~5.0.x-dev",
"ibexa/connector-quable": "5.0.x-dev",
"ibexa/shopping-list": "~5.0.x-dev",
"deptrac/deptrac": "^3.0",
@@ -103,7 +103,8 @@
"ibexa/connector-actito": "~5.0.x-dev",
"ibexa/fastly": "~5.0.x-dev",
"ibexa/connect": "~5.0.x-dev",
- "ibexa/connector-qualifio": "~5.0.x-dev"
+ "ibexa/connector-qualifio": "~5.0.x-dev",
+ "ibexa/doctrine-migrations": "~5.0.x-dev"
},
"scripts": {
"fix-cs": [
diff --git a/tests/yaml-validation-baseline.yaml b/tests/yaml-validation-baseline.yaml
index 24d177bffa..444a0b440a 100644
--- a/tests/yaml-validation-baseline.yaml
+++ b/tests/yaml-validation-baseline.yaml
@@ -15,7 +15,7 @@ ignoreErrors:
-
path: code_samples/mcp/mcp.matrix.yaml
line: 0
- hash: 5fba465c96608f7f32ea4dc052b72ab2c0db3d2e975ff394f179ad421b163945
+ hash: a175941a4e4cbbe79f633b159475487bc5afa6f345afe7f9aaac81ff4d9eae95
message: '~The value "\" is not allowed for path "ibexa\.repositories\.\\.mcp\.\\.session\.type"\. Permissible values\: "file", "psr16"\.~'
-
path: code_samples/workflow/custom_workflow/config/packages/workflows.yaml
@@ -51,17 +51,17 @@ ignoreErrors:
path: docs/commerce/payment/enable_paypal_payments.md
line: 40
hash: bc714d63a541c63d24e2a882cc8c67b685fcee24feb0d80a327f02a4c3b0bef8
- message: '~Unrecognized option "payment_method" under "ibexa"\. Available options are "http_cache", "image_placeholder", "imagemagick", "locale_conversion", "orm", "repositories", "router", "siteaccess", "system", "ui", "url_alias", "url_wildcards"\.~'
+ message: '~Unrecognized option "payment_method" under "ibexa"\. Available options are "http_cache", "image_placeholder", "imagemagick", "installer", "locale_conversion", "orm", "repositories", "router", "siteaccess", "system", "ui", "url_alias", "url_wildcards"\.~'
-
path: docs/commerce/payment/enable_stripe_payments.md
line: 41
hash: 09750e5c042fe1d6abc20d4088674195d78ca70ce113f8869818a76de1a8023a
- message: '~Unrecognized option "payment_method" under "ibexa"\. Available options are "http_cache", "image_placeholder", "imagemagick", "locale_conversion", "orm", "repositories", "router", "siteaccess", "system", "ui", "url_alias", "url_wildcards"\.~'
+ message: '~Unrecognized option "payment_method" under "ibexa"\. Available options are "http_cache", "image_placeholder", "imagemagick", "installer", "locale_conversion", "orm", "repositories", "router", "siteaccess", "system", "ui", "url_alias", "url_wildcards"\.~'
-
path: docs/commerce/payment/payum_integration.md
line: 55
hash: c3f14ff441a95545c360aaab308050a2629a81f07d76d4fb65133ab89a6ad30d
- message: '~Unrecognized option "payment_method" under "ibexa"\. Available options are "http_cache", "image_placeholder", "imagemagick", "locale_conversion", "orm", "repositories", "router", "siteaccess", "system", "ui", "url_alias", "url_wildcards"\.~'
+ message: '~Unrecognized option "payment_method" under "ibexa"\. Available options are "http_cache", "image_placeholder", "imagemagick", "installer", "locale_conversion", "orm", "repositories", "router", "siteaccess", "system", "ui", "url_alias", "url_wildcards"\.~'
-
path: docs/commerce/transactional_emails/extend_transactional_emails.md
line: 17
@@ -219,7 +219,7 @@ ignoreErrors:
message: '~The child config "fastly" under "ibexa\.system\.my_siteaccess_group\.http_cache" must be configured\.~'
-
path: docs/infrastructure_and_maintenance/security/development_security.md
- line: 20
+ line: 22
hash: 0521cbcc27827c7ee2160a512158a19c89f1d51eb64a69d1b4600eb45a2505dd
message: '~Unrecognized option "require_previous_session" under "security\.firewalls\.ibexa_front\.form_login"\. Available options are "always_use_default_target_path", "check_path", "csrf_parameter", "csrf_token_id", "default_target_path", "enable_csrf", "failure_forward", "failure_handler", "failure_path", "failure_path_parameter", "form_only", "login_path", "password_parameter", "post_only", "provider", "remember_me", "success_handler", "target_path_parameter", "use_forward", "use_referer", "username_parameter"\.~'
-
@@ -344,7 +344,7 @@ ignoreErrors:
message: '~Unrecognized option "require_previous_session" under "security\.firewalls\.ezpublish_front\.form_login"\. Available options are "always_use_default_target_path", "check_path", "csrf_parameter", "csrf_token_id", "default_target_path", "enable_csrf", "failure_forward", "failure_handler", "failure_path", "failure_path_parameter", "form_only", "login_path", "password_parameter", "post_only", "provider", "remember_me", "success_handler", "target_path_parameter", "use_forward", "use_referer", "username_parameter"\.~'
-
path: docs/release_notes/ibexa_dxp_v5.0.md
- line: 84
+ line: 190
hash: 7d4a5637a3e036ebcdc5a4be8282aebe2bfcbaee3222981b81f739ae773111d0
message: '~The child config "path" under "ibexa\.repositories\.\\.mcp\.\" must be configured\: MCP server path~'
-
From 53375e0b55f8037f2c5bae37d9d054bff844c077 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20D=C4=85browski?=
<64841871+dabrt@users.noreply.github.com>
Date: Tue, 3 Nov 2026 08:20:19 +0100
Subject: [PATCH 14/23] New MCP tools (#3457)
* New MCP tools
* Remove duplicate line
---
docs/ai/mcp/mcp_config.md | 4 ++++
docs/release_notes/ibexa_dxp_v5.0.md | 3 +++
2 files changed, 7 insertions(+)
diff --git a/docs/ai/mcp/mcp_config.md b/docs/ai/mcp/mcp_config.md
index b1bb1d829e..b4dc80a62f 100644
--- a/docs/ai/mcp/mcp_config.md
+++ b/docs/ai/mcp/mcp_config.md
@@ -154,6 +154,10 @@ MCP Servers LTS Update comes with the following **experimental** built-in tools:
- `list_languages` - lists all languages in the current SiteAccess
- `list_content_languages` - lists languages which have translations for a given content item
- `list_non_translated_content_ids` - lists IDs of content which have missing translations for a given language code
+- `Ibexa\Mcp\Tool\User\UserTools`
+ - `list_user_groups` - lists user groups, paginated
+ - `list_users` - lists user accounts, paginated
+ - `get_user` - gets one user account by `id` or `login`
The following tools are included with their respective packages, [Taxonomy](taxonomy.md) and [Workflow](workflow.md):
diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md
index 8379dc76fd..2344f6551c 100644
--- a/docs/release_notes/ibexa_dxp_v5.0.md
+++ b/docs/release_notes/ibexa_dxp_v5.0.md
@@ -37,6 +37,9 @@ Several new tools have been added to the [MCP package](https://doc.ibexa.co/en/5
- `get_default_language_code`
- `get_language`
- `convert_to_richtext_xml`
+- `list_user_groups`
+- `list_users`
+- `get_user`
The following tools were added to their respective packages: [Taxonomy](https://doc.ibexa.co/en/5.0/content_management/taxonomy/taxonomy/) and [Workflow](https://doc.ibexa.co/en/5.0/content_management/workflow/workflow/):
From ff4d68ba0e042de306b00d47a18888ba5f672f2d Mon Sep 17 00:00:00 2001
From: Vidar Langseid
Date: Tue, 3 Nov 2026 11:09:09 +0100
Subject: [PATCH 15/23] IBX-11181: Updated trusted proxies tip for Fastly on
Ibexa Cloud (#3442)
* IBX-11181: Updated trusted proxies tip for Fastly on Ibexa Cloud
---
.../cache/http_cache/reverse_proxy.md | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
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 8dfc62e4cd..2606f2078e 100644
--- a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md
+++ b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md
@@ -104,10 +104,13 @@ framework:
When using Fastly, you need to set `trusted_proxies` according to the [IP ranges used by Fastly](https://api.fastly.com/public-ip-list).
-!!! tip
+!!! tip "Fastly on [[= product_name_cloud =]]"
+
+ When you use Fastly on [[= product_name_cloud =]], you don't have to set `trusted_proxies` according to the IP ranges used by Fastly.
+ The Upsun router replaces the source IP of requests coming from Fastly with the actual client IP before they reach [[= product_name =]].
- You don't have to set `trusted_proxies` when using Fastly on Upsun.
- The Upsun router automatically changes the source IP of requests coming from Fastly, replacing the source IP with the actual client IP and removing any `X-FORWARD-...` header in the request before it reaches [[= product_name =]].
+ As of v5.0.11, [[= product_name =]] detects requests that come from Fastly on [[= product_name_cloud =]] and automatically trusts the proxy headers set by the router.
+ This works only if `framework.trusted_proxies` isn't empty (`TRUSTED_PROXIES` defaults to `127.0.0.1` in `.env`).
For more information about setting these variables, see [Configuration examples](#configuration-examples).
From 88baf774753114b05355484013251a4f2ead05e8 Mon Sep 17 00:00:00 2001
From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com>
Date: Tue, 3 Nov 2026 11:50:38 +0100
Subject: [PATCH 16/23] Ibexa Doctrine Migrations (#3337)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---------
Co-authored-by: Paweł Niedzielski
Co-authored-by: Tomasz Dąbrowski <64841871+dabrt@users.noreply.github.com>
---
.../shopping_list/install/schema.mysql.sql | 32 --
.../install/schema.postgresql.sql | 35 ---
.../install/schema.mysql.sql | 35 ---
.../install/schema.postgresql.sql | 40 ---
.../shopping_list/install_shopping_list.md | 32 +-
docs/getting_started/install_ibexa_dxp.md | 16 +
docs/ibexa_cloud/ibexa_cloud_cli.md | 28 +-
.../configure_translations_management.md | 28 +-
.../db/doctrine_migration_multi_repository.md | 8 +
.../db/doctrine_migration_one_by_one.md | 17 ++
.../db/doctrine_migration_preview_caution.md | 7 +
.../doctrine_migration_resolving_conflicts.md | 12 +
.../ibexa_oss_4.6.latest-to-5.0.0_mysql.sql | 252 ----------------
...exa_oss_4.6.latest-to-5.0.0_postgresql.sql | 285 ------------------
.../from_4.6/update_from_4.6.md | 42 +++
.../from_4.6/update_to_5.0.md | 124 ++++----
.../from_5.0/update_from_5.0.md | 41 +++
docs/users/oauth_server.md | 38 +--
18 files changed, 296 insertions(+), 776 deletions(-)
delete mode 100644 code_samples/shopping_list/install/schema.mysql.sql
delete mode 100644 code_samples/shopping_list/install/schema.postgresql.sql
delete mode 100644 code_samples/translations_management/install/schema.mysql.sql
delete mode 100644 code_samples/translations_management/install/schema.postgresql.sql
create mode 100644 docs/snippets/update/db/doctrine_migration_multi_repository.md
create mode 100644 docs/snippets/update/db/doctrine_migration_one_by_one.md
create mode 100644 docs/snippets/update/db/doctrine_migration_preview_caution.md
create mode 100644 docs/snippets/update/db/doctrine_migration_resolving_conflicts.md
delete mode 100644 docs/update_and_migration/from_4.6/sql/ibexa_oss_4.6.latest-to-5.0.0_mysql.sql
delete mode 100644 docs/update_and_migration/from_4.6/sql/ibexa_oss_4.6.latest-to-5.0.0_postgresql.sql
diff --git a/code_samples/shopping_list/install/schema.mysql.sql b/code_samples/shopping_list/install/schema.mysql.sql
deleted file mode 100644
index 3a26f10d8e..0000000000
--- a/code_samples/shopping_list/install/schema.mysql.sql
+++ /dev/null
@@ -1,32 +0,0 @@
-CREATE TABLE ibexa_shopping_list (
- id INT AUTO_INCREMENT NOT NULL,
- owner_id INT NOT NULL,
- identifier CHAR(36) NOT NULL COMMENT '(DC2Type:guid)',
- name VARCHAR(190) DEFAULT NULL,
- created_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)',
- updated_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)',
- is_default TINYINT(1) DEFAULT 0 NOT NULL,
- UNIQUE INDEX ibexa_shopping_list_identifier_idx (identifier),
- INDEX ibexa_shopping_list_owner_idx (owner_id),
- INDEX ibexa_shopping_list_default_idx (is_default),
- PRIMARY KEY(id)
-) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_520_ci` ENGINE = InnoDB;
-CREATE TABLE ibexa_shopping_list_entry (
- id INT AUTO_INCREMENT NOT NULL,
- shopping_list_id INT NOT NULL,
- product_code VARCHAR(64) NOT NULL,
- identifier CHAR(36) NOT NULL COMMENT '(DC2Type:guid)',
- added_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)',
- UNIQUE INDEX ibexa_shopping_list_entry_identifier_idx (identifier),
- INDEX ibexa_shopping_list_entry_list_idx (shopping_list_id),
- INDEX ibexa_shopping_list_entry_product_idx (product_code),
- INDEX ibexa_shopping_list_entry_added_at_idx (added_at),
- UNIQUE INDEX ibexa_shopping_list_entry_unique (shopping_list_id, product_code),
- PRIMARY KEY(id)
-) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_520_ci` ENGINE = InnoDB;
-ALTER TABLE ibexa_shopping_list
- ADD CONSTRAINT ibexa_shopping_list_owner_fk FOREIGN KEY (owner_id) REFERENCES ibexa_user (contentobject_id) ON UPDATE CASCADE ON DELETE CASCADE;
-ALTER TABLE ibexa_shopping_list_entry
- ADD CONSTRAINT ibexa_shopping_list_entry_list_fk FOREIGN KEY (shopping_list_id) REFERENCES ibexa_shopping_list (id) ON UPDATE CASCADE ON DELETE CASCADE;
-ALTER TABLE ibexa_shopping_list_entry
- ADD CONSTRAINT ibexa_shopping_list_entry_product_fk FOREIGN KEY (product_code) REFERENCES ibexa_product (code) ON UPDATE CASCADE ON DELETE CASCADE;
diff --git a/code_samples/shopping_list/install/schema.postgresql.sql b/code_samples/shopping_list/install/schema.postgresql.sql
deleted file mode 100644
index f2c3e8f358..0000000000
--- a/code_samples/shopping_list/install/schema.postgresql.sql
+++ /dev/null
@@ -1,35 +0,0 @@
-CREATE TABLE ibexa_shopping_list (
- id SERIAL NOT NULL,
- owner_id INT NOT NULL,
- identifier UUID NOT NULL,
- name VARCHAR(190) DEFAULT NULL,
- created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
- updated_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
- is_default BOOLEAN DEFAULT false NOT NULL,
- PRIMARY KEY (id)
-);
-CREATE UNIQUE INDEX ibexa_shopping_list_identifier_idx ON ibexa_shopping_list (identifier);
-CREATE INDEX ibexa_shopping_list_owner_idx ON ibexa_shopping_list (owner_id);
-CREATE INDEX ibexa_shopping_list_default_idx ON ibexa_shopping_list (is_default);
-COMMENT ON COLUMN ibexa_shopping_list.created_at IS '(DC2Type:datetime_immutable)';
-COMMENT ON COLUMN ibexa_shopping_list.updated_at IS '(DC2Type:datetime_immutable)';
-CREATE TABLE ibexa_shopping_list_entry (
- id SERIAL NOT NULL,
- shopping_list_id INT NOT NULL,
- product_code VARCHAR(64) NOT NULL,
- identifier UUID NOT NULL,
- added_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
- PRIMARY KEY (id)
-);
-CREATE UNIQUE INDEX ibexa_shopping_list_entry_identifier_idx ON ibexa_shopping_list_entry (identifier);
-CREATE INDEX ibexa_shopping_list_entry_list_idx ON ibexa_shopping_list_entry (shopping_list_id);
-CREATE INDEX ibexa_shopping_list_entry_product_idx ON ibexa_shopping_list_entry (product_code);
-CREATE INDEX ibexa_shopping_list_entry_added_at_idx ON ibexa_shopping_list_entry (added_at);
-CREATE UNIQUE INDEX ibexa_shopping_list_entry_unique ON ibexa_shopping_list_entry (shopping_list_id, product_code);
-COMMENT ON COLUMN ibexa_shopping_list_entry.added_at IS '(DC2Type:datetime_immutable)';
-ALTER TABLE ibexa_shopping_list
- ADD CONSTRAINT ibexa_shopping_list_owner_fk FOREIGN KEY (owner_id) REFERENCES ibexa_user (contentobject_id) ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE;
-ALTER TABLE ibexa_shopping_list_entry
- ADD CONSTRAINT ibexa_shopping_list_entry_list_fk FOREIGN KEY (shopping_list_id) REFERENCES ibexa_shopping_list (id) ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE;
-ALTER TABLE ibexa_shopping_list_entry
- ADD CONSTRAINT ibexa_shopping_list_entry_product_fk FOREIGN KEY (product_code) REFERENCES ibexa_product (code) ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE;
diff --git a/code_samples/translations_management/install/schema.mysql.sql b/code_samples/translations_management/install/schema.mysql.sql
deleted file mode 100644
index e45471a1bb..0000000000
--- a/code_samples/translations_management/install/schema.mysql.sql
+++ /dev/null
@@ -1,35 +0,0 @@
-CREATE TABLE IF NOT EXISTS ibexa_auto_translation (
- id INT AUTO_INCREMENT NOT NULL,
- provider_identifier VARCHAR(190) NOT NULL,
- content_id INT NOT NULL,
- version_no INT NOT NULL,
- source_language_id BIGINT NOT NULL,
- target_language_id BIGINT NOT NULL,
- review_status VARCHAR(64) NOT NULL,
- created_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)',
- updated_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)',
- INDEX ibexa_auto_translation_content_version_idx (content_id, version_no),
- INDEX ibexa_auto_translation_target_language_idx (target_language_id),
- INDEX ibexa_auto_translation_review_status_idx (review_status),
- UNIQUE INDEX ibexa_auto_translation_context_uidx (content_id, version_no, source_language_id, target_language_id),
- PRIMARY KEY(id)
-) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_520_ci` ENGINE = InnoDB;
-
-CREATE TABLE IF NOT EXISTS ibexa_auto_translation_review_log (
- id INT AUTO_INCREMENT NOT NULL,
- auto_translation_id INT DEFAULT NULL,
- user_id INT NOT NULL,
- status VARCHAR(64) NOT NULL,
- operation VARCHAR(64) NOT NULL,
- created_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)',
- INDEX IDX_325A3B737CE350E8 (auto_translation_id),
- INDEX ibexa_auto_translation_review_log_auto_translation_created_idx (auto_translation_id, created_at, id),
- INDEX ibexa_auto_translation_review_log_status_created_idx (status, created_at),
- INDEX ibexa_auto_translation_review_log_user_idx (user_id),
- PRIMARY KEY(id)
-) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_520_ci` ENGINE = InnoDB;
-
-ALTER TABLE ibexa_auto_translation_review_log ADD CONSTRAINT ibexa_auto_translation_review_log_auto_translation_fk
- FOREIGN KEY (auto_translation_id) REFERENCES ibexa_auto_translation (id) ON UPDATE CASCADE ON DELETE SET NULL;
-ALTER TABLE ibexa_auto_translation_review_log ADD CONSTRAINT ibexa_auto_translation_review_log_user_fk
- FOREIGN KEY (user_id) REFERENCES ibexa_user (contentobject_id) ON UPDATE CASCADE ON DELETE RESTRICT;
diff --git a/code_samples/translations_management/install/schema.postgresql.sql b/code_samples/translations_management/install/schema.postgresql.sql
deleted file mode 100644
index c8af0e838c..0000000000
--- a/code_samples/translations_management/install/schema.postgresql.sql
+++ /dev/null
@@ -1,40 +0,0 @@
-CREATE TABLE IF NOT EXISTS ibexa_auto_translation (
- id SERIAL NOT NULL,
- provider_identifier VARCHAR(190) NOT NULL,
- content_id INT NOT NULL,
- version_no INT NOT NULL,
- source_language_id BIGINT NOT NULL,
- target_language_id BIGINT NOT NULL,
- review_status VARCHAR(64) NOT NULL,
- created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
- updated_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
- PRIMARY KEY(id)
-);
-
-CREATE INDEX IF NOT EXISTS ibexa_auto_translation_content_version_idx ON ibexa_auto_translation (content_id, version_no);
-CREATE INDEX IF NOT EXISTS ibexa_auto_translation_target_language_idx ON ibexa_auto_translation (target_language_id);
-CREATE INDEX IF NOT EXISTS ibexa_auto_translation_review_status_idx ON ibexa_auto_translation (review_status);
-CREATE UNIQUE INDEX IF NOT EXISTS ibexa_auto_translation_context_uidx ON ibexa_auto_translation (content_id, version_no, source_language_id, target_language_id);
-COMMENT ON COLUMN ibexa_auto_translation.created_at IS '(DC2Type:datetime_immutable)';
-COMMENT ON COLUMN ibexa_auto_translation.updated_at IS '(DC2Type:datetime_immutable)';
-
-CREATE TABLE IF NOT EXISTS ibexa_auto_translation_review_log (
- id SERIAL NOT NULL,
- auto_translation_id INT DEFAULT NULL,
- user_id INT NOT NULL,
- status VARCHAR(64) NOT NULL,
- operation VARCHAR(64) NOT NULL,
- created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
- PRIMARY KEY(id)
-);
-
-CREATE INDEX IF NOT EXISTS IDX_325A3B737CE350E8 ON ibexa_auto_translation_review_log (auto_translation_id);
-CREATE INDEX IF NOT EXISTS ibexa_auto_translation_review_log_auto_translation_created_idx ON ibexa_auto_translation_review_log (auto_translation_id, created_at, id);
-CREATE INDEX IF NOT EXISTS ibexa_auto_translation_review_log_status_created_idx ON ibexa_auto_translation_review_log (status, created_at);
-CREATE INDEX IF NOT EXISTS ibexa_auto_translation_review_log_user_idx ON ibexa_auto_translation_review_log (user_id);
-COMMENT ON COLUMN ibexa_auto_translation_review_log.created_at IS '(DC2Type:datetime_immutable)';
-
-ALTER TABLE ibexa_auto_translation_review_log ADD CONSTRAINT ibexa_auto_translation_review_log_auto_translation_fk
- FOREIGN KEY (auto_translation_id) REFERENCES ibexa_auto_translation (id) ON UPDATE CASCADE ON DELETE SET NULL;
-ALTER TABLE ibexa_auto_translation_review_log ADD CONSTRAINT ibexa_auto_translation_review_log_user_fk
- FOREIGN KEY (user_id) REFERENCES ibexa_user (contentobject_id) ON UPDATE CASCADE ON DELETE RESTRICT;
diff --git a/docs/commerce/shopping_list/install_shopping_list.md b/docs/commerce/shopping_list/install_shopping_list.md
index 1c5d0829ca..3238f3982e 100644
--- a/docs/commerce/shopping_list/install_shopping_list.md
+++ b/docs/commerce/shopping_list/install_shopping_list.md
@@ -38,23 +38,35 @@ ibexa.rest.shopping_list:
## Modify database schema
-Add the tables needed by the bundle:
+[[= product_name_base =]] Doctrine migrations manage the database schema for this package.
-=== "MySQL"
+- To see a list of known migrations, and find out which ones are pending for the whole project, run:
- ```sql
- [[= include_file('code_samples/shopping_list/install/schema.mysql.sql', 0, None, ' ') =]]
+ ```bash
+ php bin/console ibexa:doctrine:migrations:versions
```
-=== "PostgreSQL"
+- To preview the changes before you apply them, use `--dry-run` with `--write-sql`:
- ```sql
- [[= include_file('code_samples/shopping_list/install/schema.postgresql.sql', 0, None, ' ') =]]
+ ```bash
+ php bin/console ibexa:doctrine:migrations:migrate --dry-run --write-sql=var/migration-preview.sql
```
-The script creates the required data structures, but doesn't add any data to the database.
+[[% include 'snippets/update/db/doctrine_migration_preview_caution.md' %]]
-The users don't have any shopping lists, not even the default “My Wishlist” list.
+- To apply pending migrations:
+
+ ```bash
+ php bin/console ibexa:doctrine:migrations:migrate
+ ```
+
+ This command does more than create the Shopping list tables - it applies all pending migrations for the project.
+
+ The `ibexa:doctrine:migrations:migrate` command creates the required data structures, but doesn't add any data to the database.
+
+[[% include 'snippets/update/db/doctrine_migration_one_by_one.md' %]]
+
+Initially, users don't have any shopping lists, not even the default “My Wishlist” list.
The default shopping list is created automatically when the user triggers the "Add to wishlist" action for the first time.
## Configure
@@ -96,5 +108,5 @@ On a clean install, you can, for example, assign this "Shopping List User" role
After placing the migration content in `src/Migrations/Ibexa/migrations/shopping_list_user.yaml`, you can import and execute it with:
```bash
-php bin/console ibexa:migrations:migrate --file=shopping_list_user.yaml --siteaccess=admin
+php bin/console ibexa:doctrine:migrations:migrate --file=shopping_list_user.yaml --siteaccess=admin
```
diff --git a/docs/getting_started/install_ibexa_dxp.md b/docs/getting_started/install_ibexa_dxp.md
index 22a7baa7b0..e1db8cf216 100644
--- a/docs/getting_started/install_ibexa_dxp.md
+++ b/docs/getting_started/install_ibexa_dxp.md
@@ -270,6 +270,22 @@ You may choose to replace the [default search engine](legacy_search_overview.md)
### Create a database
+!!! note "Installing with Doctrine migrations"
+
+ By default, `ibexa:install` creates the database schema directly, without tracking individual changes.
+ To have [[= product_name_base =]] [Doctrine migrations](update_from_5.0.md#database-update_5) manage your schema from the moment of product installation, so that you can install future upgrades with a single command, enable it before you run `ibexa:install`.
+ Create `config/packages/ibexa_installer.yaml`:
+
+ ```yaml
+ ibexa:
+ installer:
+ doctrine_migrations: true
+ ```
+
+ Both methods, direct and Doctrine-based, produce the same database.
+ However, with [[= product_name_base =]] Doctrine migrations enabled, each migration is recorded as already applied.
+ This way, every applied migration is tracked, so future updates bring your database to the expected schema with a single command, and you don't have to work out which upgrade scripts to run.
+
Install [[= product_name =]] and create a database with:
=== "PHP 8.4"
diff --git a/docs/ibexa_cloud/ibexa_cloud_cli.md b/docs/ibexa_cloud/ibexa_cloud_cli.md
index b85785e544..60fc94e05a 100644
--- a/docs/ibexa_cloud/ibexa_cloud_cli.md
+++ b/docs/ibexa_cloud/ibexa_cloud_cli.md
@@ -39,9 +39,9 @@ In all examples, replace `upsun` with `ibexa_cloud`.
## Examples
-### Run a SQL script
+### Run SQL script
-To execute a SQL upgrade script on a [[= product_name_cloud =]] environment, pass it to `ibexa_cloud sql`:
+To execute an SQL upgrade script on a [[= product_name_cloud =]] environment, pass it to `ibexa_cloud sql`:
=== "MySQL"
@@ -55,7 +55,29 @@ To execute a SQL upgrade script on a [[= product_name_cloud =]] environment, pas
ibexa_cloud sql < vendor/ibexa/installer/upgrade/db/postgresql/ibexa-x.x.x-to-x.x.y.sql
```
-### Connect with a SQL client
+### Run database migration
+
+To apply [[= product_name_base =]] Doctrine migrations on a [[= product_name_cloud =]] environment, connect with SSH:
+
+```bash
+ibexa_cloud ssh
+```
+
+You can preview the changes before you apply them:
+
+```bash
+php bin/console ibexa:doctrine:migrations:migrate --dry-run --write-sql=var/migration-preview.sql
+```
+
+[[% include 'snippets/update/db/doctrine_migration_preview_caution.md' %]]
+
+Then apply the migrations:
+
+```bash
+php bin/console ibexa:doctrine:migrations:migrate
+```
+
+### Connect with SQL client
To connect to the database using any SQL client, start SSH tunnels to all services (database, Redis, Solr, and others except Varnish) by running the following command in the project directory:
diff --git a/docs/multisite/translations_management/configure_translations_management.md b/docs/multisite/translations_management/configure_translations_management.md
index e359b4987a..c47277ba4f 100644
--- a/docs/multisite/translations_management/configure_translations_management.md
+++ b/docs/multisite/translations_management/configure_translations_management.md
@@ -39,21 +39,33 @@ To add the Translations management LTS Update to an existing [[= product_name =]
#### Modify database schema
-Add the tables needed by the bundle:
+[[= product_name_base =]] Doctrine migrations manage the database schema for this package.
-=== "MySQL"
+- To see a list of known migrations, and find out which ones are pending for the whole project, run:
- ```sql
- [[= include_code('code_samples/translations_management/install/schema.mysql.sql', indent_level=1) =]]
+ ```bash
+ php bin/console ibexa:doctrine:migrations:versions
```
-=== "PostgreSQL"
+- To preview the changes before you apply them, use `--dry-run` with `--write-sql`:
- ```sql
- [[= include_code('code_samples/translations_management/install/schema.postgresql.sql', indent_level=1) =]]
+ ```bash
+ php bin/console ibexa:doctrine:migrations:migrate --dry-run --write-sql=var/migration-preview.sql
```
-The script creates the required data structures, but doesn't add any data to the database.
+[[% include 'snippets/update/db/doctrine_migration_preview_caution.md' %]]
+
+- To apply pending migrations:
+
+ ```bash
+ php bin/console ibexa:doctrine:migrations:migrate
+ ```
+
+ This command does more than create the Translations management tables - it applies all pending migrations for the project.
+
+ The `ibexa:doctrine:migrations:migrate` command creates the required data structures, but doesn't add any data to the database.
+
+[[% include 'snippets/update/db/doctrine_migration_one_by_one.md' %]]
#### Add action configurations
diff --git a/docs/snippets/update/db/doctrine_migration_multi_repository.md b/docs/snippets/update/db/doctrine_migration_multi_repository.md
new file mode 100644
index 0000000000..ab09743129
--- /dev/null
+++ b/docs/snippets/update/db/doctrine_migration_multi_repository.md
@@ -0,0 +1,8 @@
+If your project uses [multiple repositories](/administration/configuration/repository_configuration.md#defining-custom-connection) with separate databases, run the command once for each repository, using the `--siteaccess` option with any SiteAccess that belongs to that repository:
+
+```bash
+php bin/console ibexa:doctrine:migrations:migrate --siteaccess=
+```
+
+Running the command more than once is safe.
+It has no effect if you apply it to a SiteAccess whose repository has already been migrated.
diff --git a/docs/snippets/update/db/doctrine_migration_one_by_one.md b/docs/snippets/update/db/doctrine_migration_one_by_one.md
new file mode 100644
index 0000000000..024f39e7e5
--- /dev/null
+++ b/docs/snippets/update/db/doctrine_migration_one_by_one.md
@@ -0,0 +1,17 @@
+!!! tip "Apply migrations one by one"
+
+ Instead of applying all pending migrations at once, you can go through them one at a time.
+ To preview only the next pending migration, run:
+
+ ```bash
+ php bin/console ibexa:doctrine:migrations:migrate next --dry-run
+ ```
+
+ Then, to apply it, run the same command without the `--dry-run` option:
+
+ ```bash
+ php bin/console ibexa:doctrine:migrations:migrate next
+ ```
+
+ Repeat these steps until no pending migrations remain.
+ To check which migrations are still pending, run `php bin/console ibexa:doctrine:migrations:status`.
diff --git a/docs/snippets/update/db/doctrine_migration_preview_caution.md b/docs/snippets/update/db/doctrine_migration_preview_caution.md
new file mode 100644
index 0000000000..76450891ea
--- /dev/null
+++ b/docs/snippets/update/db/doctrine_migration_preview_caution.md
@@ -0,0 +1,7 @@
+!!! caution "Preview only"
+
+ This generates an SQL file that is only intended for review.
+ More recent migrations can be unaware of changes made by earlier migrations in the same run, so the file may be incomplete.
+ Do not run the SQL file against your database.
+
+ Always apply changes by running the command without the `--dry-run` flag.
diff --git a/docs/snippets/update/db/doctrine_migration_resolving_conflicts.md b/docs/snippets/update/db/doctrine_migration_resolving_conflicts.md
new file mode 100644
index 0000000000..ba537ede7c
--- /dev/null
+++ b/docs/snippets/update/db/doctrine_migration_resolving_conflicts.md
@@ -0,0 +1,12 @@
+!!! note "Resolving conflicts with customizations"
+
+ If a migration fails because you already modified the affected table yourself, for example, as part of a customization, check the error, compare with the SQL file generated during the dry run, and resolve the issue.
+ Then, try running `ibexa:doctrine:migrations:migrate` again.
+ Most migrations check the current state of the schema and record themselves as executed when it matches, without making any changes.
+
+ If the migration still fails, check what it does, and make sure your schema reflects the same end result.
+ Then, mark that migration as executed without actually running it.
+
+ ```bash
+ php bin/console ibexa:doctrine:migrations:version --add 'Ibexa\Bundle\Taxonomy\Migration\AddTaxonomyEntriesRootIndexesMigration'
+ ```
diff --git a/docs/update_and_migration/from_4.6/sql/ibexa_oss_4.6.latest-to-5.0.0_mysql.sql b/docs/update_and_migration/from_4.6/sql/ibexa_oss_4.6.latest-to-5.0.0_mysql.sql
deleted file mode 100644
index 1217d5c9d3..0000000000
--- a/docs/update_and_migration/from_4.6/sql/ibexa_oss_4.6.latest-to-5.0.0_mysql.sql
+++ /dev/null
@@ -1,252 +0,0 @@
--- Rename core related schema
-ALTER TABLE ezbinaryfile RENAME TO ibexa_binary_file;
-
-ALTER TABLE ezcobj_state RENAME TO ibexa_object_state;
-ALTER TABLE ibexa_object_state RENAME INDEX ezcobj_state_priority TO ibexa_object_state_priority;
-ALTER TABLE ibexa_object_state RENAME INDEX ezcobj_state_lmask TO ibexa_object_state_lmask;
-ALTER TABLE ibexa_object_state RENAME INDEX ezcobj_state_identifier TO ibexa_object_state_identifier;
-
-ALTER TABLE ezcobj_state_group RENAME TO ibexa_object_state_group;
-ALTER TABLE ibexa_object_state_group RENAME INDEX ezcobj_state_group_lmask TO ibexa_object_state_group_lmask;
-ALTER TABLE ibexa_object_state_group RENAME INDEX ezcobj_state_group_identifier TO ibexa_object_state_group_identifier;
-
-ALTER TABLE ezcobj_state_group_language RENAME TO ibexa_object_state_group_language;
-
-ALTER TABLE ezcobj_state_language RENAME TO ibexa_object_state_language;
-
-ALTER TABLE ezcobj_state_link RENAME TO ibexa_object_state_link;
-
-ALTER TABLE ezcontent_language RENAME TO ibexa_content_language;
-ALTER TABLE ibexa_content_language RENAME INDEX ezcontent_language_name TO ibexa_content_language_name;
-
-ALTER TABLE ezcontentbrowsebookmark RENAME TO ibexa_content_bookmark;
-ALTER TABLE ibexa_content_bookmark RENAME INDEX ezcontentbrowsebookmark_location TO ibexa_content_bookmark_location;
-ALTER TABLE ibexa_content_bookmark RENAME INDEX ezcontentbrowsebookmark_user TO ibexa_content_bookmark_user;
-ALTER TABLE ibexa_content_bookmark RENAME INDEX ezcontentbrowsebookmark_user_location TO ibexa_content_bookmark_user_location;
-
-ALTER TABLE ezcontentclass RENAME TO ibexa_content_type;
-ALTER TABLE ibexa_content_type RENAME INDEX ezcontentclass_version TO ibexa_content_type_version;
-ALTER TABLE ibexa_content_type RENAME INDEX ezcontentclass_identifier TO ibexa_content_type_identifier;
-
-ALTER TABLE ezcontentclass_attribute RENAME TO ibexa_content_type_field_definition;
-ALTER TABLE ibexa_content_type_field_definition RENAME INDEX ezcontentclass_attr_ccid TO ibexa_content_type_field_definition_ct_id;
-ALTER TABLE ibexa_content_type_field_definition RENAME INDEX ezcontentclass_attr_dts TO ibexa_content_type_field_definition_dts;
-
-ALTER TABLE ezcontentclass_attribute_ml RENAME TO ibexa_content_type_field_definition_ml;
-ALTER TABLE ibexa_content_type_field_definition_ml DROP FOREIGN KEY ezcontentclass_attribute_ml_lang_fk;
-ALTER TABLE ibexa_content_type_field_definition_ml ADD CONSTRAINT ibexa_content_type_field_definition_ml_lang_fk FOREIGN KEY (language_id) REFERENCES ibexa_content_language(id) ON DELETE CASCADE ON UPDATE CASCADE;
-
-ALTER TABLE ezcontentclass_classgroup RENAME TO ibexa_content_type_group_assignment;
-
-ALTER TABLE ezcontentclass_name RENAME TO ibexa_content_type_name;
-
-ALTER TABLE ezcontentclassgroup RENAME TO ibexa_content_type_group;
-
-ALTER TABLE ezcontentobject_tree RENAME TO ibexa_content_tree;
-ALTER TABLE ibexa_content_tree RENAME INDEX ezcontentobject_tree_p_node_id TO ibexa_content_tree_p_node_id;
-ALTER TABLE ibexa_content_tree RENAME INDEX ezcontentobject_tree_path_ident TO ibexa_content_tree_path_ident;
-ALTER TABLE ibexa_content_tree RENAME INDEX ezcontentobject_tree_contentobject_id_path_string TO ibexa_content_tree_contentobject_id_path_string;
-ALTER TABLE ibexa_content_tree RENAME INDEX ezcontentobject_tree_co_id TO ibexa_content_tree_co_id;
-ALTER TABLE ibexa_content_tree RENAME INDEX ezcontentobject_tree_depth TO ibexa_content_tree_depth;
-ALTER TABLE ibexa_content_tree RENAME INDEX ezcontentobject_tree_path TO ibexa_content_tree_path;
-ALTER TABLE ibexa_content_tree RENAME INDEX modified_subnode TO ibexa_content_modified_subnode;
-ALTER TABLE ibexa_content_tree RENAME INDEX ezcontentobject_tree_remote_id TO ibexa_content_tree_remote_id;
-
-ALTER TABLE ibexa_content_bookmark DROP FOREIGN KEY ezcontentbrowsebookmark_location_fk;
-ALTER TABLE ibexa_content_bookmark ADD CONSTRAINT ibexa_content_bookmark_location_fk FOREIGN KEY (node_id) REFERENCES ibexa_content_tree(node_id) ON DELETE CASCADE;
-
-ALTER TABLE ezcontentobject RENAME TO ibexa_content;
-ALTER TABLE ibexa_content RENAME INDEX ezcontentobject_classid TO ibexa_content_type_id;
-ALTER TABLE ibexa_content RENAME INDEX ezcontentobject_lmask TO ibexa_content_lmask;
-ALTER TABLE ibexa_content RENAME INDEX ezcontentobject_pub TO ibexa_content_pub;
-ALTER TABLE ibexa_content RENAME INDEX ezcontentobject_section TO ibexa_content_section;
-ALTER TABLE ibexa_content RENAME INDEX ezcontentobject_currentversion TO ibexa_content_currentversion;
-ALTER TABLE ibexa_content RENAME INDEX ezcontentobject_owner TO ibexa_content_owner;
-ALTER TABLE ibexa_content RENAME INDEX ezcontentobject_status TO ibexa_content_status;
-ALTER TABLE ibexa_content RENAME INDEX ezcontentobject_remote_id TO ibexa_content_remote_id;
-
-ALTER TABLE ezcontentobject_attribute RENAME TO ibexa_content_field;
-ALTER TABLE ibexa_content_field RENAME INDEX ezcontentobject_attribute_co_id_ver_lang_code TO ibexa_content_field_co_id_ver_lang_code;
-ALTER TABLE ibexa_content_field RENAME INDEX ezcontentobject_classattr_id TO ibexa_content_field_classattr_id;
-ALTER TABLE ibexa_content_field RENAME INDEX ezcontentobject_attribute_language_code TO ibexa_content_field_language_code;
-ALTER TABLE ibexa_content_field RENAME INDEX ezcontentobject_attribute_co_id_ver TO ibexa_content_field_co_id_ver;
-
-ALTER TABLE ezcontentobject_link RENAME TO ibexa_content_relation;
-ALTER TABLE ibexa_content_relation RENAME INDEX ezco_link_to_co_id TO ibexa_content_relation_to_co_id;
-ALTER TABLE ibexa_content_relation RENAME INDEX ezco_link_from TO ibexa_content_relation_from;
-ALTER TABLE ibexa_content_relation RENAME INDEX ezco_link_cca_id TO ibexa_content_relation_cca_id;
-
-ALTER TABLE ezcontentobject_name RENAME TO ibexa_content_name;
-ALTER TABLE ibexa_content_name RENAME INDEX ezcontentobject_name_lang_id TO ibexa_content_name_lang_id;
-ALTER TABLE ibexa_content_name RENAME INDEX ezcontentobject_name_cov_id TO ibexa_content_name_cov_id;
-ALTER TABLE ibexa_content_name RENAME INDEX ezcontentobject_name_name TO ibexa_content_name_name;
-
-ALTER TABLE ezcontentobject_trash RENAME TO ibexa_content_trash;
-ALTER TABLE ibexa_content_trash RENAME INDEX ezcobj_trash_depth TO ibexa_content_trash_depth;
-ALTER TABLE ibexa_content_trash RENAME INDEX ezcobj_trash_p_node_id TO ibexa_content_trash_p_node_id;
-ALTER TABLE ibexa_content_trash RENAME INDEX ezcobj_trash_path_ident TO ibexa_content_trash_path_ident;
-ALTER TABLE ibexa_content_trash RENAME INDEX ezcobj_trash_co_id TO ibexa_content_trash_co_id;
-ALTER TABLE ibexa_content_trash RENAME INDEX ezcobj_trash_modified_subnode TO ibexa_content_trash_modified_subnode;
-ALTER TABLE ibexa_content_trash RENAME INDEX ezcobj_trash_path TO ibexa_content_trash_path;
-
-ALTER TABLE ezcontentobject_version RENAME TO ibexa_content_version;
-ALTER TABLE ibexa_content_version RENAME INDEX ezcobj_version_status TO ibexa_content_version_status;
-ALTER TABLE ibexa_content_version RENAME INDEX idx_object_version_objver TO ibexa_content_version_idx_ver;
-ALTER TABLE ibexa_content_version RENAME INDEX ezcontobj_version_obj_status TO ibexa_content_version_idx_status;
-ALTER TABLE ibexa_content_version RENAME INDEX ezcobj_version_creator_id TO ibexa_content_version_creator_id;
-
-ALTER TABLE ezdfsfile RENAME TO ibexa_dfs_file;
-ALTER TABLE ibexa_dfs_file RENAME INDEX ezdfsfile_name_trunk TO ibexa_dfs_file_name_trunk;
-ALTER TABLE ibexa_dfs_file RENAME INDEX ezdfsfile_expired_name TO ibexa_dfs_file_expired_name;
-ALTER TABLE ibexa_dfs_file RENAME INDEX ezdfsfile_name TO ibexa_dfs_file_name;
-ALTER TABLE ibexa_dfs_file RENAME INDEX ezdfsfile_mtime TO ibexa_dfs_file_mtime;
-
-ALTER TABLE ezgmaplocation RENAME TO ibexa_map_location;
-ALTER TABLE ibexa_map_location RENAME INDEX latitude_longitude_key TO ibexa_map_location_latitude_longitude_key;
-
-ALTER TABLE ezimagefile RENAME TO ibexa_image_file;
-ALTER TABLE ibexa_image_file RENAME INDEX ezimagefile_file TO ibexa_image_file_file;
-ALTER TABLE ibexa_image_file RENAME INDEX ezimagefile_coid TO ibexa_image_file_coid;
-
-ALTER TABLE ezkeyword RENAME TO ibexa_keyword;
-ALTER TABLE ibexa_keyword RENAME INDEX ezkeyword_keyword TO ibexa_keyword_keyword;
-
-ALTER TABLE ezkeyword_attribute_link RENAME TO ibexa_keyword_field_link;
-ALTER TABLE ibexa_keyword_field_link RENAME INDEX ezkeyword_attr_link_oaid TO ibexa_keyword_field_link_oaid;
-ALTER TABLE ibexa_keyword_field_link RENAME INDEX ezkeyword_attr_link_kid_oaid TO ibexa_keyword_field_link_kid_oaid;
-ALTER TABLE ibexa_keyword_field_link RENAME INDEX ezkeyword_attr_link_oaid_ver TO ibexa_keyword_field_link_oaid_ver;
-
-ALTER TABLE ezmedia RENAME TO ibexa_media;
-
-ALTER TABLE eznode_assignment RENAME TO ibexa_node_assignment;
-ALTER TABLE ibexa_node_assignment RENAME INDEX eznode_assignment_is_main TO ibexa_node_assignment_is_main;
-ALTER TABLE ibexa_node_assignment RENAME INDEX eznode_assignment_coid_cov TO ibexa_node_assignment_coid_cov;
-ALTER TABLE ibexa_node_assignment RENAME INDEX eznode_assignment_parent_node TO ibexa_node_assignment_parent_node;
-ALTER TABLE ibexa_node_assignment RENAME INDEX eznode_assignment_co_version TO ibexa_node_assignment_co_version;
-
-ALTER TABLE eznotification RENAME TO ibexa_notification;
-ALTER TABLE ibexa_notification RENAME INDEX eznotification_owner_is_pending TO ibexa_notification_owner_is_pending;
-ALTER TABLE ibexa_notification RENAME INDEX eznotification_owner TO ibexa_notification_owner;
-
-ALTER TABLE ezpackage RENAME TO ibexa_package;
-
-ALTER TABLE ezpolicy RENAME TO ibexa_policy;
-ALTER TABLE ibexa_policy RENAME INDEX ezpolicy_role_id TO ibexa_policy_role_id;
-ALTER TABLE ibexa_policy RENAME INDEX ezpolicy_original_id TO ibexa_policy_original_id;
-
-ALTER TABLE ezpolicy_limitation RENAME TO ibexa_policy_limitation;
-ALTER TABLE ibexa_policy_limitation RENAME INDEX policy_id TO ibexa_policy_id;
-
-ALTER TABLE ezpolicy_limitation_value RENAME TO ibexa_policy_limitation_value;
-ALTER TABLE ibexa_policy_limitation_value RENAME INDEX ezpolicy_limit_value_limit_id TO ibexa_policy_limit_value_limit_id;
-ALTER TABLE ibexa_policy_limitation_value RENAME INDEX ezpolicy_limitation_value_val TO ibexa_policy_limitation_value_val;
-
-ALTER TABLE ezpreferences RENAME TO ibexa_user_preference;
-ALTER TABLE ibexa_user_preference RENAME INDEX ezpreferences_user_id_idx TO ibexa_user_preference_user_id_idx;
-ALTER TABLE ibexa_user_preference RENAME INDEX ezpreferences_name TO ibexa_user_preference_name;
-
-ALTER TABLE ezrole RENAME TO ibexa_role;
-
-ALTER TABLE ezsearch_object_word_link RENAME TO ibexa_search_object_word_link;
-ALTER TABLE ibexa_search_object_word_link RENAME INDEX ezsearch_object_word_link_object TO ibexa_search_object_word_link_object;
-ALTER TABLE ibexa_search_object_word_link RENAME INDEX ezsearch_object_word_link_identifier TO ibexa_search_object_word_link_identifier;
-ALTER TABLE ibexa_search_object_word_link RENAME INDEX ezsearch_object_word_link_integer_value TO ibexa_search_object_word_link_integer_value;
-ALTER TABLE ibexa_search_object_word_link RENAME INDEX ezsearch_object_word_link_word TO ibexa_search_object_word_link_word;
-ALTER TABLE ibexa_search_object_word_link RENAME INDEX ezsearch_object_word_link_frequency TO ibexa_search_object_word_link_frequency;
-
-ALTER TABLE ezsearch_word RENAME TO ibexa_search_word;
-ALTER TABLE ibexa_search_word RENAME INDEX ezsearch_word_word_i TO ibexa_search_word_word_i;
-ALTER TABLE ibexa_search_word RENAME INDEX ezsearch_word_obj_count TO ibexa_search_word_obj_count;
-
-ALTER TABLE ezsection RENAME TO ibexa_section;
-
-ALTER TABLE ezsite_data RENAME TO ibexa_site_data;
-
-ALTER TABLE ezurl RENAME TO ibexa_url;
-ALTER TABLE ibexa_url RENAME INDEX ezurl_url TO ibexa_url_url;
-
-ALTER TABLE ezurl_object_link RENAME TO ibexa_url_content_link;
-ALTER TABLE ibexa_url_content_link RENAME INDEX ezurl_ol_coa_id TO ibexa_url_ol_coa_id;
-ALTER TABLE ibexa_url_content_link RENAME INDEX ezurl_ol_url_id TO ibexa_url_ol_url_id;
-ALTER TABLE ibexa_url_content_link RENAME INDEX ezurl_ol_coa_version TO ibexa_url_ol_coa_version;
-ALTER TABLE ibexa_url_content_link RENAME INDEX ezurl_ol_coa_id_cav TO ibexa_url_ol_coa_id_cav;
-
-ALTER TABLE ezurlalias RENAME TO ibexa_url_alias;
-ALTER TABLE ibexa_url_alias RENAME INDEX ezurlalias_source_md5 TO ibexa_url_alias_source_md5;
-ALTER TABLE ibexa_url_alias RENAME INDEX ezurlalias_wcard_fwd TO ibexa_url_alias_wcard_fwd;
-ALTER TABLE ibexa_url_alias RENAME INDEX ezurlalias_forward_to_id TO ibexa_url_alias_forward_to_id;
-ALTER TABLE ibexa_url_alias RENAME INDEX ezurlalias_imp_wcard_fwd TO ibexa_url_alias_imp_wcard_fwd;
-ALTER TABLE ibexa_url_alias RENAME INDEX ezurlalias_source_url TO ibexa_url_alias_source_url;
-ALTER TABLE ibexa_url_alias RENAME INDEX ezurlalias_desturl TO ibexa_url_alias_desturl;
-
-ALTER TABLE ezurlalias_ml RENAME TO ibexa_url_alias_ml;
-ALTER TABLE ibexa_url_alias_ml RENAME INDEX ezurlalias_ml_actt_org_al TO ibexa_url_alias_ml_actt_org_al;
-ALTER TABLE ibexa_url_alias_ml RENAME INDEX ezurlalias_ml_text_lang TO ibexa_url_alias_ml_text_lang;
-ALTER TABLE ibexa_url_alias_ml RENAME INDEX ezurlalias_ml_par_act_id_lnk TO ibexa_url_alias_ml_par_act_id_lnk;
-ALTER TABLE ibexa_url_alias_ml RENAME INDEX ezurlalias_ml_par_lnk_txt TO ibexa_url_alias_ml_par_lnk_txt;
-ALTER TABLE ibexa_url_alias_ml RENAME INDEX ezurlalias_ml_act_org TO ibexa_url_alias_ml_act_org;
-ALTER TABLE ibexa_url_alias_ml RENAME INDEX ezurlalias_ml_text TO ibexa_url_alias_ml_text;
-ALTER TABLE ibexa_url_alias_ml RENAME INDEX ezurlalias_ml_link TO ibexa_url_alias_ml_link;
-ALTER TABLE ibexa_url_alias_ml RENAME INDEX ezurlalias_ml_id TO ibexa_url_alias_ml_id;
-
-ALTER TABLE ezurlalias_ml_incr RENAME TO ibexa_url_alias_ml_incr;
-
-ALTER TABLE ezurlwildcard RENAME TO ibexa_url_wildcard;
-
-ALTER TABLE ezuser RENAME TO ibexa_user;
-ALTER TABLE ibexa_user RENAME INDEX ezuser_login TO ibexa_user_login;
-
-ALTER TABLE ezuser_accountkey RENAME TO ibexa_user_accountkey;
-
-ALTER TABLE ezuser_role RENAME TO ibexa_user_role;
-ALTER TABLE ibexa_user_role RENAME INDEX ezuser_role_role_id TO ibexa_user_role_role_id;
-ALTER TABLE ibexa_user_role RENAME INDEX ezuser_role_contentobject_id TO ibexa_user_role_contentobject_id;
-
-ALTER TABLE ezuser_setting RENAME TO ibexa_user_setting;
-
-ALTER TABLE ibexa_content_bookmark DROP FOREIGN KEY ezcontentbrowsebookmark_user_fk;
-ALTER TABLE ibexa_content_bookmark ADD CONSTRAINT ibexa_content_bookmark_user_fk FOREIGN KEY (user_id) REFERENCES ibexa_user(contentobject_id) ON DELETE CASCADE;
-
--- Rename contentclass_id column
-ALTER TABLE ibexa_content_type_field_definition RENAME COLUMN contentclass_id TO content_type_id;
-ALTER TABLE ibexa_content_type_group_assignment RENAME COLUMN contentclass_id TO content_type_id;
-ALTER TABLE ibexa_content_type_name RENAME COLUMN contentclass_id TO content_type_id;
-ALTER TABLE ibexa_content RENAME COLUMN contentclass_id TO content_type_id;
-ALTER TABLE ibexa_search_object_word_link RENAME COLUMN contentclass_id TO content_type_id;
-
--- Update content type version to status
-ALTER TABLE ibexa_content_type RENAME INDEX ibexa_content_type_version TO ibexa_content_type_status;
-ALTER TABLE ibexa_content_type RENAME COLUMN version TO status;
-
-ALTER TABLE ibexa_content_type_field_definition RENAME COLUMN version TO status;
-
-ALTER TABLE ibexa_content_type_field_definition_ml RENAME COLUMN version TO status;
-
-ALTER TABLE ibexa_content_type_group_assignment RENAME COLUMN contentclass_version TO content_type_status;
-ALTER TABLE ibexa_content_type_name RENAME COLUMN contentclass_version TO content_type_status;
-
--- Rename user invitations tables
-ALTER TABLE ibexa_user_invitations RENAME TO ibexa_user_invitation;
-ALTER TABLE ibexa_user_invitation RENAME INDEX ibexa_user_invitations_email_idx TO ibexa_user_invitation_email_idx;
-ALTER TABLE ibexa_user_invitation RENAME INDEX ibexa_user_invitations_hash_idx TO ibexa_user_invitation_hash_idx;
-ALTER TABLE ibexa_user_invitation RENAME INDEX ibexa_user_invitations_email_uindex TO ibexa_user_invitation_email_uindex;
-ALTER TABLE ibexa_user_invitation RENAME INDEX ibexa_user_invitations_hash_uindex TO ibexa_user_invitation_hash_uindex;
-
-ALTER TABLE ibexa_user_invitations_assignments RENAME TO ibexa_user_invitation_assignment;
-ALTER TABLE ibexa_user_invitation_assignment DROP FOREIGN KEY ibexa_user_invitations_assignments_ibexa_user_invitations_id_fk;
-ALTER TABLE ibexa_user_invitation_assignment ADD CONSTRAINT ibexa_user_invitation_assignment_ibexa_user_invitation_id_fk
- FOREIGN KEY (invitation_id) REFERENCES ibexa_user_invitation(id) ON DELETE CASCADE ON UPDATE CASCADE;
-
--- Rename content type field definition ML columns
-ALTER TABLE ibexa_content_type_field_definition_ml RENAME COLUMN contentclass_attribute_id TO content_type_field_definition_id;
-
--- Rename content field columns and indexes
-ALTER TABLE ibexa_content_field RENAME COLUMN contentclassattribute_id TO content_type_field_definition_id;
-ALTER TABLE ibexa_content_field RENAME INDEX ibexa_content_field_classattr_id TO ibexa_content_field_field_definition_id;
-
--- Update content relation columns and indexes
-ALTER TABLE ibexa_content_relation RENAME COLUMN contentclassattribute_id TO content_type_field_definition_id;
-ALTER TABLE ibexa_content_relation RENAME INDEX ibexa_content_relation_cca_id TO ibexa_content_relation_ccfd_id;
-
--- Update search object word link columns
-ALTER TABLE ibexa_search_object_word_link RENAME COLUMN contentclass_attribute_id TO content_type_field_definition_id;
diff --git a/docs/update_and_migration/from_4.6/sql/ibexa_oss_4.6.latest-to-5.0.0_postgresql.sql b/docs/update_and_migration/from_4.6/sql/ibexa_oss_4.6.latest-to-5.0.0_postgresql.sql
deleted file mode 100644
index 9d0ebd1dc2..0000000000
--- a/docs/update_and_migration/from_4.6/sql/ibexa_oss_4.6.latest-to-5.0.0_postgresql.sql
+++ /dev/null
@@ -1,285 +0,0 @@
--- Rename core related schema
-ALTER TABLE ezbinaryfile RENAME TO ibexa_binary_file;
-
-ALTER TABLE ezcobj_state RENAME TO ibexa_object_state;
-ALTER INDEX ezcobj_state_priority RENAME TO ibexa_object_state_priority;
-ALTER INDEX ezcobj_state_lmask RENAME TO ibexa_object_state_lmask;
-ALTER INDEX ezcobj_state_identifier RENAME TO ibexa_object_state_identifier;
-
-ALTER TABLE ezcobj_state_group RENAME TO ibexa_object_state_group;
-ALTER INDEX ezcobj_state_group_lmask RENAME TO ibexa_object_state_group_lmask;
-ALTER INDEX ezcobj_state_group_identifier RENAME TO ibexa_object_state_group_identifier;
-
-ALTER TABLE ezcobj_state_group_language RENAME TO ibexa_object_state_group_language;
-
-ALTER TABLE ezcobj_state_language RENAME TO ibexa_object_state_language;
-
-ALTER TABLE ezcobj_state_link RENAME TO ibexa_object_state_link;
-
-ALTER TABLE ezcontent_language RENAME TO ibexa_content_language;
-ALTER INDEX ezcontent_language_name RENAME TO ibexa_content_language_name;
-
-ALTER TABLE ezcontentbrowsebookmark RENAME TO ibexa_content_bookmark;
-ALTER INDEX ezcontentbrowsebookmark_location RENAME TO ibexa_content_bookmark_location;
-ALTER INDEX ezcontentbrowsebookmark_user RENAME TO ibexa_content_bookmark_user;
-ALTER INDEX ezcontentbrowsebookmark_user_location RENAME TO ibexa_content_bookmark_user_location;
-
-ALTER TABLE ezcontentclass RENAME TO ibexa_content_type;
-ALTER INDEX ezcontentclass_version RENAME TO ibexa_content_type_version;
-ALTER INDEX ezcontentclass_identifier RENAME TO ibexa_content_type_identifier;
-
-ALTER TABLE ezcontentclass_attribute RENAME TO ibexa_content_type_field_definition;
-ALTER INDEX ezcontentclass_attr_ccid RENAME TO ibexa_content_type_field_definition_ct_id;
-ALTER INDEX ezcontentclass_attr_dts RENAME TO ibexa_content_type_field_definition_dts;
-
-ALTER TABLE ezcontentclass_attribute_ml RENAME TO ibexa_content_type_field_definition_ml;
-ALTER TABLE ibexa_content_type_field_definition_ml DROP CONSTRAINT ezcontentclass_attribute_ml_lang_fk;
-ALTER TABLE ibexa_content_type_field_definition_ml ADD CONSTRAINT ibexa_content_type_field_definition_ml_lang_fk FOREIGN KEY (language_id) REFERENCES ibexa_content_language(id) ON DELETE CASCADE ON UPDATE CASCADE;
-
-ALTER TABLE ezcontentclass_classgroup RENAME TO ibexa_content_type_group_assignment;
-
-ALTER TABLE ezcontentclass_name RENAME TO ibexa_content_type_name;
-
-ALTER TABLE ezcontentclassgroup RENAME TO ibexa_content_type_group;
-
-ALTER TABLE ezcontentobject_tree RENAME TO ibexa_content_tree;
-ALTER INDEX ezcontentobject_tree_p_node_id RENAME TO ibexa_content_tree_p_node_id;
-ALTER INDEX ezcontentobject_tree_path_ident RENAME TO ibexa_content_tree_path_ident;
-ALTER INDEX ezcontentobject_tree_contentobject_id_path_string RENAME TO ibexa_content_tree_contentobject_id_path_string;
-ALTER INDEX ezcontentobject_tree_co_id RENAME TO ibexa_content_tree_co_id;
-ALTER INDEX ezcontentobject_tree_depth RENAME TO ibexa_content_tree_depth;
-ALTER INDEX ezcontentobject_tree_path RENAME TO ibexa_content_tree_path;
-ALTER INDEX modified_subnode RENAME TO ibexa_content_modified_subnode;
-ALTER INDEX ezcontentobject_tree_remote_id RENAME TO ibexa_content_tree_remote_id;
-
-ALTER TABLE ibexa_content_bookmark DROP CONSTRAINT ezcontentbrowsebookmark_location_fk;
-ALTER TABLE ibexa_content_bookmark ADD CONSTRAINT ibexa_content_bookmark_location_fk FOREIGN KEY (node_id) REFERENCES ibexa_content_tree(node_id) ON DELETE CASCADE;
-
-ALTER TABLE ezcontentobject RENAME TO ibexa_content;
-ALTER INDEX ezcontentobject_classid RENAME TO ibexa_content_type_id;
-ALTER INDEX ezcontentobject_lmask RENAME TO ibexa_content_lmask;
-ALTER INDEX ezcontentobject_pub RENAME TO ibexa_content_pub;
-ALTER INDEX ezcontentobject_section RENAME TO ibexa_content_section;
-ALTER INDEX ezcontentobject_currentversion RENAME TO ibexa_content_currentversion;
-ALTER INDEX ezcontentobject_owner RENAME TO ibexa_content_owner;
-ALTER INDEX ezcontentobject_status RENAME TO ibexa_content_status;
-ALTER INDEX ezcontentobject_remote_id RENAME TO ibexa_content_remote_id;
-
-ALTER TABLE ezcontentobject_attribute RENAME TO ibexa_content_field;
-ALTER INDEX ezcontentobject_attribute_co_id_ver_lang_code RENAME TO ibexa_content_field_co_id_ver_lang_code;
-ALTER INDEX ezcontentobject_classattr_id RENAME TO ibexa_content_field_classattr_id;
-ALTER INDEX ezcontentobject_attribute_language_code RENAME TO ibexa_content_field_language_code;
-ALTER INDEX ezcontentobject_attribute_co_id_ver RENAME TO ibexa_content_field_co_id_ver;
-
-ALTER TABLE ezcontentobject_link RENAME TO ibexa_content_relation;
-ALTER INDEX ezco_link_to_co_id RENAME TO ibexa_content_relation_to_co_id;
-ALTER INDEX ezco_link_from RENAME TO ibexa_content_relation_from;
-ALTER INDEX ezco_link_cca_id RENAME TO ibexa_content_relation_cca_id;
-
-ALTER TABLE ezcontentobject_name RENAME TO ibexa_content_name;
-ALTER INDEX ezcontentobject_name_lang_id RENAME TO ibexa_content_name_lang_id;
-ALTER INDEX ezcontentobject_name_cov_id RENAME TO ibexa_content_name_cov_id;
-ALTER INDEX ezcontentobject_name_name RENAME TO ibexa_content_name_name;
-
-ALTER TABLE ezcontentobject_trash RENAME TO ibexa_content_trash;
-ALTER INDEX ezcobj_trash_depth RENAME TO ibexa_content_trash_depth;
-ALTER INDEX ezcobj_trash_p_node_id RENAME TO ibexa_content_trash_p_node_id;
-ALTER INDEX ezcobj_trash_path_ident RENAME TO ibexa_content_trash_path_ident;
-ALTER INDEX ezcobj_trash_co_id RENAME TO ibexa_content_trash_co_id;
-ALTER INDEX ezcobj_trash_modified_subnode RENAME TO ibexa_content_trash_modified_subnode;
-ALTER INDEX ezcobj_trash_path RENAME TO ibexa_content_trash_path;
-
-ALTER TABLE ezcontentobject_version RENAME TO ibexa_content_version;
-ALTER INDEX ezcobj_version_status RENAME TO ibexa_content_version_status;
-ALTER INDEX idx_object_version_objver RENAME TO ibexa_content_version_idx_ver;
-ALTER INDEX ezcontobj_version_obj_status RENAME TO ibexa_content_version_idx_status;
-ALTER INDEX ezcobj_version_creator_id RENAME TO ibexa_content_version_creator_id;
-
-ALTER TABLE ezdfsfile RENAME TO ibexa_dfs_file;
-ALTER INDEX ezdfsfile_name_trunk RENAME TO ibexa_dfs_file_name_trunk;
-ALTER INDEX ezdfsfile_expired_name RENAME TO ibexa_dfs_file_expired_name;
-ALTER INDEX ezdfsfile_name RENAME TO ibexa_dfs_file_name;
-ALTER INDEX ezdfsfile_mtime RENAME TO ibexa_dfs_file_mtime;
-
-ALTER TABLE ezgmaplocation RENAME TO ibexa_map_location;
-ALTER INDEX latitude_longitude_key RENAME TO ibexa_map_location_latitude_longitude_key;
-
-ALTER TABLE ezimagefile RENAME TO ibexa_image_file;
-ALTER INDEX ezimagefile_file RENAME TO ibexa_image_file_file;
-ALTER INDEX ezimagefile_coid RENAME TO ibexa_image_file_coid;
-
-ALTER TABLE ezkeyword RENAME TO ibexa_keyword;
-ALTER INDEX ezkeyword_keyword RENAME TO ibexa_keyword_keyword;
-
-ALTER TABLE ezkeyword_attribute_link RENAME TO ibexa_keyword_field_link;
-ALTER INDEX ezkeyword_attr_link_oaid RENAME TO ibexa_keyword_field_link_oaid;
-ALTER INDEX ezkeyword_attr_link_kid_oaid RENAME TO ibexa_keyword_field_link_kid_oaid;
-ALTER INDEX ezkeyword_attr_link_oaid_ver RENAME TO ibexa_keyword_field_link_oaid_ver;
-
-ALTER TABLE ezmedia RENAME TO ibexa_media;
-
-ALTER TABLE eznode_assignment RENAME TO ibexa_node_assignment;
-ALTER INDEX eznode_assignment_is_main RENAME TO ibexa_node_assignment_is_main;
-ALTER INDEX eznode_assignment_coid_cov RENAME TO ibexa_node_assignment_coid_cov;
-ALTER INDEX eznode_assignment_parent_node RENAME TO ibexa_node_assignment_parent_node;
-ALTER INDEX eznode_assignment_co_version RENAME TO ibexa_node_assignment_co_version;
-
-ALTER TABLE eznotification RENAME TO ibexa_notification;
-ALTER INDEX eznotification_owner_is_pending RENAME TO ibexa_notification_owner_is_pending;
-ALTER INDEX eznotification_owner RENAME TO ibexa_notification_owner;
-
-ALTER TABLE ezpackage RENAME TO ibexa_package;
-
-ALTER TABLE ezpolicy RENAME TO ibexa_policy;
-ALTER INDEX ezpolicy_role_id RENAME TO ibexa_policy_role_id;
-ALTER INDEX ezpolicy_original_id RENAME TO ibexa_policy_original_id;
-
-ALTER TABLE ezpolicy_limitation RENAME TO ibexa_policy_limitation;
-ALTER INDEX policy_id RENAME TO ibexa_policy_id;
-
-ALTER TABLE ezpolicy_limitation_value RENAME TO ibexa_policy_limitation_value;
-ALTER INDEX ezpolicy_limit_value_limit_id RENAME TO ibexa_policy_limit_value_limit_id;
-ALTER INDEX ezpolicy_limitation_value_val RENAME TO ibexa_policy_limitation_value_val;
-
-ALTER TABLE ezpreferences RENAME TO ibexa_user_preference;
-ALTER INDEX ezpreferences_user_id_idx RENAME TO ibexa_user_preference_user_id_idx;
-ALTER INDEX ezpreferences_name RENAME TO ibexa_user_preference_name;
-
-ALTER TABLE ezrole RENAME TO ibexa_role;
-
-ALTER TABLE ezsearch_object_word_link RENAME TO ibexa_search_object_word_link;
-ALTER INDEX ezsearch_object_word_link_object RENAME TO ibexa_search_object_word_link_object;
-ALTER INDEX ezsearch_object_word_link_identifier RENAME TO ibexa_search_object_word_link_identifier;
-ALTER INDEX ezsearch_object_word_link_integer_value RENAME TO ibexa_search_object_word_link_integer_value;
-ALTER INDEX ezsearch_object_word_link_word RENAME TO ibexa_search_object_word_link_word;
-ALTER INDEX ezsearch_object_word_link_frequency RENAME TO ibexa_search_object_word_link_frequency;
-
-ALTER TABLE ezsearch_word RENAME TO ibexa_search_word;
-ALTER INDEX ezsearch_word_word_i RENAME TO ibexa_search_word_word_i;
-ALTER INDEX ezsearch_word_obj_count RENAME TO ibexa_search_word_obj_count;
-
-ALTER TABLE ezsection RENAME TO ibexa_section;
-
-ALTER TABLE ezsite_data RENAME TO ibexa_site_data;
-
-ALTER TABLE ezurl RENAME TO ibexa_url;
-ALTER INDEX ezurl_url RENAME TO ibexa_url_url;
-
-ALTER TABLE ezurl_object_link RENAME TO ibexa_url_content_link;
-ALTER INDEX ezurl_ol_coa_id RENAME TO ibexa_url_ol_coa_id;
-ALTER INDEX ezurl_ol_url_id RENAME TO ibexa_url_ol_url_id;
-ALTER INDEX ezurl_ol_coa_version RENAME TO ibexa_url_ol_coa_version;
-ALTER INDEX ezurl_ol_coa_id_cav RENAME TO ibexa_url_ol_coa_id_cav;
-
-ALTER TABLE ezurlalias RENAME TO ibexa_url_alias;
-ALTER INDEX ezurlalias_source_md5 RENAME TO ibexa_url_alias_source_md5;
-ALTER INDEX ezurlalias_wcard_fwd RENAME TO ibexa_url_alias_wcard_fwd;
-ALTER INDEX ezurlalias_forward_to_id RENAME TO ibexa_url_alias_forward_to_id;
-ALTER INDEX ezurlalias_imp_wcard_fwd RENAME TO ibexa_url_alias_imp_wcard_fwd;
-ALTER INDEX ezurlalias_source_url RENAME TO ibexa_url_alias_source_url;
-ALTER INDEX ezurlalias_desturl RENAME TO ibexa_url_alias_desturl;
-
-ALTER TABLE ezurlalias_ml RENAME TO ibexa_url_alias_ml;
-ALTER INDEX ezurlalias_ml_actt_org_al RENAME TO ibexa_url_alias_ml_actt_org_al;
-ALTER INDEX ezurlalias_ml_text_lang RENAME TO ibexa_url_alias_ml_text_lang;
-ALTER INDEX ezurlalias_ml_par_act_id_lnk RENAME TO ibexa_url_alias_ml_par_act_id_lnk;
-ALTER INDEX ezurlalias_ml_par_lnk_txt RENAME TO ibexa_url_alias_ml_par_lnk_txt;
-ALTER INDEX ezurlalias_ml_act_org RENAME TO ibexa_url_alias_ml_act_org;
-ALTER INDEX ezurlalias_ml_text RENAME TO ibexa_url_alias_ml_text;
-ALTER INDEX ezurlalias_ml_link RENAME TO ibexa_url_alias_ml_link;
-ALTER INDEX ezurlalias_ml_id RENAME TO ibexa_url_alias_ml_id;
-
-ALTER TABLE ezurlalias_ml_incr RENAME TO ibexa_url_alias_ml_incr;
-
-ALTER TABLE ezurlwildcard RENAME TO ibexa_url_wildcard;
-
-ALTER TABLE ezuser RENAME TO ibexa_user;
-ALTER INDEX ezuser_login RENAME TO ibexa_user_login;
-
-ALTER TABLE ezuser_accountkey RENAME TO ibexa_user_accountkey;
-
-ALTER TABLE ezuser_role RENAME TO ibexa_user_role;
-ALTER INDEX ezuser_role_role_id RENAME TO ibexa_user_role_role_id;
-ALTER INDEX ezuser_role_contentobject_id RENAME TO ibexa_user_role_contentobject_id;
-
-ALTER TABLE ezuser_setting RENAME TO ibexa_user_setting;
-
-ALTER TABLE ibexa_content_bookmark DROP CONSTRAINT ezcontentbrowsebookmark_user_fk;
-ALTER TABLE ibexa_content_bookmark ADD CONSTRAINT ibexa_content_bookmark_user_fk FOREIGN KEY (user_id) REFERENCES ibexa_user(contentobject_id) ON DELETE CASCADE;
-
--- Rename contentclass_id column
-ALTER TABLE ibexa_content_type_field_definition RENAME COLUMN contentclass_id TO content_type_id;
-ALTER TABLE ibexa_content_type_group_assignment RENAME COLUMN contentclass_id TO content_type_id;
-ALTER TABLE ibexa_content_type_name RENAME COLUMN contentclass_id TO content_type_id;
-ALTER TABLE ibexa_content RENAME COLUMN contentclass_id TO content_type_id;
-ALTER TABLE ibexa_search_object_word_link RENAME COLUMN contentclass_id TO content_type_id;
-
--- Update content type version to status
-ALTER INDEX ibexa_content_type_version RENAME TO ibexa_content_type_status;
-ALTER TABLE ibexa_content_type RENAME COLUMN version TO status;
-
-ALTER TABLE ibexa_content_type_field_definition RENAME COLUMN version TO status;
-
-ALTER TABLE ibexa_content_type_field_definition_ml RENAME COLUMN version TO status;
-
-ALTER TABLE ibexa_content_type_group_assignment RENAME COLUMN contentclass_version TO content_type_status;
-ALTER TABLE ibexa_content_type_name RENAME COLUMN contentclass_version TO content_type_status;
-
--- Rename user invitations tables
-ALTER TABLE ibexa_user_invitations RENAME TO ibexa_user_invitation;
-ALTER INDEX ibexa_user_invitations_email_idx RENAME TO ibexa_user_invitation_email_idx;
-ALTER INDEX ibexa_user_invitations_hash_idx RENAME TO ibexa_user_invitation_hash_idx;
-ALTER INDEX ibexa_user_invitations_email_uindex RENAME TO ibexa_user_invitation_email_uindex;
-ALTER INDEX ibexa_user_invitations_hash_uindex RENAME TO ibexa_user_invitation_hash_uindex;
-
-ALTER TABLE ibexa_user_invitations_assignments RENAME TO ibexa_user_invitation_assignment;
-ALTER TABLE ibexa_user_invitation_assignment DROP CONSTRAINT ibexa_user_invitations_assignments_ibexa_user_invitations_id_fk;
-ALTER TABLE ibexa_user_invitation_assignment ADD CONSTRAINT ibexa_user_invitation_assignment_ibexa_user_invitation_id_fk
- FOREIGN KEY (invitation_id) REFERENCES ibexa_user_invitation(id) ON DELETE CASCADE ON UPDATE CASCADE;
-
--- Rename content type field definition ML columns
-ALTER TABLE ibexa_content_type_field_definition_ml RENAME COLUMN contentclass_attribute_id TO content_type_field_definition_id;
-
--- Rename content field columns and indexes
-ALTER TABLE ibexa_content_field RENAME COLUMN contentclassattribute_id TO content_type_field_definition_id;
-ALTER INDEX ibexa_content_field_classattr_id RENAME TO ibexa_content_field_field_definition_id;
-
--- Update content relation columns and indexes
-ALTER TABLE ibexa_content_relation RENAME COLUMN contentclassattribute_id TO content_type_field_definition_id;
-ALTER INDEX ibexa_content_relation_cca_id RENAME TO ibexa_content_relation_ccfd_id;
-
--- Update search object word link columns
-ALTER TABLE ibexa_search_object_word_link RENAME COLUMN contentclass_attribute_id TO content_type_field_definition_id;
-
--- Rename core sequence names to match new table names
-ALTER SEQUENCE ezcobj_state_group_id_seq RENAME TO ibexa_object_state_group_id_seq;
-ALTER SEQUENCE ezcobj_state_id_seq RENAME TO ibexa_object_state_id_seq;
-ALTER SEQUENCE ezcontentbrowsebookmark_id_seq RENAME TO ibexa_content_bookmark_id_seq;
-ALTER SEQUENCE ezcontentclass_attribute_id_seq RENAME TO ibexa_content_type_field_definition_id_seq;
-ALTER SEQUENCE ezcontentclass_id_seq RENAME TO ibexa_content_type_id_seq;
-ALTER SEQUENCE ezcontentclassgroup_id_seq RENAME TO ibexa_content_type_group_id_seq;
-ALTER SEQUENCE ezcontentobject_attribute_id_seq RENAME TO ibexa_content_field_id_seq;
-ALTER SEQUENCE ezcontentobject_id_seq RENAME TO ibexa_content_id_seq;
-ALTER SEQUENCE ezcontentobject_link_id_seq RENAME TO ibexa_content_relation_id_seq;
-ALTER SEQUENCE ezcontentobject_tree_node_id_seq RENAME TO ibexa_content_tree_node_id_seq;
-ALTER SEQUENCE ezcontentobject_version_id_seq RENAME TO ibexa_content_version_id_seq;
-ALTER SEQUENCE ezimagefile_id_seq RENAME TO ibexa_image_file_id_seq;
-ALTER SEQUENCE ezkeyword_attribute_link_id_seq RENAME TO ibexa_keyword_field_link_id_seq;
-ALTER SEQUENCE ezkeyword_id_seq RENAME TO ibexa_keyword_id_seq;
-ALTER SEQUENCE eznode_assignment_id_seq RENAME TO ibexa_node_assignment_id_seq;
-ALTER SEQUENCE eznotification_id_seq RENAME TO ibexa_notification_id_seq;
-ALTER SEQUENCE ezpackage_id_seq RENAME TO ibexa_package_id_seq;
-ALTER SEQUENCE ezpolicy_id_seq RENAME TO ibexa_policy_id_seq;
-ALTER SEQUENCE ezpolicy_limitation_id_seq RENAME TO ibexa_policy_limitation_id_seq;
-ALTER SEQUENCE ezpolicy_limitation_value_id_seq RENAME TO ibexa_policy_limitation_value_id_seq;
-ALTER SEQUENCE ezpreferences_id_seq RENAME TO ibexa_user_preference_id_seq;
-ALTER SEQUENCE ezrole_id_seq RENAME TO ibexa_role_id_seq;
-ALTER SEQUENCE ezsearch_object_word_link_id_seq RENAME TO ibexa_search_object_word_link_id_seq;
-ALTER SEQUENCE ezsearch_word_id_seq RENAME TO ibexa_search_word_id_seq;
-ALTER SEQUENCE ezsection_id_seq RENAME TO ibexa_section_id_seq;
-ALTER SEQUENCE ezurl_id_seq RENAME TO ibexa_url_id_seq;
-ALTER SEQUENCE ezurlalias_id_seq RENAME TO ibexa_url_alias_id_seq;
-ALTER SEQUENCE ezurlalias_ml_incr_id_seq RENAME TO ibexa_url_alias_ml_incr_id_seq;
-ALTER SEQUENCE ezurlwildcard_id_seq RENAME TO ibexa_url_wildcard_id_seq;
-ALTER SEQUENCE ezuser_accountkey_id_seq RENAME TO ibexa_user_accountkey_id_seq;
-ALTER SEQUENCE ezuser_role_id_seq RENAME TO ibexa_user_role_id_seq;
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 72b736be90..dcd6e31855 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
@@ -740,6 +740,48 @@ No additional steps needed.
## v4.6.33
+### Database update
+
+With v4.6.33, [[= product_name_base =]] introduces Doctrine migrations to manage database schema changes.
+With [[= product_name_base =]] Doctrine migrations, you no longer have to manually run the SQL upgrade scripts.
+The `ibexa/doctrine-migrations` package is installed automatically as a dependency of [[= product_name =]]'s packages, so no separate installation step is required.
+
+[[= product_name_base =]] Doctrine migrations cover every SQL upgrade script previously listed in this guide.
+The only exception is [the activity log character set fix](#set-character-set-for-activity-log-tables), which you still need to run manually, but only if your installation was originally upgraded from v4.5.
+
+[[% include 'snippets/update/db/db_backup_warning.md' %]]
+
+To preview the migrations before you apply them, run:
+
+```bash
+php bin/console ibexa:doctrine:migrations:migrate --dry-run --write-sql=var/migration-preview.sql
+```
+
+[[% include 'snippets/update/db/doctrine_migration_preview_caution.md' %]]
+
+Run the following command to apply all database migrations present in your currently installed code:
+
+```bash
+php bin/console ibexa:doctrine:migrations:migrate
+```
+
+[[% include 'snippets/update/db/doctrine_migration_one_by_one.md' %]]
+
+[[% include 'snippets/update/db/doctrine_migration_multi_repository.md' %]]
+
+[[= product_name_base =]] Doctrine migrations only manage [[= product_name =]]'s own database tables.
+Your custom tables are not affected, even if you manage them with standard Doctrine migrations.
+
+!!! caution "Command scope"
+
+ This command isn't a full schema conformity checker.
+ It checks for the presence of key elements (such as a column or table) to determine whether a change has already been applied.
+ If a past upgrade was partially applied to your database, Doctrine migrations can be misled into marking the migration as complete when it isn't.
+
+ Always back up your database and test the `ibexa:doctrine:migrations:migrate` command in a non-production environment first.
+
+[[% include 'snippets/update/db/doctrine_migration_resolving_conflicts.md' %]]
+
### Flysystem 3 support
Depending on a [PHP version](requirements.md#php), your [[= product_name =]] supports different Flysystem versions:
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 5e805b8878..b3b5e7b8dc 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
@@ -7,16 +7,24 @@ month_change: true
## Update from v4.6.x to v4.6.latest
-Before you update to v5.0, you need to [update to the latest maintenance release of v4.6 (v[[= latest_tag_4_6 =]])](update_from_4.6.md).
+Before you update to v5.0, you must [update to the latest maintenance release of v4.6 (v[[= latest_tag_4_6 =]])](update_from_4.6.md).
+
+!!! caution "Database migration sequence"
+
+ For certain migrations, protection mechanisms differ between v4.6.x and v.5.0.x.
+ Therefore, before you update the database, make sure that you run `ibexa:doctrine:migrations:migrate` when your project is on the latest v4.6.x patch version.
+ See [Database update](update_from_4.6.md#database-update_6).
+
+ Otherwise `ibexa:doctrine:migrations:migrate` will fail on v5.0, for example, with the `Table 'ibexa_setting' already exists` error.
### Move from old to new Commerce
If you've chosen to use the [deprecated Commerce packages](update_from_4.3_old_commerce.md) during the update to 4.4,
you have to move to [new Commerce ones](update_from_4.3_new_commerce.md).
-## Update from v4.6.latest to v5.0.0
+## Update from v4.6.latest to v5.0.latest
-When you have the last version of 4.6, you can update to v5.0.0.
+When you have the latest version of 4.6, you can update to the latest version of 5.0 (v[[= latest_tag_5_0 =]]).
### Requirements
@@ -110,7 +118,7 @@ rm -r config/graphql
#### Update package requirements
-[[= product_name =]] 5.0 is based on Symfony 7.3 and both must be updated.
+[[= product_name =]] 5.0 is based on Symfony 7.4 (since v5.0.7) 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-pack) and `ibexa/rector` are installed.
Adjust the list based on your project requirements.
@@ -122,22 +130,22 @@ Notice the use of the `--no-update` option to only edit the `composer.json` entr
# Update required PHP version
composer require --no-update 'php:>=8.3';
# Update required Symfony version
- composer config extra.symfony.require '7.3.*'
+ composer config extra.symfony.require '7.4.*'
# Upgrade Ibexa and Symfony packages: application
composer require --no-update \
ibexa/headless:[[= latest_tag_5_0 =]] \
- symfony/console:^7.3 \
- symfony/dotenv:^7.3 \
- symfony/framework-bundle:^7.3 \
- symfony/runtime:^7.3 \
- symfony/yaml:^7.3 \
+ symfony/console:^7.4 \
+ symfony/dotenv:^7.4 \
+ symfony/framework-bundle:^7.4 \
+ symfony/runtime:^7.4 \
+ symfony/yaml:^7.4 \
;
# Upgrade Ibexa and Symfony packages: development tools
composer require --dev --no-update \
ibexa/rector:[[= latest_tag_5_0 =]] \
- symfony/debug-bundle:^7.3 \
- symfony/stopwatch:^7.3 \
- symfony/web-profiler-bundle:^7.3 \
+ symfony/debug-bundle:^7.4 \
+ symfony/stopwatch:^7.4 \
+ symfony/web-profiler-bundle:^7.4 \
;
```
@@ -147,22 +155,22 @@ Notice the use of the `--no-update` option to only edit the `composer.json` entr
# Update required PHP version
composer require --no-update 'php:>=8.3';
# Update required Symfony version
- composer config extra.symfony.require '7.3.*'
+ composer config extra.symfony.require '7.4.*'
# Upgrade Ibexa and Symfony packages: application
composer require --no-update \
ibexa/experience:[[= latest_tag_5_0 =]] \
- symfony/console:^7.3 \
- symfony/dotenv:^7.3 \
- symfony/framework-bundle:^7.3 \
- symfony/runtime:^7.3 \
- symfony/yaml:^7.3 \
+ symfony/console:^7.4 \
+ symfony/dotenv:^7.4 \
+ symfony/framework-bundle:^7.4 \
+ symfony/runtime:^7.4 \
+ symfony/yaml:^7.4 \
;
# Upgrade Ibexa and Symfony packages: development tools
composer require --dev --no-update \
ibexa/rector:[[= latest_tag_5_0 =]] \
- symfony/debug-bundle:^7.3 \
- symfony/stopwatch:^7.3 \
- symfony/web-profiler-bundle:^7.3 \
+ symfony/debug-bundle:^7.4 \
+ symfony/stopwatch:^7.4 \
+ symfony/web-profiler-bundle:^7.4 \
;
```
@@ -172,22 +180,22 @@ Notice the use of the `--no-update` option to only edit the `composer.json` entr
# Update required PHP version
composer require --no-update 'php:>=8.3';
# Update required Symfony version
- composer config extra.symfony.require '7.3.*'
+ composer config extra.symfony.require '7.4.*'
# Upgrade Ibexa and Symfony packages: application
composer require --no-update \
ibexa/commerce:[[= latest_tag_5_0 =]] \
- symfony/console:^7.3 \
- symfony/dotenv:^7.3 \
- symfony/framework-bundle:^7.3 \
- symfony/runtime:^7.3 \
- symfony/yaml:^7.3 \
+ symfony/console:^7.4 \
+ symfony/dotenv:^7.4 \
+ symfony/framework-bundle:^7.4 \
+ symfony/runtime:^7.4 \
+ symfony/yaml:^7.4 \
;
# Upgrade Ibexa and Symfony packages: development tools
composer require --dev --no-update \
ibexa/rector:[[= latest_tag_5_0 =]] \
- symfony/debug-bundle:^7.3 \
- symfony/stopwatch:^7.3 \
- symfony/web-profiler-bundle:^7.3 \
+ symfony/debug-bundle:^7.4 \
+ symfony/stopwatch:^7.4 \
+ symfony/web-profiler-bundle:^7.4 \
;
```
@@ -308,42 +316,38 @@ composer run-script post-update-cmd
[[% include 'snippets/update/db/db_backup_warning.md' %]]
-The main schema has changed and the provided SQL file `ibexa-4.6.latest-to-5.0.0.sql` updates it:
-
-=== "MySQL"
-
- ```bash
- mysql -u -p < vendor/ibexa/installer/upgrade/db/mysql/ibexa-4.6.latest-to-5.0.0.sql
- ```
+[[= product_name_base =]] Doctrine migrations manage the database schema updates.
-=== "PostgreSQL"
+To preview the migrations before you apply them, run:
- ```bash
- psql < vendor/ibexa/installer/upgrade/db/postgresql/ibexa-4.6.latest-to-5.0.0.sql
- ```
+```bash
+php bin/console ibexa:doctrine:migrations:migrate --dry-run --write-sql=var/migration-preview.sql
+```
-??? note "Ibexa Open Source"
+[[% include 'snippets/update/db/doctrine_migration_preview_caution.md' %]]
- If you don't have access to [[= product_name =]]'s `ibexa/installer` package, apply the following database update:
+The following command migrates your database from the v4.6 schema to the v5.0 schema:
- === "MySQL"
+```bash
+php bin/console ibexa:doctrine:migrations:migrate
+```
- ``` sql
- [[= include_file('docs/update_and_migration/from_4.6/sql/ibexa_oss_4.6.latest-to-5.0.0_mysql.sql', glue=" ") =]]
- ```
+[[% include 'snippets/update/db/doctrine_migration_multi_repository.md' %]]
- === "PostgreSQL"
+Doctrine migrations only manage [[= product_name =]]'s own database tables.
+Your custom tables are not affected, even if you also manage them with standard Doctrine migrations.
- ``` sql
- [[= include_file('docs/update_and_migration/from_4.6/sql/ibexa_oss_4.6.latest-to-5.0.0_postgresql.sql', glue=" ") =]]
- ```
+!!! caution "Command scope"
-As this script targets all editions, on editions lower than Commerce you may encounter errors about missing tables which can safely be ignored.
+ This command isn't a full schema conformity checker.
+ It checks for the presence of key elements (such as a column or table) to determine whether a change has already been applied.
+ If a past upgrade was partially applied to your database, Doctrine migrations can be misled into marking the migration as complete when it isn't.
-Many tables and columns are renamed.
-If you have custom code directly querying those, you will need to update them.
+[[% include 'snippets/update/db/doctrine_migration_resolving_conflicts.md' %]]
-You can track the renaming in the `ibexa-4.6.latest-to-5.0.0.sql` file or below.
+Many tables and columns are renamed between v4.6 and v5.0.
+If you have custom code that directly queries those, you need to update them.
+You can track the renaming below.
??? note "Tables and columns renaming map"
@@ -432,7 +436,7 @@ You can track the renaming in the `ibexa-4.6.latest-to-5.0.0.sql` file or below.
??? note "DFS (Distributed File System)"
If [DFS IO handler](clustering.md#dfs-io-handler) is used and, as recommended, its table is on its own database, you'll have to rename table and columns there.
- Here are the DFS renaming queries (extracted from `ibexa-4.6.latest-to-5.0.0.sql`):
+ Here are the DFS renaming queries:
```sql
ALTER TABLE ezdfsfile RENAME TO ibexa_dfs_file;
@@ -487,6 +491,7 @@ return RectorConfig::configure()
SymfonySetList::SYMFONY_71, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-71
SymfonySetList::SYMFONY_72, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-72
SymfonySetList::SYMFONY_73, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-73
+ SymfonySetList::SYMFONY_74, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-74
SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES,
]
)
@@ -1127,5 +1132,6 @@ composer ibexa:setup --platformsh
#### Conclusion
-Your project is now running the latest major version of [[= product_name =]].
-To reach the last patch version, see [Update from v5.0.x to v5.0.latest](update_from_5.0.md)
+Your project is now running [[= product_name =]] v5.0, with packages and database schema both up to date.
+
+To learn about configuration updates, PHP API changes, or other changes introduced between v5.0.0 and v[[= latest_tag_5_0 =]] that aren't related to the database, see [Update from v5.0.x to v5.0.latest](update_from_5.0.md).
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 ab269743c7..3ce029ec58 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
@@ -491,6 +491,47 @@ No additional steps needed for [[= product_name =]].
## v5.0.11
+### Database update
+
+With v5.0.11, [[= product_name_base =]] introduces Doctrine migrations to manage database schema changes.
+With [[= product_name_base =]] Doctrine migrations, you no longer have to manually run the SQL upgrade scripts.
+The `ibexa/doctrine-migrations` package is installed automatically as a dependency of [[= product_name =]]'s packages, so no separate installation step is required.
+
+[[= product_name_base =]] Doctrine migrations cover every SQL upgrade script previously listed in this guide.
+
+[[% include 'snippets/update/db/db_backup_warning.md' %]]
+
+To preview the migrations before you apply them, run:
+
+```bash
+php bin/console ibexa:doctrine:migrations:migrate --dry-run --write-sql=var/migration-preview.sql
+```
+
+[[% include 'snippets/update/db/doctrine_migration_preview_caution.md' %]]
+
+Run the following command to apply all database migrations present in your currently installed code:
+
+```bash
+php bin/console ibexa:doctrine:migrations:migrate
+```
+
+[[% include 'snippets/update/db/doctrine_migration_one_by_one.md' %]]
+
+[[% include 'snippets/update/db/doctrine_migration_multi_repository.md' %]]
+
+[[= product_name_base =]] Doctrine migrations only manage [[= product_name =]]'s own database tables.
+Your custom tables are not affected, even if you manage them with standard Doctrine migrations.
+
+!!! caution "Command scope"
+
+ This command isn't a full schema conformity checker.
+ It checks for the presence of key elements (such as a column or table) to determine whether a change has already been applied.
+ If a past upgrade was partially applied to your database, Doctrine migrations can be misled into marking the migration as complete when it isn't.
+
+ Always back up your database and test the `ibexa:doctrine:migrations:migrate` command in a non-production environment first.
+
+[[% include 'snippets/update/db/doctrine_migration_resolving_conflicts.md' %]]
+
### Flysystem 3 support
[[= product_name =]] 5.0 requires PHP 8.3 or later, therefore, as of v.5.0.11, `league/flysystem` installs as 3.36 or later by default.
diff --git a/docs/users/oauth_server.md b/docs/users/oauth_server.md
index d61f152fc3..887add4ac8 100644
--- a/docs/users/oauth_server.md
+++ b/docs/users/oauth_server.md
@@ -18,21 +18,7 @@ You can install it with the following command:
composer require ibexa/oauth2-server --with-all-dependencies
```
-Add the tables needed by the bundle:
-
-=== "MySQL"
-
- ```bash
- php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/oauth2-server/src/bundle/Resources/config/schema.yaml | mysql -u -p
- ```
-
-=== "PostgreSQL"
-
- ```bash
- php bin/console ibexa:doctrine:schema:dump-sql --force-platform=postgres vendor/ibexa/oauth2-server/src/bundle/Resources/config/schema.yaml | psql
- ```
-
-Then, in `config/bundles.php`, at the end of an array with a list of bundles, add the following two lines :
+Then, in `config/bundles.php`, at the end of an array with a list of bundles, add the following two lines:
``` php
Date: Tue, 3 Nov 2026 15:18:03 +0100
Subject: [PATCH 17/23] Update links (#3458)
* Update PHP Exceptions doc
Regarding https://web.archive.org/web/20260919120917/https://www.php.net/manual/en/language.exceptions.php this is the closest content
* Update Raptor website
* Update Quable website
* Update contact links
* Update PHP Error handling doc
Regarding https://php-legacy-docs.zend.com/manual/php5/en/language.errors.basics about disabling error this note is the closest
* Update Ibexa Blog
* URL field type: Update example
* reverse_proxy.md: Update Fastly token doc link
* Update Gemini doc
* Fix Actito link
* Fix Varnish link
* Fix Quable link
* Fix QNTM link
* Fix Fastly link
* Fix Quable link
* Fix Varnish link
* Fix KnpMenuBundle link
* Update Demo request link
* Update LiipImagineBundle link
* Update KnpMenuBundle link
* reporting_issues.md: Update Security legal page link
* Update KnpMenuBundle link
---
.../back_office_menus/back_office_menus.md | 2 +-
.../project_organization/bundles.md | 2 +-
docs/ai/ai_actions/configure_ai_actions.md | 2 +-
docs/ai/ai_actions/extend_ai_actions.md | 2 +-
docs/api/php_api/php_api.md | 2 +-
docs/cdp/cdp_activation/cdp_data_export.md | 2 +-
.../transactional_emails.md | 2 +-
.../field_type_reference/urlfield.md | 18 +++++++++---------
docs/content_management/taxonomy/taxonomy.md | 2 +-
docs/getting_started/requirements.md | 6 +++---
docs/ibexa_cloud/ibexa_cloud_guide.md | 2 +-
docs/ibexa_products/ibexa_commerce.md | 2 +-
docs/ibexa_products/ibexa_experience.md | 2 +-
docs/ibexa_products/ibexa_headless.md | 2 +-
.../cache/http_cache/reverse_proxy.md | 2 +-
.../security/reporting_issues.md | 2 +-
.../security/security_checklist.md | 2 +-
docs/product_catalog/quable/install_quable.md | 2 +-
docs/product_catalog/quable/quable.md | 4 ++--
docs/product_catalog/quable/quable_api.md | 2 +-
docs/product_catalog/quable/quable_guide.md | 2 +-
.../connector_installation_configuration.md | 2 +-
.../raptor_integration/raptor_connector.md | 2 +-
.../raptor_connector_guide.md | 2 +-
.../cohesivo_v6.0_deprecations.md | 2 +-
docs/release_notes/ez_platform_v1.10.0.md | 2 +-
docs/release_notes/ez_platform_v1.11.0.md | 2 +-
docs/release_notes/ez_platform_v1.12.0.md | 2 +-
docs/release_notes/ez_platform_v1.13.0_lts.md | 2 +-
docs/release_notes/ez_platform_v1.7.0_lts.md | 2 +-
docs/release_notes/ez_platform_v1.8.0.md | 2 +-
docs/release_notes/ez_platform_v1.9.0.md | 2 +-
docs/release_notes/ibexa_dxp_v4.0.md | 2 +-
docs/release_notes/ibexa_dxp_v4.6.md | 2 +-
docs/release_notes/ibexa_dxp_v5.0.md | 4 ++--
docs/resources/new_in_doc.md | 4 ++--
docs/templating/components.md | 6 +++---
docs/templating/image_variations.md | 2 +-
38 files changed, 53 insertions(+), 53 deletions(-)
diff --git a/docs/administration/back_office/back_office_menus/back_office_menus.md b/docs/administration/back_office/back_office_menus/back_office_menus.md
index bb99032430..0290c90c87 100644
--- a/docs/administration/back_office/back_office_menus/back_office_menus.md
+++ b/docs/administration/back_office/back_office_menus/back_office_menus.md
@@ -9,7 +9,7 @@ Back office menus are based on the [KnpMenuBundle](https://github.com/KnpLabs/Kn
!!! tip
For general information on how to use `MenuBuilder`,
- see [the official KnpMenuBundle documentation](https://symfony.com/bundles/KnpMenuBundle/current/index.html).
+ see [the official KnpMenuBundle documentation](https://symfony.com/bundles/KnpMenuBundle).
Menus are extensible using event subscribers, for example:
diff --git a/docs/administration/project_organization/bundles.md b/docs/administration/project_organization/bundles.md
index baff70d4ec..78e0d171f9 100644
--- a/docs/administration/project_organization/bundles.md
+++ b/docs/administration/project_organization/bundles.md
@@ -69,7 +69,7 @@ To remove a bundle (either one you created yourself, or an out-of-the-box one th
|Bundle|Description|
|---------|-----------|
|ibexa/oss|Core packages|
-|ibexa/app-switcher|Integration with the [QNTM group](https://qntmgroup.com/solutions/)|
+|ibexa/app-switcher|Integration with the [QNTM group](https://ibexa.ai/en/about-ibexa/governance)|
|ibexa/calendar|Calendar tab with a calendar widget|
|ibexa/collaboration|Collaboration functionality|
|ibexa/connect|[[[= product_name_connect =]]]([[= connect_doc =]]/)|
diff --git a/docs/ai/ai_actions/configure_ai_actions.md b/docs/ai/ai_actions/configure_ai_actions.md
index effa57c3e5..5e1eccbf1b 100644
--- a/docs/ai/ai_actions/configure_ai_actions.md
+++ b/docs/ai/ai_actions/configure_ai_actions.md
@@ -174,7 +174,7 @@ GEMINI_API_KEY=
### Configure default models
-By default, when reaching out for responses, the Gemini connector uses the Gemini Pro [model](https://ai.google.dev/gemini-api/docs/models) for text refinement and Gemini Flash model for alternative text generation.
+By default, when reaching out for responses, the Gemini connector uses the Gemini Pro [model]( https://aistudio.google.com/docs/models) for text refinement and Gemini Flash model for alternative text generation.
Users can override this setting at runtime when they [edit or create an AI action]([[= user_doc =]]/ai_actions/work_with_ai_actions/#edit-existing-ai-actions).
You can also change the default values globally.
To do it, in `config/packages` folder, create a YAML file similar to this example:
diff --git a/docs/ai/ai_actions/extend_ai_actions.md b/docs/ai/ai_actions/extend_ai_actions.md
index 47ba8701c9..69913215e4 100644
--- a/docs/ai/ai_actions/extend_ai_actions.md
+++ b/docs/ai/ai_actions/extend_ai_actions.md
@@ -390,7 +390,7 @@ Extend the models map by defining:
- a `max_tokens` limit
Optionally, you can set the default model that would be used for the action type that you're modifying, the default allowed tokens limit and the default temperature.
-Default values must stay within the limits supported by the [Gemini API](https://ai.google.dev/gemini-api/docs/models).
+Default values must stay within the limits supported by the [Gemini API]( https://aistudio.google.com/docs/models).
### Add a custom Action Handler
diff --git a/docs/api/php_api/php_api.md b/docs/api/php_api/php_api.md
index 4c8f2e8eab..45d824c6da 100644
--- a/docs/api/php_api/php_api.md
+++ b/docs/api/php_api/php_api.md
@@ -140,7 +140,7 @@ This isn't required in template functions or controller code, as the HTTP layer
## Exception handling
-PHP API uses [Exceptions](https://www.php.net/exceptions) to handle errors.
+PHP API uses [Exceptions](https://www.php.net/manual/en/language.error-handling.throwable.php) to handle errors.
Each API method may throw different exceptions, depending on what it does.
It's good practice to cover every exception you expect to happen.
diff --git a/docs/cdp/cdp_activation/cdp_data_export.md b/docs/cdp/cdp_activation/cdp_data_export.md
index dc845accbb..0cc00b354b 100644
--- a/docs/cdp/cdp_activation/cdp_data_export.md
+++ b/docs/cdp/cdp_activation/cdp_data_export.md
@@ -143,7 +143,7 @@ Finally, you can specify the audiences you wish to include.
### [[= product_name_base =]] Messenger support for large batches of data
-CDP uses [[= product_name_base =]] Messenger to process incoming data from [Raptor](https://www.raptorservices.com/).
+CDP uses [[= product_name_base =]] Messenger to process incoming data from [Raptor](https://raptorservices.com/en).
This approach improves performance and reliability when processing large amounts of CDP user records.
For more information, see [Background tasks: How it works](background_tasks.md#how-it-works).
diff --git a/docs/commerce/transactional_emails/transactional_emails.md b/docs/commerce/transactional_emails/transactional_emails.md
index 23df8abdca..7fcffe6a51 100644
--- a/docs/commerce/transactional_emails/transactional_emails.md
+++ b/docs/commerce/transactional_emails/transactional_emails.md
@@ -40,7 +40,7 @@ Symfony Flex installs and activates the package.
### Configure Actito integration
-Before you can start configuring the notifier engine to process and dispatch notifications to be forwarded as transactional emails, you must first obtain and configure an [Actito license](https://actito.com/en/pricing/).
+Before you can start configuring the notifier engine to process and dispatch notifications to be forwarded as transactional emails, you must first obtain and configure an [Actito license](https://actito.com/en/pricing).
Once you gain access to the Actito dashboard:
diff --git a/docs/content_management/field_types/field_type_reference/urlfield.md b/docs/content_management/field_types/field_type_reference/urlfield.md
index 065d2c8a34..9aae6a0c60 100644
--- a/docs/content_management/field_types/field_type_reference/urlfield.md
+++ b/docs/content_management/field_types/field_type_reference/urlfield.md
@@ -11,10 +11,10 @@ It's formed by the combination of a link and the respective text.
### Input expectations
-| Type | Description | Example |
-|----------|-----------------------------------------------|------------------------|
-| `string` | Link content provided to the value. | "https://www.ibexa.co" |
-| `string` | Text content that represents the stored link. | "Ibexa" |
+| Type | Description | Example |
+|----------|-----------------------------------------------|-----------------------|
+| `string` | Link content provided to the value. | "https://ibexa.ai/en" |
+| `string` | Text content that represents the stored link. | "Ibexa" |
### Value object
@@ -45,15 +45,15 @@ It expects two comma-separated strings, corresponding to the link and text.
use Ibexa\Core\FieldType\Url;
// Instantiates an Url Value object
-$UrlValue = new Url\Value('https://www.ibexa.co/', 'Ibexa');
+$UrlValue = new Url\Value('https://ibexa.ai/en', 'Ibexa');
```
### Hash format
-| Key | Type | Description | Example |
-|--------|----------|---------------|-------------------------|
-| `link` | `string` | Link content. | "https://www.ibexa.co/" |
-| `text` | `string` | Text content. | "Ibexa" |
+| Key | Type | Description | Example |
+|--------|----------|---------------|-----------------------|
+| `link` | `string` | Link content. | "https://ibexa.ai/en" |
+| `text` | `string` | Text content. | "Ibexa" |
``` php
// Example of the hash value in PHP
diff --git a/docs/content_management/taxonomy/taxonomy.md b/docs/content_management/taxonomy/taxonomy.md
index 21be1039a1..d80789fc69 100644
--- a/docs/content_management/taxonomy/taxonomy.md
+++ b/docs/content_management/taxonomy/taxonomy.md
@@ -261,7 +261,7 @@ ibexa:
#### Change embeddings provider to Google Gemini [[% include 'snippets/lts-update_badge.md' %]]
-Once you have installed and configured the [Google Gemini connector](configure_ai_actions.md#install-google-gemini-connector), you can modify the default configuration to use the `ibexa_gemini` embedding provider and one of the [supported models](https://ai.google.dev/gemini-api/docs/embeddings):
+Once you have installed and configured the [Google Gemini connector](configure_ai_actions.md#install-google-gemini-connector), you can modify the default configuration to use the `ibexa_gemini` embedding provider and one of the [supported models]( https://aistudio.google.com/docs/embeddings):
```yaml hl_lines="15 22"
ibexa:
diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md
index c8912e1806..d0d2e347ed 100644
--- a/docs/getting_started/requirements.md
+++ b/docs/getting_started/requirements.md
@@ -214,7 +214,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](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)
+ - [Varnish](https://www.varnish.org/) 6.0LTS or 7.1 with [varnish-modules](https://github.com/varnish/varnish-modules/blob/main/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.
@@ -223,7 +223,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](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)
+ - [Varnish](https://www.varnish.org/) 6.0LTS or 7.1 with [varnish-modules](https://github.com/varnish/varnish-modules/blob/main/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.
@@ -232,7 +232,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](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)
+ - [Varnish](https://www.varnish.org/) 6.0LTS with [varnish-modules](https://github.com/varnish/varnish-modules/blob/main/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 baa3536bfa..d48cd9d7f2 100644
--- a/docs/ibexa_cloud/ibexa_cloud_guide.md
+++ b/docs/ibexa_cloud/ibexa_cloud_guide.md
@@ -32,7 +32,7 @@ It shifts the focus away from fundamental operations and toward improving your d
If you want to use [[= product_name_cloud =]], you need to check the [requirements](requirements.md#ibexa-cloud-requirements-and-setup) and follow [installation process](install_on_ibexa_cloud.md).
To use [[= product_name_cloud =]], you must make arrangements with [[= product_name_base =]] to get and set up a user account.
-To do so, contact your Partner Manager, or Sales representatives team, or fill out the form available at this link: https://www.ibexa.co/about-ibexa/contact-us.
+To do so, contact your Partner Manager, or Sales representatives team, or fill out the form available at this link: https://cohesivo.com/en/about-us/contact-us.
When you have an account, you can log in to https://console.ibexa.cloud.
diff --git a/docs/ibexa_products/ibexa_commerce.md b/docs/ibexa_products/ibexa_commerce.md
index e7e4d0a1bc..b113687694 100644
--- a/docs/ibexa_products/ibexa_commerce.md
+++ b/docs/ibexa_products/ibexa_commerce.md
@@ -21,7 +21,7 @@ You can completely revamp your online stores and give your consumers exceptional
To start using [[= product_name_com =]], you need to purchase a product license.
For more information, see [Ibexa Commerce license pricing](https://www.ibexa.co/products/pricing?tab=3).
-You can also [contact us](https://www.ibexa.co/about-ibexa/contact-us) or [one of our partners](https://www.ibexa.co/partners).
+You can also [contact us](https://cohesivo.com/en/about-us/contact-us) or [one of our partners](https://cohesivo.com/en/partners).
## How it works
diff --git a/docs/ibexa_products/ibexa_experience.md b/docs/ibexa_products/ibexa_experience.md
index f33f8f4f9b..fffd984bc3 100644
--- a/docs/ibexa_products/ibexa_experience.md
+++ b/docs/ibexa_products/ibexa_experience.md
@@ -19,7 +19,7 @@ It also provides tools for using segmentation and targeting, and it can be widel
To start using [[= product_name_exp =]], you need to purchase a product license.
For more information, see [[[= product_name_exp =]] license pricing](https://www.ibexa.co/products/pricing?tab=2).
-You can also [contact us](https://www.ibexa.co/about-ibexa/contact-us) or [one of our partners](https://www.ibexa.co/partners).
+You can also [contact us](https://cohesivo.com/en/about-us/contact-us) or [one of our partners](https://cohesivo.com/en/partners).
## How it works
diff --git a/docs/ibexa_products/ibexa_headless.md b/docs/ibexa_products/ibexa_headless.md
index c03dd6e2c5..38eb30a2ca 100644
--- a/docs/ibexa_products/ibexa_headless.md
+++ b/docs/ibexa_products/ibexa_headless.md
@@ -19,7 +19,7 @@ It's provided without a default front office, but with a complete back office an
To start using [[= product_name_headless =]] you must purchase a product license.
For more information, see [[[= product_name_headless =]] license pricing](https://www.ibexa.co/products/pricing?tab=1).
-You can [contact us](https://www.ibexa.co/about-ibexa/contact-us) or [contact one of our partners](https://www.ibexa.co/partners).
+You can [contact us](https://cohesivo.com/en/about-us/contact-us) or [contact one of our partners](https://cohesivo.com/en/partners).
## How it works
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 2606f2078e..886f6310ba 100644
--- a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md
+++ b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md
@@ -256,7 +256,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/user-and-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/organizations-and-accounts/account-members-and-permissions/managing-account-level-api-tokens/).
The API token needs the `purge_all` an `purge_select` scopes.
### Configuration examples
diff --git a/docs/infrastructure_and_maintenance/security/reporting_issues.md b/docs/infrastructure_and_maintenance/security/reporting_issues.md
index aad919e18f..5c514e18ac 100644
--- a/docs/infrastructure_and_maintenance/security/reporting_issues.md
+++ b/docs/infrastructure_and_maintenance/security/reporting_issues.md
@@ -6,7 +6,7 @@ description: Learn how to report security issues in Ibexa DXP.
The security of [[= product_name_base =]] software is a primary concern and is taken seriously.
-For more information on security in [[= product_name_base =]] products, see [Ibexa Security Policy](https://www.ibexa.co/software-information/security).
+For more information on security in [[= product_name_base =]] products, see [Ibexa Security Policy](https://ibexa.ai/en/legal-pages/security).
No engineering team is perfect though, and if you do discover a security issue in one of our products we are very grateful for your help in reporting it to us privately, and refraining from public disclosure until we have found the solution and distributed it. Thank you!
diff --git a/docs/infrastructure_and_maintenance/security/security_checklist.md b/docs/infrastructure_and_maintenance/security/security_checklist.md
index b7f2a00135..b78fe14a8c 100644
--- a/docs/infrastructure_and_maintenance/security/security_checklist.md
+++ b/docs/infrastructure_and_maintenance/security/security_checklist.md
@@ -202,7 +202,7 @@ You should also make sure that no stack trace is ever visible to end users of pr
Symfony in production mode prevents exception messages from being visible to end users.
However, if Symfony fails to boot properly, such exceptions may end up being visible, including stack traces.
-This can be prevented by [disabling error message output in PHP](https://www.php.net/manual/en/language.errors.basics.php).
+This can be prevented by [disabling error message output in PHP](https://www.php.net/manual/en/language.error-handling.diagnostic.php).
The following `php.ini` configuration values should be used on production sites.
When using [[= product_name_cloud =]], the same settings can be configured in [[= product_name =]]'s `.platform.app.yaml` file.
diff --git a/docs/product_catalog/quable/install_quable.md b/docs/product_catalog/quable/install_quable.md
index bbacf5b0ee..7e860d86d8 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://www.quable.com).
+Before installing the [[= pim_product_name =]] connector, ensure you have access to a [[[= pim_product_name =]] PIM instance](https://quable.com/en).
## Install package
diff --git a/docs/product_catalog/quable/quable.md b/docs/product_catalog/quable/quable.md
index c73ba23dbe..afe4569df8 100644
--- a/docs/product_catalog/quable/quable.md
+++ b/docs/product_catalog/quable/quable.md
@@ -6,7 +6,7 @@ month_change: false
# Quable PIM Integration
-[[= product_name =]] integrates with [[[= pim_product_name =]]](https://www.quable.com/en) to provide product information management as part of the [[= product_name_base =]] orchestration platform.
+[[= product_name =]] integrates with [[[= pim_product_name =]]](https://quable.com/en) to provide product information management as part of the [[= product_name_base =]] orchestration platform.
[[= pim_product_name =]] is [[= product_name_base =]]’s PIM solution for managing complex product catalogs and serves as the single source of truth, available as an add-on for [[= product_name =]].
Once you install and configure it, the integration performs an initial synchronization of product data, followed by ongoing updates via webhooks.
@@ -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/", "Quable PIM integration", "Quable PIM integration allows you to use products managed in Quable as the source of product data in Ibexa DXP."),
- ("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://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/product_catalog/quable/quable_api.md b/docs/product_catalog/quable/quable_api.md
index de0dc06e16..5bf039ff1d 100644
--- a/docs/product_catalog/quable/quable_api.md
+++ b/docs/product_catalog/quable/quable_api.md
@@ -9,7 +9,7 @@ month_change: false
As [[= pim_product_name =]] products are represented as [[= product_name =]] products, you can use the existing [Product APIs](product_api.md) to retrieve the product information.
[[= pim_product_name =]] is the source of truth about products and categories and you should only use the [[= product_name =]] APIs to read the information coming from [[= pim_product_name =]], but you can't use them to modify it.
-To modify the information, use the [[[= pim_product_name =]] interface](https://www.quable.com) or the dedicated [[[= pim_product_name =]] APIs](https://developers.quable.com/quable-api/).
+To modify the information, use the [[[= pim_product_name =]] interface](https://quable.com/en) or the dedicated [[[= pim_product_name =]] APIs](https://developers.quable.com/quable-api/).
## REST API Usage
diff --git a/docs/product_catalog/quable/quable_guide.md b/docs/product_catalog/quable/quable_guide.md
index eecef45aa4..6ba90b5a0c 100644
--- a/docs/product_catalog/quable/quable_guide.md
+++ b/docs/product_catalog/quable/quable_guide.md
@@ -7,7 +7,7 @@ month_change: false
## Overview
-[[= pim_product_name =]] integration connects [[= product_name =]] with [[[= pim_product_name =]] Product Information Management (PIM)](https://www.quable.com/en), making [[= pim_product_name =]] the authoritative source of product information for every website powered by [[= product_name =]].
+[[= pim_product_name =]] integration connects [[= product_name =]] with [[[= pim_product_name =]] Product Information Management (PIM)](https://quable.com/en), making [[= pim_product_name =]] the authoritative source of product information for every website powered by [[= product_name =]].
[[= pim_product_name =]] serves as the single source of truth for all product data, including attributes, classifications, variants, and translations.
[[= product_name =]] consumes this data and makes it available for use in content and digital experiences.
diff --git a/docs/recommendations/raptor_integration/connector_installation_configuration.md b/docs/recommendations/raptor_integration/connector_installation_configuration.md
index 13d0472c18..d4187c59b3 100644
--- a/docs/recommendations/raptor_integration/connector_installation_configuration.md
+++ b/docs/recommendations/raptor_integration/connector_installation_configuration.md
@@ -5,7 +5,7 @@ month_change: false
# Configuration procedure
-To configure the [Raptor](https://www.raptorservices.com/) integration add-on, follow the step-by-step procedure below.
+To configure the [Raptor](https://raptorservices.com/en) integration add-on, follow the step-by-step procedure below.
## Install Raptor connector
diff --git a/docs/recommendations/raptor_integration/raptor_connector.md b/docs/recommendations/raptor_integration/raptor_connector.md
index c266a2b4ce..400c79ff3a 100644
--- a/docs/recommendations/raptor_integration/raptor_connector.md
+++ b/docs/recommendations/raptor_integration/raptor_connector.md
@@ -6,7 +6,7 @@ month_change: false
# Raptor connector
-The [Raptor](https://www.raptorservices.com/) connector is an add-on that provides a seamless integration between [[= product_name =]] and Raptor recommendation engine.
+The [Raptor](https://raptorservices.com/en) connector is an add-on that provides a seamless integration between [[= product_name =]] and Raptor recommendation engine.
Its primary goal is to enable editors and managers to deliver personalized experiences across digital channels, which helps increase conversion rates, drive sales, and improve user engagement.
diff --git a/docs/recommendations/raptor_integration/raptor_connector_guide.md b/docs/recommendations/raptor_integration/raptor_connector_guide.md
index 8e4cea4682..7a70dbcd46 100644
--- a/docs/recommendations/raptor_integration/raptor_connector_guide.md
+++ b/docs/recommendations/raptor_integration/raptor_connector_guide.md
@@ -5,7 +5,7 @@ month_change: false
# Raptor integration guide
-Discover [Raptor](https://www.raptorservices.com/) integration - an add-on that is focused on recommendations and tracking customer behaviors.
+Discover [Raptor](https://raptorservices.com/en) integration - an add-on that is focused on recommendations and tracking customer behaviors.
It includes Raptor connector with tracking scripts and events, used to track and analyze customer behaviors, and a set of Recommendation blocks.
## What is Raptor connector
diff --git a/docs/release_notes/cohesivo_v6.0_deprecations.md b/docs/release_notes/cohesivo_v6.0_deprecations.md
index 9ac7fa673e..ade0f26be3 100644
--- a/docs/release_notes/cohesivo_v6.0_deprecations.md
+++ b/docs/release_notes/cohesivo_v6.0_deprecations.md
@@ -16,7 +16,7 @@ month_change: true
As the work on Cohesivo 6.0 is in progress, this page **isn't exhaustive and will evolve with time**.
-As announced during Ibexa Summit 2026, [Ibexa DXP will be renamed to Cohesivo](https://www.ibexa.co/blog/redefining-the-dxp-from-execution-to-orchestration) to support the new [orchestration platform approach](https://www.ibexa.co/blog/the-orchestration-era).
+As announced during Ibexa Summit 2026, [Ibexa DXP will be renamed to Cohesivo](https://ibexa.ai/en/blog/redefining-the-dxp-from-execution-to-orchestration) to support the new [orchestration platform approach](https://ibexa.ai/en/blog/the-orchestration-era).
To learn more about the new brand, visit the [Cohesivo official site](https://cohesivo.com).
diff --git a/docs/release_notes/ez_platform_v1.10.0.md b/docs/release_notes/ez_platform_v1.10.0.md
index 32d47bdf96..1f8a07a67b 100644
--- a/docs/release_notes/ez_platform_v1.10.0.md
+++ b/docs/release_notes/ez_platform_v1.10.0.md
@@ -109,4 +109,4 @@ Kudos to [@emodric](https://twitter.com/emodric) for the Tags bundle, [@pspanja]
- [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).
+If you would like to become familiar with the products, [request a demo](https://cohesivo.com/en/demo).
diff --git a/docs/release_notes/ez_platform_v1.11.0.md b/docs/release_notes/ez_platform_v1.11.0.md
index caa6f5ec0d..4fb1ffd758 100644
--- a/docs/release_notes/ez_platform_v1.11.0.md
+++ b/docs/release_notes/ez_platform_v1.11.0.md
@@ -87,7 +87,7 @@ full support, maintenance, and priority security patch handling as they're used
- [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).
+If you would like to become familiar with the products, [request a demo](https://cohesivo.com/en/demo).
### Updating
diff --git a/docs/release_notes/ez_platform_v1.12.0.md b/docs/release_notes/ez_platform_v1.12.0.md
index 7549985d21..5652a94ddf 100644
--- a/docs/release_notes/ez_platform_v1.12.0.md
+++ b/docs/release_notes/ez_platform_v1.12.0.md
@@ -56,7 +56,7 @@ For Varnish users be aware thus change implies new VCL and requirement for varni
- [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).
+If you would like to become familiar with the products, [request a demo](https://cohesivo.com/en/demo).
### Updating
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 00cb056290..79b1513d49 100644
--- a/docs/release_notes/ez_platform_v1.13.0_lts.md
+++ b/docs/release_notes/ez_platform_v1.13.0_lts.md
@@ -55,7 +55,7 @@ You can [serve Varnish through Fastly](https://doc.ibexa.co/en/2.2/guide/http_ca
- [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).
+If you would like to become familiar with the products, [request a demo](https://cohesivo.com/en/demo).
### Updating
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 e5b4d212b8..c86c233fe0 100644
--- a/docs/release_notes/ez_platform_v1.7.0_lts.md
+++ b/docs/release_notes/ez_platform_v1.7.0_lts.md
@@ -95,7 +95,7 @@ Other improvements includes the good setup of all content type field categories
- [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).
+If you would like to become familiar with the products, [request a demo](https://cohesivo.com/en/demo).
### Updating
diff --git a/docs/release_notes/ez_platform_v1.8.0.md b/docs/release_notes/ez_platform_v1.8.0.md
index 69f5cd77ff..f589fa8d8c 100644
--- a/docs/release_notes/ez_platform_v1.8.0.md
+++ b/docs/release_notes/ez_platform_v1.8.0.md
@@ -85,7 +85,7 @@ If you're looking for the Long Term Support (LTS) release, see [eZ Platform 1.7
- [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).
+If you would like to become familiar with the products, [request a demo](https://cohesivo.com/en/demo).
### Updating
diff --git a/docs/release_notes/ez_platform_v1.9.0.md b/docs/release_notes/ez_platform_v1.9.0.md
index 8d7ddac93d..170be40cbe 100644
--- a/docs/release_notes/ez_platform_v1.9.0.md
+++ b/docs/release_notes/ez_platform_v1.9.0.md
@@ -75,7 +75,7 @@ The eZ Enterprise Demo now uses the [Netgen Tags bundle](https://github.com/netg
- [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).
+If you would like to become familiar with the products, [request a demo](https://cohesivo.com/en/demo).
### Updating
diff --git a/docs/release_notes/ibexa_dxp_v4.0.md b/docs/release_notes/ibexa_dxp_v4.0.md
index aaae03cf62..53af4f0b70 100644
--- a/docs/release_notes/ibexa_dxp_v4.0.md
+++ b/docs/release_notes/ibexa_dxp_v4.0.md
@@ -19,7 +19,7 @@ simplified navigation and more streamlined workflows.
!!! tip
- Read more about the rationale and process for the redesign on [Ibexa blog](https://www.ibexa.co/blog/ibexa-dxp-v4.0-preview-redesigned-user-interface-elevates-the-user-experience).
+ Read more about the rationale and process for the redesign on [Ibexa blog](https://ibexa.ai/en/blog/ibexa-dxp-v4.0-preview-redesigned-user-interface-elevates-the-user-experience).
### New product catalog
diff --git a/docs/release_notes/ibexa_dxp_v4.6.md b/docs/release_notes/ibexa_dxp_v4.6.md
index b79c66d79e..f009503c96 100644
--- a/docs/release_notes/ibexa_dxp_v4.6.md
+++ b/docs/release_notes/ibexa_dxp_v4.6.md
@@ -273,7 +273,7 @@ ibexa_cdp:
bulk_async_threshold: 100
```
-When the number of [audience](https://content.raptorservices.com/help-center/how-to-build-audiences-in-the-customer-data-platform) changes coming from [Raptor](https://www.raptorservices.com/) exceeds this number, the changes are sent to the queue and processed in the background.
+When the number of [audience](https://content.raptorservices.com/help-center/how-to-build-audiences-in-the-customer-data-platform) changes coming from [Raptor](https://raptorservices.com/en) exceeds this number, the changes are sent to the queue and processed in the background.
Otherwise, they are processed synchronously.
### Improved HTTP caching for Page Builder and dashboard blocks [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]]
diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md
index 2344f6551c..1ff9fc07d0 100644
--- a/docs/release_notes/ibexa_dxp_v5.0.md
+++ b/docs/release_notes/ibexa_dxp_v5.0.md
@@ -505,7 +505,7 @@ To learn more, see the [corresponding security advisory](https://developers.ibex
### Raptor connector
-The Raptor connector provides a seamless integration between Ibexa DXP and [Raptor Recommendation Engine](https://www.raptorservices.com/website-recommendations/).
+The Raptor connector provides a seamless integration between Ibexa DXP and [Raptor Recommendation Engine](https://raptorservices.com/en/platform/website-recommendations).
For more information, see [Raptor connector](https://doc.ibexa.co/en/5.0/recommendations/raptor_integration/raptor_connector/).
@@ -526,7 +526,7 @@ For more information about Recommendation blocks in Page Builder, see the releva
### [[= pim_product_name =]] PIM
-The [[= pim_product_name =]] integration add-on allows you to connect Ibexa DXP with [[[= pim_product_name =]] Product Information Management (PIM)](https://www.quable.com/en), making [[= pim_product_name =]] the authoritative source of product information for every website powered by Ibexa DXP.
+The [[= pim_product_name =]] integration add-on allows you to connect Ibexa DXP with [[[= pim_product_name =]] Product Information Management (PIM)](https://quable.com/en), making [[= pim_product_name =]] the authoritative source of product information for every website powered by Ibexa DXP.
[[= pim_product_name =]] can serve as the single source of truth for all product data, including attributes, classifications, variants, and translations.
Ibexa DXP consumes this data and makes it available for use in content and digital experiences.
diff --git a/docs/resources/new_in_doc.md b/docs/resources/new_in_doc.md
index f474555853..cc9ea16216 100644
--- a/docs/resources/new_in_doc.md
+++ b/docs/resources/new_in_doc.md
@@ -542,7 +542,7 @@ We want to thank
### v5.0.0
[Ibexa DXP v5.0.0](https://doc.ibexa.co/en/5.0/release_notes/ibexa_dxp_v5.0/#ibexa-dxp-v500) is now available, accompanied by [v5.0 documentation](https://doc.ibexa.co/en/5.0/).
-Ibexa DXP 5.0 LTS benefits of the [Long-Term Support](https://www.ibexa.co/blog/continuous-innovation-how-ibexa-dxp-s-lifecycle-enhances-feature-delivery).
+Ibexa DXP 5.0 LTS benefits of the [Long-Term Support](https://ibexa.ai/en/blog/continuous-innovation-how-ibexa-dxp-s-lifecycle-enhances-feature-delivery).
See how to [update from 4.6 to 5.0](https://doc.ibexa.co/en/5.0/update_and_migration/from_4.6/update_to_5.0/).
@@ -819,7 +819,7 @@ Enhanced the PHP API with the following new classes and interfaces:
### Trainings
-- The Content Editor Training has been released. Learn more in the [announcement blog post](https://www.ibexa.co/blog/constant-development-is-key-so-here-s-a-new-training-for-content-editors)
+- The Content Editor Training has been released. Learn more in the [announcement blog post](https://ibexa.ai/en/blog/constant-development-is-key-so-here-s-a-new-training-for-content-editors)
### Infrastructure and maintenance
diff --git a/docs/templating/components.md b/docs/templating/components.md
index c2553b1a1b..31eb3b1685 100644
--- a/docs/templating/components.md
+++ b/docs/templating/components.md
@@ -71,7 +71,7 @@ You can use an unique group name when creating a Twig Component to create your o
|---|---|---|
| [Controller](https://github.com/ibexa/twig-components/blob/5.0/src/lib/Component/ControllerComponent.php) | Renders a Symfony controller |`controller` |
| [HTML](https://github.com/ibexa/twig-components/blob/5.0/src/lib/Component/HtmlComponent.php) | Renders static HTML |`html` |
-| [Menu](https://github.com/ibexa/twig-components/blob/5.0/src/lib/Component/MenuComponent.php) | Renders a [menu](https://symfony.com/bundles/KnpMenuBundle/current/index.html) |`menu` |
+| [Menu](https://github.com/ibexa/twig-components/blob/5.0/src/lib/Component/MenuComponent.php) | Renders a [menu](https://symfony.com/bundles/KnpMenuBundle) |`menu` |
| [Script](https://github.com/ibexa/twig-components/blob/5.0/src/lib/Component/ScriptComponent.php) | Renders a [`
+
+
+
+
+
+
+
+