elevatedthird / paragon-base
A Composer-based installation template for the Paragon Drupal Distribution
Package info
github.com/elevatedthird/paragon-base
Type:project
pkg:composer/elevatedthird/paragon-base
Requires
- bower-asset/chosen: ^1.8
- bower-asset/lazysizes: ^5.2
- composer/installers: ^1.10
- cweagans/composer-patches: ~1.0
- drupal/address: ^1.0
- drupal/admin_toolbar: ^2.0
- drupal/advagg: ^4.0
- drupal/allowed_formats: ^1.1
- drupal/backup_migrate: ^5.0@RC
- drupal/better_exposed_filters: ^5.0@beta
- drupal/block_field: ^1.0@alpha
- drupal/chosen: ^2.0
- drupal/ckeditorheight: ^1.0
- drupal/coffee: ^1.0
- drupal/components: ^2.2
- drupal/config_update: ^1.0
- drupal/console: ~1.9
- drupal/core: 8.9.13
- drupal/core-composer-scaffold: ~9.1.3
- drupal/csv_serialization: ^2.0@beta
- drupal/devel: ^2.0
- drupal/embed: ^1.0
- drupal/entity: ^1.0
- drupal/entity_browser: ^2.5
- drupal/entity_embed: ^1.0
- drupal/entity_reference_revisions: ^1.3
- drupal/environment_indicator: ~4.0.0
- drupal/fast_404: ^2.0@alpha
- drupal/field_group: ^3.0
- drupal/field_hidden: ^1.0
- drupal/field_tools: dev-1.x
- drupal/focal_point: ^1.0
- drupal/gin: ^3.0@alpha
- drupal/gtm: ^1.6
- drupal/http_cache_control: ^2.0
- drupal/imageapi_optimize: ~4.0.0@beta
- drupal/imageapi_optimize_gd: ^2.0@beta
- drupal/imageapi_optimize_webp: ^2.0@beta
- drupal/inline_entity_form: ^1.0
- drupal/layout_builder_browser: ^1.1
- drupal/layout_builder_modal: ^1.1
- drupal/layout_builder_restrictions: ^2.7
- drupal/lazy: ^3.4
- drupal/lb_claro: ^1.0@beta
- drupal/link_attributes: ^1.0
- drupal/linkit: ~6.0.0@beta
- drupal/login_security: ^1.0
- drupal/mailsystem: ^4.0
- drupal/markup: ^1.0
- drupal/media_responsive_thumbnail: ^1.0
- drupal/memcache: ^2.0
- drupal/menu_block: ^1.0
- drupal/metatag: ^1.0
- drupal/name: ^1.0
- drupal/paragon: dev-1.x
- drupal/paragon_adminkit: ^1.0@alpha
- drupal/paragon_themekit: ^1.0@alpha
- drupal/paragraphs: ^1.0
- drupal/paragraphs_browser: ^1.0
- drupal/path_redirect_import: ^1.0@beta
- drupal/pathauto: ^1.0
- drupal/purge: ^3.0@beta
- drupal/redirect: ^1.0
- drupal/robotstxt: ^1.4
- drupal/scheduler: ^1.0
- drupal/scheduler_content_moderation_integration: ^1.3
- drupal/search_api: ^1.0
- drupal/search_api_solr: ^1.0
- drupal/seckit: ~2.0.0@RC
- drupal/security_review: ^1.0
- drupal/shield: ^1.0
- drupal/simple_sitemap: ^3.0
- drupal/site_settings: ^1.0
- drupal/sitemap: ^2.0@beta
- drupal/smart_trim: ^1.0
- drupal/svg_image_field: ^1.2
- drupal/svg_upload_sanitizer: ^1.0@alpha
- drupal/swiftmailer: ^2.0
- drupal/system_status: ^2.0
- drupal/twig_field_value: ~2.0.0
- drupal/ultimate_cron: ^2.0
- drupal/username_enumeration_prevention: ^1.1
- drupal/views_bulk_edit: ^2.0
- drupal/views_bulk_operations: ^3.8
- drush/drush: ~10.0
- npm-asset/jquery-ui-touch-punch: dev-master
- oomphinc/composer-installers-extender: ^2.0
- symfony/css-selector: ~3.3
- zaporylie/composer-drupal-optimizations: ^1.1
Requires (Dev)
- drupal/drupal-extension: ^3.2
- geerlingguy/drupal-vm: ~6.0.0
Conflicts
- dev-master
- 8.1.0-alpha31
- 8.1.0-alpha30
- 8.1.0-alpha29
- 8.1.0-alpha28
- 8.1.0-alpha27
- 8.1.0-alpha26
- 8.1.0-alpha25
- 8.1.0-alpha24
- 8.1.0-alpha23
- 8.1.0-alpha22
- 8.1.0-alpha21
- 8.1.0-alpha20
- 8.1.0-alpha19
- 8.1.0-alpha18
- 8.1.0-alpha17
- 8.1.0-alpha16
- 8.1.0-alpha15
- 8.1.0-alpha14
- 8.1.0-alpha13
- 8.1.0-alpha12
- 8.1.0-alpha10
- 8.1.0-alpha9
- 8.1.0-alpha8
- 8.1.0-alpha7
- 8.1.0-alpha6
- 8.1.0-alpha5
- 8.1.0-alpha4
- 8.1.0-alpha3
- 8.1.0-alpha2
- 8.1.0-alpha1
- 8.1.0-a
- 4.1.0
- 4.0.2
- 4.0.0
- 3.3.3
- 3.3.2
- 3.3.1
- 3.3.0
- 3.2.1
- 3.2.0
- 3.1.0
- 3.0.0
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.1
- 2.1.0
- 2.0.0
- 1.0-alpha2
- dev-E3001-546
- dev-dependabot/composer/psy/psysh-0.12.19
- dev-fast404-extension-fix
- dev-dependabot/composer/enshrined/svg-sanitize-0.22.0
- dev-drupal-11
- dev-latest_10_missing_gib_lb_patch
- dev-feature/remove-allowed-formats
- dev-develop
- dev-feature/E3003-49-install-layout-builder-lock
- dev-feature/E3003-50-install-layout-builder-limit
- dev-feature/starter-components
- dev-19-setup-tugboat-qa
- dev-17-remove-field_meta_summary-from-landing-page-content-type
This package is auto-updated.
Last update: 2026-05-17 16:33:47 UTC
README
Paragon is a Drupal distribution focused on providing a clean starting point for site builds with just the right amount of baked in configuration.This allows developers to focus on building custom functionality, rather than recreating the same standard set of baseline features they’ve built 100 times before.
The intent of this distribution is to create a Drupal install that will be treated as an artifact and maintained independently of this project after the initial installation. As such, rather than making this an official install profile, Paragon is instead managed as a Composer template that heavily leverages drupal/core-composer-scaffold and also includes exported configuration that can be used to install the site.
Prerequisites
- Download DDEV if it is not already installed.
- Access to Elevated Third Github organization, Paragon-base repository and SSH key setup.
- You must be using Composer 2.
Setup instructions
Step #1: Clone repository
- Run the following command:
composer create-project elevatedthird/paragon-base [install_directory_name]which will clone down the composer template and create all necessary files. - You will prompted to select a hosting environment for your project. Select 'custom' if you don't want platform specific files. You can set up hosting requirements later by running
composer setup-platform
Step #2: Project setup
- Rename the the app in the
.ddev/config.ymlfile ddev startddev composer installddev composer npm-install
Step #3: Install Drupal
- Install the site:
ddev drush si --existing-config --site-name=[SITE_NAME] --account-name=root --account-pass=[PASSWORD] -vv -y - Once install completes, remove the automatically generated database connection details that have most likely been appended to the bottom of
settings.php. - Install starter components:
ddev drush propel:init - Build the theme:
ddev vite:build
Step #4: Set up Solr Search
ddev drush pm:enable search_api_solr_admin
- This module is ignored in settings.php
- Create a new Solr server connection in the UI
- Follow the ddev-solr steps to connect to Solr
- Upload the config set to Solr and create the collection.
ddev drush --numShards=1 search-api-solr:upload-configset [YOUR_SERVER_NAME]
Essential DDEV commands
ddev xdebug onddev xdebug offddev viteddev vite:build
E3 Github Workflows
By default, all Paragon projects have Github Actions enabled. To disable, rename the .github/workflows/main.yml to main.disable
- Ensure you have invited
hosting@elevatedthird.comto your project. - Set up the
.envfile located in the project root. These variables will be used as settings for the Github Workflows. - If your site is on Pantheon, you will need to uncomment and fill out the
PANTHEON_SITEvar. - If you are NOT using kinetic, change the
THEME_NAMEvariable to the name of the active theme's folder. Also, change the paths to the theme in thebuild-themeandnpm-installscripts in composer.json
Specific Platform Instructions
Acquia
- Ensure you have a hooks/dev/post-code-update/drush-deploy.sh
- Ensure that the code below is present in the settings.php.
if (isset($_ENV['AH_SITE_ENVIRONMENT'])) { if (file_exists($app_root . '/' . $site_path . '/settings.acquia.php')) { include $app_root . '/' . $site_path . '/settings.acquia.php'; } }
Pantheon
- Ensure you change the
docrootfolder name toweb - Change
docroottowebin yourcomposer.jsonfile - Ensure that the code below is present in the settings.php.
if(isset($_ENV['PANTHEON_ENVIRONMENT'])) { if (file_exists($app_root . '/' . $site_path . '/settings.pantheon.php')) { include $app_root . '/' . $site_path . '/settings.pantheon.php'; } }
Platform
- Ensure your
.platform.app.yamldeploy hook looks like this
deploy: | set -e php ./drush/platformsh_generate_drush_yml.php cd docroot drush deploy
- Ensure that the code below is present in the settings.php.
if (isset($_ENV['PLATFORM_PROJECT'])) { if (file_exists($app_root . '/' . $site_path . '/settings.platformsh.php')) { include $app_root . '/' . $site_path . '/settings.platformsh.php'; } }
Tugboat Integration
By default, Paragon creates a .tugboat folder containing configuration related to Tugboat QA. You must set up a tugboat project and connect the Github repo to it.
Claude Code
Paragon ships with a Claude Code setup designed to run inside the DDEV web container. The following files drive the integration.
CLAUDE.md
A CLAUDE.md template lives in the project root. It contains project-specific instructions that Claude reads at the start of every session — things like the site name, key modules, hosting environment, and known gotchas. Fill it out before using Claude Code on the project. Claude will refuse to proceed until the template status is marked complete.
Permission rules (.claude/settings.json)
The project .claude/settings.json defines three tiers of permissions:
Deny — Claude is blocked from running these automatically and cannot ask for approval either. Covers destructive or sensitive operations:
- Reading
.env,settings.php,settings.local.php, certificates, and key files drush sql-drop,drush site-install, and any Drush remote aliases (@prod, etc.)rm -rf,git push --force,git merge,git rebase- Acquia CLI (
acli) commands and.acquiafiles
Ask — Claude must prompt for approval before running:
composer require / update / removegit commitandgit push
Allow — Claude can run these without prompting:
- Safe Drush read/cache/config commands (
drush status,drush cr,drush config:*,drush pm:list,drush updb,drush watchdog:show, etc.) - Code quality tools:
phpcs,phpstan,phpunit
Mounting your host ~/.claude into the container
docker-compose.claude-home.yaml provides commented-out volume definitions that shim your host machine's Claude config into the DDEV web container. This lets Claude inside the container share your global commands, skills, and plugins without duplicating them. Two options are available — uncomment one:
# Option 1: full ~/.claude (settings, history, sessions, commands, plugins) - ${HOME}/.claude:/root/.claude:ro # Option 2: granular — commands and plugins only - ${HOME}/.claude/commands:/root/.claude/commands:ro - ${HOME}/.claude/plugins:/root/.claude/plugins:ro
The volume is mounted read-only so the container cannot modify your host Claude config.
Per-project .claude.json persistence
config.claude-code.yaml runs a post-start hook that creates a .ddev/claude-code/.claude.json file (if it doesn't exist) and symlinks it to ~/.claude.json inside the container. This keeps any project-level Claude state (conversation history, approvals) in the repo's .ddev folder rather than lost on container rebuild.