Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 113 additions & 0 deletions .github/workflows/link_check.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
name: "Check documentation links"

on:
push:
branches:
- master
- "[0-9]+.[0-9]+"
workflow_dispatch:
inputs:
force_recheck:
description: "Clear lychee cache and recheck all links from scratch"
type: boolean
default: false
devdoc_50_branch:
description: "ibexa/documentation-developer branch for 5.0"
type: string
default: "5.0"
devdoc_46_branch:
description: "ibexa/documentation-developer branch for 4.6"
type: string
default: "4.6"
userdoc_50_branch:
description: "ibexa/documentation-user branch for 5.0"
type: string
default: "5.0"
userdoc_46_branch:
description: "ibexa/documentation-user branch for 4.6"
type: string
default: "4.6"
connect_branch:
description: "ibexa/documentation-connect branch"
type: string
default: "main"
pull_request: ~
schedule:
- cron: "0 6 * * *"

jobs:
link-check:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.13]

steps:
- uses: actions/checkout@v4

- name: Generate token
id: generate_token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.AUTOMATION_CLIENT_ID }}
private-key: ${{ secrets.AUTOMATION_CLIENT_SECRET }}
owner: ${{ github.repository_owner }}

- name: Configure git credentials for private repositories
run: |
git config --global url."https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/ibexa/documentation-connect".insteadOf \
"https://github.com/ibexa/documentation-connect"

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Install MkDocs dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

- name: Build documentation
run: mkdocs build --strict

- name: Clone and build versioned repositories for link remap
run: >-
bash tools/clone-repositories.sh
"${{ inputs.devdoc_50_branch || '5.0' }}"
"${{ inputs.devdoc_46_branch || '4.6' }}"
"${{ inputs.userdoc_50_branch || '5.0' }}"
"${{ inputs.userdoc_46_branch || '4.6' }}"
"${{ inputs.connect_branch || 'main' }}"

- name: Restore lychee cache
if: ${{ !inputs.force_recheck }}
uses: actions/cache@v4
with:
path: .lycheecache
key: lychee-${{ github.ref_name }}-${{ hashFiles('lychee.toml') }}
restore-keys: |
lychee-${{ github.ref_name }}-
lychee-

- name: Check links
uses: lycheeverse/lychee-action@v2

Check failure

Code scanning / SonarCloud

External GitHub Actions and workflows should be pinned to a commit hash High

Use full commit SHA hash for this dependency. See more on SonarQube Cloud
with:
args: >-
--config lychee.toml
--cache
--cache-exclude-status "400.."
site
output: lychee-report.md
jobSummary: false
fail: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Comment thread
adriendupuis marked this conversation as resolved.

- name: Upload link-check report
if: always()
uses: actions/upload-artifact@v4
with:
name: lychee-report
path: lychee-report.md
if-no-files-found: ignore
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@ auth.json
yarn.lock
docs/css/*.map
.deptrac.cache
.lycheecache
lychee.toml
/repositories/
lychee-report.md
165 changes: 165 additions & 0 deletions .lycheeignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
# URLs excluded from lychee link checking.
# Each line is a regular expression matched against the full URL.
#
# Add external URLs here when they produce false positives (redirects, bot-blocks,
# JS-rendered anchors, etc.). Structural file:// exclusions that depend on the
# build path live in lychee.toml.dist instead, as they require __BASE_DIR__ substitution.

# Localhost / loopback — not real content links
^https?://localhost
^https?://127\.0\.0\.1

# Placeholder domain used in examples
^https?://example\.com

# Known intentional redirects (302)
^https://support\.ibexa\.co/
^https://redocly\.com/redoc/
^https://updates\.ibexa\.co
^https://console\.cloud\.google\.com

# Hosts that block automated requests (403)
^https?://(www\.)?linkedin\.com
^https?://(www\.)?openai\.com
^https?://help\.openai\.com
^https?://(www\.)?paypal\.com
^https://support\.qualifio\.com/
^https://unsplash\.com/
https://support.deepl.com/hc/en-us/articles/360020695820-API-key-for-DeepL-API
^https?://(www\.)?npmjs\.com


# AI provider consoles — redirect to login pages (302/307)
https://aistudio\.google\.com/app/api-keys
https://console\.anthropic\.com/login
https://docs\.claude\.com/en/docs/about-claude/models/overview

# AWS console — redirects unauthenticated requests (302)
https://console\.aws\.amazon\.com/

# EU legislation portal — fragment (#d1e...) is a JavaScript-rendered anchor
https://eur-lex\.europa\.eu/

# GitHub release tag URLs with unresolved MkDocs macro (releases/tag/ with no version)
# These come from snippets using [[= version =]] which does not expand during link-check builds.
https://github\.com/ibexa/(commerce|experience|headless)/releases/tag/$

# Webarchive links
https://web.archive.org/web/20140911035812/https://doc.ez.no/display/EZP/Legacy+code+and+features
https://web.archive.org/web/20150920231014/https://doc.ez.no/display/EZP/Upgrade
https://web.archive.org/web/20201015232625/https://ezsystems.github.io/ezplatform-rest-reference/

# Doc links older than 4.6
https://doc.ibexa.co/en/2.2/releases/updating_ez_platform/
https://doc.ibexa.co/en/2.2/releases/updating_ez_platform/#migrate-landing-pages
https://doc.ibexa.co/en/2.5/api/field_types_reference/imageassetfield/
https://doc.ibexa.co/en/2.5/api/field_types_reference/matrixfield/
https://doc.ibexa.co/en/2.5/api/field_types_reference/richtextfield/
https://doc.ibexa.co/en/2.5/api/graphql/
https://doc.ibexa.co/en/2.5/api/public_php_api_browsing/#getting-content-from-a-location
https://doc.ibexa.co/en/2.5/api/public_php_api_browsing/#siteaccess-aware-repository
https://doc.ibexa.co/en/2.5/community_resources/translations/#how-to-translate-the-interface-using-crowdin
https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform/
https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform/
https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform/
https://doc.ibexa.co/en/2.5/getting_started/install_ez_platform/
https://doc.ibexa.co/en/2.5/getting_started/requirements/
https://doc.ibexa.co/en/2.5/getting_started/requirements/
https://doc.ibexa.co/en/2.5/getting_started/requirements/
https://doc.ibexa.co/en/2.5/getting_started/requirements/
https://doc.ibexa.co/en/2.5/getting_started/requirements/
https://doc.ibexa.co/en/2.5/guide/config_back_office/#content-tree
https://doc.ibexa.co/en/2.5/guide/config_repository/#user-identifiers
https://doc.ibexa.co/en/2.5/guide/content_management/#location-visibility
https://doc.ibexa.co/en/2.5/guide/databases/#using-postgresql
https://doc.ibexa.co/en/2.5/guide/design_engine/
https://doc.ibexa.co/en/2.5/guide/design_engine/#default-designs
https://doc.ibexa.co/en/2.5/guide/extending/extending_back_office/#custom-content-type-icons
https://doc.ibexa.co/en/2.5/guide/extending/extending_form_builder/
https://doc.ibexa.co/en/2.5/guide/extending/extending_online_editor/#custom-data-attributes-and-classes
https://doc.ibexa.co/en/2.5/guide/extending/extending_online_editor/#custom-plugins
https://doc.ibexa.co/en/2.5/guide/extending/extending_online_editor/#custom-tags
https://doc.ibexa.co/en/2.5/guide/extending/extending_online_editor/#custom-tags
https://doc.ibexa.co/en/2.5/guide/extending/extending_online_editor/#example-factbox-tag
https://doc.ibexa.co/en/2.5/guide/extending/extending_online_editor/#inline-custom-tags
https://doc.ibexa.co/en/2.5/guide/extending/extending_online_editor/#link-tag
https://doc.ibexa.co/en/2.5/guide/images/#reusing-images
https://doc.ibexa.co/en/2.5/guide/images/#setting-placeholder-generator
https://doc.ibexa.co/en/2.5/guide/internationalization/
https://doc.ibexa.co/en/2.5/guide/limitation_reference/#state-limitation
https://doc.ibexa.co/en/2.5/guide/search/solr/
https://doc.ibexa.co/en/2.5/guide/search/solr/#solrcloud
https://doc.ibexa.co/en/2.5/guide/url_management/#regenerating-url-aliases
https://doc.ibexa.co/en/2.5/guide/url_management/#url-alias-patterns
https://doc.ibexa.co/en/2.5/guide/url_management/#url-wildcards
https://doc.ibexa.co/en/2.5/guide/workflow/
https://doc.ibexa.co/en/2.5/guide/workflow/#permissions
https://doc.ibexa.co/en/2.5/update_and_migration/from_1.x_2.x/update_app_to_2.5/#c-fix-other-conflicts
https://doc.ibexa.co/en/2.5/update_and_migration/from_1.x_2.x/update_db_to_2.5/#a-update-to-v22
https://doc.ibexa.co/en/3.0/api/rest_api_guide/
https://doc.ibexa.co/en/3.1/guide/url_management/
https://doc.ibexa.co/en/3.3/api/public_php_api_search/#additional-search-result-data
https://doc.ibexa.co/en/3.3/extending/extending_udw/
https://doc.ibexa.co/en/3.3/getting_started/install_ez_platform/
https://doc.ibexa.co/en/3.3/guide/cache/http_cache/
https://doc.ibexa.co/en/3.3/guide/content_rendering/queries_and_controllers/content_queries/#content-query-field
https://doc.ibexa.co/en/3.3/guide/data_migration/data_migration/
https://doc.ibexa.co/en/3.3/guide/image_editor/
https://doc.ibexa.co/en/3.3/guide/images/image_editor/
https://doc.ibexa.co/en/3.3/guide/search/sort_clause_reference/contenttranslatedname_sort_clause/
https://doc.ibexa.co/en/3.3/guide/search/sort_clause_reference/customfield_sort_clause/
https://doc.ibexa.co/en/3.3/guide/search/sort_clause_reference/score_sort_clause/
https://doc.ibexa.co/en/4.3/api/rest_api/rest_api_reference/rest_api_reference.html#product-catalog-create-catalog
https://doc.ibexa.co/en/4.3/api/rest_api/rest_api_reference/rest_api_reference.html#product-catalog-filter-catalogs
https://doc.ibexa.co/en/4.3/api/rest_api/rest_api_reference/rest_api_reference.html#product-catalog-load-catalog-filters
https://doc.ibexa.co/en/4.3/api/rest_api/rest_api_reference/rest_api_reference.html#product-catalog-update-catalog
https://doc.ibexa.co/en/4.3/pim/pim_configuration/#catalog-filters
https://doc.ibexa.co/en/4.3/update_and_migration/from_4.2/update_from_4.2/
https://doc.ibexa.co/en/4.4/commerce/commerce/
https://doc.ibexa.co/en/4.4/commerce/storefront/storefront/
https://doc.ibexa.co/en/4.4/content_management/data_migration/data_migration_actions/#data-migration-actions
https://doc.ibexa.co/en/4.4/content_management/images/fastly_io/
https://doc.ibexa.co/en/4.4/infrastructure_and_maintenance/clustering/clustering/#configuring-the-dfs-io-handler
https://doc.ibexa.co/en/4.5/api/rest_api/rest_api_usage/rest_requests/#expected-user
https://doc.ibexa.co/en/4.5/cdp/cdp_activation/#configuration
https://doc.ibexa.co/en/4.5/commerce/commerce/
https://doc.ibexa.co/en/4.5/content_management/pages/react_app_block/
https://doc.ibexa.co/en/4.5/content_management/pages/react_app_block/#react-app-block-configuration
https://doc.ibexa.co/en/4.5/customer_management/cp_page_builder/
https://doc.ibexa.co/en/4.5/search/aggregation_reference/product_attribute_aggregations/
https://doc.ibexa.co/en/4.5/search/aggregation_reference/productavailabilityterm_aggregation/
https://doc.ibexa.co/en/4.5/search/aggregation_reference/productpricerange_aggregation/
https://doc.ibexa.co/en/4.5/search/aggregation_reference/productstockrange_aggregation/
https://doc.ibexa.co/en/4.5/search/aggregation_reference/producttypeterm_aggregation/
https://doc.ibexa.co/en/4.5/search/aggregation_reference/taxonomyentryid_aggregation/
https://doc.ibexa.co/en/4.5/search/criteria_reference/productstock_criterion/
https://doc.ibexa.co/en/4.5/search/criteria_reference/productstockrange_criterion/
https://doc.ibexa.co/en/4.5/users/passwords/#breached-passwords
https://doc.ibexa.co/projects/userguide/en/2.5/content_model/#content-tree
https://doc.ibexa.co/projects/userguide/en/2.5/creating_content_advanced/#forms
https://doc.ibexa.co/projects/userguide/en/2.5/multi_file_content_management/#multi-file-content-management
https://doc.ibexa.co/projects/userguide/en/2.5/publishing/advanced_publishing_options/
https://doc.ibexa.co/projects/userguide/en/2.5/publishing/flex_workflow/#reviewing-a-draft
https://doc.ibexa.co/projects/userguide/en/2.5/search/#simplified-filtered-search
https://doc.ibexa.co/projects/userguide/en/3.1/publishing/publishing/#comparing-versions
https://doc.ibexa.co/projects/userguide/en/3.2/publishing/publishing/#autosave
https://doc.ibexa.co/projects/userguide/en/3.3/publishing/advanced_publishing_options/#calendar-widget
https://doc.ibexa.co/projects/userguide/en/4.0/publishing/editorial_workflow/#releasing-locked-drafts
https://doc.ibexa.co/projects/userguide/en/4.0/site_organization/working_with_page/#configure-block-display
https://doc.ibexa.co/projects/userguide/en/4.1/site_organization/working_with_page/#dynamic-targeting-block
https://doc.ibexa.co/projects/userguide/en/4.2/user_management/manage_users/#invite-users
https://doc.ibexa.co/projects/userguide/en/4.2/user_management/manage_users/#register-as-a-user
https://doc.ibexa.co/projects/userguide/en/4.4/content_management/block_reference/#catalog-block
https://doc.ibexa.co/projects/userguide/en/4.4/content_management/block_reference/#last-purchased-block
https://doc.ibexa.co/projects/userguide/en/4.4/content_management/block_reference/#last-viewed-block
https://doc.ibexa.co/projects/userguide/en/4.4/content_management/block_reference/#product-collection-block
https://doc.ibexa.co/projects/userguide/en/4.4/content_management/block_reference/#recently-added-block
https://doc.ibexa.co/projects/userguide/en/4.4/personalization/enable_personalization/#request-access-to-the-server
https://doc.ibexa.co/projects/userguide/en/4.4/personalization/recommendation_models/#predictive
https://doc.ibexa.co/projects/userguide/en/4.4/personalization/recommendation_models/#recently-added
https://doc.ibexa.co/projects/userguide/en/4.4/personalization/recommendation_models/#recurring-purchase
https://doc.ibexa.co/projects/userguide/en/4.5/content_management/block_reference/#bestsellers-block
https://doc.ibexa.co/projects/userguide/en/4.5/content_management/translate_content/#translation-comparison
https://doc.ibexa.co/projects/userguide/en/4.5/customer_management/build_customer_portal/
https://doc.ibexa.co/projects/userguide/en/4.5/personalization/recommendation_models/#b2b-model
https://doc.ibexa.co/projects/userguide/en/4.5/personalization/segment_management/
43 changes: 43 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,49 @@ Regenerate the baseline by running:
vendor/bin/deptrac --formatter=baseline
```

## Checking links

External links in the built documentation are checked using [lychee](https://lychee.cli.rs).

### Running the link checker

```bash
# 1. Build the main docs site
mkdocs build --strict

# 2. Clone and build versioned repositories, and generate lychee.toml
./tools/clone-repositories.sh

# 3. Check links
lychee --config lychee.toml --cache --cache-exclude-status "400.." site
```

After fixing any reported links, run `mkdocs build --strict` before rerunning `lychee`.

#### Using non-standard brancges

The script accepts optional branch names before cloning repositories:

```bash
./tools/clone-repositories.sh [DEVDOC_50] [DEVDOC_46] [USERDOC_50] [USERDOC_46] [CONNECT]
```

| Argument | Repository | Default |
|--------------|---------------------------------|---------|
| `DEVDOC_50` | `ibexa/documentation-developer` | `5.0` |
| `DEVDOC_46` | `ibexa/documentation-developer` | `4.6` |
| `USERDOC_50` | `ibexa/documentation-user` | `5.0` |
| `USERDOC_46` | `ibexa/documentation-user` | `4.6` |
| `CONNECT` | `ibexa/documentation-connect` | `main` |

Example — checking link for release PRs:

```bash
./tools/clone-repositories.sh release-5.0.10 release-4.6.70 4.6 4.6 main
```

The same parameters are available as inputs when triggering the GitHub Actions workflow manually.

## Where to View

https://doc.ibexa.co
2 changes: 1 addition & 1 deletion docs/administration/project_organization/bundles.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ When overriding files, the path inside your application has to correspond to the

### Removing bundles

To remove a bundle (either one you created yourself, or an out-of-the-box one that you don't need), see the [How to Remove a Bundle]([[= symfony_doc =]]/bundles/remove.html) instruction in Symfony doc.
To remove a bundle (either one you created yourself, or an out-of-the-box one that you don't need), remove the bundle entry from `config/bundles.php`.

## Core packages

Expand Down
2 changes: 1 addition & 1 deletion docs/ai/ai_actions/configure_ai_actions.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ You can now use the Anthropic connector in your project.
!!! note "Current model availability"

Anthropic regularly releases new models and deprecates older ones.
Before you configure the connector, check the [Anthropic models overview](https://docs.anthropic.com/en/docs/about-claude/models/overview) for the current list of supported model identifiers.
Before you configure the connector, check the [Anthropic models overview](https://platform.claude.com/docs/en/about-claude/models/overview) for the current list of supported model identifiers.

## Install Google Gemini connector [[% include 'snippets/lts-update_badge.md' %]]

Expand Down
2 changes: 1 addition & 1 deletion docs/ai/ai_actions/extend_ai_actions.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ The `ActionServiceInterface` service extracts the configuration options from the

[[= product_name =]] comes with a built-in connector to OpenAI services, but you're not limited to it and can add support for additional AI services in your application.

The following example adds a new Action Handler connecting to a local AI run using [the llamafile project](https://github.com/Mozilla-Ocho/llamafile) which you can use to execute Text-To-Text Actions, such as the built-in "Refine Text" Action.
The following example adds a new Action Handler connecting to a local AI run using [the llamafile project](https://github.com/mozilla-ai/llamafile) which you can use to execute Text-To-Text Actions, such as the built-in "Refine Text" Action.

When creating an Action Handler for [[= product_name_connect =]], add the new handler identifier to the [`Ibexa AI handler` custom property](configure_ai_actions.md#initiate-integration) in [[= product_name_connect =]] user interface.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ ibexa_rest:
The `router.generate` renders a URI based on the name of the route and its parameters.
The parameter values can be a real value or a placeholder.
For example, `'router.generate("ibexa.rest.load_location", {locationPath: "1/2"})'` results in `/api/ibexa/v2/content/locations/1/2` while `'router.generate("ibexa.rest.load_location", {locationPath: "{locationPath}"})'` gives `/api/ibexa/v2/content/locations/{locationPath}`.
This syntax is based on Symfony's [expression language]([[= symfony_doc =]]/components/expression_language/index.html), an extensible component that allows limited/readable scripting to be used outside the code context.
This syntax is based on Symfony's [expression language]([[= symfony_doc =]]/components/expression_language.html), an extensible component that allows limited/readable scripting to be used outside the code context.

In this example, `app.rest.greeting` is available in every SiteAccess (`default`):

Expand Down
Loading