Latest features: platform and extensibility
- Version
- 4.0 preview
- Updated
The part that decides whether a customized store is still updatable in three years. Two threads
here: the core got harder to get wrong (generated types, prepared statements, exceptions instead of
silent false), and the customization layer got more places to hook into without forking anything.
One application, three hosts — still true, and now proven per surface
The same CBX runs inside Joomla, WordPress and Magento 2: same admin screens, same data model, same release. What is new is how far that parity is carried — the CLI suite is the same suite on all three, the MCP server runs on all three, and the platform guides say where each host genuinely differs rather than leaving it to be discovered.
Records and schemas that cannot drift from the models
CBX generates, from each model's property definitions, a PHP record class and a JSON schema per
entity — in a single pass, so the two cannot disagree — plus TypeScript types. That is what gives an
editor autocompletion on a record that is otherwise a plain stdClass, and what lets the
OpenAPI document and the MCP tool schemas describe the real fields
rather than a hand-maintained approximation of them.
configbox:generate-types --check fails on drift, so CI can hold the line.
- Type generation
- Property definition settings — storage, validation, and the keys they get confused with
- The property types, one article each
Prepared statements
KenedoDatabase gained a real mysqli prepared-statement path with named or positional placeholders and
IN-list expansion. It is the sanctioned path for new queries; the historic string-built queries stay
as they are, because half-converting a query is worse than either end state.
Refusals became exceptions
CBX used to report a refusal by returning false and parking a sentence in setError(). That protocol
is retired in favour of exceptions — which matters to customization code specifically: a custom
property type or model that still returns false keeps working, but one that throws nothing and
reports nothing will silently accept bad data. Read the first section of the guide if you maintain
anything in the customization layer.
- Errors are exceptions now — what customization code has to change
- The breaking-changes log · the AI cheatsheet
The customization layer, extended
This is the feature that keeps customized CBX stores updatable for years: one directory that updates never touch. What it can now hold:
| Extend | Guide |
|---|---|
| Templates, views, controllers, models | views & templates · controllers & models |
| Fields on stock models | extending stock models · custom properties |
| A new kind of question | custom question types · and making them legible to AI |
| A new rule condition | custom rule conditions |
| A new calculation building block | custom calc term types |
| A payment provider | payment connectors |
| Site-specific CLI commands | custom CLI commands |
| The admin's on-screen help | help customization |
| Behaviour at defined points | events & observers · system overrides & boot hooks |
| Frontend JS/CSS | assets & AMD |
| Wording | language overrides |
Customizations get their own migration track
A customization can ship versioned, idempotent update scripts of its own, applied on the same
freeze-on-failure terms as the core track — and configbox:migrate --status and
configbox:migrate:unblock both understand the distinction.
A heads-up for anyone with admin-UI customizations
The upcoming major release modernizes the admin form and list markup, CSS and JavaScript, and deliberately introduces breaking changes to the admin HTML structure and class names. There is a guide that says exactly what changed and how to amend custom CSS, custom admin JS and overridden backend templates. Read it before that release, not after.
For anyone automating CBX
Views announce their own readiness (view-init-done, and the cbViewInitialized event) at the point
their handlers exist, not when the markup appeared — which removes a whole family of intermittent
failures from browser automation. The marker was renamed from view-processed on 2026-08-16 because
the old name invited exactly the wrong reading.
The framework itself
- Kenedo MVC: lifecycle, tasks, properties
- KenedoController · KenedoModel · KenedoView
- Every MVC task, including the recursive copy
- Host-adaptation stylesheets