PHPackages                             locomotivemtl/charcoal-project-boilerplate - 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. locomotivemtl/charcoal-project-boilerplate

ActiveProject

locomotivemtl/charcoal-project-boilerplate
==========================================

A Charcoal Project Boilerplate

0.6.2(3y ago)264593[2 PRs](https://github.com/locomotivemtl/charcoal-project-boilerplate/pulls)MITPHPPHP ^7.4 || ^8.1

Since Mar 2Pushed 3y ago13 watchersCompare

[ Source](https://github.com/locomotivemtl/charcoal-project-boilerplate)[ Packagist](https://packagist.org/packages/locomotivemtl/charcoal-project-boilerplate)[ Docs](https://charcoal.locomotive.ca/)[ RSS](/packages/locomotivemtl-charcoal-project-boilerplate/feed)WikiDiscussions main Synced 2mo ago

READMEChangelogDependencies (10)Versions (20)Used By (0)

Charcoal Project Boilerplate
============================

[](#charcoal-project-boilerplate)

> ⚠️ This skeleton is built for [`locomotivemtl/charcoal-*`](https://packagist.org/packages/locomotivemtl/) and is deprecated in favour of [`charcoal/boilerplate`](https://github.com/charcoalphp/boilerplate).

The goal of this project is to provide a fully working "boilerplate" (empty *skeleton* project) using the Charcoal framework.

It can also optionally set up the [Locomotive Boilerplate](https://github.com/locomotivemtl/locomotive-boilerplate) for the frontend.

Table of Content
================

[](#table-of-content)

- [How to Install](#how-to-install)
    - [1. Installing boilerplate](#1-installing-boilerplate)
    - [2. Test your installation](#2-test-your-installation)
    - [3. Set up a database storage](#3-set-up-a-database-storage)
    - [4. Set the project name](#4-set-the-project-name)
    - [5. Set up `charcoal-admin`](#5-set-up-charcoal-admin)
    - [6. (Optional) Install `locomotive-boilerplate`](#6-optional-install-locomotive-boilerplate)
- [Going further](#going-further)
    - More config customizations
    - Creating a custom template
    - Using objects
    - Customizing the backend
- [Dependencies and requirements](#dependencies-and-requirements)
    - [The charcoal modules](#the-charcoal-modules)
        - [Status matrix](#status-matrix)
- [What's inside this Boilerplate](#whats-inside-this-boilerplate)
- [Development](#development)
    - [Development dependencies](#development-dependencies)
    - [Continuous Integration](#continuous-integration)
    - [Coding Style](#coding-style)
    - [Authors](#authors)

Intended scope
==============

[](#intended-scope)

Although it is fully ready to use, this boilerplate is still incomplete. It does not *yet* showcase all of the Charcoal features and therefore require a lot of manual tinkering for options.

Here is a short "mission statement" of what is expected to be accomplished with this project:

- A fully automated setup process.
    - Optionally install `locomotive-boilerplate` for the frontend.
- Translation (l10n) fully working with `charcoal-translator`.
    - Default data also provided in english and french.
    - ...and spanish and more...
- A working "backend" with `charcoal-admin`.
    - User set up automatically.
    - With a default configuration that allows to manage CMS objects (sections, news, events, blogs, locations, etc.)
    - Permission system working and enabled.
    - Notification system working and enabled.
    - Revisioning system working and enabled.
    - Media library working and enabled.
    - Built-in help (doc) system working and enabled.
- A few default, common templates (mustache) built-in.
    - Home page, with a few options and widgets (like carousel) or similar.
    - News list / news details, with attachment support.
    - Calendar (event list) with ajax options / event details, with attachment support.
    - Blog / article details, with attachment support and options to enable comments, and ajax actions
    - Contact, with a contact form that saves to a database and send a confirmation email depending to category options, with ajax actions.
    - Map, with locations by categories.
- Metadata 100% fully working on every pages and for every objects.
    - Use objects' metadata information, which all are editable in `charcoal-admin`.
- Provide an optimized set of SEO features.
- Search enabled
    - Results returned for all types of cms objects (sections, news, events, blogs, locations, etc.)
    - Used keywords, which all are editable in `charcoal-admin`.
    - Also search in attachments.
    - Auto-complete enabled and working.
- 100% tested with PHPUnit.

How to Install
==============

[](#how-to-install)

To start a Charcoal project with this Boilerplate, simply:

1. **Installing boilerplate**
-----------------------------

[](#1-installing-boilerplate)

Charcoal uses the Composer `create-project` command to install the boilerplate:

```
★ composer create-project --prefer-dist locomotivemtl/charcoal-project-boilerplate acme
```

Replace "acme" with the desired directory name for your new project.

> **About the Document Root**
>
> 👉 The project should *not* be cloned directly in a web-accessible directory. The web server should be configured to serve the `www/` folder directly (or through a symlink). The other folders (`vendor/`, `src/`, `templates/`, `metadata/`, `config/`, etc.) should therefore not be available from the web server (kept outside the document root).

2. **Test your installation**
-----------------------------

[](#2-test-your-installation)

A quick server can be started using the PHP builtin server:

```
★ cd www
★ php -S localhost:8080
```

Point your browser to `http://localhost:8080/` and you should see the boilerplate's default home page.

[![Boilerplate homepage](docs/images/boilerplate-home.png)](docs/images/boilerplate-home.png)

How to change the default page and add routes/templates is explained later in this README.

> Hint: the recommended way is from the admin, by adding pages (sections).

3. **Set up a database storage**
--------------------------------

[](#3-set-up-a-database-storage)

The next step requires a custom configuration file. It is recommended to use `config/config.local.json` and making sure it is not committed to source control:

```
★ cp config/config.sample.json config/config.local.json
```

Then edit the `config/config.local.json` file with this information.

If your project does not require any database storage, use a database in memory such as SQLite by adding the following to the `config/config.local.json` file:

```
{
    "databases": {
        "default": {
            "type": "sqlite",
            "database": ":memory:"
        }
    },
    "default_database": "default"
}
```

If your project uses MySQL, create an empty database and ensure a SQL user has the proper permissions for this database. Then add the following to the `config/config.local.json` file:

```
{
    "databases": {
        "default": {
            "type": "mysql",
            "hostname": "127.0.0.1",
            "database": "foobar",
            "username": "foo_bar",
            "password": "F00$BâR123"
        }
    },
    "default_database": "default"
}
```

4. **Set the project name**
---------------------------

[](#4-set-the-project-name)

By default, the project is named "Acme" and namespaced under `App` and is autoloaded by Composer using the [PSR-4 autoloading standard](https://www.php-fig.org/psr/psr-4/).

There are a few occurrences of "Acme" in the boilerplate:

- [config/admin.json](config/admin.json): See `admin.title`.
- [config/config.json](config/config.json): See `project_name` and `cache.prefix`.

You should also change the information of the Composer package:

- [composer.json](composer.json): See `name`.

5. **Set up charcoal-admin**
----------------------------

[](#5-set-up-charcoal-admin)

A quick-and-dirty script is provided to install charcoal-admin automatically:

```
★ sh ./build/scripts/install-charcoal-admin.sh
```

Point your browser to  and you should see the Charcoal's admin login screen.

[![Admin login](docs/images/admin-login.png)](docs/images/admin-login.png)

The next step to customize the *backend* is to configure the main menu, as well as the various admin options. See the `config/admin.json` file for details.

> Refer to the `charcoal-admin` help for more information.

6. **(Optional) Install `locomotive-boilerplate`)**
---------------------------------------------------

[](#6-optional-install-locomotive-boilerplate)

Another quick-and-dirty script is provided to install the locomotive frontend, from its github repository.

```
★ sh ./build/scripts/install-locomotive-boilerplate.sh
```

> For more information about the `locomotive-boilerplate` frontend module: visit

Dependencies and Requirements
=============================

[](#dependencies-and-requirements)

- [`PHP 7.4+`](http://php.net)
    - `ext-json`
    - `ext-pdo`
    - `ext-spl`
    - `ext-mbstring`

External libraries
------------------

[](#external-libraries)

Most Charcoal features are built on top of proven, open-source technologies:

- **Composer** (Deployment and auto-loading)
- **Slim** (PSR-7 App Framework)
- **FastRoute** (Router)
- **Pimple** (DI Container, from symfony)
- **Mustache** (Templating Engine)
    - Optionally supports **Twig**, from symfony
- **PDO / MySQL** (Database Storage)
- **Stash** (PSR-6 Cache)
- **CLImate** (Terminal Utility, from the php league)
- **Flysystem** (File system abstraction, from the php league)
- **Symfony Translation** (Localization Tools)
- **Laminas ACL** (Permissions Management)
- **PHPmailer** (Email Transport)
- **Monolog** (PSR-3 Logger)
- **PHPUnit** (Unit Testing)
- **APIGen** (API Documentation)
- **PHP Code Sniffer** (Coding Standards)
- **jQuery** (Javascript Framework)
- **Bootstrap** (CSS Framework)
- **TinyMCE** (HTML Editor)
- **elFinder** (File Manager)
- **Github** (Source control)
- **Travis** (Continuous Integration)

The Charcoal modules
--------------------

[](#the-charcoal-modules)

- [charcoal-admin](https://github.com/locomotivemtl/charcoal-admin)
    - The backend, or control panel.
- [charcoal-app](https://github.com/locomotivemtl/charcoal-app)
    - App components based on Slim.
- [charcoal-attachment](https://github.com/locomotivemtl/charcoal-attachment)
    - Additional attachments to content objects.
- [charcoal-cms](https://github.com/locomotivemtl/charcoal-cms)
    - CMS objects (Section, News, Events, etc.)
- [charcoal-config](https://github.com/locomotivemtl/charcoal-config)
    - Base configuration system.
- [charcoal-core](https://github.com/locomotivemtl/charcoal-core)
    - Core objects, Model, Source.
- [charcoal-email](https://github.com/locomotivemtl/charcoal-email)
    - Email utilities, based on phpmailer.
- [charcoal-factory](https://github.com/locomotivemtl/charcoal-factory)
    - Dynamic objects creation.
- [charcoal-image](https://github.com/locomotivemtl/charcoal-image)
    - Image manipulation and effects.
- [charcoal-object](https://github.com/locomotivemtl/charcoal-object)
    - Object definition (Content and UserData; based on Model), behaviors and tools.
- [charcoal-property](https://github.com/locomotivemtl/charcoal-property)
    - Metadata's properties.
- [charcoal-translator](https://github.com/locomotivemtl/charcoal-translator)
    - Translation utilities, based on Symfony.
- [charcoal-ui](https://github.com/locomotivemtl/charcoal-ui)
    - Ui objects (Form, Menu, Dashboard, Layout, etc.)
- [charcoal-user](https://github.com/locomotivemtl/charcoal-user)
    - User definition, authentication and authorization (based on Laminas ACL).
- [charcoal-validator](https://github.com/locomotivemtl/chracoal-validator)
    - Data validation.
- [charcoal-view](https://github.com/locomotivemtl/charcoal-view)
    - View renderer. (mustache, twig, etc.)

### Status matrix

[](#status-matrix)

ModuleVersionTravisScrutinizerInsightsCoverallsPHPDocApiGen**admin**[![version](https://camo.githubusercontent.com/6d041d8ca7de769bf0bfc38cf6f00f32c34237a91dda3483d90d379162792e45/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d61646d696e2e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/6d041d8ca7de769bf0bfc38cf6f00f32c34237a91dda3483d90d379162792e45/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d61646d696e2e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/ecdc44485ed92acfa325fd99793c9e81c2c5615a0899c7f56cd39e55050f0f1f/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d61646d696e2e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-admin)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/be84400fcfbd1a3f34e2108abddfe7d14820b3143af10872c8bb7ba83cf44300/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d61646d696e2f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-admin/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/8759cabff846d4cfde2efefb492e65d4957f12a71749dfc5b399742f237d0fab/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f30303430326265352d663862622d343237392d383962382d3365316533323438313738612f6d696e692e706e67)](https://insight.sensiolabs.com/projects/00402be5-f8bb-4279-89b8-3e1e3248178a)[![Coverage Status](https://camo.githubusercontent.com/c473b0dd890de90eda943d2316db9acd8095c82bb0fbcac3b81cf4308070c73c/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d61646d696e2f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-admin?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-admin/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-admin/apigen/master/)**app**[![version](https://camo.githubusercontent.com/ba708505a45c53939ca7a6f7b0b29c4e3d44900a0b34e687418296ce35b619c6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6170702e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/ba708505a45c53939ca7a6f7b0b29c4e3d44900a0b34e687418296ce35b619c6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6170702e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/fba9c037a24a9556bb3f0cc462ef03901ced336986e0c842be947eeda3269b76/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6170702e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-app)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/5161ea4114123ef1eba06f5505851864528ae803ea026b4a82fc02f92e2f65f7/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6170702f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-app/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/02f12e4603d7eb24de690ebb6a7d977d2e501f7c5d7123ce9feb88ba8a075e17/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f35333362353739362d376536392d343261372d613034362d3731333432313436333038612f6d696e692e706e67)](https://insight.sensiolabs.com/projects/533b5796-7e69-42a7-a046-71342146308a)[![Coverage Status](https://camo.githubusercontent.com/3287c510e33cb3dfb4d239e0f026ba0875d405fd037e1ce2fd12496fdd30d16b/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d6170702f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-app?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-app/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-app/apigen/master/)**attachment**[![version](https://camo.githubusercontent.com/38c546cfdfe2e44168a0c0039e6d3511b7a7670781f835bd75588f9c057ac3f9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6174746163686d656e742e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/38c546cfdfe2e44168a0c0039e6d3511b7a7670781f835bd75588f9c057ac3f9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6174746163686d656e742e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/bf9e8d0393364050199e1a86dd058535cc8846712b9033b2ebc0cf39b3f84a60/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6174746163686d656e742e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-attachment)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/1bd6d2ea5ff556c268254d985f2545b85fcbaf8e5636e439d9937a9fd1868f3a/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6174746163686d656e742f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-attachment/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/a4b1346c92ce5d381ef5ca4c0b650dde3b0930cf422c35c36d0c85905803e1c1/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f30393837366439352d646139642d346332332d383936662d3930346265333336386339392f6d696e692e706e67)](https://insight.sensiolabs.com/projects/09876d95-da9d-4c23-896f-904be3368c99)[![Coverage Status](https://camo.githubusercontent.com/9146dbab057f99d97aab749b864252db468e2357c6eb29e93cbdba8a88a90da4/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d6174746163686d656e742f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-attachment?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-attachment/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-attachment/apigen/master/)**cms**[![version](https://camo.githubusercontent.com/9b10f1fbfd881a9ee3101b7d1f2a3ace60daa5d04415dd32ee0e4728fd356317/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636d732e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/9b10f1fbfd881a9ee3101b7d1f2a3ace60daa5d04415dd32ee0e4728fd356317/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636d732e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/79cdc9cf5e4a1fec52aeef5fa1ac58c465d964845a37c89e661b32916d3f90dc/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636d732e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-cms)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/133330fa13c3a0cda4f218d9ecb3c8c59a5d59eb44e5146d553a5cc2df3a3d7a/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636d732f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-cms/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/5a9794e4ffdda19f4892e255785026c67188b635d267f7f10e469f2e76a21432/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f34346438643236342d323037622d343137642d626362642d6464353232373466633230312f6d696e692e706e67)](https://insight.sensiolabs.com/projects/44d8d264-207b-417d-bcbd-dd52274fc201)[![Coverage Status](https://camo.githubusercontent.com/1f5b275ca5ea091478dcf6d2d2b9f4f36778f1912b5415897ddedd8c739b6460/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d636d732f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-cms?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-cms/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-cms/apigen/master/)**config**[![version](https://camo.githubusercontent.com/787032cb7be4df556f9daea4b39017f81158350661efd78ebc9cddbcda7e36c4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636f6e6669672e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/787032cb7be4df556f9daea4b39017f81158350661efd78ebc9cddbcda7e36c4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636f6e6669672e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/9b72543ce520dbfe0b21af2dc1e76a0526086c09f52e7228cc10443c915400df/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636f6e6669672e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-config)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/38a012176239c94901e9a2bc108e59b41116aef5c62b041abaf067af940dd5df/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636f6e6669672f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-config/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/cbb249e380e9652e93221af09d4f2b1c53288d676d75b021157cf81725186624/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f32376164323035662d343230382d346661362d396463662d3533346233613163306161612f6d696e692e706e67)](https://insight.sensiolabs.com/projects/27ad205f-4208-4fa6-9dcf-534b3a1c0aaa)[![Coverage Status](https://camo.githubusercontent.com/ef779087052b2534fbaee85707b2af3cd870a24888ad537684a90d2990fb202b/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d636f6e6669672f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-config?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-config/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-config/apigen/master/)**core**[![version](https://camo.githubusercontent.com/cf71accc51dc53f0867834a1fb64a31634d2f9ab8b9379a58a6802872b964a66/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636f72652e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/cf71accc51dc53f0867834a1fb64a31634d2f9ab8b9379a58a6802872b964a66/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636f72652e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/a3dfab807697a8aeefc699560f0c09bb1b76637e56c4605d193e54c21dc7b0cb/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636f72652e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-core)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/095c8ccdc4217fce29a6a54473caf3900ad03133548d97264910b6ee73aaf2ac/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d636f72652f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-core/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/e3b9bc6a40d84edfc93602601c63f6e74fd2ac041e2b3042eb8c7c5f4628f289/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f61623135663662302d323036332d343435652d383164372d3235373562393139623061622f6d696e692e706e67)](https://insight.sensiolabs.com/projects/ab15f6b0-2063-445e-81d7-2575b919b0ab)[![Coverage Status](https://camo.githubusercontent.com/93b1a0d4ff4f6537d918d44511c8736130b6ba227fa3663395268960e886cc68/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d636f72652f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-core?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-core/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-core/apigen/master/)**email**[![version](https://camo.githubusercontent.com/5db57919b7242aebff78abd8a1000ff4f87f97024107ecaed163c8dedbe17d0f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d656d61696c2e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/5db57919b7242aebff78abd8a1000ff4f87f97024107ecaed163c8dedbe17d0f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d656d61696c2e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/e80bab459d3222860056906cd4428cea840b3eef1f2bc9becb5356c35a240c50/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d656d61696c2e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-email)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/f71dff7f3c82a9daaeba10d685c1738a53246b5ccd62dbc46c997d6573078749/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d656d61696c2f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-email/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/406616acfe445d086b8ebb608a71df51625856d630b85780dff9322414e71a19/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f35343035383338382d336235642d343765332d383138352d6630303132333264333166372f6d696e692e706e67)](https://insight.sensiolabs.com/projects/54058388-3b5d-47e3-8185-f001232d31f7)[![Coverage Status](https://camo.githubusercontent.com/b017e42fbff731bd53ea6a75e82c77d786bfef610724094b1811d24c88954709/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d656d61696c2f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-email?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-email/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-email/apigen/master/)**factory**[![version](https://camo.githubusercontent.com/6b576177ab73a247b8d8a8db8c23b5ed42f92c5ea6b030619850d645cf05d4c1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d666163746f72792e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/6b576177ab73a247b8d8a8db8c23b5ed42f92c5ea6b030619850d645cf05d4c1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d666163746f72792e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/c251f17b53cb766ef5d51ff601fe5a9cba6895125f1c4d2846fafc157909e2dd/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d666163746f72792e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-factory)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/c72f3fd20440cf51db122183d50cbefd05d32df12c5cb1df603095592730e423/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d666163746f72792f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-factory/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/b86ae497c71a1376e9484e7011418c12c210886dc472ab80d3f1a15a883ef5cb/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f30616563393330622d643639362d343135612d623465662d6131356331613536353039652f6d696e692e706e67)](https://insight.sensiolabs.com/projects/0aec930b-d696-415a-b4ef-a15c1a56509e)[![Coverage Status](https://camo.githubusercontent.com/3b2352f4e89b20cfc34cfade04e93af0b6eab4624bdeac4c8912d908d74b9d50/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d666163746f72792f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-factory?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-factory/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-factory/apigen/master/)**image**[![version](https://camo.githubusercontent.com/39f96c7aaa63b26f4aa4e43e28144a8a6e8ef8560e3a27f0c3e158051258e4c5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d696d6167652e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/39f96c7aaa63b26f4aa4e43e28144a8a6e8ef8560e3a27f0c3e158051258e4c5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d696d6167652e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/e2170b62d79157f606fbf3d2fa63b8044e3a637be961a7ad7c64e21d7737a439/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d696d6167652e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-image)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/a6f883e7837267f630d6d490cc3f0f614c5ddbb03116ba37d7f87e39c279ac77/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d696d6167652f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-image/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/4a81e2b049887e8555d75fd620420e80d4f48ae31509f7fda4a1a31af5d32f22/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f38376339363231642d336232652d346537312d613432662d6536396562636134363732652f6d696e692e706e67)](https://insight.sensiolabs.com/projects/87c9621d-3b2e-4e71-a42f-e69ebca4672e)[![Coverage Status](https://camo.githubusercontent.com/788b09d977cbc3c9e49a936348f9d2d94ad2ff8ea8c01c00e96cd500fcfa7dcc/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d696d6167652f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-image?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-image/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-image/apigen/master/)**object**[![version](https://camo.githubusercontent.com/3713613319642cc6f12d6f7b7dc903d8f84ed06f8cfb8244ece7028659ef84c1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6f626a6563742e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/3713613319642cc6f12d6f7b7dc903d8f84ed06f8cfb8244ece7028659ef84c1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6f626a6563742e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/afaf89e3d49543d24ffb913a8049c66df8e9df528c5968551ea06588b0924f61/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6f626a6563742e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-object)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/2ce794a41f3f28c465b8d4467ce27f84b7eabd0a25f30e4815333cdf78e0a10f/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d6f626a6563742f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-object/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/db2599008839e02de5b4c05ddeabe6e44bbbe66ae4d0565472a7a6aa0ca84e8f/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f65663737316334392d386330352d343438622d613131322d3036393733376233383064632f6d696e692e706e67)](https://insight.sensiolabs.com/projects/ef771c49-8c05-448b-a112-069737b380dc)[![Coverage Status](https://camo.githubusercontent.com/bffcc7c2c35fbe2482ed7bfdf4bfa39c72e43018ba1cba65dcf988d0868d67bc/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726f70657274792f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-property?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-object/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-object/apigen/master/)**presenter**[![version](https://camo.githubusercontent.com/3e4a7a05cfc999a996a4586945243e55f1ffc2c001539cf61cb60fea63133cba/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726573656e7465722e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/3e4a7a05cfc999a996a4586945243e55f1ffc2c001539cf61cb60fea63133cba/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726573656e7465722e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/9ab23f490f4d185df1e69c422547f6605f23423afe5d545b9546e7b2e73c0af4/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726573656e7465722e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-property)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/5c1726b2611b79825d8bc2a12d2a9c5621a2d0f926577555bd7231b4d98eb16c/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726573656e7465722f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-presenter/?branch=master)-[![Coverage Status](https://camo.githubusercontent.com/ae41279f3a4bbb354da2761902352184c17d78dafe9bdaa223bbbce9abe607d3/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726573656e7465722f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-presenter?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-presenter/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-presenter/apigen/master/)**property**[![version](https://camo.githubusercontent.com/3b22e0c17cc75c086b2c699784de2b12de594b592d7f505fb15e208a7b0b1679/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726f70657274792e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/3b22e0c17cc75c086b2c699784de2b12de594b592d7f505fb15e208a7b0b1679/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726f70657274792e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/3e52417abbc6f41c1eba8ea30e35e2fd7a8fd1185a73ab75d0abd189bfd6e038/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726f70657274792e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-property)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/52478e12f5d06cf09d44046936e64c3aafc082dd9b2e5263580120639bd33d9b/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726f70657274792f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-property/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/6ec8a0a860d97acce1d452703997cf81ab2eb2e5183a34f0235ec67d45fe3fa2/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f66336264666633382d633330302d343230372d383334322d6461303032653634613665312f6d696e692e706e67)](https://insight.sensiolabs.com/projects/f3bdff38-c300-4207-8342-da002e64a6e1)[![Coverage Status](https://camo.githubusercontent.com/bffcc7c2c35fbe2482ed7bfdf4bfa39c72e43018ba1cba65dcf988d0868d67bc/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726f70657274792f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-property?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-property/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-property/apigen/master/)**queue**[![version](https://camo.githubusercontent.com/f09d501859c7bf340624a1aa8166922fca456432e9a6f7c080c4635c4b79db07/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d71756575652e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/f09d501859c7bf340624a1aa8166922fca456432e9a6f7c080c4635c4b79db07/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d71756575652e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/64af67dfe56427a70246e5c463934b77349abbb7762c64a615b7199f2b4f3596/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d71756575652e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-queue)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/6a2a6af3c5b4cdc9c429666cc0ad37bc27a66f786caafb99292feffd803f2c32/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d71756575652f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-queue/?branch=master)-[![Coverage Status](https://camo.githubusercontent.com/2c8e2e0e2ec3ada4a241ca840a4a2748f3b3a1c22863ef6c30c0d60a905e73ba/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d71756575652f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-queue?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-queue/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-queue/apigen/master/)**translator**[![version](https://camo.githubusercontent.com/c49e6f63a04dd3371156696aba521216118bdb151c9735126ac8ed36058a06d7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d7472616e736c61746f722e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/c49e6f63a04dd3371156696aba521216118bdb151c9735126ac8ed36058a06d7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d7472616e736c61746f722e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/b8e3cf6494643f6bcf581addb6dfa2d5870b7208b9b8883cf4e66c23f244c241/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d7472616e736c61746f722e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-translator)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/15a0af69762890f06fb9e8df17ee2e84178dfa23effd3229582b4201ff8ea557/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d7472616e736c61746f722f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-translator/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/7150f9f6e46de0ab325fd001840ee7fc5284365843b3e052923b2ee0efa85f59/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f32373538633832302d653733612d346430652d623734362d3535326133653361393266612f6d696e692e706e67)](https://insight.sensiolabs.com/projects/2758c820-e73a-4d0e-b746-552a3e3a92fa)[![Coverage Status](https://camo.githubusercontent.com/b666ed396f89e1914e1084292cbcbe2d59d2dc1b5951e1973b68e7f8cf255397/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d7472616e736c61746f722f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-translator?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-translator/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-translator/apigen/master/)**ui**[![version](https://camo.githubusercontent.com/bdeb3dba93f169baa2e7eb1caf3ddebde523747fee0c32e359a0d6e76f3ec16d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d75692e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/bdeb3dba93f169baa2e7eb1caf3ddebde523747fee0c32e359a0d6e76f3ec16d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d75692e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/f26295c36db133017cd008af6f2b1e34b9c6c6c38aa5521a9d9f7eea3a0bb450/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d75692e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-ui)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/79e3eb16b5a3d55a3320b6cc6f0d16287c9eee06a4c5d8f3d8c39a140770d4c3/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d75692f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-ui/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/dbc93126feedf6cf35ed018588318fc13e03ac2c65620f55d186232ea71f0883/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f61643564313639392d303763632d343562352d396261342d3962336234356636373765302f6d696e692e706e67)](https://insight.sensiolabs.com/projects/ad5d1699-07cc-45b5-9ba4-9b3b45f677e0)[![Coverage Status](https://camo.githubusercontent.com/8f77d226cf0de6901c4a8b5038e900dfb4c0360ce424350959f2fdadef605e8f/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d75692f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-ui?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-ui/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-ui/apigen/master/)**user**[![version](https://camo.githubusercontent.com/96d263c869709f22016f221068e49097c5b636543bf61f5405bb270f5e4bb811/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d757365722e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/96d263c869709f22016f221068e49097c5b636543bf61f5405bb270f5e4bb811/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d757365722e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/2c180ebf0618bc3563d3b1c5111888e1c8f0a2f879a9d60a5c3802cde057992c/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d757365722e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-user)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/318c58b6e6aa6e2aefc6ff805a6d0deca242b8916ba943faa68796fca1d686f8/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d757365722f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-user/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/b4e01c929b8f64f8f85969cd6665ddcc34fa538082f991408b32ee6f1b86e15b/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f35623035666164352d356532642d343164332d616364332d3132383232623335343839322f6d696e692e706e67)](https://insight.sensiolabs.com/projects/5b05fad5-5e2d-41d3-acd3-12822b354892)[![Coverage Status](https://camo.githubusercontent.com/8f77d226cf0de6901c4a8b5038e900dfb4c0360ce424350959f2fdadef605e8f/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d75692f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-ui?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-user/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-user/apigen/master/)**validator**[![version](https://camo.githubusercontent.com/36a17539782c5dd9bfbc341628704e51845b297979122f6fd8c9d01569ee831d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d76616c696461746f722e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/36a17539782c5dd9bfbc341628704e51845b297979122f6fd8c9d01569ee831d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d76616c696461746f722e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/eff67d0b9049e29a62f82f9000e2481cb24f508b801ce53bb8f30cb856a69df5/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d76616c696461746f722e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-view)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/30c032d32ecc072b8defa27f774def9581d0ec66b7b7df054b8908ed053f0193/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d76616c696461746f722f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-vialidator/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/1ecd78fa8ed642526c72c69a33ae3dbf10dd273cc302e6a5167f721e7345e55b/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f35633231613163662d396232312d343163382d383261382d3930666261643830386132302f6d696e692e706e67)](https://insight.sensiolabs.com/projects/5c21a1cf-9b21-41c8-82a8-90fbad808a20)[![Coverage Status](https://camo.githubusercontent.com/7acb2a834a35d2171b6795d95683deeea962e215648ca01f1ce52c4a77a17f0a/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d76616c696461746f722f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-validator?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-validator/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-validator/apigen/master/)**view**[![version](https://camo.githubusercontent.com/d990260131e645e0673d8f080539eb290ee6871e5eb49dab42a37347deccb1fc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d766965772e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://camo.githubusercontent.com/d990260131e645e0673d8f080539eb290ee6871e5eb49dab42a37347deccb1fc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6c6f636f6d6f746976656d746c2f63686172636f616c2d766965772e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)[![Build Status](https://camo.githubusercontent.com/ca225733998bc9c63d544f7e849f3c921307e400032d64f33ce9d3d0bc8062ca/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d766965772e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-view)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/5511c32cd8b3d9f2db32ab7a04cef45cf63807220d354686fc5ddb3ccbfc97e1/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d766965772f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-view/?branch=master)[![SensioLabsInsight](https://camo.githubusercontent.com/b5acbc0d86ae3d3fb674eca831b2c29ab7cb1c2a8cf92f67e43a1bec064c7504/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f33393664326630362d383262612d346337392d623863632d3736326631653862646132392f6d696e692e706e67)](https://insight.sensiolabs.com/projects/396d2f06-82ba-4c79-b8cc-762f1e8bda29)[![Coverage Status](https://camo.githubusercontent.com/4d50308d22c86ca7884d3a33c86f585a3f8a29fc873cc8604a85c272885884ea/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d766965772f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-view?branch=master)[PHPDoc](http://locomotivemtl.github.io/charcoal-view/docs/master/)[ApiGen](http://locomotivemtl.github.io/charcoal-view/apigen/master/)What's inside this Boilerplate?
===============================

[](#whats-inside-this-boilerplate)

Like all Charcoal projects / modules, the main components are:

- **Autoloader**
    - Provided by Composer.
- **Config**
    - As JSON or PHP files in the [`config/`](config/) directory.
    - Use [`locomotivemtl/charcoal-config`](https://github.com/locomotivemtl/charcoal-config)
- **Front Controller**
    - See [`www/.htaccess`](www/.htaccess) and [`www/index.php`](www/index.php) for details.
    - Route dispatcher
        - See [`config/routes.json`](config/routes.json) for route configuration.
- **Script Controller (Charoal Binary)**
    - Installed from `charcoal-app` as `vendor/bin/charcoal`.
    - Many useful scripts are provided with the `charcoal-admin` module.
- **PHP scripts**
    - PSR-1, PSR2 and PSR-4 compliant scripts are located in [`src/`](src/)
    - There are typically 3 types of controllers:
        - *Templates*
        - *Actions*
        - *Scripts*
    - ... 2 types of object
        - Objects based on *Content*
        - Objects based on *UserData*
    - ... and all other types of scripts (services, helpers, configs, factories, etc.)
- **Assets**
    - Assets are files required to be on the webserver root
    - Scripts, in `src/scripts/` and compiled in `www/assets/scripts/`
    - Styles , with Sass in `src/styles/` and compiled CSS in `www/assets/styles/`
    - Images, in `www/assets/images/`

Development
===========

[](#development)

To install the development environment:

```
★ composer install --prefer-source
```

To run the scripts (phplint, phpcs and phpunit):

```
★ composer test
```

Development dependencies
------------------------

[](#development-dependencies)

- `phpunit/phpunit`
- `squizlabs/php_codesniffer`
- `satooshi/php-coveralls`

Continuous Integration
----------------------

[](#continuous-integration)

ServiceBadgeDescription[Travis](https://travis-ci.org/locomotivemtl/charcoal-project-boilerplate)[![Build Status](https://camo.githubusercontent.com/2813cbfddccb0b4c0570b7b2a9650111299ddf3cb295579adca7fa35bdf56afc/68747470733a2f2f7472617669732d63692e6f72672f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726f6a6563742d626f696c6572706c6174652e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/locomotivemtl/charcoal-project-boilerplate)Runs code sniff check and unit tests. Auto-generates API documentation.[Scrutinizer](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-project-boilerplate/)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/1f3c12d2a2510bf556a344223095ac590407e54ccae86044a3f60a24a5200cd6/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726f6a6563742d626f696c6572706c6174652f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/locomotivemtl/charcoal-project-boilerplate/?branch=master)Code quality checker. Also validates API documentation quality.[Coveralls](https://coveralls.io/github/locomotivemtl/charcoal-project-boilerplate)[![Coverage Status](https://camo.githubusercontent.com/00162eaf6d18336fc87f3886579b07fb1554e8991f6fea643075111c2cd8991c/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6c6f636f6d6f746976656d746c2f63686172636f616c2d70726f6a6563742d626f696c6572706c6174652f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/locomotivemtl/charcoal-project-boilerplate?branch=master)Unit Tests code coverage.[Sensiolabs](https://insight.sensiolabs.com/projects/533b5796-7e69-42a7-a046-71342146308a)[![SensioLabsInsight](https://camo.githubusercontent.com/02f12e4603d7eb24de690ebb6a7d977d2e501f7c5d7123ce9feb88ba8a075e17/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f35333362353739362d376536392d343261372d613034362d3731333432313436333038612f6d696e692e706e67)](https://insight.sensiolabs.com/projects/533b5796-7e69-42a7-a046-71342146308a)Another code quality checker, focused on PHP.Coding Style
------------

[](#coding-style)

The charcoal-project-boilerplate module follows the Charcoal coding-style:

- [*PSR-1*](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md)
- [*PSR-2*](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
- [*PSR-4*](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md), autoloading is therefore provided by *Composer*.
- [*phpDocumentor*](http://phpdoc.org/) comments.
- Read the [phpcs.xml](phpcs.xml) file for all the details on code style.

> Coding style validation / enforcement can be performed with `composer phpcs`. An auto-fixer is also available with `composer phpcbf`.

Authors
-------

[](#authors)

- [Locomotive, a Montreal Web agency](https://locomotive.ca)

###  Health Score

34

—

LowBetter than 77% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity23

Limited adoption so far

Community21

Small or concentrated contributor base

Maturity64

Established project with proven stability

 Bus Factor2

2 contributors hold 50%+ of commits

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

Every ~58 days

Recently: every ~40 days

Total

17

Last Release

1335d ago

PHP version history (4 changes)0.1.0PHP &gt;7.1

0.2.5PHP &gt;=7.3

0.2.7PHP ^7.3 || ^8.0

0.4.0PHP ^7.4 || ^8.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/cfb071c0ff7ce9500c528a003a2c53124248debc3e5bf367c17f89f5e6136125?d=identicon)[mducharme](/maintainers/mducharme)

---

Top Contributors

[![mcaskill](https://avatars.githubusercontent.com/u/29353?v=4)](https://github.com/mcaskill "mcaskill (95 commits)")[![mducharme](https://avatars.githubusercontent.com/u/12157?v=4)](https://github.com/mducharme "mducharme (92 commits)")[![dominiclord](https://avatars.githubusercontent.com/u/1775204?v=4)](https://github.com/dominiclord "dominiclord (12 commits)")[![BeneRoch](https://avatars.githubusercontent.com/u/3017380?v=4)](https://github.com/BeneRoch "BeneRoch (5 commits)")[![quentinhocde](https://avatars.githubusercontent.com/u/6057498?v=4)](https://github.com/quentinhocde "quentinhocde (3 commits)")[![Jerek0](https://avatars.githubusercontent.com/u/9463158?v=4)](https://github.com/Jerek0 "Jerek0 (2 commits)")[![jdacosta](https://avatars.githubusercontent.com/u/5209281?v=4)](https://github.com/jdacosta "jdacosta (2 commits)")[![JoelAlphonso](https://avatars.githubusercontent.com/u/10762266?v=4)](https://github.com/JoelAlphonso "JoelAlphonso (1 commits)")[![hum-n](https://avatars.githubusercontent.com/u/4596862?v=4)](https://github.com/hum-n "hum-n (1 commits)")[![devenini](https://avatars.githubusercontent.com/u/19838822?v=4)](https://github.com/devenini "devenini (1 commits)")

---

Tags

boilerplatecharcoalcharcoal-admincmsphpboilerplateSkeletoncharcoalproject

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Psalm

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/locomotivemtl-charcoal-project-boilerplate/health.svg)

```
[![Health](https://phpackages.com/badges/locomotivemtl-charcoal-project-boilerplate/health.svg)](https://phpackages.com/packages/locomotivemtl-charcoal-project-boilerplate)
```

###  Alternatives

[aplus/app

Aplus Framework App Project

5951.6M1](/packages/aplus-app)[locomotivemtl/charcoal-cms

Charcoal CMS (Content Management System) Module

529.0k3](/packages/locomotivemtl-charcoal-cms)[flightphp/skeleton

A Flight PHP framework skeleton app to get your new projects up and running ASAP

602.4k](/packages/flightphp-skeleton)[markocupic/contao-bundle-creator-bundle

This bundle provides a bundle maker for Contao 4.\*. The extension will create a fully working backend- or/and frontend module after you have defined a few parameters in the contao backend.

224.7k](/packages/markocupic-contao-bundle-creator-bundle)

PHPackages © 2026

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