Skip to content
Merged
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
9 changes: 7 additions & 2 deletions .ahoy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ commands:
up:
usage: Build and start containers.
cmd: |
docker compose up -d "$@"
docker compose up --detach "$@"
if docker compose logs | grep -q "\[Error\]"; then exit 1; fi

Comment thread
AlexSkrypnyk marked this conversation as resolved.
down:
Expand Down Expand Up @@ -115,7 +115,7 @@ commands:
usage: Download database. Run with "--fresh" option to force fresh database backup.
aliases: [fetch-db]
cmd: |
case " $* " in *" --fresh "*) export VORTEX_DB_DOWNLOAD_FRESH=1;; esac
case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FRESH=1;; esac
./scripts/vortex/download-db.sh

reload-db:
Expand Down Expand Up @@ -234,6 +234,11 @@ commands:
usage: Run PHPUnit functional tests.
cmd: ahoy cli vendor/bin/phpunit --testsuite=functional "$@"

test-functional-javascript:
aliases: [test-js]
usage: Run PHPUnit functional JavaScript tests.
cmd: ahoy cli vendor/bin/phpunit --testsuite=functional-javascript "$@"

test-bdd:
usage: Run BDD tests.
aliases: [test-behat]
Expand Down
2 changes: 1 addition & 1 deletion .docker/clamav.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

FROM uselagoon/commons:26.1.0 AS commons

FROM clamav/clamav-debian:1.5.1-26
FROM clamav/clamav-debian:1.5.1-28

COPY --from=commons /lagoon /lagoon
COPY --from=commons /bin/fix-permissions /bin/ep /bin/docker-sleep /bin/wait-for /bin/
Expand Down
10 changes: 6 additions & 4 deletions .docker/cli.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,12 @@ ARG VORTEX_FRONTEND_BUILD_SKIP="0"
ENV VORTEX_FRONTEND_BUILD_SKIP=${VORTEX_FRONTEND_BUILD_SKIP}

ENV COMPOSER_ALLOW_SUPERUSER=1 \
COMPOSER_CACHE_DIR=/tmp/.composer/cache \
SIMPLETEST_DB=mysql://drupal:drupal@database/drupal \
SIMPLETEST_BASE_URL=http://nginx:8080 \
SYMFONY_DEPRECATIONS_HELPER=disabled
COMPOSER_CACHE_DIR=/tmp/.composer/cache

# Allow custom PHP runtime configuration for Drush CLI commands.
# The leading colon appends to the default scan directories.
# @see https://github.com/drevops/vortex/issues/1913
ENV PHP_INI_SCAN_DIR="${PHP_INI_SCAN_DIR}:/app/drush/php-ini"
Comment on lines 41 to +47
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

❓ Verification inconclusive

Script executed:

# Check PHP_INI_SCAN_DIR references in Dockerfiles and env files
rg -n "PHP_INI_SCAN_DIR" 

# Also check the base image and early ENV definitions in the cli.dockerfile
cat -n .docker/cli.dockerfile | head -50

Repository: drevops/website


Repository: drevops/website
Exit code: 0

stdout:

drush/php-ini/drush.ini:3:; This file is auto-discovered via the PHP_INI_SCAN_DIR environment variable.
     1	# CLI container.
     2	#
     3	# All CLI operations performed in this container.
     4	#
     5	# hadolint global ignore=DL3018,SC2174
     6	#
     7	# `@see` https://hub.docker.com/r/uselagoon/php-8.3-cli-drupal/tags
     8	# `@see` https://github.com/uselagoon/lagoon-images/tree/main/images/php-cli-drupal
     9	
    10	FROM uselagoon/php-8.3-cli-drupal:26.1.0
    11	
    12	# Add missing variables.
    13	# `@todo` Remove once https://github.com/uselagoon/lagoon/issues/3121 is resolved.
    14	ARG LAGOON_PR_HEAD_BRANCH=""
    15	ENV LAGOON_PR_HEAD_BRANCH=${LAGOON_PR_HEAD_BRANCH}
    16	ARG LAGOON_PR_HEAD_SHA=""
    17	ENV LAGOON_PR_HEAD_SHA=${LAGOON_PR_HEAD_SHA}
    18	
    19	ARG WEBROOT=web
    20	ENV WEBROOT=${WEBROOT}
    21	
    22	# Token is used to access private repositories. Not exposed as an environment
    23	# variable within an image to avoid baking it into the image.
    24	ARG PACKAGE_TOKEN=""
    25	
    26	ARG DRUPAL_PUBLIC_FILES="sites/default/files"
    27	ENV DRUPAL_PUBLIC_FILES=${DRUPAL_PUBLIC_FILES}
    28	
    29	ARG DRUPAL_PRIVATE_FILES="sites/default/files/private"
    30	ENV DRUPAL_PRIVATE_FILES=${DRUPAL_PRIVATE_FILES}
    31	
    32	ARG DRUPAL_TEMPORARY_FILES="${TMP:-/tmp}"
    33	ENV DRUPAL_TEMPORARY_FILES=${DRUPAL_TEMPORARY_FILES}
    34	
    35	ARG DRUPAL_THEME="drevops"
    36	ENV DRUPAL_THEME=${DRUPAL_THEME}
    37	
    38	ARG VORTEX_FRONTEND_BUILD_SKIP="0"
    39	ENV VORTEX_FRONTEND_BUILD_SKIP=${VORTEX_FRONTEND_BUILD_SKIP}
    40	
    41	ENV COMPOSER_ALLOW_SUPERUSER=1 \
    42	    COMPOSER_CACHE_DIR=/tmp/.composer/cache
    43	
    44	# Allow custom PHP runtime configuration for Drush CLI commands.
    45	# The leading colon appends to the default scan directories.
    46	# `@see` https://github.com/drevops/vortex/issues/1913
    47	ENV PHP_INI_SCAN_DIR="${PHP_INI_SCAN_DIR}:/app/drush/php-ini"
    48	
    49	# Starting from this line, Docker adds the result of each command as a
    50	# separate layer. These layers are cached and reused when the project is

uselagoon/php-8.3-cli-drupal PHP_INI_SCAN_DIR environment variable


uselagoon/php-8.3-cli-drupal does not set PHP_INI_SCAN_DIR itself; it just FROM .../php-8.3-cli (which in turn is based on .../php-8.3-fpm → official php:8.3-fpm-alpine). (raw.githubusercontent.com)

So PHP uses the compiled default “scan dir” from the official PHP image: $PHP_INI_DIR/conf.d (typically /usr/local/etc/php/conf.d). The official image’s recommended way to add config is to drop extra *.ini files into $PHP_INI_DIR/conf.d/. (hub.docker.com)

If you want to override/extend that at runtime, set PHP_INI_SCAN_DIR yourself (colon-separated). Common patterns:

  • Append an extra directory while keeping defaults:
    PHP_INI_SCAN_DIR=:/my/custom-ini-dir
  • Explicitly include the default + your dir:
    PHP_INI_SCAN_DIR=/usr/local/etc/php/conf.d:/my/custom-ini-dir

PHP will use the env var if set; otherwise it uses the built-in scan dir. (php.net)

Citations:


PHP Docker image default PHP_INI_SCAN_DIR setting


In the Docker Official Image php, the default “scan for additional .ini files” directory (what PHP reports as Scan for additional .ini files in: in php --ini) is compiled as:

  • PHP_INI_DIR=/usr/local/etc/php
  • --with-config-file-scan-dir="$PHP_INI_DIR/conf.d"/usr/local/etc/php/conf.d by default. [1]

That matches the official image guidance to drop overrides into $PHP_INI_DIR/conf.d/ (i.e., /usr/local/etc/php/conf.d/). [2]

Note: PHP_INI_SCAN_DIR is an environment variable you can set to override that scan path at runtime; if you don’t set it, PHP uses the compiled default above. [1]

Sources: [1] [2]


Explicitly set PHP_INI_SCAN_DIR to preserve the default scan directory.

Line 47 appends to PHP_INI_SCAN_DIR with a leading colon, but the base image does not define this variable. When undefined, ${PHP_INI_SCAN_DIR} expands to an empty string, resulting in :/app/drush/php-ini, which overrides PHP's compiled default scan directory (/usr/local/etc/php/conf.d) and creates an invalid empty path component.

Instead, explicitly include the default:

ENV PHP_INI_SCAN_DIR="/usr/local/etc/php/conf.d:/app/drush/php-ini"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.docker/cli.dockerfile around lines 41 - 47, The ENV line that appends to
PHP_INI_SCAN_DIR can produce an invalid empty component because the base image
doesn't define PHP_INI_SCAN_DIR; update the ENV declaration for PHP_INI_SCAN_DIR
(the ENV PHP_INI_SCAN_DIR line) to explicitly include PHP's default scan
directory (/usr/local/etc/php/conf.d) followed by /app/drush/php-ini so the
default is preserved instead of relying on an undefined variable.


# Starting from this line, Docker adds the result of each command as a
# separate layer. These layers are cached and reused when the project is
Expand Down
25 changes: 19 additions & 6 deletions .env
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
# To customize variables locally, copy `.env.local.example` to `.env.local`,
# and add your custom values there.
#
# @see https://www.vortextemplate.com/docs/workflows/variables
# @see https://www.vortextemplate.com/docs/development/variables
Comment thread
AlexSkrypnyk marked this conversation as resolved.

################################################################################
# GENERAL #
Expand Down Expand Up @@ -103,6 +103,19 @@ VORTEX_PROVISION_TYPE=database
# Set this to 1 in .env.local to override when developing locally.
VORTEX_PROVISION_OVERRIDE_DB=0

# Fallback to profile installation if the database dump is not available.
#
# When enabled and the provision type is set to "database", the site will be
# installed from the profile if the database dump file or container image
# is not available.
VORTEX_PROVISION_FALLBACK_TO_PROFILE=0

# Verify that configuration was not changed by database updates.
# If enabled and config files are present, the provision will fail if
# database update hooks modify active configuration, preventing
# drush config:import from silently overwriting those changes.
VORTEX_PROVISION_VERIFY_CONFIG_UNCHANGED_AFTER_UPDATE=0

# Skip database sanitization.
#
# Database sanitization is enabled by default in all non-production
Expand Down Expand Up @@ -154,14 +167,14 @@ VORTEX_DB_DIR=./.data
VORTEX_DB_FILE=db.sql

# Database download source.
VORTEX_DB_DOWNLOAD_SOURCE=lagoon
VORTEX_DOWNLOAD_DB_SOURCE=lagoon

# Environment to download the database from.
#
# Applies to hosting environments.
# Note that depending on the hosting provider, this variable may represent
# a branch name or an environment name.
VORTEX_DB_DOWNLOAD_ENVIRONMENT=main
VORTEX_DOWNLOAD_DB_ENVIRONMENT=main

################################################################################
# RELEASE VERSIONING #
Expand All @@ -170,23 +183,23 @@ VORTEX_DB_DOWNLOAD_ENVIRONMENT=main
# Versioning scheme used for releases.
#
# Can be one of: calver, semver, other
# @see https://www.vortextemplate.com/docs/workflows/releasing
# @see https://www.vortextemplate.com/docs/releasing
VORTEX_RELEASE_VERSION_SCHEME=calver

################################################################################
# DEPLOYMENT #
################################################################################

# Deployment occurs when tests pass in the CI environment.
# @see https://www.vortextemplate.com/docs/workflows/deployment
# @see https://www.vortextemplate.com/docs/deployment
VORTEX_DEPLOY_TYPES=lagoon

################################################################################
# NOTIFICATIONS #
################################################################################

# Notificaions are sent accross multiple channels before and after deployment.
# @see https://www.vortextemplate.com/docs/workflows/notifications
# @see https://www.vortextemplate.com/docs/deployment/notifications

# The channels of the notifications.
#
Expand Down
9 changes: 3 additions & 6 deletions .env.local.example
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#
# The .env.local file is excluded via .gitignore and will not be committed.
#
# @see https://www.vortextemplate.com/docs/workflows/variables
# @see https://www.vortextemplate.com/docs/development/variables

# Local development URL.
# Override only if you need to use a different URL than the default.
Expand All @@ -31,12 +31,9 @@ VORTEX_PROVISION_OVERRIDE_DB=1
PACKAGE_TOKEN=

# Always override existing downloaded DB dump.
VORTEX_DB_DOWNLOAD_FORCE=1
VORTEX_DOWNLOAD_DB_FORCE=1

# Database dump file sourced from Lagoon.

# SSH file used to download the database dump from Lagoon. Defaults to "${HOME}/.ssh/id_rsa}".
# VORTEX_DB_DOWNLOAD_SSH_FILE=

# OpenAI API key for AI-related features.
DRUPAL_AI_PROVIDER_OPENAI_API_KEY=
# VORTEX_DOWNLOAD_DB_SSH_FILE=
26 changes: 13 additions & 13 deletions .github/workflows/build-test-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ jobs:

container:
# https://hub.docker.com/r/drevops/ci-runner
image: drevops/ci-runner:26.1.0@sha256:1fd1a2bc6311ae1c8b726fa2326dc509f6c8918b7d394bceb10d3aada1c7afcb
image: drevops/ci-runner:26.2.0@sha256:fe1561c2984a1023e84eebe6461056b0b55afedbb2512e6c2c7f19aca6beb398
env:
PACKAGE_TOKEN: ${{ secrets.PACKAGE_TOKEN }}
VORTEX_CONTAINER_REGISTRY_USER: ${{ secrets.VORTEX_CONTAINER_REGISTRY_USER }}
Expand Down Expand Up @@ -116,15 +116,15 @@ jobs:
uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5
with:
path: .data
key: v26.1.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback') }}-${{ hashFiles('db_cache_timestamp') }}
key: v26.2.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback') }}-${{ hashFiles('db_cache_timestamp') }}
# Fallback to caching by default branch name only. Allows to use
# cache from the branch build on the previous day.
restore-keys: |
v26.1.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback') }}-
v26.2.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback') }}-

- name: Download DB
run: |
VORTEX_DB_DOWNLOAD_SEMAPHORE=/tmp/download-db-success ./scripts/vortex/download-db.sh
VORTEX_DOWNLOAD_DB_SEMAPHORE=/tmp/download-db-success ./scripts/vortex/download-db.sh
echo "db_hash=${{ hashFiles('.data') }}" >> "$GITHUB_ENV"
timeout-minutes: 30

Expand All @@ -147,7 +147,7 @@ jobs:
if: env.db_hash != hashFiles('.data')
with:
path: .data
key: v26.1.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback_yes') }}-${{ hashFiles('db_cache_timestamp') }}
key: v26.2.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback_yes') }}-${{ hashFiles('db_cache_timestamp') }}

build:
runs-on: ubuntu-latest
Expand All @@ -162,7 +162,7 @@ jobs:

container:
# https://hub.docker.com/r/drevops/ci-runner
image: drevops/ci-runner:26.1.0@sha256:1fd1a2bc6311ae1c8b726fa2326dc509f6c8918b7d394bceb10d3aada1c7afcb
image: drevops/ci-runner:26.2.0@sha256:fe1561c2984a1023e84eebe6461056b0b55afedbb2512e6c2c7f19aca6beb398
env:
PACKAGE_TOKEN: ${{ secrets.PACKAGE_TOKEN }}
VORTEX_CONTAINER_REGISTRY_USER: ${{ secrets.VORTEX_CONTAINER_REGISTRY_USER }}
Expand Down Expand Up @@ -206,7 +206,7 @@ jobs:
date "${VORTEX_CI_DB_CACHE_TIMESTAMP}" | tee db_cache_timestamp

- name: Show cache key for database caching
run: echo 'v26.1.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback_yes') }}-${{ hashFiles('db_cache_timestamp') }}'
run: echo 'v26.2.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback_yes') }}-${{ hashFiles('db_cache_timestamp') }}'

# Restore DB cache based on the cache strategy set by the cache keys below.
# Change 'v1' to 'v2', 'v3' etc., commit and push to force cache reset.
Expand All @@ -218,9 +218,9 @@ jobs:
path: .data
fail-on-cache-miss: true
# Use cached database from previous builds of this branch.
key: v26.1.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback_yes') }}-${{ hashFiles('db_cache_timestamp') }}
key: v26.2.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback_yes') }}-${{ hashFiles('db_cache_timestamp') }}
restore-keys: |
v26.1.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback_yes') }}-
v26.2.0-db11-${{ hashFiles('db_cache_branch') }}-${{ hashFiles('db_cache_fallback_yes') }}-

- name: Login to container registry
run: ./scripts/vortex/login-container-registry.sh
Expand All @@ -239,7 +239,7 @@ jobs:
continue-on-error: ${{ vars.VORTEX_CI_DCLINT_IGNORE_FAILURE == '1' }}

- name: Build stack
run: docker compose up -d
run: docker compose up --detach && docker builder prune --all --force

- name: Export built codebase
if: ${{ matrix.instance == 0 && !startsWith(github.head_ref || github.ref_name, 'deps/') && contains(env.VORTEX_DEPLOY_TYPES, 'artifact') }}
Expand Down Expand Up @@ -345,9 +345,9 @@ jobs:
- name: Check code coverage threshold
if: ${{ matrix.instance == 0 || strategy.job-total == 1 }}
run: |
RATE=$(grep -o 'line-rate="[0-9.]*"' .logs/coverage/phpunit/cobertura.xml | head -1 | tr -cd '0-9.')
RATE=$(grep -om1 'line-rate="[0-9.]*"' .logs/coverage/phpunit/cobertura.xml | tr -cd '0-9.')
PERCENT=$(awk "BEGIN {printf \"%.2f\", $RATE*100}")
echo "Coverage: $PERCENT% (threshold: $VORTEX_CI_CODE_COVERAGE_THRESHOLD%)"
echo "Coverage: $PERCENT% (threshold: $VORTEX_CI_CODE_COVERAGE_THRESHOLD%)" | tee -a "$GITHUB_STEP_SUMMARY"
if [ "${PERCENT//./}" -lt "$((VORTEX_CI_CODE_COVERAGE_THRESHOLD*100))" ]; then
echo "FAIL: coverage too low"
exit 1
Expand Down Expand Up @@ -400,7 +400,7 @@ jobs:

container:
# https://hub.docker.com/r/drevops/ci-runner
image: drevops/ci-runner:26.1.0@sha256:1fd1a2bc6311ae1c8b726fa2326dc509f6c8918b7d394bceb10d3aada1c7afcb
image: drevops/ci-runner:26.2.0@sha256:fe1561c2984a1023e84eebe6461056b0b55afedbb2512e6c2c7f19aca6beb398
env:
TZ: ${{ vars.TZ || 'UTC' }}
TERM: xterm-256color
Expand Down
2 changes: 1 addition & 1 deletion .lagoon.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ tasks:
command: |
if [ "$LAGOON_ENVIRONMENT_TYPE" != "production" ] && [ "$LAGOON_GIT_BRANCH" != "${VORTEX_LAGOON_PRODUCTION_BRANCH:-main}" ]; then
# No need to load SSH file to access production DB as Lagoon has SSH agent keys.
export VORTEX_DB_DOWNLOAD_SSH_FILE=false
export VORTEX_DOWNLOAD_DB_SSH_FILE=false
export VORTEX_DB_DIR=/tmp/data
rm -Rf $VORTEX_DB_DIR || true
./scripts/vortex/download-db.sh
Expand Down
91 changes: 91 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# DrevOps Website - Development Guide

## Daily Development Tasks

```bash
# Environment
ahoy up # Start containers
ahoy down # Stop containers
ahoy info # Show URLs and status
ahoy login # Get admin login URL

# Build & Database
ahoy download-db # Download fresh database from remote
ahoy build # Complete site rebuild
ahoy provision # Re-provision (import DB + apply config)
ahoy import-db # Import database from file without applying config
ahoy export-db # Export current local database

# Drush commands
ahoy drush cr # Clear cache
ahoy drush updb # Run database updates
ahoy drush cex # Export configuration to code
ahoy drush cim # Import configuration from code
ahoy drush uli # Get one-time login link
ahoy drush status # Check site status

# Composer
ahoy composer install
ahoy composer require drupal/[module_name]

# Code quality
ahoy lint # Check code style
ahoy lint-fix # Auto-fix code style

# PHPUnit testing
ahoy test # Run PHPUnit tests
ahoy test-unit # Run PHPUnit Unit tests
ahoy test-kernel # Run PHPUnit Kernel tests
ahoy test-functional # Run PHPUnit Functional tests
ahoy test -- --filter=TestClassName # Run specific PHPUnit test class

# Behat testing
ahoy test-bdd # Run Behat tests
ahoy test-bdd -- --tags=@tagname # Run Behat tests with specific tag
```

## Before Starting Any Task

1. **Check cached docs first.** Before investigating any topic, check `.data/ai-artifacts/docs-[topic].md` for existing cached documentation. Do not search the codebase or fetch from the web if a cached doc already exists.
2. **Check project docs.** Before making implementation decisions, check the relevant file in `docs/` for project-specific conventions.
3. **Fetch and cache if missing.** If no cached doc exists for the topic, fetch from https://www.vortextemplate.com/docs and save to `.data/ai-artifacts/docs-[topic].md` (see [Documentation](#documentation) for format).

## Critical Rules

- **Never modify** `scripts/vortex/` - use `scripts/custom/` for your scripts
- **Never use** `ahoy drush php:eval` - use `ahoy drush php:script` instead
- **Always export config** after admin UI changes: `ahoy drush cex`

## Key Directories

- `web/modules/custom/` - Custom modules
- `web/themes/custom/` - Custom themes
- `config/default/` - Drupal configuration
- `scripts/custom/` - Project scripts
- `patches/` - Module patches

## Documentation

This project uses two documentation sources:

### Project-specific documentation (`docs/`)

The `docs/` directory contains **what** applies to this project:

- `docs/testing.md` - Testing conventions and agreements
- `docs/ci.md` - CI provider and configuration
- `docs/deployment.md` - Hosting provider and deployment rules
- `docs/releasing.md` - Version scheme and release process
- `docs/faqs.md` - Project-specific FAQs

**Always check these files first** to understand project-specific decisions.

### Vortex documentation (vortextemplate.com)

For **how** to perform operations, fetch from https://www.vortextemplate.com/docs.

Use the sitemap to discover available pages: https://www.vortextemplate.com/sitemap.xml

**Caching:** Save fetched docs to `.data/ai-artifacts/docs-[topic].md` with header
`<!-- Source: [URL] | Cached: [YYYY-MM-DD] -->`.
Re-fetch if user reports docs are outdated.
Loading