cx-composer--for=liferay
~/liferay-workspace — cx-composer — 100×32
liferay-workspacecode --install-extension cxcomposer.cx-composer-for-liferay
Installed "cx-composer for Liferay" v0.0.1
 
liferay-workspacecx-composer --help
cx-composer — the developer workbench for Liferay Client Extensions.
 
COMMANDS
scaffoldnew project for any of 28 CX types
addappend a client-extension block
buildblade gw buildClientExtensionZip (per-CX)
validateclient-extension.yaml, LCP.json, Dockerfile
 
INTELLISENSE  28 types, full field completions + hover docs, unknown-field diagnostics with did-you-mean.
 
liferay-workspace_
$ nvim client-extension.yaml# try me — completions + hover work here just like in VS Code
client-extension.yaml — [+] modified
Loading editor…

-- INSERT -- place cursor inside my-widget: and start typing.

or type type: on a new line — dropdown lists every CX type.

# ────── features ──────

Every part of a client extension, right in your editor.

cx-composer scaffold customElement
my-widget/
client-extension.yaml
README.md
.gitignore
assets/index.js
assets/styles.css
✓ scaffolded Custom Element (2 required prompts)

Scaffold every type. One wizard.

Target folder → type (28 supported) → name → required fields. Custom Element, IFrame, OAuth, Object Actions, Site Initializer, Commerce Payment Integration — same flow.

cx-composer intellisense # client-extension.yaml
htmlElementName string — required
urls string[] — required
cssURLs string[]
instanceable boolean
useESM boolean

IntelliSense that reads the Liferay docs.

Completions + Markdown hover for every field on every one of 28 types. Schema pulled from Liferay's YAML reference, verified against 131 real files in liferay/liferay-portal.

cx-composer validate client-extension.yaml
✗ line 7 Unknown field "instanceableq" for type "customElement".
Did you mean "instanceable"?
✗ line 12 "my-oauth" (oAuthApplicationUserAgent) missing required "scopes".
2 problems found. LCP.json and Dockerfile also validated.

Catch typos before deploy fails.

Auto-runs on save/open. Free tier. Includes LCP.json + Dockerfile with the same did-you-mean pattern.

cx-composer build # inside client-extensions/my-widget/
$ blade gw buildClientExtensionZip
→ build/my-widget-1.0.0.zip
✓ built in 3.2s (this CX only, not the whole workspace)

Per-extension build.

Runs the Gradle task inside the specific CX folder. In monorepos, right-click the manifest and it targets exactly that project.

# ────── faq ──────

Frequently asked questions

  • What is a Liferay Client Extension?
    A Liferay Client Extension is a declarative package — defined by a client-extension.yaml manifest — that extends a Liferay DXP install without deploying a portlet or an OSGi bundle. There are 28 types spanning frontend widgets (Custom Element, IFrame), theming (Theme CSS, Global CSS/JS), configuration (OAuth apps, Instance Settings), microservices (Object Action, Workflow Action, Notification Type, CAPTCHA), batch (Batch, Site Initializer), commerce (Payment / Checkout / Shipping / Tax), and audiences. Each extension is built into a .zip with blade gw buildClientExtensionZip and deployed to a Liferay server.
  • What is CX Composer for Liferay?
    CX Composer is a VS Code extension that provides the full authoring lifecycle for Liferay Client Extensions: multi-step scaffolding for all 28 types, IntelliSense on client-extension.yaml (completions + hover for every field on every type), per-extension build via Blade, and validators for client-extension.yaml, LCP.json, and Dockerfile. Free tier includes validation. Pro tier ($15/year) unlocks the productivity suite (scaffolding, IntelliSense, snippets, per-extension build).
  • How does CX Composer compare to Blade CLI?
    Blade CLI is a general-purpose Liferay tooling CLI — it can generate module skeletons, deploy bundles, and drive Gradle. CX Composer complements Blade with editor-first workflows: it invokes Blade under the hood for build (buildClientExtensionZip) but adds IntelliSense, validation, and a wizard-driven scaffold that Blade does not provide.
  • Do I need a Liferay Workspace?
    For scaffolding, add-extension, and validation — no, CX Composer works on any folder. For building (Build command), yes: you need a Liferay Workspace with the workspace Gradle plugin so Blade's buildClientExtensionZip task is available.
  • What files does CX Composer validate?
    client-extension.yaml (Liferay Client Extension manifest — full schema for all 28 types), LCP.json (Liferay Cloud service configuration), and Dockerfile. Validation auto-runs on save and open. Unknown fields are flagged with did-you-mean suggestions.
  • Is CX Composer affiliated with Liferay?
    No. CX Composer is an independent third-party product. Liferay® and Liferay DXP® are registered trademarks of Liferay, Inc. See https://cxcomposer.dev/legal for details.
  • What Liferay DXP versions does CX Composer support?
    CX Composer's schema targets Liferay DXP 2024.Q1+ and Liferay Portal GA100+. Field additions from later releases (globalJS scope/scriptLocation, globalCSS scope) are supported. The Client Extension format has been stable since DXP 2023.Q4.
# ────── pricing ──────

Free for validation. Pro for the productivity suite.

┌───────────────────────────────────────────────────────────────────┬────────┬────────┐
featurefreepro
$0$15/yr
├───────────────────────────────────────────────────────────────────┼────────┼────────┤
validation (client-extension.yaml, LCP.json, Dockerfile)
auto-runs on open + save
did-you-mean suggestions
Problems panel integration
scaffold new projects (all 28 types) ·
add client extension (append + on any folder) ·
per-extension build ·
IntelliSense on client-extension.yaml ·
snippets (lrcx-*) for YAML / JS / TS / CSS ·
└───────────────────────────────────────────────────────────────────┴────────┴────────┘