---
url: 'https://dxpr.com/hc/documentation/learn-dxpr-builder/development/contributing'
title: 'Contributing | DXPR'
author:
  name: docs-sync
  url: 'https://dxpr.com/users/docs-sync'
date: '2026-10-23T14:31:17+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: 'Development setup and the contribution workflow'
tags:
  - Tooling
image: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
published: true
og:
  site_name: DXPR
  updated_time: '2026-10-23T14:31:17+0000'
  'image:alt': 'DXPR, powered by Drupal: AI-powered Drupal for marketers.'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      mainEntity: {  }
    -
      '@type': TechArticle
      headline: Contributing
      description: 'Development setup and the contribution workflow'
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-23T14:31:17+0000'
      dateModified: '2026-10-23T14:31:17+0000'
      author:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      mainEntityOfPage: 'https://dxpr.com/hc/documentation/learn-dxpr-builder/development/contributing'
      articleSection: Tooling
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/hc/documentation/learn-dxpr-builder/development/contributing'
      description: 'Development setup and the contribution workflow'
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Home
            item: 'https://dxpr.com/'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: en
---
[Help Center](/hc)/[Documentation](/hc/documentation) /[Learn DXPR Builder](/hc/documentation/learn-dxpr-builder) /[Extend](/hc/documentation/learn-dxpr-builder/extend) /[Tooling](/hc/documentation/learn-dxpr-builder/extend/tooling) # Contributing.

Development setup and the contribution workflow

 Learn DXPR BuilderExtendTooling

   ## In this guide

DXPR Builder development happens on GitHub at [github.com/dxpr/dxpr\_builder](https://github.com/dxpr/dxpr_builder). All contributions follow the workflow described in the repository's [CONTRIBUTING.md](https://github.com/dxpr/dxpr_builder/blob/3.x/CONTRIBUTING.md).

## Git workflow

1. Every pull request must be linked to a GitHub issue
2. Branch naming convention: `person/target-branch/#issue-description` (e.g. `jur/3.x/#42-fix-carousel-autoplay`)
3. Write atomic commits following the [alphagov Git styleguide](https://github.com/alphagov/styleguides/blob/master/git.md)
4. Pull requests must contain a short description of the solution
5. Keep changes inside the scope of the issue: no unrelated formatting or refactoring

## Code owner

[@jjroelofs](https://github.com/jjroelofs) is the code owner. No pull requests can be merged without their review.

## Coding standards

- PHP: [Drupal coding standards](https://www.drupal.org/docs/develop/standards)
- JavaScript: ES6+ only (no `var`, no jQuery in new code). Follow the [Airbnb JavaScript coding standards](https://github.com/airbnb/javascript) with project exceptions
- CSS: follow the [Design System](https://github.com/dxpr/dxpr_builder/blob/3.x/DESIGN-SYSTEM.md) for custom properties and token naming
- A change to an element's `showed` method must include the updated `dxpr_frontend.js`. Generate it from the full output the editor prints to the browser console when you click a container's save button.
- New features need QA Analytics coverage.

Run `npm install` once after cloning. It installs the Husky pre-commit hook, which lints your staged files; see [Testing](/hc/documentation/learn-dxpr-builder/development/testing).

## Running E2E tests

Tests are triggered via slash commands in PR comments:

| Command | Description |
|---|---|
| `/e2e` | Run the full BS5 editor and anonymous suites |
| `/e2e groups=group-name` | Run specific test groups |
| `/e2e tests=ClassName` | Run specific test classes |
| `/e2e-bs3` | Run the BS3 editor suite |
| `/e2eV2` | Run the BS5 suites on the DXPR CMS stack |
| `/e2e maven_ref=branch` | Test with a custom `dxpr_maven` branch |

When a builder change needs a test change, the QA engineer updates `dxpr_maven` on a branch, and you run `/e2e maven_ref=<branch>` on your pull request. The builder pull request merges first, then the `dxpr_maven` one.

## Before requesting review

1. Implement the change
2. Test carefully
3. Do a cleanup/refactoring round
4. Re-test to confirm nothing broke
5. Commit and push with clean git history
6. Check that linter checks pass
7. Comment `/e2e` on the PR to run regression tests
8. Request review after all checks pass