PHPackages                             atendesigngroup/drupal-kickstart - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. atendesigngroup/drupal-kickstart

ActiveProject[Framework](/categories/framework)

atendesigngroup/drupal-kickstart
================================

Drupal 11 kickstart project — managed by drupal-kickstart.sh.

11.x-dev(1y ago)10[18 issues](https://github.com/AtenDesignGroup/drupal-kickstart/issues)[4 PRs](https://github.com/AtenDesignGroup/drupal-kickstart/pulls)ShellCI passing

Since Sep 23Pushed 1mo ago2 watchersCompare

[ Source](https://github.com/AtenDesignGroup/drupal-kickstart)[ Packagist](https://packagist.org/packages/atendesigngroup/drupal-kickstart)[ RSS](/packages/atendesigngroup-drupal-kickstart/feed)WikiDiscussions 11.0.x Synced today

READMEChangelog (5)Dependencies (25)Versions (15)Used By (0)

PROJECT NAME
============

[](#project-name)

- Production URL:
- Aten Shortname: PROJECTCODE

Project Setup
-------------

[](#project-setup)

See `docs` for details on project setup, including:

- Drupal Kickstart
- Grumphp

Overview
--------

[](#overview)

Description of project intention &amp; goals.

People &amp; Roles in Project
-----------------------------

[](#people--roles-in-project)

**Aten**

- Jack Reacher (Project Manager)
- James Bond (Tech Lead)
- Jason Bourne (Developer)

Communication
-------------

[](#communication)

- Slack: #client-PROJECTCODE
- JIRA:

Code Repository
---------------

[](#code-repository)

- Host: Pantheon/Platform.sh/Acquia
- Repo Name: Project Name
- Development URL:
- Repo URL:
- Default Branch: `master`
- Owner: Aten/Client

Hosting
-------

[](#hosting)

**Production**

- **Provider:** Pantheon/Acquia
- **Owner:** Aten/Client

Automated Testing
-----------------

[](#automated-testing)

No testing:

- This project does not currently have automated testing configured.

Has testing:

- This project has automated testing configured.
- Type of testing: Cypress ()
- Location to READ.ME: `web/...`

Theme Information
-----------------

[](#theme-information)

- Base Theme: Prototype
- Custom Theme: `THEME_NAME`
- Location to READ.ME: `web/themes/custom/THEME_NAME/README.md`

Development Workflow
--------------------

[](#development-workflow)

When adding new features to the project, you'll need to create a feature branch, which is commonly named after the Jira ticket number (e.g., JIRA-XXX). You will commit all your code changes to this feature branch and push the branch to the code repository. Once the ticket is ready for QA, it should be merged into the `main` branch, which will then be deployed to the development instance on the hosting platform.

Assign the Jira ticket to a QA team member, provide the link to the development environment, and include instructions on what needs to be tested. Additionally, please ensure that you set up the environment with dummy data to verify that it's functioning correctly before involving the QA team.

Deployment
----------

[](#deployment)

When code is pushed to GitHub, an automated process using GitHub Actions deploys the site to the development environment on Pantheon. Production deployments are still conducted manually and must follow the Pantheon workflow, as they need to go through Test and then Live. When working on an isolated feature that you want to test independently, you can create a feature branch using the following naming convention for your branch (feature/\[JIRA-ISSUE\]). When you push the feature branch to GitHub, it will create a Multi-dev environment based on that code; the development database will be used when creating the Multi-dev environment.

Local Development
-----------------

[](#local-development)

The Drupal project was configured to support DDev out of the box. Developers can quickly begin setting up their local environment by following the instructions below. Please ensure that you've installed [DDev](https://ddev.com/get-started/).

First, let's start by installing the project's composer packages:

```
composer install

```

Now, you'll need to start up the local instance:

```
ddev start

```

Now, you'll need to import the development database to the local environment:

```
ddev import-db local.database.sql.gz

```

Drush aliases are also available. To sync the DB from any Pantheon environment to your local run:

```
ddev drush sql-sync @lapl.[ENVIRONMENT_ID] @self

```

If you get an error around pubkeys, run `ddev auth ssh` and try again.

1. Get your Pantheon.io machine token: a. Login to your Pantheon Dashboard, and [Generate a Machine Token](https://pantheon.io/docs/machine-tokens/) for ddev to use. b. Add the API token to the `web_environment` section in your global ddev configuration at ~/.ddev/global\_config.yaml

```
yaml
  web_environment:
    - TERMINUS_MACHINE_TOKEN=abcdeyourtoken

```

2. `ddev pull pantheon`
3. You can append `--skip-files` or `--skip-db` to the `ddev pull pantheon` command to skip files or database import respectively.

Branch Structure &amp; Sync Workflow
------------------------------------

[](#branch-structure--sync-workflow)

This repository uses two long-lived branches with distinct roles:

BranchPurpose`11.0.x`**Starter template** — the clean, reusable project scaffold. Contains recipes, assets, DDEV commands, and tooling config with `DK_*` token placeholders.`dk-start-build`**Built project** — a real Drupal installation created by running `drupal-kickstart.sh`. Contains the full Drupal codebase (`web/`, `vendor/`, `composer.json`, `config/sync/`).### How the sync works

[](#how-the-sync-works)

When starter-scoped files are changed on `dk-start-build` and pushed, a GitHub Action automatically opens a PR against `11.0.x` containing only those files.

**Files that sync back to `11.0.x`:**

- `recipes/` — Drupal recipes (formulas)
- `assets/` — settings templates, Pantheon assets
- `.ddev/commands/` — custom DDEV commands
- `drupal-kickstart.sh` — the project setup script
- `composer.custom.json`, `composer.patches.json` — Composer configuration
- `grumphp.yml`, `phpcs.xml`, `phpunit.xml`, `eslint.config.js` — tooling config
- `docs/`, `AGENTS.md`, `README.md`

**Files that never sync (build artifacts):**

- `composer.json`, `composer.lock` — generated by `drupal-kickstart.sh`
- `web/` — Drupal core, contrib modules, and themes
- `vendor/` — Composer vendor directory
- `config/sync/` — exported Drupal configuration
- `pantheon.yml`, `private/`, `.env`, `.kickstart.env`

### Token reversal

[](#token-reversal)

`drupal-kickstart.sh` replaces `DK_*` placeholders with real project values during the build (e.g. `DK_COMMIT_PREFIX` → `GRE`). The sync workflow reverses this automatically before opening the PR, so `11.0.x` always contains the original placeholders — never project-specific values.

Token values are stored as **GitHub repository variables** (Settings → Secrets and variables → Actions → Variables):

VariableDescriptionExample`DK_DDEV_NAME`DDEV project name`my-client-site``DK_THEME_NAME`Theme machine name`my_theme``DK_THEME_DESC`Theme display name`My Theme``DK_COMMIT_PREFIX`Commit prefix used in this build`GRE``DK_PHP_VERSION`PHP version`8.3`### Triggering a sync manually

[](#triggering-a-sync-manually)

Go to **Actions → "Sync build → 11.0.x" → Run workflow** (select branch `dk-start-build`). Useful when the automatic push trigger didn't fire or you want to re-sync after updating the repository variables.

---

Theme Development
-----------------

[](#theme-development)

Powered by some of the latest and greatest tools, this package streamlines theme development.

Install the required npm packages:

```
ddev theme-install

```

That's it for installs! You can start developing by running:

```
ddev theme-watch

```

To compile your build files, stop watching and run:

```
ddev theme-build

```

---

Known Issues: `drupal/prototype` Starterkit
-------------------------------------------

[](#known-issues-drupalprototype-starterkit)

Upstream bugs in `drupal/prototype` affecting Drupal 11. Patches in `composer.patches.json` apply automatically on `composer install`.

### 1. SDC strict null validation breaks optional props

[](#1-sdc-strict-null-validation-breaks-optional-props)

**Problem/Motivation:** Drupal 11's `ComponentValidator` rejects `null` for bare types (`type: string`, `type: array`). Prototype component schemas use bare types for optional props, so leaving any optional field empty causes `InvalidComponentException: NULL value found, but a string is required` and breaks page rendering.

**Steps to reproduce:**

1. Create a paragraph of type CTA, Pullquote, Slideshow, Teaser, or Video.
2. Leave at least one optional field (title, caption, link, etc.) blank.
3. View the node — the page throws an `InvalidComponentException`.

**Proposed resolution:** `patches/prototype-sdc-null-safety.patch` — converts bare types to `type: ['string', 'null']` and removes `required` arrays from optional props.

---

### 2. `slideshow.twig` — `'type': loop` resolves to null

[](#2-slideshowtwig--type-loop-resolves-to-null)

**Problem/Motivation:** The default Splide config in `slideshow.twig` uses the bare word `loop` as a value (`'type': loop`). Outside a `{% for %}` block, `loop` is undefined in Twig and evaluates to `null`, producing `data-splide='{"type":null}'`. Splide fails to initialize and the carousel does not function.

**Steps to reproduce:**

1. Add a Slideshow paragraph with at least one slide.
2. Do not pass an explicit `options.type` from the bridge template.
3. Inspect the rendered HTML — `data-splide` contains `"type":null` and the carousel is broken.

**Proposed resolution:** `patches/prototype-sdc-null-safety.patch` — changes `'type': loop` to `'type': 'loop'`.

---

### 3. `Starterkit.php` — class name casing breaks theme generation on Linux

[](#3-starterkitphp--class-name-casing-breaks-theme-generation-on-linux)

**Problem/Motivation:** Drupal's `GenerateTheme` command looks for `Drupal\prototype\StarterKit` (capital K), but the file is named `Starterkit.php` (lowercase k). On Linux's case-sensitive filesystem (including inside DDEV), PSR-4 autoloading silently skips `postProcess()`, leaving the `tests/` directory in the generated theme. Template discovery then picks up test templates over the real bridge templates, breaking paragraph rendering.

**Steps to reproduce:**

1. Run `ddev exec php web/themes/contrib/prototype/generator.php -n my_theme -d "My Theme" -p web/themes/custom` — must run via `ddev exec` to use the Linux container filesystem where case-sensitivity applies.
2. Inspect `web/themes/custom/my_theme/` — the `tests/` directory is present.
3. Enable the theme, add a Slideshow paragraph to a node — the test template renders instead of the real bridge template.

**Proposed resolution:** `patches/prototype-starterkit-class-name-change.patch` — renames `src/Starterkit.php` to `src/StarterKit.php`, updates the class declaration, and corrects the `.starterkit.yml` ignore patterns.

###  Health Score

24

—

LowBetter than 31% of packages

Maintenance46

Moderate activity, may be stable

Popularity2

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity33

Early-stage or recently created project

 Bus Factor1

Top contributor holds 55.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

647d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/720018?v=4)[James Nettik](/maintainers/jnettik)[@jnettik](https://github.com/jnettik)

---

Top Contributors

[![grgwrd](https://avatars.githubusercontent.com/u/31477460?v=4)](https://github.com/grgwrd "grgwrd (31 commits)")[![joelsteidl](https://avatars.githubusercontent.com/u/67734?v=4)](https://github.com/joelsteidl "joelsteidl (25 commits)")

### Embed Badge

![Health badge](/badges/atendesigngroup-drupal-kickstart/health.svg)

```
[![Health](https://phpackages.com/badges/atendesigngroup-drupal-kickstart/health.svg)](https://phpackages.com/packages/atendesigngroup-drupal-kickstart)
```

###  Alternatives

[govcms/govcms

GovCMS Drupal Distribution

198102.2k3](/packages/govcms-govcms)[az-digital/az_quickstart

Arizona Quickstart

52280.4k3](/packages/az-digital-az-quickstart)[thunder/thunder-distribution

The thunder distribution

51661.9k3](/packages/thunder-thunder-distribution)[voidagency/vactory_starter_kit

Vactory is a custom Drupal profile which is developed and released by VOID Agency.

1021.6k](/packages/voidagency-vactory-starter-kit)[goalgorilla/open_social

Open Social is a distribution for building social communities and intranets.

194463.2k](/packages/goalgorilla-open-social)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
