1.41.0 - Lumen
This release replaces several in-house mechanisms with the ecosystem equivalents and fixes a set of mechanisms that had been running without doing anything: mail interception in CI moves to Drupal core's mail collector, large database dumps import without hand-tuning, the front-end toolchain moves from Yarn to npm, and security scanning gets its own workflow. The documentation is restructured into a single Development section, and the administration interface switches to Drupal core's Navigation module.
π Highlights
-
Mail interception in CI moved from a custom mechanism to core's mail collector
The customsuspend_mail_sendflag lived in the scaffold module consumers are invited to edit, so deleting that hook silently re-enabled mail inci. It is replaced by two independent layers that a project cannot switch off by accident: Drupal core's mail collector as a settings override, andSSMTP_MAILHUBpointed at a closed port so delivery fails at the transport regardless of which mail plugin produced the message. -
Yarn replaced by npm across the template
Module scripts and theme compilation now run on npm. Theahoycommands are unchanged (ahoy fei,ahoy fe,ahoy lint-fe,ahoy test-js), but the lock file changes fromyarn.locktopackage-lock.json. -
Large database dumps import reliably
The shipped database configuration raises the InnoDB redo log capacity to 1 GB, the default Drushmemory_limitgoes from 512M to 1G, and cache table data is dropped from exported dumps. Together these remove the three most common causes of a failed import on a big site. -
Standalone Security audit workflow
Gitleaks secret scanning andcomposer auditmoved out of the build workflow into their ownSecurity auditworkflow, withcomposer auditrunning first and every check running regardless of earlier failures - so one finding no longer hides the rest. -
Core Navigation replaces Admin Toolbar
The administration interface is now Drupal core's Navigation module plusnavigation_extra_tools, anddrupal/admin_toolbaris no longer shipped. -
Search and migration handling in provisioning
A new search re-index provision step runs for development environments, and the Solr search server is disabled while migrations run so indexing does not compete with the migration. -
Deployment logs and stale branch cleanup
Notifications can now carry the deployment log, and artifact deployments can prune stale deployment branches on a pattern and age. -
Documentation restructured
Content is reorganised into a single Development section with per-topic subsections and canonical tool pages, and both documentation majors are now served from one combined site built on every branch.
π₯ Breaking changes
These changes are applied when you update to 1.41.0.
-
Yarn replaced by npm. Delete
yarn.lockfrom the repository root and from your custom theme, runnpm installin both to generatepackage-lock.json, and commit the result. Any custom scripts or CI steps callingyarnmust callnpminstead. Theahoyfront-end commands keep their names. -
drupal/admin_toolbarreplaced by the core Navigation module. Uninstalladmin_toolbaron existing sites;navigationandnavigation_extra_toolsare installed by the development modules provision script. If your project depends on Admin Toolbar, add it back to your owncomposer.json. -
.gitignore,.dockerignoreand.gitignore.artifactare now deny lists. They previously ignored everything underweb/and un-ignored selected paths; now everything not listed is tracked. Reviewgit statusafter updating - files that were silently ignored before may now be picked up. -
VR_DIFFY_AUTO_BRANCHESrenamed toVR_DIFFY_PR_SKIP_BRANCHES. Rename the repository variable if you set it. The default is unchanged (deps/*). -
The installer removes unmodified template-owned paths. A
.vortex-manifest.jsonrecords checksums for files the template ships, so an update deletes template-owned files you never modified when the template stops shipping them. Files you edited are left alone. -
The provision task completion marker changed from
<to+. Any log parsing that matched the old marker needs updating. -
Versioned Drupal Rector sets replaced by the composer-based set. Rector now derives the Drupal rule set from the installed core version instead of a pinned set. Custom
rector.phpfiles that reference a versionedDrupalSetListconstant need updating.
What's new since 1.40.2
π Template
-
β¨ New
-
[#3039] Replaced 'suspend_mail_send' with a mail collector and a closed mail transport in CI. @AlexSkrypnyk (#3050)
What it does: Installs Drupal's mail collector as a settings override in thecienvironment and pointsSSMTP_MAILHUBat a closed port, so no automated test run can deliver a message to a real recipient. Reroute Email is disabled inciso each stored message keeps its intended recipient.
How to use it: Applies automatically inci. Tag a scenario@emailto assert on captured messages with theEmailTraitsteps; untagged scenarios are still covered by the default collector. -
[#2814] Added search re-index provision script for development environments. @AlexSkrypnyk (#2815)
What it does: Addsscripts/provision-30-search-index.sh, which re-indexes the search backend after provisioning.
How to use it: Runs automatically in development environments. SetDRUPAL_SEARCH_INDEX_SKIP=1(default0) to skip it. -
[#2985] Added generated content provisioning to the development modules script. @AlexSkrypnyk (#2997)
What it does: Creates placeholder content throughdrupal/generated_contentas part of the development modules provision step.
How to use it: Runs automatically in development environments. SetDRUPAL_GENERATED_CONTENT_SKIP=1(default0) to skip it. -
[#3001] Disabled the Solr search server while migrations run. @AlexSkrypnyk (#3006)
What it does: Disables the Search API Solr server for the duration of a migration and re-enables it afterwards, so indexing does not compete with the migration.
How to use it: On by default. SetDRUPAL_MIGRATION_SEARCH_DISABLE=0(default1) to leave the server enabled. -
[#2885] Split Gitleaks and composer audit into a standalone 'Security audit' workflow. @AlexSkrypnyk (#2886)
What it does: Moves secret scanning and dependency auditing out of the build workflow into a dedicatedSecurity auditworkflow on both CI providers.
How to use it: Runs automatically; no configuration needed. Security findings no longer block or hide build results. -
[#2808] Added opt-in deployment log collection to notifications. @AlexSkrypnyk (#2818)
What it does: Collects the deployment log and attaches it to the outgoing notification for every channel that supports it.
How to use it: SetVORTEX_NOTIFY_LOG=1(default0). The log directory isVORTEX_NOTIFY_LOG_DIR, which the notify script defaults for you. -
[#2696] Bumped git-artifact to 1.7.0 and added an option for stale deployment branch cleanup. @AlexSkrypnyk (#2827)
What it does: Lets an artifact deployment delete deployment branches that match a pattern and are older than a given age.
How to use it: SetVORTEX_DEPLOY_ARTIFACT_CLEANUP_PATTERN(default empty, which disables cleanup) and optionallyVORTEX_DEPLOY_ARTIFACT_CLEANUP_AGE(default7days). -
[#2863] Added opt-in for visual regression on non-PR deployments. @AlexSkrypnyk (#2864)
What it does: Allows visual regression runs on branches outside pull requests.
How to use it: Set theVR_DIFFY_BRANCHESrepository variable to the branches to cover.VR_DIFFY_PR_SKIP_BRANCHES(defaultdeps/*) still excludes branches from PR runs. -
[#3035] Added a Behat profile offset to decouple the profile from the runner index. @AlexSkrypnyk (#3037)
What it does: Lets the Behat profile number be offset from the CI runner index, so Behat runners need not start at index 0.
How to use it: SetVORTEX_CI_BEHAT_PROFILE_OFFSET(default0) in the CI configuration. -
[#3010] Freed preinstalled runner toolchains in the GitHub Actions build and database jobs. @AlexSkrypnyk (#3011)
What it does: Removes preinstalled toolchains from the GitHub Actions runner to reclaim disk space before the build.
How to use it: Set theVORTEX_CI_FREE_DISK_SPACErepository variable to1(opt-in). Leave it unset to keep the default runner image intact. -
[#3042] Tracked '.claude/skills/' in consumer projects by default. @AlexSkrypnyk (#3048)
What it does: Keeps.claude/as an allow list but un-ignores.claude/skills/, so skills shared with the team are committed while machine-local Claude state stays ignored.
How to use it: Applies automatically; commit your project skills under.claude/skills/. -
[#2984] Excluded cache table data from the exported database dump. @AlexSkrypnyk (#2994)
What it does: Exports cache tables with their structure but without their data, since Drupal rebuilds them on demand.
How to use it: On by default.VORTEX_EXPORT_DB_FILE_STRUCTURE_TABLES(defaultcache*) takes a comma-separated list of table names, each of which may use*; set it empty to export every table's data.
-
-
π Changed
-
[#3040] Switched the template from Yarn to npm for module scripts and theme compilation. @AlexSkrypnyk (#3046)
What it does: Replaces Yarn with npm throughout the template:npm cifor installs,npm runfor build, watch and lint targets, andnpm testfor Jest.
How to use it: Deleteyarn.lockfrom the root and the custom theme, runnpm installin both, and commitpackage-lock.json. See Breaking changes. -
[#3041] Namespaced the CI runner-role variables under the 'VORTEX_CI_' prefix. @AlexSkrypnyk (#3045)
What it does: Settles the seven runner-role and profile variables introduced in this release on theVORTEX_CI_prefix, matching the rest of the template.
How to use it: No action needed on update. These variables are new in 1.41.0 and did not exist in 1.40.2 under any name, so there is nothing in an existing project to rename. -
[#2711] Replaced Admin Toolbar default with the core Navigation module. @AlexSkrypnyk (#2806)
What it does: Installs Drupal core's Navigation module plusnavigation_extra_toolsas the administration interface and dropsdrupal/admin_toolbar.
How to use it: Uninstalladmin_toolbaron existing sites. See Breaking changes. -
[#2703] Turned '.dockerignore', '.gitignore' and '.gitignore.artifact' into deny lists. @AlexSkrypnyk (#2780)
What it does: Inverts the ignore files from an allow list of un-ignored paths to a deny list of generated, downloaded and local-only files.
How to use it: Reviewgit statusafter updating. See Breaking changes. -
[#2986] Raised the default Drush 'memory_limit' to 1G. @AlexSkrypnyk (#2993)
What it does: Raises the shipped Drushmemory_limitfrom 512M to 1G so long-running commands do not exhaust memory.
How to use it: Applies automatically. For a one-off larger limit, runahoy cli php -d memory_limit=2G vendor/bin/drush <command>. -
[#2980] Raised the InnoDB redo log capacity so large database dumps import. @AlexSkrypnyk (#2990)
What it does: Sets the InnoDB redo log capacity to 1 GB in the shipped database configuration.
How to use it: Applies automatically on the next container rebuild; no configuration needed. -
[#3002] Ran 'composer audit' first and every audit check regardless of failures. @AlexSkrypnyk (#3004)
What it does: Reorders the audit job to runcomposer auditfirst and continues through every check even after one fails, so a single finding does not mask the others.
How to use it: Applies automatically in CI. -
Replaced per-step CI runner conditions with declared runner roles. @AlexSkrypnyk (#3033)
What it does: Replaces ad-hoc per-step runner index comparisons with explicit runner-role variables declared once per job.
How to use it: Applies automatically. -
[#2975] Replaced versioned Drupal Rector sets with the composer-based set. @AlexSkrypnyk (#2978)
What it does: Derives the Drupal Rector rule set from the installed core version rather than a pinned versioned set.
How to use it: Applies automatically. Update customrector.phpfiles that name a versionedDrupalSetListconstant. See Breaking changes. -
[#2987] Raised the Prettier 'printWidth' default to 160 and pinned doc comments to 80. @AlexSkrypnyk (#2995)
What it does: Widens the Prettier line limit to 160 characters for code while holding documentation comments at 80.
How to use it: Applies automatically; runahoy lint-fixto reformat. -
[#3059] Adopted the Drupal core ESLint 9 configuration and updated the front-end toolchain. @AlexSkrypnyk (#3047)
What it does: Moves the theme to Drupal core's ESLint 9 flat configuration and refreshes the front-end toolchain around it.
How to use it: Applies automatically. Custom ESLint rules must move to the flat config format. -
Replaced the provision task completion marker '<' with '+'. @AlexSkrypnyk (#3061)
What it does: Changes the character that marks a completed provision task in the log output.
How to use it: Update any log parsing that matched the old marker. See Breaking changes. -
[#2891] Split CircleCI deploy branch filter into per-pattern list. @AlexSkrypnyk (#2893)
What it does: Replaces a single combined deploy branch regex with an explicit per-pattern list.
How to use it: Applies automatically; adjust the list if you customised the filter. -
[#2829] Reduced CI runner disk pressure during provisioning. @AlexSkrypnyk (#2837)
What it does: Frees disk space during provisioning so large builds do not exhaust the runner.
How to use it: Applies automatically in CI. -
[#3053] Suppressed 'docker compose cp' progress output in CI. @AlexSkrypnyk (#3054)
What it does: Silences the per-file progress output ofdocker compose cpso CI logs stay readable.
How to use it: Applies automatically in CI. -
[#2849] Anchored environment name matching in provision scripts. @AlexSkrypnyk (#2854)
What it does: Anchors environment name comparisons so a partial name cannot match the wrong environment.
How to use it: Applies automatically on provision. -
[#2848] Split provision example into demo, development module and example scripts. @AlexSkrypnyk (#2859)
What it does: Separates the single provision example into distinct demo, development module and example scripts.
How to use it: Applies automatically; the scripts live underscripts/. -
[#3017] Installed 'testmode' from the development modules provision script. @AlexSkrypnyk (#3018)
What it does: Installs thetestmodemodule as part of the development modules provision step.
How to use it: Applies automatically in development environments. -
[#2843] Suppressed Composer output of the initial tooling install and adopted the standard progress helpers. @AlexSkrypnyk (#2858)
What it does: Quiets the bootstrap tooling install and routes its output through the standardtask/passhelpers.
How to use it: Applies automatically on first run. -
[#3007] Closed every 'task' with a 'pass' or a 'fail' in shipped scripts. @AlexSkrypnyk (#3008)
What it does: Ensures every announced task reports an outcome, so no step leaves the reader unsure whether it succeeded.
How to use it: Applies automatically; output only. -
[#2967] Moved 'exit 1' into the 'fail()' helper across the shell tooling. @AlexSkrypnyk (#2971)
What it does: Makesfail()itself terminate, removing the repeatedexit 1at every call site.
How to use it: Applies automatically. Custom scripts that callfail()and thenexit 1can drop the explicit exit. -
[#2896] Skipped database image fetch when the image already exists on the host. @AlexSkrypnyk (#2951)
What it does: Avoids re-pulling the database image when it is already present locally.
How to use it: Applies automatically; speeds up repeat builds. -
Updated demo and test DBs. @AlexSkrypnyk (#2812)
What it does: Regenerates the demo and test databases and points the demo database URL at the 1.40.0 release asset.
How to use it: Applies automatically for demo installs. -
[#2851] Removed the 'page' content model when the demo and search modules are deselected. @AlexSkrypnyk (#2862)
What it does: Drops the samplepagecontent type from an install that opts out of both the demo content and the search modules.
How to use it: Affects new installs only. -
[#2852] Made 'dclint' and 'hadolint' optional development tools. @AlexSkrypnyk (#2855)
What it does: Turns the Docker Compose and Dockerfile linters into individually selectable tools.
How to use it: Choose them during installation; existing projects keep both. -
Skipped Behat animated screenshots in CI on 'drevops/behat-screenshot' 2.6.0. @AlexSkrypnyk (#3032)
What it does: Disables animated failure screenshots in CI, where they cost time without adding signal over the still capture.
How to use it: Applies automatically in CI; local runs are unchanged. -
[#2795] Added 'issues: write' permission to the Renovate dependency updates job. @AlexSkrypnyk (#2802)
What it does: Grants the Renovate job the permission it needs to manage the dependency dashboard issue.
How to use it: Applies automatically to GitHub Actions projects. -
[#2794] Added 'pull-requests: read' permission to CI deploy job for 'gh pr view'. @AlexSkrypnyk (#2797)
What it does: Grants the deploy job the permission needed to read pull request metadata.
How to use it: Applies automatically to GitHub Actions projects. -
[#3012] Migrated release drafter's default version resolver to a 'version-resolver' category. @AlexSkrypnyk (#3013)
What it does: Moves the release drafter configuration onto the supportedversion-resolverkey.
How to use it: Applies automatically. -
[#2784] Added Drupal logo to the Drupal version shield. @AlexSkrypnyk (#2801)
What it does: Adds the Drupal logo to the README version badge.
How to use it: Cosmetic; no action needed. -
Added the visual regression report to the GitHub Actions run summary. @AlexSkrypnyk (#2865)
What it does: Publishes the visual regression result into the workflow run summary.
How to use it: Applies automatically to GitHub Actions projects. -
[#2868] Pinned Hadolint to v2.15.0 and replaced its global ignores with justified per-line ones. @AlexSkrypnyk (#2867)
What it does: Pins the Hadolint image and replaces file-wide ignores with per-line suppressions.
How to use it: Applies automatically in CI. -
[#2870, #2871, #2872] Pinned the seed script, 'asciinema' and 'sharp-cli' versions. @AlexSkrypnyk (#2874)
What it does: Pins the remaining unpinned tool versions used by the seed and documentation pipelines.
How to use it: Maintainer-facing; no consumer action needed. -
Converged naming, structure, API conventions and source comments across the codebase. @AlexSkrypnyk (#2952, #2895, #2890)
What it does: Aligns naming, visibility, API shapes and comment register across the template, installer, tooling and test harness.
How to use it: Internal consistency work; no consumer action needed.
-
-
π Fixed
-
[#3070] Restored Drupal Rector sets and added a guard against them silently unloading. @AlexSkrypnyk (#3071)
What it does: Fixes the Drupal Rector rule sets being dropped when PHPUnit is deselected, and adds a canary that fails the lint run if the sets ever stop loading.
How to use it: Applies automatically;ahoy lintnow fails loudly instead of passing with no Drupal rules active. -
[#3019] Fixed 'getProtectedValue()' reading the property from the reflection class instead of the object. @AlexSkrypnyk (#3020)
What it does: Corrects a test helper that read a protected property off the reflection class rather than the instance.
How to use it: Test-infrastructure fix; no consumer action needed. -
[#3023] Anchored environment variable prefixes forwarded by 'ahoy cli'. @AlexSkrypnyk (#3024)
What it does: Anchors the prefix match soahoy clino longer forwards variables that merely contain a matching substring.
How to use it: Applies automatically. -
Fixed 'vortex-tooling.sh' aborting when an older tooling package directory is present. @AlexSkrypnyk (#2811)
What it does: Lets the tooling bootstrap proceed when a previous tooling package directory is left behind.
How to use it: Applies automatically on update. -
[#2816] Fixed Docker build check warnings in the CLI Dockerfile. @AlexSkrypnyk (#2817)
What it does: Clears the build check warnings reported for the CLI image.
How to use it: Applies automatically on the next image build. -
[#2821] Fixed database fetch skip message to name the indexed force variable. @AlexSkrypnyk (#2824)
What it does: Corrects the skip message so it names the indexed force variable actually consulted.
How to use it: Output only. -
[#2835] Surfaced the Lagoon CLI error on a failed deploy without debug mode. @AlexSkrypnyk (#2836)
What it does: Prints the Lagoon CLI error on a failed deployment without requiring debug mode.
How to use it: Applies automatically to Lagoon deployments. -
[#2820] Surfaced Lagoon deploy output in debug mode and per-task status. @AlexSkrypnyk (#2822)
What it does: Adds per-task status and full deploy output under debug mode for Lagoon.
How to use it: SetVORTEX_DEBUG=1to see the full output. -
[#2966] Restored the Lagoon database override flag to the state it was discovered in. @AlexSkrypnyk (#2969)
What it does: Restores the database override flag after use instead of leaving it changed.
How to use it: Applies automatically to Lagoon deployments. -
[#2796] Covered 'ENVIRONMENT_TYPE' in test isolation and container runtime. @AlexSkrypnyk (#2803)
What it does: IncludesENVIRONMENT_TYPEin test isolation and the container runtime so tests do not inherit a stale value.
How to use it: Applies automatically. -
Updated Drupal scaffold files for Drupal 11.4 and added scaffold drift guards to tests. @AlexSkrypnyk (#2810)
What it does: Refreshes the scaffold files to Drupal 11.4 and adds tests that fail when they drift from core.
How to use it: Applies automatically on update. -
[#2981] Completed the Rector rename-skip family and audited the skip list. @AlexSkrypnyk (#2991)
What it does: Adds the missing rename-skip rules and audits the full Rector skip list.
How to use it: Applies automatically; runahoy lint-fix. -
Fixed docs workflows building the v2 binary from the removed '.vortex/installer' path. @AlexSkrypnyk (#2861)
What it does: Points the documentation workflows at the correct installer path.
How to use it: Maintainer-facing. -
Triggered 'Vortex - Test docs' from both per-major test workflows. @AlexSkrypnyk (#2880)
What it does: Runs the documentation test workflow from both major-line test workflows.
How to use it: Maintainer-facing.
-
-
β¬οΈ Updated
-
Updated 'drevops/behat-steps' to 3.14.1 and re-recorded the 'test-bdd' documentation video. @AlexSkrypnyk (#3043)
-
Updated template Composer dependencies and wired nine 'behat-steps' traits into 'FeatureContext'. @AlexSkrypnyk (#3036)
-
[#2983] Wired the remaining 'behat-steps' traits into 'FeatureContext'. @AlexSkrypnyk (#2992)
-
Updated 'stage_file_proxy' to 4.x and 'drupal-rector' to 1.x. @AlexSkrypnyk (#2823)
-
Refreshed template and '.vortex/' dependencies and applied Rector early-return fixes. @AlexSkrypnyk (#3031)
-
Re-recorded the demo videos and updated dependencies. @AlexSkrypnyk (#3030)
-
Bumped CI database cache key to 'v26.8.0'. @AlexSkrypnyk (#2892)
-
Upgraded the BATS tests to 'bats-helpers' 2.0. @AlexSkrypnyk (#2894)
-
[#2838] Isolated ambient credentials from tooling BATS tests and added missing-token guard coverage. @AlexSkrypnyk (#2839)
-
Update PHP - Drupal core - Minor and patch to ~11.4.5. @renovate[bot] (#2946, #2788, #2785)
-
Update PHP - All packages except core - Minor and patch. @renovate[bot] (#3065, #2948, #2879, #2833, #2813, #2786)
-
Update Container images - All - Major, minor and patch to v26.8.1. @renovate[bot] (#3068, #2947, #2853, #2809, #2798)
-
Update uselagoon/mysql-8.4 Docker tag to v26.8.1. @renovate[bot] (#3066, #2799)
-
Update uselagoon/valkey-8 Docker tag to v26.8.1. @renovate[bot] (#3067, #2800)
-
Update selenium/standalone-chromium Docker tag to v151. @renovate[bot] (#2968, #2804)
-
Update drevops/ci-runner Docker tag to v26.7.0. @renovate[bot] (#2882)
-
Update hadolint/hadolint Docker tag to v2.15.1. @renovate[bot] (#2881)
-
Update rhysd/actionlint Docker tag to v1.7.12. @renovate[bot] (#2873)
-
Update zizmorcore/zizmor-action action to v0.6.2. @renovate[bot] (#2883, #2831, #2793)
-
Update renovatebot/github-action action to v46.2.2. @renovate[bot] (#2949, #2884, #2834, #2787)
-
Update dawidd6/action-download-artifact action to v24. @renovate[bot] (#3064, #3025)
-
Update toshimaru/auto-author-assign action to v3.1.0. @renovate[bot] (#2976)
-
Update actions/setup-node action to v7. @renovate[bot] (#2790)
-
Update GitHub Actions - All - Major, minor and patch. @renovate[bot] (#3069, #2866, #2830, #2789)
-
π Installer
-
β¨ New
-
[#2988] Removed unmodified template-owned paths the install no longer ships. @AlexSkrypnyk (#2999)
What it does: Records a.vortex-manifest.jsonof checksums for template-owned files, so a later update can delete files the template stopped shipping - but only where the file is byte-identical to what was installed.
How to use it: Applies automatically on update. Files you modified are never removed. -
[#2782] Added installer selection for Twig CS Fixer in the Tools multiselect. @AlexSkrypnyk (#2783)
What it does: Adds Twig CS Fixer as an individually selectable tool during installation.
How to use it: Choose it in the Tools multiselect; existing projects keep their current setup. -
[#2852] Made 'dclint' and 'hadolint' optional development tools. @AlexSkrypnyk (#2855)
What it does: Adds the Docker Compose and Dockerfile linters to the Tools multiselect.
How to use it: Choose them during installation.
-
-
π Changed
-
[#3040] Updated the installer Tools handler for the npm toolchain. @AlexSkrypnyk (#3046)
What it does: Teaches the installer's Tools handler about npm rather than Yarn when stripping deselected front-end tools.
How to use it: Reflected automatically in newly installed projects. -
[#2851] Removed the 'page' content model when the demo and search modules are deselected. @AlexSkrypnyk (#2862)
What it does: Drops the samplepagecontent type from installs that opt out of both demo content and search.
How to use it: Affects new installs only. -
Converged naming, visibility, and idiom conventions across the installer and '.vortex/tests' harness. @AlexSkrypnyk (#2890, #2895, #2952)
What it does: Aligns naming, property visibility and idiom across the installer and the integration test harness.
How to use it: Internal consistency work; no consumer action needed.
-
-
π Fixed
- [#3060] Synchronised npm lock files when the installer removes front-end tools. @AlexSkrypnyk (#3062)
What it does: Regeneratespackage-lock.jsonafter a deselected front-end tool is stripped, so the lock matchespackage.json.
How to use it: Affects new installs only.
- [#3060] Synchronised npm lock files when the installer removes front-end tools. @AlexSkrypnyk (#3062)
π Documentation
-
β¨ New
-
Restructured the documentation into a single 'Development' section with per-topic subsections and canonical tool pages. @AlexSkrypnyk (#3038)
What it does: Reorganises the documentation around a single Development section, with one canonical page per tool instead of content split across task, config and concept pages.
How to use it: Browse https://www.vortextemplate.com/docs. -
Served both documentation majors from one combined site built on every branch. @AlexSkrypnyk (#3052)
What it does: Builds and serves both major documentation lines from a single site, on every branch rather than only onmain.
How to use it: Use the version selector on the docs site. -
[#3000] Refreshed the contrib module documentation and added a Modules reference page. @AlexSkrypnyk (#3005)
What it does: Documents every shipped contributed module on a single reference page.
How to use it: See the Modules reference page in the docs. -
[#2996] Published the shipped tooling script variables in the generated docs table. @AlexSkrypnyk (#2998)
What it does: Extends the generated variables table to cover the variables read by the shipped tooling scripts, not only those in.env.
How to use it: See the Variables page; regenerate withahoy update-docs.
-
-
π Changed
-
Reconciled the Vortex documentation for coherence and corrected stale facts across all sections. @AlexSkrypnyk (#3034)
What it does: Audits every section against the code and corrects statements that had drifted.
How to use it: No action needed. -
Recorded the demos at a 10:6 screen ratio and sized the home page to them. @AlexSkrypnyk (#3056)
What it does: Standardises the terminal demo aspect ratio and matches the home page layout to it.
How to use it: Cosmetic. -
[#3057] Refused to render a demo video whose recorded output reports an issue. @AlexSkrypnyk (#3063)
What it does: Checks each recorded transcript for errors, warnings and failures, and declines to render the video when any are present - so a published demo is a claim the command runs clean.
How to use it: Maintainer-facing. Read the offending lines in the decoded transcript, fix the command, and record again. -
Disabled JetBrains Mono ligatures so code samples render '->' and '=>' literally. @AlexSkrypnyk (#3003)
What it does: Turns off font ligatures so arrow operators appear as written.
How to use it: Cosmetic. -
Refreshed .vortex dev dependencies for August 2026. @AlexSkrypnyk (#2950, #2832)
What it does: Refreshes the lock files for the docs, installer and tests subsystems.
How to use it: Maintainer-facing.
-
-
π Fixed
-
[#2875] Quoted the documentation lint and spellcheck globs so every page is checked. @AlexSkrypnyk (#2876)
What it does: Quotes the globs so the shell does not expand them, restoring coverage of every documentation page.
How to use it: Maintainer-facing. -
Fixed 'window.gtag is not a function' in the docs dev server after a build. @AlexSkrypnyk (#3044)
What it does: Stops the analytics stub erroring in the development server after a production build.
How to use it: Maintainer-facing.
-
π Release checklist
- Updated all dependencies outside of the schedule (Renovate) - pending: run
renovate --schedule= --force-cli=true drevops/vortexmanually. No Renovate PRs were open at prep time and the last batch merged 2026-08-29. - Updated container images and checked
@seelinks -uselagoon/*all at26.8.1(php-cli-drupal, php-fpm, nginx-drupal, solr-9-drupal, commons, mysql-8.4, valkey-8);selenium/standalone-chromium:151.0;drevops/ci-runner:26.8.0(latest);drevops/docker-wait-for-dependencies:26.6.1(latest). SolrluceneMatchVersionstays9.12.3- the Solr image did not change major this cycle. - CI tool images verified and consistent across both providers -
hadolint/hadolint:v2.15.1(also pinned in.vortex/tests/lint.dockerfiles.sh),zavoloklom/dclint:3.1.0,ghcr.io/gitleaks/gitleaks:v8.30.1,rhysd/actionlint:1.7.12. No untagged references. - Bumped
drevops/mariadb-drupal-datafrom26.6.0to26.8.1in.circleci/config.yml- this pin is invisible to Renovate: it is a plainVORTEX_DB_IMAGE_BASE:assignment, matching neithercustomManagersregex (docker run ...orIMAGE: "${...}"). It had rotted two minors behind and missed the arm64 seeding fix released in26.7.0. - Updated PHP version in
composer.jsonforconfig.platform-8.4.23, matches container. - Updated PHP version in
phpcs.xmlfortestVersion-8.4, matches. - Updated PHP version in
phpstan.neonforphpVersion-80423, matches the container'sPHP_VERSION_ID. Verified directly againstuselagoon/php-8.4-cli-drupal:26.8.1. - Tagged
drevops/vortex-toolingbefore the Vortex tag - not required for this release..vortex/tooling/changed this cycle (80 files, +3881/-1110), but no new tooling tag is being cut, so the requirement stays on the published1.4.0tag. The pin is unchanged at~1.4.0in the rootcomposer.jsonrequire, and1.4.0in the root path-repoversionsoverride,scripts/vortex-tooling.sh(VORTEX_DEV bootstrap) and.vortex/tests/phpunit/Traits/SutTrait.php. The tooling changes ship to consumers with the nextdrevops/vortex-toolingrelease. - Updated minor version of all packages in
composer.json(composer update -W) - bumpeddrevops/behat-steps^3.14.1β^3.14.2(bump-after-update). - Updated theme dependencies - npm, not Yarn (the template switched this cycle). Refreshed both
package-lock.jsonfiles vianpm update; in-range transitive bumps including Jest30.4.xβ30.5.0. 0 vulnerabilities in either tree. -
drevops/ci-runnerversion in CI configs -26.8.0, confirmed latest on Docker Hub. - Incremented the CI database cache version -
v26.8.0βv26.8.1, consistent across.circleci/config.yml,.circleci/vortex-test-common.yml,.github/workflows/build-test-deploy.yml. Tracks theuselagoon/*bump to26.8.1. - Updated documentation (
ahoy update-docs) - produced no changes; the generated variables table was already current. It did not revert the cache version bump. - Regenerated installer and test snapshots (
ahoy update-snapshots) - 152 scenarios,Updated: 0. Expected: fixtures mask container tags, cache versions and dependency versions as__VERSION__. - Regenerated demo videos (
ahoy update-videos) - not run this cycle.buildandlintwere last recorded in #3063 and correctly show the npm toolchain; the other seven date from #3056. One is known stale:provisionrecords the old<completion marker, which changed in #3061 after that recording. Requires Docker and ~15-20 minutes. - Tagged the Vortex release - pending. No tooling tag is needed first this cycle.
- Pending deprecations checked - none due. The only two
@deprecatedmarkers are in.vortex/installer/src/Prompts/Handlers/HostingProjectName.php(lines 79 and 135) and are open-ended Acquia backward-compatibility shims that name no removal version. - Demo database URL - left at the
1.40.0release asset. It is bumped only when the demo databases are regenerated (last done in #2812), not on every release.
Full Changelog: 1.40.2...1.41.0
@AlexSkrypnyk, @renovate[bot] and renovate[bot]