Content remains an ordinary file
Everything starts with content.yml: a stable contract that can be read without specialist software, tracked in Git and moved safely between environments. It is not an intermediate format — it is the source of truth.
Every block passes through the definition registry. The CMS checks its type, required fields, translations, length rules and media references before normalized data can move forward.
One model instead of two implementations
PageViewModelFactory assembles the localized title, SEO, navigation, media and active blocks. At this point the result is neither JSON nor an HTML document.
The model then takes one of two paths:
PageSerializercreates a predictable REST response,PageRendererruns block renderers and places their output in a layout,- both adapters receive identical validated data.
Assets follow the content
The renderer does not ship one global bundle containing every style. When a page uses article-hero, its CSS is published under a fingerprinted URL. Unused blocks add no weight to the document.
A new component therefore remains a local change: a YAML schema, PHP and optional CSS or JavaScript.
The boundary between the model and its adapters lets the website and API evolve independently without data drift.
