Overview
XB was originally developed in parallel:
- one pure client-side PoC
- one pure server-side PoC
Then we got the two talking to each other. XB was originally developed with support SDCs, exclusively, and this is still visible in the metadata about components (the /xb/api/config/component route's response): they're highly SDC-specific.
Then in December 2024, we overhauled it significantly in #3491013: Rework layout API to separate components and slots and introduced multiple "node types" in the JSON tree structure the client expects.
But virtually everything here has been demo-driven development. There's lots of loose ends, duplication, imprecise OpenAPI specs, etc.
Beta blockers (July 2025)
Beta blockers (tag: beta blocker) MUST happen before #3515932: Milestone 1.0.0-beta1: Enable creation of non-throwaway sites.
(Numbered lists must happen one after the other, bulleted lists can happen in parallel.)
- Permissions: #3452581: [META] XB Permissions
- Layout + model bugs and reliability:
- ✅ #3520662: Empty slot not visible — client expects "slot node" for every *possible* slot, not for every *populated* slot
- ✅ Missing "node type" in
docs/data-model.md's3.4 UI Data Model: communicating a `component tree` to the front end: a node type for exposedContentTemplateslots: #3519352-32: Content templates, part 3b: store exposed slot subtrees on individual entities
- XB config entities bugs and reliability:
- High-impact bugs
Stable blockers (October 2025)
Stable blockers (tag: stable blocker) do not block #3515932: Milestone 1.0.0-beta1: Enable creation of non-throwaway sites, but would be nice-to-have at that point in time. They MUST happen before #3517885: Milestone 1.0.0: Production Sites.
(Numbered lists must happen one after the other, bulleted lists can happen in parallel.)
- XB-eligible content entities functionality:
- Finalize and de-SDC-ify component metadata (
/xb/api/config/component):- ✅ #3504421: Rename `PropSourceComponent.field_data` to `.propSources`
- ✅ #3515629: FieldWidget's XB transforms must be bubbled by the Field Widget rendering to inform the client
- ✅ #3516705: Auto-saved changes to code components are not visible in preview-on-hover-component-list until published
- #3510896: Add a new internal HTTP API for candidate `DynamicPropSource`s to enable a `ContentTemplate` UI
- #3521041: [META] Refactor the organically grown Component metadata mess in PHP (`::getClientSideInfo()`) and JS (`BaseComponent`, `DynamicComponent`, `PropSourceComponent` etc.)
- Layout + model maintainability/completeness:
- #3499632: Remove `ClientServerConversionTrait` (C→S) and `ComponentTreeItemList::getClientSideRepresentation()` (S→C) in favor of (de)normalizers
- #3491701: [later phase] ApiLayoutController must use the previewed route's controller, and override canonical content entity routes' received entity object
- #3510892: Allow XB to be gradually adopted: make XB's viewing (formatter) and editing (`ApiLayoutController::get()`) work with an empty XB field
Missing "node type" indocs/data-model.md's3.4 UI Data Model: communicating a `component tree` to the front end: a node type for overrides/personalization variantsProbably actually additional metadata on the existingIntroducenodeType: slotwould be sufficient, for examplemutuallyExclusive: true|falseto indicate only one variant can be visible at a time, and perhaps some extra metadata for additional UI affordancesnodeType: switch→ PoC'd by @penyaskito at #3525565: Personalization ComponentSource PoC
- Back-end changes to improve front-end performance
- OpenAPI/DX
- ✅ #3471884: Rename all XB internal HTTP API routes from `/xb/api/…` to `/xb/api/v0/…`
- #3472617: Document where the cut-off lies of where OpenAPI validation ends and entity validation begins
- #3499809: Handle all paths in OpenAPI request validation
- #3507427: /components/schemas/Component in openapi.yml is incomplete: add `source` and use it to make the OpenAPI spec more precise
- #3541131: DX: Rename `ComponentInputsForm` to `ComponentInstanceForm`
Post-stable priorities (after October 2025)
Post-stable priorities (tag: post-stable priority) do not block any release, and are things we'd like to see happen, but are intentionally NOT happening any time soon. We're highly confident that these will be net additions without the need for backwards compatibility breaks.
None yet.
Comments
Comment #2
wim leersComment #3
wim leersComment #4
wim leersComment #5
wim leersComment #6
wim leersComment #7
wim leersComment #8
wim leersComment #9
wim leersComment #10
wim leersComment #11
wim leers#3520662: Empty slot not visible — client expects "slot node" for every *possible* slot, not for every *populated* slot and #3504421: Rename `PropSourceComponent.field_data` to `.propSources` are in.
Comment #12
wim leersComment #13
wim leers#3515629: FieldWidget's XB transforms must be bubbled by the Field Widget rendering to inform the client and #3471884: Rename all XB internal HTTP API routes from `/xb/api/…` to `/xb/api/v0/…` landed.
Comment #14
wim leersComment #15
wim leersComment #16
wim leersOops. #3519992 is part of #3452581: [META] XB Permissions.
Comment #17
wim leersComment #18
wim leersComment #19
wim leersRemoved #3499352 from this meta and into #3499352: SDCs should only have get HTML comments injected when `renderComponent(isPreview: TRUE)` per #3499352-15: SDCs should only have get HTML comments injected when `renderComponent(isPreview: TRUE)`.
Comment #20
wim leersAdded two missing things for the client-side data model:
docs/data-model.md's3.4 UI Data Model: communicating a `component tree` to the front end: a node type for exposedContentTemplateslots: #3519352-32: Content templates, part 3b: store exposed slot subtrees on individual entitiesdocs/data-model.md's3.4 UI Data Model: communicating a `component tree` to the front end: a node type for overrides/personalization variantsI mentioned this to @jessebaker before in chat/conversation and to @penyaskito about the second bullet), but it's really starting to become time to get that going.
Comment #21
wim leers#20.2 is overkill, based on a call I just had with @effulgentsia and @penyaskito — thanks @effulgentsia for raising, as you heard, I'd already been thinking in the same direction 😊
Comment #22
wim leersSo … adopting the same structure as we have for #3520484: [META] Production-ready ComponentSource plugins and others: beta vs stable vs post-stable.
Changes:
Comment #23
wim leersHTML fixes.
Comment #24
wim leers⚠️ a crucial piece here is access control/permissions, but that has its own meta: #3452581: [META] XB Permissions.
Comment #25
wim leersAdded #3525130: Never show any messages in XB's previews to beta blockers and #3528847: Implement `lookup_keys` in Component for optimized queries to stable blockers.
As you can see as of #22, IMHO all remaining HTTP API changes can happen after
beta1aka #3515932: Milestone 1.0.0-beta1: Enable creation of non-throwaway sites.Observations:
ComponentSourceplugins and their supporting infrastructure. #3520484: [META] Production-ready ComponentSource plugins handled that, and things are WAY better 👍beta blocker-tagged issues is quite short. 😊ComponentSourceInterfaceis NOT a stable API yet at #3515932: Milestone 1.0.0-beta1: Enable creation of non-throwaway sites — only the data storage is. XB basically has no public API at that point, only stable storage. Consequently, the client-side data model is also still free to change until1.0.That's why actually … I can signal this is "done for now", i.e. for #3515932: Milestone 1.0.0-beta1: Enable creation of non-throwaway sites but NOT for #3517885: Milestone 1.0.0: Production Sites, by marking this .
Comment #26
wim leersGiven #3520484-76: [META] Production-ready ComponentSource plugins, this actually won't be blocking a stable (1.0) release.
Comment #27
wim leersAdded #3541131: DX: Rename `ComponentInputsForm` to `ComponentInstanceForm`.
Comment #29
wim leersWe should do #3588923: Make Canvas' Internal HTTP API confirm to JSON:API's JSON Schema..