Status Quo
We have three repositories for the bulk of Neos and Flow development:
- GitHub - neos/flow-development-collection: The unified repository containing the Flow core packages, used for Flow development.
- GitHub - neos/neos-development-collection: The unified repository containing the Neos core packages, used for Neos development.
- GitHub - neos/neos-ui: Neos CMS UI written in ReactJS with Immutable data structures.
Between these three, dependencies are (theoretically) unidirectional, so:
Neos.Neos.Ui
depends onNeos.Neos
, but not the other way around- A package in
neos-development-collection
may depend on a package inflow-development-collection
, but not the other way around
The heart of Neos is the Neos.Neos
package, which handles the following concerns:
- Establish a
User
model and add user-related semantics on top of the Content Repository (e.g.Personal Workspace
) - Establish web-related semantics on top of the Content Repository (e.g.
Site
,Domain
) - Establish combined semantics relating the Content Repository and
Neos.Media
(e.g.AssetUsage
) - Integrate the Content Repository and
Neos.Media
with Flow’s Routing- & Linking-mechanisms - Provide high-level integration APIs on top of the Content Repository,
Neos.Media
and its own domain models- FlowQuery
- Eel
- Fluid View Helpers
- Provide main entry point for frontend requests (
Frontend\NodeController
) - Provide a Backend Module for Configuration inspection
- Provide a Backend Module for (composer-/Flow-)Package inspection
- Provide a Backend Module for Dimension configuration inspection
- Provide a Backend Module for Sites & Domain management
- Provide a Backend Module for User management
- Provide a Backend Module for User settings
- Provide a Backend Module for Workspaces management
Problems
1. Responsibility Overflow
The above (certainly incomplete) list shows, that Neos.Neos
has a lot of responsibilities. Some of these are irreducibly necessary. Neos is composed of various parts (especially Content Repository & Media) that have useful applications on their own. Neos.Neos
takes those parts and adds semantics aside and on top to turn the whole composition into a Content Management System.
Besides those domain-related responsibilities, Neos.Neos
also provides APIs for integration and User Interfaces in the form of backend modules. It is these responsibilities that make the package appear quite monolithic.
2. Neos.Neos
↔ Neos.Neos.Ui
It is very often unclear whether specific functionality shall live in Neos.Neos
or rather in Neos.Neos.Ui
. We have for instance resorted to awkward workarounds to establish content element wrapping and out-of-band rendering in the UI (some of this has been already mitigated though).
In subtle ways, Neos.Neos
sometimes has soft dependencies on Neos.Neos.Ui
, or it anticipates UI-specifics. This mostly happens with translation labels, but there are also more pronounced cases, like the IconNameMappingPostprocessor
.
Neos.Neos.Ui
on the other hand establishes logic that should rather live in Neos.Neos
. It has its own node property converter for example - that’s weird (and many have stumbled over this one, too).
3. Backend Modules
It has long been the plan to unify the content module (which runs on React and is developed separately in GitHub - neos/neos-ui: Neos CMS UI written in ReactJS with Immutable data structures.) with the other backend modules. We are currently developing redundant CSS and JavaScript split over two packages and repositories.
Some backend modules are about to grow significantly in size. In case of Workspaces (see: !!! TASK: Move workspace module to separate package by ahaeslich · Pull Request #4665 · neos/neos-development-collection · GitHub) and Media UI (see: GitHub - Flowpack/media-ui: The development repository for the new Neos media management interface), these modules have been moved to separate packages. If we continue in this direction (so: Move all backend modules into dedicated packages), we’ll need to provide an easy way to install all packages that are supposed to be part of the Neos core UX at once.
Proposal
During the post-con sprint 2024 in Karlsruhe, @ahaeslich, @christianm , @robert and I have briefly discussed the following two ideas:
1. Split domain repsonsibilities from Neos.Neos
and turn it into a meta-package
The idea is to establish an new package Neos.Neos.Core
(name tbd.), that takes on the domain responsibilities of Neos.Neos
and provides high-level PHP APIs, so it can be used as a headless CMS.
Stripped of its responsibilities, Neos.Neos
itself is then turned into a meta-package that requires all dependencies needed for the usual Neos user experience.
A simple composer require neos/neos
shall suffice to bring Neos to life.
2. Create a new neos-ui-development-collection
To ease the unification of all UI-related code, a new development collection (following the pattern of flow-development-collection
and neos-development-collection
) shall be created.
This collection can be home to dedicated Backend Module packages, as well as UI tooling and framework code.
Neos.Neos
shall require the packages from this collection as well.
Prior Discussions
What’s next?
We’d like to get your feedback on the above proposal. Please tell us what you think, add your ideas and criticism. We may add your feedback to the proposal and/or get an overview of counter-proposals on this matter.
As a result of this discussion, we’d like to reach a decision on how to move forward.