--- myst: html_meta: "description": "Add-on and project configuration pipeline" "property=og:description": "Add-on and project configuration pipeline" "property=og:title": "Add-on and project configuration pipeline" "keywords": "Volto, Plone, Volto add-ons, Volto Project" --- # Add-on and project configuration pipeline Volto build its configuration out of Volto's configuration defaults, add-ons configuration, and project configuration. This is called the configuration pipeline. ![Volto configuration pipeline](./configuration-pipeline.png) It's applied in this particular order. Configurations can be overriden at a later stage. ## All-in with add-on approach You can take full advantage of the configuration pipeline and do not use the project configuration at all. You can create a "policy" core product for your project, and use another for your project's theme. This way, the project itself renders as a simple boilerplate, expendable or rebuild-able at any time. You can also reuse add-ons across projects, and adjust them using another add-ons, depending on the other projects requirements. ## Define your add-ons programatically Having the `addons` key in `package.json` is not flexibile enough in complex scenarios. You can load your add-ons programatically, outside `package.json` using `volto.config.js` like this: ```js module.exports = { addons: ['@eeacms/volto-accordion-block'] } ``` This is a scape hatch where you can define using code the add-ons that are used the current project. Take a look: ```js let addons = []; if (process.env.MY_SPECIAL_ENV_VAR) { // Does not have to be RAZZLE_ addons = ['volto-my-awesome-special-add-on']; } if (process.env.MARKER_FOR_MY_SECRET_PROJECT) { // Does not have to be RAZZLE_ addons = [ '@kitconcept/volto-heading-block', '@kitconcept/volto-slider-block', 'volto-my-secret-project-add-on', ]; } module.exports = { addons: addons, }; ``` They are added to the existing ones in `package.json`.