Eddy is a template for maintaining a contributed Drupal module or theme on GitHub. Start your extension from it and you get CI on GitHub Actions, a local Drupal site to develop and test against, coding standards checks, and mirroring of the code to Drupal.org.
Eddy isn't for building websites: use Vortex for that. The 2 templates do separate jobs, and a repository uses only 1 of them.
- ⚙️ CI on GitHub Actions - PHP
8.3,8.4and8.5, and Drupalstableon 10, 11 and 12, pluslegacyandcanarytiers on 11 and 12, with code coverage on codecov.io. The setup works with Drupal.org GitLab CI too. - 💻 Local development - a Drupal site built on the PHP of your host by the same commands that CI runs, through
makeor Ahoy, with your development dependencies, suggested extensions and patches. - 🧹 Coding standards - PHPCS, PHPStan, Drupal Rector, Twig CS Fixer, ESLint, Stylelint, CSpell and Prettier.
- 🧪 Tests - PHPUnit Unit, Kernel, Functional and FunctionalJavascript tests, in a local Chrome or a Selenium container, and JavaScript tests with Jest.
- 🚚 Deployment - mirroring of the code and its tags to Drupal.org, or any other git remote, once CI passes.
- 🤖 Renovate - grouped pull requests that keep dependencies up to date.
- 📝 Docs for your extension - README.md and CONTRIBUTING.md templates.
Eddy tests itself the way it tests a project created from it, and deploys to drevops/eddy_destination as a working example.
➡️ See the projects using Eddy.
- Download the latest release and expand it into a new directory.
- Run
php install.phpthere and answer its questions. - Build the site with
make buildorahoy build, then check it withlintandtestthrough the same wrapper. Without a wrapper, the generatedCONTRIBUTING.mdlists thescripts/eddy-toolingandvendor/bin/eddy-*commands that do the same jobs.
➡️ Installation walks through every step, from the download to the first deployment to Drupal.org.
If you use Claude Code, ask Claude to "update scaffold" in your project, and it merges the latest release into your extension through a pull request. You can update by hand too.
➡️ Updating your extension covers both, and Upgrading from 4.x covers the one-off move from a 4.x release.
Contributions are welcome.
➡️ See Contributing for how to build and test the scaffold, run its self-tests, and work on the documentation.