Skip to main content
Version: v1

Contributed modules

Vortex ships the contributed modules most Drupal projects need, pre-configured and wired into the environment-aware settings and the provisioning scripts. This page lists every shipped module in alphabetical order: what it does, why it ships, and how it's configured.

➡️ See Overview for the mechanisms that require, configure, and install these modules.

ClamAV​

ClamAV scans uploaded files for malware with the ClamAV engine before they're saved. Ships only when the ClamAV service is selected.

Configuration​

settings.clamav.php selects daemon or executable mode and points the daemon at the ClamAV service, but only when DRUPAL_CLAMAV_ENABLED is set to 1.

VariablePurpose
DRUPAL_CLAMAV_ENABLEDApplies the override only when set to 1
DRUPAL_CLAMAV_MODESelects daemon or executable mode
CLAMAV_HOST, CLAMAV_PORTDaemon host and port

Coffee​

Coffee adds a keyboard shortcut to jump straight to any administration page by typing its name.

Configuration​

No settings override.

Config Split​

Configuration Split splits configuration into sets that are conditionally imported, enabling environment-specific configuration such as development-only modules.

Configuration​

settings.config_split.php enables the split matching the detected environment - local, ci, dev, or stage - so each environment imports only its own set.

Config Update​

Configuration Update Manager provides tools and Drush commands to report, revert, and import configuration changes relative to the defaults shipped by modules.

Configuration​

No settings override.

Devel​

Devel is a suite of development tools for inspecting variables, entities, and the service container while debugging.

Configuration​

settings.devel.php excludes it from the exported configuration.

Drupal Helpers​

Drupal helpers is a collection of helper functions that simplify writing update hooks and deployment operations.

  • Installed: As a dependency of the ys_demo demo module, declared in ys_demo.info.yml.

Configuration​

No settings override.

➡️ See Drupal helpers for the helper facades.

Environment Indicator​

Environment Indicator shows a colored banner identifying the current environment to prevent accidental changes on the wrong site.

Configuration​

settings.environment_indicator.php names the indicator after the detected environment and colors it per environment - red for production, yellow for stage, green for dev - with the toolbar integration and favicon marker turned on.

Fast 404​

Fast 404 answers requests for missing files without bootstrapping Drupal. Drupal core already returns a lightweight 404 for the same file extensions, but only after a full bootstrap. On a site serving many such requests, the saving is the bootstrap itself.

  • Installed: Never enabled as a Drupal module. The handler runs from the settings file during the settings load, before the module system exists, so requiring the package is all that's needed.

Configuration​

settings.fast_404.php sets the file extensions to intercept and whitelists the front controller and the other entry-point scripts. It brings image style derivatives under the same rules so anonymous requests can't force derivative generation, and calls fast404_preboot() with those settings. Path checking against the router and the URL aliases is off, as it queries the database before Drupal has connected to it.

Generated Content​

Generated Content generates deterministic placeholder content from declarative definitions for development and testing.

Configuration​

settings.generated_content.php excludes it from the exported configuration.

➡️ See Generated Content for the plugin system and the demo plugin.

Migrate Plus​

Migrate Plus extends the core Migrate API with extra source and process plugins and configuration-entity migrations. The demo migration module uses it against the second database.

Configuration​

No settings override.

Ships only when the migration feature is selected - the installer removes the requirement otherwise.

➡️ See Migrations for the second database and the demo migration.

Migrate Tools​

Migrate Tools provides Drush commands and a UI to run, roll back, and monitor migrations. scripts/provision-20-migration.sh drives it during provisioning.

Configuration​

No settings override.

Ships only when the migration feature is selected - the installer removes the requirement otherwise.

➡️ See Migrations for the second database and the demo migration.

Navigation Extra Tools adds administration shortcuts - clear caches, run cron, run database updates - to the core Navigation module.

Configuration​

No settings override.

Pathauto​

Pathauto automatically generates URL aliases for content based on configurable patterns.

Configuration​

No settings override.

Redirect​

Redirect manages URL redirects and creates them automatically when content URLs change.

Configuration​

No settings override.

Redis​

Redis integrates Drupal with the Redis in-memory store for cache and lock backends. Ships only when the Redis service is selected.

Configuration​

settings.redis.php makes Redis the default cache backend, registers the module container YAML files, and swaps the bootstrap container over. These are all gated on DRUPAL_REDIS_ENABLED and on the redis PHP extension being loaded, so a two-stage deployment can provision the service before switching the cache.

VariablePurpose
DRUPAL_REDIS_ENABLEDApplies the override only when set to 1
REDIS_HOST, REDIS_SERVICE_PORTConnection host and port

Reroute Email​

Reroute Email intercepts outgoing emails and redirects them to a configurable address instead of the intended recipients. This prevents accidental email delivery to real users in non-production environments while still allowing email features to be tested.

Configuration​

settings.reroute_email.php excludes the module from the exported configuration and enables rerouting in every environment except local, ci, and prod.

Rerouting replaces the recipient of an outgoing message with the configured address, unless that recipient matches DRUPAL_REROUTE_EMAIL_ALLOWED. With rerouting disabled, every message reaches its intended recipient. Rerouting is therefore disabled only where that delivery is either wanted or already intercepted by other means.

Environment behavior:

EnvironmentRerouting enabledReason
LocalNoPygmy already catches outgoing mail
CINoThe mail collector stores messages instead of sending them
DevYesPrevents accidental delivery to real users
StageYesStage runs a copy of production content, so any address that survives database sanitization is a real one
ProdNoProduction emails must reach actual recipients

Rerouting is the fall-through default, so it's also enabled in any custom environments (for example, PR environments) that don't match the standard environment types listed earlier. Those environments install the module only if their environment type is added to the provisioning scripts. ➡️ See Provision

Rerouting is off in ci so that tests can assert on the address a message was sent to. With rerouting on, every message would carry the rerouting address instead of the intended one.

A site that deselects this module during installation still sends no mail from ci, because the mail collector stores messages there regardless. That site does send mail to real recipients in dev, stage, and custom environments.

Environment variables:

VariableDefaultPurpose
DRUPAL_REROUTE_EMAIL_ADDRESSwebmaster@your-site-domain.exampleAddress to receive all rerouted emails
DRUPAL_REROUTE_EMAIL_ALLOWED*@your-site-domain.examplePattern for addresses allowed to bypass rerouting

Overriding default behavior:

Set DRUPAL_REROUTE_EMAIL_DISABLED to 1 to disable email rerouting in an environment where it would otherwise be enabled. This is the supported way for a stage environment to send real mail during UAT.

Example of the Reroute Email module settings.reroute_email.php file
<?php

/**
* @file
* Reroute email settings.
*/

declare(strict_types=1);

$settings['config_exclude_modules'][] = 'reroute_email';

$config['reroute_email.settings']['address'] = getenv('DRUPAL_REROUTE_EMAIL_ADDRESS') ?: 'webmaster@your-site-domain.example';
$config['reroute_email.settings']['allowed'] = getenv('DRUPAL_REROUTE_EMAIL_ALLOWED') ?: '*@your-site-domain.example';

if (in_array($settings['environment'], [ENVIRONMENT_LOCAL, ENVIRONMENT_CI, ENVIRONMENT_PROD], TRUE)) {
// Deliver every message to its intended recipient. Local and CI capture
// outgoing mail by other means, and production sends to real recipients.
$config['reroute_email.settings']['enable'] = FALSE;
}
else {
// Send every outgoing message to the address above instead of to its
// intended recipient, unless that recipient matches the allowed list.
$config['reroute_email.settings']['enable'] = TRUE;
}

// Allow an environment to opt out of the rerouting set above.
if (getenv('DRUPAL_REROUTE_EMAIL_DISABLED') === '1') {
// Deliver every message to its intended recipient.
$config['reroute_email.settings']['enable'] = FALSE;
}

RobotsTxt​

RobotsTxt manages the robots.txt file from the admin UI, useful when it can't be placed on disk (for example, in multisite setups).

Configuration​

settings.robotstxt.php serves a Disallow: / file outside production, so non-production environments aren't indexed.

SDC Devel​

SDC Devel provides development and validation tooling for Single Directory Components (SDC), reporting issues in component definitions and templates.

Configuration​

settings.sdc_devel.php excludes it from the exported configuration.

Search API​

Search API provides a framework for building search experiences with pluggable indexing backends.

Configuration​

No settings override.

Search API Solr​

Search API Solr is a Search API backend that integrates Apache Solr for fast, scalable search. Ships only when the Solr service is selected.

Configuration​

No settings override.

Security Kit​

Security Kit adds configurable security-hardening HTTP headers, including Content Security Policy and anti-framing protection.

  • Installed: Required only - not installed during provisioning; enable it when the project needs it.

Configuration​

settings.seckit.php disables the Content Security Policy and the upgrade-insecure-requests header locally and in CI, where the site isn't served over HTTPS.

Shield​

Shield restricts access to your site by requiring HTTP authentication credentials.

Configuration​

settings.shield.php forces Shield on in non-production environments other than local and ci, where it's forced off. Production is left untouched, so Shield stays under UI control there.

Environment behavior:

EnvironmentShield enabledReason
LocalNoNo need for HTTP auth during local development
CINoAutomated tests must access the site freely
DevYesProtects development environments from crawlers
StageYesProtects staging environments from public access
ProdNot enforcedLeft to the site configuration - enable or disable through the UI

Environment variables:

VariableDefaultPurpose
DRUPAL_SHIELD_USERHTTP authentication username
DRUPAL_SHIELD_PASSHTTP authentication password
DRUPAL_SHIELD_PRINTMessage shown in the authentication popup (module default when unset)
DRUPAL_SHIELD_ALLOW_ACME_CHALLENGESet to 1 to keep the /.well-known/acme-challenge/* path open for Let's Encrypt certificate generation

Overriding default behavior:

Set DRUPAL_SHIELD_DISABLED to 1 to disable Shield in an environment where it would otherwise be enabled. This is useful for temporary access during debugging or when an environment doesn't require protection.

Example of the Shield module settings.shield.php file
<?php

/**
* @file
* Shield settings.
*/

declare(strict_types=1);

// Shield can be enabled and disabled in production through UI.
//
// For other environments, Shield is enforced to be enabled.
// 'DRUPAL_SHIELD_USER' and 'DRUPAL_SHIELD_PASS' environment variables must
// be added in the environment or there will be no way to bypass HTTP Auth.
//
// Unlike other settings files, enablement does not follow the presence of
// environment variables: Shield must stay enabled even when the credential
// variables are missing.
if ($settings['environment'] !== ENVIRONMENT_PROD) {
$config['shield.settings']['shield_enable'] = TRUE;

if ($settings['environment'] === ENVIRONMENT_LOCAL || $settings['environment'] === ENVIRONMENT_CI) {
$config['shield.settings']['shield_enable'] = FALSE;
}
}

$shield_user = getenv('DRUPAL_SHIELD_USER');
$shield_pass = getenv('DRUPAL_SHIELD_PASS');
if (!empty($shield_user) && !empty($shield_pass)) {
$config['shield.settings']['credentials']['shield']['user'] = $shield_user;
$config['shield.settings']['credentials']['shield']['pass'] = $shield_pass;
}

// Allow overriding the title of the Shield pop-up.
$shield_print = getenv('DRUPAL_SHIELD_PRINT');
if (!empty($shield_print)) {
$config['shield.settings']['print'] = $shield_print;
}

// Allow disabling Shield completely in an environment.
if (getenv('DRUPAL_SHIELD_DISABLED') === '1') {
$config['shield.settings']['shield_enable'] = FALSE;
}

// Allow ACME challenge path for Let's Encrypt certificate generation.
if (getenv('DRUPAL_SHIELD_ALLOW_ACME_CHALLENGE') === '1') {
$config['shield.settings']['method'] = 0;
$shield_acme_path = '/.well-known/acme-challenge/*';
$shield_existing_paths = $config['shield.settings']['paths'] ?? '';
$config['shield.settings']['paths'] = str_contains($shield_existing_paths, $shield_acme_path) ? $shield_existing_paths : trim($shield_existing_paths . "\n" . $shield_acme_path);
}

Stage File Proxy​

Stage File Proxy fetches media files from a remote site on demand, so local environments don't need a full copy of the files directory.

Configuration​

settings.stage_file_proxy.php sets the origin from DRUPAL_STAGE_FILE_PROXY_ORIGIN outside production and injects the Shield credentials into that URL when they're set, so a shielded origin still serves files.

Testmode​

Testmode adjusts site behavior during automated tests, for example by filtering out generated content from listings.

Configuration​

settings.testmode.php excludes it from the exported configuration.

➡️ See Testmode for the configuration and the Behat integration.

XML Sitemap​

XML sitemap generates a multilingual XML sitemap to help search engines index the site.

Configuration​

settings.xmlsitemap.php stops cron regeneration and search engine submission outside production, so non-production environments are never advertised.