PHPackages                             charcoal/cms - 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. charcoal/cms

ActiveLibrary[Framework](/categories/framework)

charcoal/cms
============

Charcoal CMS (Content Management System) Module

v5.0.0(2y ago)0111MITPHPPHP ^7.4 || ^8.0

Since Feb 17Pushed 2y ago2 watchersCompare

[ Source](https://github.com/charcoalphp/cms)[ Packagist](https://packagist.org/packages/charcoal/cms)[ Docs](https://charcoal.locomotive.ca)[ RSS](/packages/charcoal-cms/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (14)Versions (95)Used By (1)

Charcoal CMS
============

[](#charcoal-cms)

The CMS package provides common objects and tools for building user-facing Web sites.

Installation
------------

[](#installation)

```
composer require charcoal/cms
```

For Charcoal projects, the service provider can be registered from your configuration file:

```
{
    "service_providers": {
        "charcoal/cms/service-provider/cms": {}
    }
}
```

Usage
-----

[](#usage)

### Objects

[](#objects)

- [Section](#section-object)
- [Tag](#tag-object)
- [Event](#event-object)
- [FAQ](#faq-object)
- [News](#news-object)

### Section object

[](#section-object)

A **section**, in Charcoal, is a reachable *page* on the website, as part of the full hierarchical site map. They can be displayed in menus or breadcrumbs and be reached with a unique URL (`routable`).

Types of sections:

- `blocks`
    - Blocks sections define their content as a structured map of blocks.
- `content`
    - Content sections define their content in a single, simple *HTML* property.
- `empty`
    - Empty sections are linked to a template but do not require any custom content.
- `external`
    - External sections are simply a redirect to an external (or internal) URL.

All section types, except *external*, make use of a `Template` object to be rendered. Typically, a charcoal `view` make sure of linking the `template` (by default, *mustache*

> Sections are standard Charcoal `Model`, meaning they are *describable* with a `Metadata` object (which define a map of `properties`) and *storable* with a `Source` object.

Base section properties:

InterfaceNameL10nTypeDescriptionSection**section\_type**choiceSection**title**✔stringSection**subtitle**✔htmlSection**summary**✔htmlSection**image**✔imageSection**template\_ident**stringSection**template\_options**structureSection**content**✔htmlSection**attachments**✔multi-objectSection**external\_url**✔urlFor external URLs. Note that all content-related properties are ignored if this property is set.Content**id**idThe model's `key`.Content**active**boolInactive events should not appear in public API / frontend.Content**position**intDefault order property.Authorable**created\_by**stringAdmin user.Authorable**last\_modified\_by**stringAdmin user.Authorable**required\_acl\_permissions**To do...Timestampable**created**date-timeTimestampable**last\_modified**date-timeHierarchical**master**object`SectionInterface`.Routable**slug**✔stringPermalink. Auto-generated from title.#### Interfaces

[](#interfaces)

From model:

- `Describable`: The objects can be defined by Metadata.
- `Storable`: Objects have unique IDs and can be stored in storage / database.

From content:

- `Content`: A "managed" charcoal model (describable with metadata / storable).
- `Authorable`: Creation and modification user (admin) are kept in the storage.
- `Revisionable`: Copy of changes will be kept upon each object update in the storage.
- `Timestampable`: Creation and modification time are kept into the storage.

From [charcoal/object](https://github.com/charcoalphp/object):

- `Hierarchicale`: The objects can be stacked hierarchically.
- `Publishable`: Objects have publish status, date and expiry. Allows moderation.
- `Routable`: Objects are reachable through a URL.

From [charcoal/cms](https://github.com/charcoalphp/cms):

- `Metatag`: The objects have meta-information for SEO purpose.
- `Searchable`: Extra keywords can be used to help search engine.
- `Templateable`: The objects can be rendered with a template / controller / config combo.

#### Extending the section object

[](#extending-the-section-object)

The `\Charcoal\Cms\Section\*` objects are `final`. To extend, use the `\Charcoal\Cms\AbstractSection` base object instead, to make sure no metadata conflicts arise.

### Tag object

[](#tag-object)

**Tag** objects link any objects together by providing an extra taxonomy layer. Tags may also be used to enhance internal search engines.

### Event object

[](#event-object)

Charcoal **Event** is a specialized content object to describe an event, which typically happens at a given date in a certain location.

Base events properties:

InterfaceNameL10nTypeDescriptionEvent**title**✔stringEvent**subtitle**✔htmlEvent**summary**✔htmlEvent**content**✔htmlEvent**image**✔imageEvent**start\_date**date-timeEvent**end\_date**date-timeEvent**info\_url**✔imageContent**id**idThe model's `key`.Content**active**boolInactive events should not appear in public API / frontend.Content**position**intDefault order property.Authorable**created\_by**stringAdmin user.Authorable**last\_modified\_by**stringAdmin user.Authorable**required\_acl\_permissions**To do...Timestampable**created**date-timeTimestampable**last\_modified**date-timeCategorizable**category**✔object`EventCategory`, or custom.Publishable**publishDate**date-timePublishable**expiryDate**date-timePublishable**publishStatus**string`draft`, `pending`, or `published`.Routable**slug**✔stringPermalink. Auto-generated from title.Metatag**meta\_title**✔stringMetatag**meta\_description**✔stringMetatag**meta\_image**✔imageMetatag**meta\_author**✔stringTemplateable**controller\_ident**stringTemplateable**template\_ident**stringTemplateable**template\_options**structure#### Interfaces

[](#interfaces-1)

From model:

- `Describable`: The objects can be defined by Metadata.
- `Storable`: Objects have unique IDs and can be stored in storage / database.

From content:

- `Content`: A "managed" charcoal model (describable with metadata / storable).
- `Authorable`: Creation and modification user (admin) are kept in the storage.
- `Revisionable`: Copy of changes will be kept upon each object update in the storage.
- `Timestampable`: Creation and modification time are kept into the storage.

From [charcoal/object](https://github.com/charcoalphp/object):

- `Categorizable`: The objects can be put into a category.
- `Publishable`: Objects have publish status, date and expiry. Allows moderation.
- `Routable`: Objects are reachable through a URL.

From [charcoal/cms](https://github.com/charcoalphp/cms):

- `Metatag`: The objects have meta-information for SEO purpose.
- `Searchable`: Extra keywords can be used to help search engine.
- `Templateable`: The objects can be rendered with a template / controller / config combo.

#### Extending the event object

[](#extending-the-event-object)

The `\Charcoal\Cms\Event` object is `final`. To extend, use the `\Charcoal\Cms\AbstractEvent` base object instead, to make sure no metadata conflicts arise.

#### Event categories

[](#event-categories)

**Event category** objects are simple `charcoal/object/category` used to group / categorize events. The default type is `Charcoal\Cms\EventCategory`.

*Events* implement the `Categorizable` interface, from [charcoal/object](https://github.com/charcoalphp/object).

### FAQ object

[](#faq-object)

**FAQ** objects are a special content type that is split in a "question" / "answer" format.

#### FAQ categories

[](#faq-categories)

**FAQ category** objects are simple `charcoal/object/category` used to group / categorize FAQ objects. The default type is `Charcoal\Cms\FaqCategory`.

*FAQs* implement the `Categorizable` interface, from [charcoal/object](https://github.com/charcoalphp/object).

### News object

[](#news-object)

News object are a special content type that with a specific news date.

Base news properties:

InterfaceNameL10nTypeDescriptionNews**title**✔stringNews**subtitle**✔htmlNews**summary**✔htmlNews**content**✔htmlNews**image**✔imageNews**news\_date**date-timeNews**info\_url**✔imageContent**id**idThe model's `key`.Content**active**boolInactive news should not appear in public API / frontend.Content**position**intDefault order property.Authorable**created\_by**stringAdmin user.Authorable**last\_modified\_by**stringAdmin user.Authorable**required\_acl\_permissions**To do...Timestampable**created**date-timeTimestampable**last\_modified**date-timeCategorizable**category**✔object`NewsCategory`, or custom.Publishable**publishDate**date-timePublishable**expiryDate**date-timePublishable**publishStatus**string`draft`, `pending`, or `published`.Routable**slug**✔stringPermalink. Auto-generated from title.Metatag**meta\_title**✔stringMetatag**meta\_description**✔stringMetatag**meta\_image**✔imageMetatag**meta\_author**✔stringTemplateable**controller\_ident**stringTemplateable**template\_ident**stringTemplateable**template\_options**structure#### Interfaces

[](#interfaces-2)

From model:

- `Describable`: The objects can be defined by Metadata.
- `Storable`: Objects have unique IDs and can be stored in storage / database.

From content:

- `Content`: A "managed" charcoal model (describable with metadata / storable).
- `Authorable`: Creation and modification user (admin) are kept in the storage.
- `Revisionable`: Copy of changes will be kept upon each object update in the storage.
- `Timestampable`: Creation and modification time are kept into the storage.

From [charcoal/object](https://github.com/charcoalphp/object):

- `Categorizable`: The objects can be put into a category.
- `Publishable`: Objects have publish status, date and expiry. Allows moderation.
- `Routable`: Objects are reachable through a URL.

From [charcoal/cms](https://github.com/charcoalphp/cms):

- `Metatag`: The objects have meta-information for SEO purpose.
- `Searchable`: Extra keywords can be used to help search engine.
- `Templateable`: The objects can be rendered with a template / controller / config combo.

#### Extending the news object

[](#extending-the-news-object)

The `\Charcoal\Cms\News` object is `final`. To extend, use the `\Charcoal\Cms\AbstractNews` base object instead, to make sure no metadata conflicts arise.

#### News categories

[](#news-categories)

**News category** objects are simple `charcoal/object/category` used to group / categorize events. The default type is `Charcoal\Cms\NewsCategory`.

*News* implement the `Categorizable` interface, from [charcoal/object](https://github.com/charcoalphp/object).

Resources
---------

[](#resources)

- [Contributing](https://github.com/charcoalphp/.github/blob/main/CONTRIBUTING.md)
- [Report issues](https://github.com/charcoalphp/charcoal/issues) and [send pull requests](https://github.com/charcoalphp/charcoal/pulls)in the [main Charcoal repository](https://github.com/charcoalphp/charcoal)

###  Health Score

35

—

LowBetter than 79% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity5

Limited adoption so far

Community20

Small or concentrated contributor base

Maturity84

Battle-tested with a long release history

 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 ~29 days

Recently: every ~15 days

Total

89

Last Release

795d ago

Major Versions

0.10.0 → v2.1.22022-06-21

v2.2.3 → v3.1.02022-08-08

v3.1.8 → v4.0.02022-09-21

v4.1.0 → v5.0.02024-03-13

PHP version history (3 changes)0.1PHP &gt;=5.6.0

0.9.1PHP &gt;7.1

v2.1.2PHP ^7.4 || ^8.0

### Community

Maintainers

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

![](https://www.gravatar.com/avatar/0a4f39523b4b2837562ba0848a0327b8d340118d1ba87cb0f5d59b1d5cb6beba?d=identicon)[mcaskill](/maintainers/mcaskill)

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

![](https://www.gravatar.com/avatar/4229f19eecd12c2b651b6502dcc5adfba48c5770db3d2dbea55fc92c7a246b2b?d=identicon)[BeneRoch](/maintainers/BeneRoch)

---

Top Contributors

[![JoelAlphonso](https://avatars.githubusercontent.com/u/10762266?v=4)](https://github.com/JoelAlphonso "JoelAlphonso (94 commits)")[![mducharme](https://avatars.githubusercontent.com/u/12157?v=4)](https://github.com/mducharme "mducharme (89 commits)")[![mcaskill](https://avatars.githubusercontent.com/u/29353?v=4)](https://github.com/mcaskill "mcaskill (82 commits)")[![dominiclord](https://avatars.githubusercontent.com/u/1775204?v=4)](https://github.com/dominiclord "dominiclord (31 commits)")[![BeneRoch](https://avatars.githubusercontent.com/u/3017380?v=4)](https://github.com/BeneRoch "BeneRoch (26 commits)")[![actions-user](https://avatars.githubusercontent.com/u/65916846?v=4)](https://github.com/actions-user "actions-user (18 commits)")[![losted](https://avatars.githubusercontent.com/u/165665?v=4)](https://github.com/losted "losted (11 commits)")[![veve40](https://avatars.githubusercontent.com/u/7537381?v=4)](https://github.com/veve40 "veve40 (2 commits)")

---

Tags

charcoalcmscontent-management-systemphpread-only-repositorycmscharcoal

###  Code Quality

TestsPHPUnit

Code StylePHP\_CodeSniffer

### Embed Badge

![Health badge](/badges/charcoal-cms/health.svg)

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

###  Alternatives

[locomotivemtl/charcoal-cms

Charcoal CMS (Content Management System) Module

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

Charcoal application, based on Slim 3

1320.3k12](/packages/locomotivemtl-charcoal-app)[sproutcms/cms

Enterprise content management and framework

241.6k4](/packages/sproutcms-cms)

PHPackages © 2026

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