cx-composer
❯ cx-composer scaffold siteInitializer --with-code
CX Composer scaffolding a Site Initializer folder tree: full layouts/master-pages/fragments/taxonomies/style-books/object-definitions structure appears, page-definition.json opens in the editor, terminal confirms schemas verified against Liferay's reference sample.
my-site/ client-extension.yaml # site + oAuthApplicationHeadlessServer site-initializer/ layout-set/public/metadata.json layouts/01_home/page.json + page-definition.json layout-page-templates/master-pages/main/ fragments/group/example/fragments/hero-banner/ taxonomy-vocabularies/, style-books/, object-definitions/, roles.json, … ✓ deploys clean — schemas verified against liferay-aicontentwizard-site-initializer
02 · Site Init

Site Initializer that actually deploys.

The full working folder tree: layouts with master pages, fragment collections (scoped under group/), style books, taxonomies, object definitions, roles, notifications. Every filename and field name matches Liferay's own samples — no more LayoutNameException or OAuth2ApplicationHomePageURLSchemeException on deploy.

at a glance
# ────── step by step ──────

How Site Init works, in 6 steps.

    01

    Trigger the scaffold

    Command palette → Scaffold New Project → pick Site Initializer, or right-click the target folder.

    02

    Enter id + name

    The id becomes the folder name; name is what shows up in the site initializer picker inside Liferay.

    03

    Full tree generated

    layout-set/, layouts/, layout-page-templates/master-pages/, fragments/group/, taxonomy-vocabularies/, style-books/, object-definitions/, roles.json, and notification templates.

    04

    Filenames match Liferay samples

    Verified against Liferay's official reference samples — the exact field-name capitalisation and folder structure DXP expects.

    05

    Paired oAuthApplicationHeadlessServer

    Auto-declared in the same yaml with matching naming (<id>-oauth-server) so batch imports authenticate.

    06

    Deploys cleanly on first try

    No LayoutNameException, no OAuth2ApplicationHomePageURLSchemeException, no missing companion files.