Skip to content

Cohesivo rebranding - #3336

Open
dabrt wants to merge 14 commits into
6.0from
cohesivo-rebranding
Open

Cohesivo rebranding#3336
dabrt wants to merge 14 commits into
6.0from
cohesivo-rebranding

Conversation

@dabrt

@dabrt dabrt commented Jul 31, 2026

Copy link
Copy Markdown
Contributor
Question Answer
JIRA Ticket N/A
Versions 6.0
Edition All

Rebrand features and the main product according to a new naming scheme:
Engage -> Qualifio
CDP -> Raptor
PIM -> Quable
Ibexa DXP -> Cohesivo

I am leaving a few things as-is on purpose:

  • Add Image Asset from Digital Asset Management article
  • Product edition names remain the same until further notice
  • Product catalog remains the same until further notice

NOTES:

  • Ibexa DXP PHP Storm plugin description received only a partial makeover, waiting for Adam's decisions
  • Link checker will fail until user doc PR is merged.
  • Some diagrams have invalid source, I'd need to recreate them.

Checklist

  • Text renders correctly
  • Text has been checked with vale
  • Description metadata is up to date
  • Redirects cover removed/moved pages

@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown

Preview of modified files

Preview of modified Markdown:

@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown

Summary

Status Count
🔍 Total 736682
🔗 Unique 14789
✅ Successful 6192
⏳ Timeouts 0
🔀 Redirected 0
👻 Excluded 730486
❓ Unknown 0
🚫 Errors 4
⛔ Unsupported 0

Errors per input

Errors in site/ibexa_products/editions/index.html

  • [ERROR] file:///home/runner/work/documentation-developer/documentation-developer/repositories/userdoc-6.0/site/qualifio/qualifio/index.html (at 14392:14) | File not found. Check if file exists and path is correct

Errors in site/qualifio/create_campaign/index.html

  • [ERROR] file:///home/runner/work/documentation-developer/documentation-developer/repositories/userdoc-6.0/site/qualifio/qualifio/index.html#campaign (at 14190:13) | File not found. Check if file exists and path is correct
  • [ERROR] file:///home/runner/work/documentation-developer/documentation-developer/repositories/userdoc-6.0/site/qualifio/qualifio/index.html#publication-channel (at 14199:63) | File not found. Check if file exists and path is correct

Errors in site/qualifio/install_qualifio/index.html

  • [ERROR] file:///home/runner/work/documentation-developer/documentation-developer/repositories/userdoc-6.0/site/qualifio/qualifio/index.html#request-access (at 14197:39) | File not found. Check if file exists and path is correct

Full Github Actions output

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

code_samples/ change report

Before (on target branch)After (in current PR)

code_samples/qualifio/config/packages/ibexa_connector_qualifio.yaml


code_samples/qualifio/config/packages/ibexa_connector_qualifio.yaml


code_samples/ibexa_engage/config/packages/ibexa_connector_qualifio.yaml

docs/ibexa_engage/install_ibexa_engage.md@42:``` yaml
docs/ibexa_engage/install_ibexa_engage.md@43:[[= include_file('code_samples/ibexa_engage/config/packages/ibexa_connector_qualifio.yaml') =]]
docs/ibexa_engage/install_ibexa_engage.md@44:```
docs/qualifio/install_qualifio.md@42:``` yaml
docs/qualifio/install_qualifio.md@43:[[= include_file('code_samples/qualifio/config/packages/ibexa_connector_qualifio.yaml') =]]
docs/qualifio/install_qualifio.md@44:```

001⫶ibexa_connector_qualifio:
002⫶ client_id: 1234
003⫶ channel: 'd882c3f1-1b05-48c8-bc1d-c11a45e2c23a'
004⫶ feed_url: 'https://api.qualif.io/v1/campaignfeed/channels/d882c3f1-1b05-48c8-bc1d-c11a45e2c23a/json?clientId=1234'
005⫶ variable_map:
006⫶ form:
007⫶ shipping_address:
008⫶ first_name: 'firstname'
009⫶ last_name: 'lastname'
010⫶ email: 'email'
011⫶ street: 'address'
012⫶ postal_code: 'zip_code'
013⫶ locality: 'locality'
014⫶ country: 'country'
015⫶ phone_number: 'phone'
016⫶ billing_address:
017⫶ first_name: 'firstname'
018⫶ last_name: 'lastname'
019⫶ email: 'email'
020⫶ street: 'address'
021⫶ postal_code: 'zip_code'
022⫶ locality: 'locality'
023⫶ country: 'country'
024⫶ phone_number: 'phone'
025⫶ content:
026⫶ birthday: 'birthday'
027⫶ first_name: 'firstname'
028⫶ last_name: 'lastname'
029⫶ company: 'company'
030⫶ position: 'position'
031⫶ phone: 'phone'
032⫶ gender: 'gender'
033⫶ account:
034⫶ name: 'name'
035⫶ email: 'email'
036⫶ id: 'userid'
037⫶ remote_id: 'identifier'
038⫶ login: 'login'



001⫶ibexa_connector_qualifio:
002⫶ client_id: 1234
003⫶ channel: 'd882c3f1-1b05-48c8-bc1d-c11a45e2c23a'
004⫶ feed_url: 'https://api.qualif.io/v1/campaignfeed/channels/d882c3f1-1b05-48c8-bc1d-c11a45e2c23a/json?clientId=1234'
005⫶ variable_map:
006⫶ form:
007⫶ shipping_address:
008⫶ first_name: 'firstname'
009⫶ last_name: 'lastname'
010⫶ email: 'email'
011⫶ street: 'address'
012⫶ postal_code: 'zip_code'
013⫶ locality: 'locality'
014⫶ country: 'country'
015⫶ phone_number: 'phone'
016⫶ billing_address:
017⫶ first_name: 'firstname'
018⫶ last_name: 'lastname'
019⫶ email: 'email'
020⫶ street: 'address'
021⫶ postal_code: 'zip_code'
022⫶ locality: 'locality'
023⫶ country: 'country'
024⫶ phone_number: 'phone'
025⫶ content:
026⫶ birthday: 'birthday'
027⫶ first_name: 'firstname'
028⫶ last_name: 'lastname'
029⫶ company: 'company'
030⫶ position: 'position'
031⫶ phone: 'phone'
032⫶ gender: 'gender'
033⫶ account:
034⫶ name: 'name'
035⫶ email: 'email'
036⫶ id: 'userid'
037⫶ remote_id: 'identifier'
038⫶ login: 'login'


code_samples/raptor_cdp/date_of_birth_export/src/Export/User/DateOfBirthUserItemProcessor.php
code_samples/ibexa_engage/config/packages/ibexa_connector_qualifio.yaml




code_samples/cdp/date_of_birth_export/src/Export/User/DateOfBirthUserItemProcessor.php
code_samples/raptor_cdp/date_of_birth_export/src/Export/User/DateOfBirthUserItemProcessor.php


docs/cdp/cdp_data_customization.md@22:``` php
docs/cdp/cdp_data_customization.md@23:[[= include_code('code_samples/cdp/date_of_birth_export/src/Export/User/DateOfBirthUserItemProcessor.php') =]]
docs/cdp/cdp_data_customization.md@24:```
docs/raptor_cdp/raptor_cdp_data_customization.md@22:``` php
docs/raptor_cdp/raptor_cdp_data_customization.md@23:[[= include_code('code_samples/raptor_cdp/date_of_birth_export/src/Export/User/DateOfBirthUserItemProcessor.php') =]]
docs/raptor_cdp/raptor_cdp_data_customization.md@24:```

001⫶<?php declare(strict_types=1);
002⫶
003⫶namespace App\Export\User;
004⫶
005⫶use Ibexa\Contracts\Cdp\Export\User\AbstractUserItemProcessor;
006⫶use Ibexa\Contracts\Core\Repository\Values\Content\Content;
007⫶use Ibexa\Core\FieldType\Date\Value as DateValue;
008⫶use InvalidArgumentException;
009⫶
010⫶final class DateOfBirthUserItemProcessor extends AbstractUserItemProcessor
011⫶{
012⫶ public function __construct(
013⫶ private readonly string $dateOfBirthFieldIdentifier,
014⫶ string $userFieldTypeIdentifier
015⫶ ) {
016⫶ parent::__construct($userFieldTypeIdentifier);
017⫶ }
018⫶
019⫶ protected function doProcess(array $processedItemData, Content $userContent): array
020⫶ {
021⫶ $userField = $this->getUserField($userContent);
022⫶
023⫶ if (null === $userField) {
024⫶ throw new InvalidArgumentException('Content does not contain user field');
025⫶ }
026⫶
027⫶ $dateOfBirth = '';
028⫶ $dateOfBirthField = $userContent->getField($this->dateOfBirthFieldIdentifier);
029⫶
030⫶ if ($dateOfBirthField !== null
031⫶ && $dateOfBirthField->value instanceof DateValue
032⫶ && $dateOfBirthField->value->date !== null
033⫶ ) {
034⫶ $dateOfBirth = $dateOfBirthField->value->date->format('Y-m-d');
035⫶ }
036⫶
037⫶ return array_merge(
038⫶ $processedItemData,
039⫶ [
040⫶ 'date_of_birth' => $dateOfBirth,
041⫶ ]
042⫶ );
043⫶ }
044⫶}


001⫶<?php declare(strict_types=1);
002⫶
003⫶namespace App\Export\User;
004⫶
005⫶use Ibexa\Contracts\Cdp\Export\User\AbstractUserItemProcessor;
006⫶use Ibexa\Contracts\Core\Repository\Values\Content\Content;
007⫶use Ibexa\Core\FieldType\Date\Value as DateValue;
008⫶use InvalidArgumentException;
009⫶
010⫶final class DateOfBirthUserItemProcessor extends AbstractUserItemProcessor
011⫶{
012⫶ public function __construct(
013⫶ private readonly string $dateOfBirthFieldIdentifier,
014⫶ string $userFieldTypeIdentifier
015⫶ ) {
016⫶ parent::__construct($userFieldTypeIdentifier);
017⫶ }
018⫶
019⫶ protected function doProcess(array $processedItemData, Content $userContent): array
020⫶ {
021⫶ $userField = $this->getUserField($userContent);
022⫶
023⫶ if (null === $userField) {
024⫶ throw new InvalidArgumentException('Content does not contain user field');
025⫶ }
026⫶
027⫶ $dateOfBirth = '';
028⫶ $dateOfBirthField = $userContent->getField($this->dateOfBirthFieldIdentifier);
029⫶
030⫶ if ($dateOfBirthField !== null
031⫶ && $dateOfBirthField->value instanceof DateValue
032⫶ && $dateOfBirthField->value->date !== null
033⫶ ) {
034⫶ $dateOfBirth = $dateOfBirthField->value->date->format('Y-m-d');
035⫶ }
036⫶
037⫶ return array_merge(
038⫶ $processedItemData,
039⫶ [
040⫶ 'date_of_birth' => $dateOfBirth,
041⫶ ]
042⫶ );
043⫶ }
044⫶}


code_samples/cdp/date_of_birth_export/src/Export/User/DateOfBirthUserItemProcessor.php

Download colorized diff

@dabrt
dabrt marked this pull request as ready for review August 4, 2026 10:25

@mnocon mnocon left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Human review

This is a great start and thank you for preparing this.
To avoid growing this PR and constantly getting conflicts when something changes, I'm ok with merging this as-is and adding additional changes in follow-up PRs.

Besides the comments added inline, please review product_name_base usages - it still results in "Ibexa AI Actions", "Ibexa Messenger" or "Ibexa Rector", which I guess we'll rename to Cohesivo Messenger/Cohesivo Rector (but please verify this first).

AI review

I've asked to Claude to review these changes, and reviewed the output - here are the (real) issues it found (I've filtered out the false-positives already)

Issue 1

docs/administration/project_organization/project_organization.md:2 — grammar
description: An Cohesivo project follows Symfony's directory structure...

Plus 16 live "an [[= product_name =]]" occurrences that the rename silently broke ("Cohesivo" takes a, not an). Representative: architecture.md:10,23,
api/rest_api/rest_api_usage/rest_api_usage.md:7, ibexa_products/ibexa_experience.md:10,
getting_started/install_with_ddev.md:420,437, resources/contributing/report_and_follow_issues.md:7,
tutorials/beginner_tutorial/beginner_tutorial.md:7. Find with:

grep -rn "an [[= product_name =]]" --include="*.md" docs/

Issue 2

Leftover bare "DXP" — 9c9957b converted the DXP → the [[= product_name =]] in several files but missed:

docs/ibexa_products/ibexa_headless.md:153 — "use the DXP as the authentication service"

Note that commit's own conversions read awkwardly, because "the" was correct before the macro and isn't now: infrastructure_and_maintenance/backup.md:9 "shut down the Cohesivo",
security/security_checklist.md:120 "what version of the Cohesivo is running", recommendations/raptor_integration/connector_installation_configuration.md:37 (twice). Drop the article in these.

Issue 3

Historical accuracy — docs/update_and_migration/**
Commit d8d1bba hardcoded docs/release_notes/** and docs/resources/phpstorm_plugin.md but
skipped update_and_migration/ entirely. The result is the same fact branded two ways: this branch set release_notes/ibexa_dxp_v3.3.md:23 to "Ibexa DXP is now installed using Symfony Flex", while
update_and_migration/from_2.5/to_3.3.md:13 still renders "Cohesivo v3.3 uses Symfony Flex".

Replace [[= product_name =]] with literal Ibexa DXP where the sentence is scoped to ≤ 5.0:

update_to_5.0.md:32 and :447 matter extra — their link labels currently render "Cohesivo v4.0/v5.0
deprecations…" while the target pages' H1s were hardcoded to "Ibexa DXP v…", so label and destination
sagree.

Also pre-existing but now visible: docs/update_and_migration/from_4.3/update_from_4.3.md:9 has a
missing space — in[[= product_name =]] → "inCohesivo".

Issue 4

  1. Same diagram, two brandings. docs/ibexa_products/img/cdp.png was regenerated (71,821 bytes,
    shows "Cohesivo"). docs/raptor_cdp/img/raptor_cdp_how_works.png is a byte-identical rename of the
    old file (103,388 bytes, still shows "IBEXA DXP") — and it's the one displayed on
    docs/raptor_cdp/raptor_cdp_guide.md:30. Verified by md5: the two files differ.

Issue 5

  1. docs/product_catalog/img/diagrams_source/remote_pim_support.xml — IBEXA DXP at lines 38,
    50, 95. docs/product_catalog/img/ got zero changes; the rendered PNG is embedded at docs/product_catalog/product_catalog_guide.md:166.

Issue 6

  1. docs/ibexa_products/img/ibexa_engage.drawio not renamed alongside its export
    (ibexa_engage.png → qualifio.png). It's the only source/output name mismatch in that directory.

Issue 7

  1. Generated file hand-patched, template not. 9c9957b edited
    docs/api/php_api/php_api_reference/index.html:49672 to "Cohesivo's public PHP API…", but tools/api_refs/.phpdoc/template/index.html.twig:8 still says "Ibexa DXP's public PHP API…". Verified
    both. The next tools/api_refs/api_refs.sh run reverts the fix. Fix the template.

Issue 8

  1. plugins.yml — llms.txt output still says Ibexa DXP. This is the agent-facing description of
    the 6.0 docs (base_url: https://doc.ibexa.co/en/6.0/ at :639):
  • :634 — "Developer documentation for Ibexa DXP — architecture, APIs, templating, and extensibility
    for building and customizing Ibexa DXP projects." (two occurrences)
  • :644 — section key Ibexa DXP developer documentation:

Issue 9

  1. theme/partials/eol_warning.html:3 — hardcoded
    https://doc.ibexa.co/en/latest/update_and_migration/update_ibexa_dxp/. The page is now
    update_system.md; survives only as a double hop via plugins.yml:524. Renders on every EOL page.

Issue 10

mkdocs.yml:930 — nav group Migrate to Ibexa DXP: while this branch changed
docs/update_and_migration/migrate_to_ibexa_dxp/common_issues.md:2 to "…updating from earlier
version to Cohesivo". One of the two is wrong; the migration target is 6.0, so the nav label
should change (directory name stays).

My comment: this is for sure for a follow-up.
For example, https://ez-systems-developer-documentation--3336.com.readthedocs.build/en/3336/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform/ contains the following sentence:

eZ Publish Platform (5.x) was a transitional version of the Ibexa CMS, bridging the gap between the earlier generation called eZ Publish (sometimes referred to as legacy), and eZ Platform, the predecessor to Cohesivo.

Which needs to be rewritten.

@@ -13,7 +13,7 @@ As a diverse Platform as a Service (PaaS), it's designed to allow you to focus o

[[= product_name_cloud =]] is a part of [[= product_name =]] - a software that is designed to provide your business with all the features, functionality, and support your need to transform your business for the digital age.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please verify if we keep the Ibexa Cloud name?

This sentence feels unusual, as it goes against the new company structure (Cohesivo is part of Ibexa, but Ibexa Cloud is part of Cohesivo).

Ibexa Cloud is a part of Cohesivo - a software that is designed to provide your business with all the features, functionality, and support your need to transform your business for the digital age.

!!! tip

To keep the classifications aligned, we recommend running the `ibexa:quable:classification:sync` command every night, even when using synchronization with webhooks.
To keep the classifications aligned, it is recommended that you run the `ibexa:quable:classification:sync` command every night, even when using synchronization with webhooks.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
To keep the classifications aligned, it is recommended that you run the `ibexa:quable:classification:sync` command every night, even when using synchronization with webhooks.
To keep the classifications aligned, it's recommended that you run the `ibexa:quable:classification:sync` command every night, even when using synchronization with webhooks.

@@ -1,5 +1,5 @@
---
description: Catalogs enable filtering our a selection of products from the PIM.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch!

Comment thread mkdocs.yml
@@ -1005,16 +1005,17 @@ extra:
# Global variables
site_display_name: 'Ibexa Documentation'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
site_display_name: 'Ibexa Documentation'
site_display_name: 'Cohesivo Documentation'

Comment thread mkdocs.yml
@@ -20,15 +20,15 @@ not_in_nav: |
/snippets/*
nav:
- Ibexa Developer Documentation: index.md

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Ibexa Developer Documentation: index.md
- Cohesivo Developer Documentation: index.md

In hybrid mode, the bundle includes a client-side [shim](https://en.wikipedia.org/wiki/Shim_(computing)) that captures Raptor tracking events and sends them to a same-origin endpoint instead of communicating directly with Raptor SaaS.
The server enriches each event with identifiers resolved from request cookies (`cookieId`, `sessionId`, and `userId`) and forwards it to Raptor asynchronously through [Ibexa Messenger](background_tasks.md).
Since the browser never connects to the Raptor domain, ad blockers cannot block the requests.
In hybrid mode, the bundle includes a client-side [shim](https://en.wikipedia.org/wiki/Shim_(computing)) that captures [[= product_name_cdp_base =]] tracking events and sends them to a same-origin endpoint instead of communicating directly with [[= product_name_cdp_base =]] SaaS.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
In hybrid mode, the bundle includes a client-side [shim](https://en.wikipedia.org/wiki/Shim_(computing)) that captures [[= product_name_cdp_base =]] tracking events and sends them to a same-origin endpoint instead of communicating directly with [[= product_name_cdp_base =]] SaaS.
In hybrid mode, the bundle includes a client-side [shim](https://en.wikipedia.org/wiki/Shim_(computing)) that captures [[= product_name_cdp_base =]] tracking events and sends them to a same-origin endpoint instead of communicating directly with [[= product_name_cdp_base =]].

or

Suggested change
In hybrid mode, the bundle includes a client-side [shim](https://en.wikipedia.org/wiki/Shim_(computing)) that captures [[= product_name_cdp_base =]] tracking events and sends them to a same-origin endpoint instead of communicating directly with [[= product_name_cdp_base =]] SaaS.
In hybrid mode, the bundle includes a client-side [shim](https://en.wikipedia.org/wiki/Shim_(computing)) that captures [[= product_name_cdp_base =]] tracking events and sends them to a same-origin endpoint instead of communicating directly with [[= product_name_cdp_base =]] servers.

If we want to unify it, we're not calling it Raptor SaaS in other places.

Comment thread mkdocs.yml
- Resources: resources/resources.md
- Release process and roadmap: resources/release_process_and_roadmap.md
- Ibexa DXP PhpStorm plugin: resources/phpstorm_plugin.md
- Ibexa PhpStorm plugin: resources/phpstorm_plugin.md

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know you've mentioned a partial rewrite for this one, but right not there's a mismatch between the Nav entry (Ibexa PhpStorm plugin) and the title: Ibexa DXP plugin for PhpStorm

Image

The server enriches each event with identifiers resolved from request cookies (`cookieId`, `sessionId`, and `userId`) and forwards it to Raptor asynchronously through [Ibexa Messenger](background_tasks.md).
Since the browser never connects to the Raptor domain, ad blockers cannot block the requests.
In hybrid mode, the bundle includes a client-side [shim](https://en.wikipedia.org/wiki/Shim_(computing)) that captures [[= product_name_cdp_base =]] tracking events and sends them to a same-origin endpoint instead of communicating directly with [[= product_name_cdp_base =]] SaaS.
The server enriches each event with identifiers resolved from request cookies (`cookieId`, `sessionId`, and `userId`) and forwards it to [[= product_name_cdp_base =]] asynchronously through [Ibexa Messenger](background_tasks.md).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my other comment - most likely we should rename this to Cohesivo Messenger

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants