CX Composer for Liferay
The developer workbench for Liferay Client Extensions — inside VS Code.
Scaffolding for all 28 Liferay Client Extension types. IntelliSense on client-extension.yaml. Full IntelliSense + validation for 309 Liferay batch schemas in batch/*.batch-engine-data.json (registered batch-engine entity types — Object Definitions, User Accounts, Sites, Taxonomies, Commerce, and 300 more). Per-extension build. Free validators for client-extension.yaml, LCP.json, and Dockerfile. AI-drafted scaffolding (Preview).
cxcomposer.dev · Extension reference · hello@cxcomposer.dev
Why CX Composer
Authoring a Liferay Client Extension means writing client-extension.yaml from memory, wiring up assets and Gradle tasks by hand, and hoping the schema you copied from learn.liferay.com is up to date. CX Composer collapses all of that into an editor-first workflow.
- Scaffold once, ship often — pick a target folder, pick a type, answer the required prompts. You get a full project — manifest, README, assets — that builds on first try.
- Never write yaml from memory — completions and Markdown hover for every field on every type, driven by a schema pulled straight from Liferay's public YAML reference and cross-checked against 131 real production
client-extension.yaml files.
- Batch imports that don't fail — full schema IntelliSense inside
batch/*.batch-engine-data.json for all 309 registered Liferay batch-engine entity types. Extracted from Liferay's public OpenAPI schemas, enriched with 169 hand-verified runtime FK patches. No more "No Country exists with primary key 0" deploy errors.
- Catch typos before deploy fails —
instanceableq when you meant instanceable? Squiggle on the exact line with a did-you-mean suggestion.
- Per-extension build —
blade gw buildClientExtensionZip runs inside the specific client-extension folder. Monorepo-aware, right-click friendly.
Features
Scaffold every type. One wizard.
Multi-step wizard for all 28 Liferay Client Extension types: Custom Element, IFrame, Global CSS, Global JS, Theme CSS, Theme Favicon, Theme Sprite Map, JS Import Map Entry, Editor Config Contributor, FDS Cell Renderer, FDS Filter, Static Content, OAuth Application (Headless Server / User Agent), Instance Settings, Notification Type, Object Action, Object Validation Rule, Object Entry Manager, Workflow Action, CAPTCHA, Batch, Site Initializer, Commerce Payment Integration, Commerce Checkout Step, Commerce Shipping Engine, Commerce Tax Engine, Audiences Custom Attributes.
Each type gets type-appropriate assets and required prompts.
IntelliSense that reads Liferay's docs
Completions and Markdown hover for every field on client-extension.yaml (all 28 types) and on batch/*.batch-engine-data.json (all 309 registered batch-engine entities). Unknown-field detection with did-you-mean suggestions. Missing-required-field diagnostics.
Batch data authoring — all 309 Liferay entities
Right-click any folder that contains a type: batch client-extension.yaml → Add Batch File… wizard → pick from 309 registered entity types (grouped by category: Objects, Users, Sites, Roles, Content, Taxonomies, Workflow, Commerce, and more) → generates a schema-correct batch/<entity>.batch-engine-data.json skeleton with the correct configuration.className, envelope shape, and required fields prepopulated.
Inside the file:
- className autocomplete — all 309 entities, filterable, described
- Field-name autocomplete inside
items[] — driven by the file's specific className
- Hover shows each field's type + Liferay's own description from the OpenAPI YAML
- Diagnostics catch missing required fields — including runtime parent-FK requirements OpenAPI omits (169 hand-verified patches for things like
Region.countryId, TaxonomyCategory.parentVocabulary)
Schemas extracted from Liferay's public OpenAPI schemas — the same source Liferay's batch importer validates against at deploy time.
Six validator types
client-extension.yaml — full schema, all 28 types
LCP.json — Liferay Cloud service configuration
Dockerfile — instruction ordering, deprecation warnings
- Folder-level companion checks — Dockerfile / assemble source / referenced JSON
frontend-token-definition.json — walks up from the JSON to its themeCSS block, enforces the full frontendTokenCategories → sets → tokens → mappings schema
batch/*.batch-engine-data.json — schema-aware validation for all 309 batch-engine entity types
Auto-runs on save and open. Explicit Validate File command surfaces every diagnostic in the Problems panel plus a summary toast. Validate Whole CX (folder) scans the entire CX folder tree, including every batch data file.
AI-drafted scaffolding (Preview)
Describe what you need in one sentence — Draft with AI picks the CX type, drafts the yaml + handler code, and scaffolds a working project. Explain with AI provides schema-grounded hover explanations on any yaml block. Bring your own API key: Anthropic, OpenAI, Google, Groq, Azure, or run models locally with Ollama — no per-call cost from CX Composer, no data sent to our servers.
Per-extension build
Runs blade gw buildClientExtensionZip inside the specific client-extension folder — not the whole workspace. In monorepos, right-click any client-extension.yaml and the build targets exactly that project.
Right-click integrations
- Right-click any folder →
Scaffold New Project or Add Client Extension Here
- Right-click a
client-extension.yaml → Add Extension, Validate, Build
- Right-click any file →
Validate File (works on all three supported file types)
Activity Bar panel
Dedicated CX Composer view with grouped actions (Project, Build, License) and a live license status row that shows plan, account, start date, and renewal date.
Free vs. Pro
Free (everyone)
- Validation for
LCP.json and Dockerfile
- Yaml validation for four static-asset CX types:
globalJS, globalCSS, themeSpritemap, jsImportMapsEntry
- Auto-runs on save + open
- Did-you-mean suggestions for typos and unknown fields
- Problems-panel integration
Pro — $5 / month · $15 / 6 months · $25 / year
- Yaml validation for the other 24 CX types (all microservice / backend types,
themeCSS, Site Initializer, Batch, Commerce)
- Batch data IntelliSense + validation for all 309 registered Liferay entity types inside
batch/*.batch-engine-data.json
- Add Batch File wizard — right-click a batch CX folder, pick from 309 entities, get a schema-correct skeleton
- Folder-level companion checks — Dockerfile / assemble source / referenced JSON
- Deep
frontend-token-definition.json validation
- Scaffold new projects — all 28 CX types
- Add Client Extension — append blocks or drop new manifests via folder right-click
- Per-extension Build —
blade gw buildClientExtensionZip
- IntelliSense on
client-extension.yaml — completions + Markdown hover
- Snippets — YAML / JS / TS / CSS (
lrcx-* prefixes)
- AI-drafted scaffolding (Preview) — Draft with AI, Explain with AI, and BYOK provider setup (Anthropic / OpenAI / Google / Groq / Azure OpenAI / local Ollama). CX Composer never proxies your prompts.
Same feature set on every Pro plan — pick the billing cadence that suits you.
Get a Pro license: store.cxcomposer.dev
Run CX Composer: Activate License and paste your key. Keys are stored securely in VS Code's SecretStorage and re-verified on a 7-day cadence with an additional 7-day offline grace period. One machine per key.
Requirements
- VS Code 1.90+
- Blade CLI on your
PATH — only if you use the Build command (configurable via cxComposer.blade.path)
- Liferay Workspace with the workspace Gradle plugin — only if you build
IntelliSense, hover, validation, and scaffolding need nothing else — no additional VS Code extensions required.
Settings
| Setting |
Default |
Description |
cxComposer.blade.path |
blade |
Path to the Blade CLI executable. |
cxComposer.build.gradleTask |
buildClientExtensionZip |
Gradle task run inside the client extension folder to produce its .zip. |
cxComposer.license.key |
"" |
Legacy setting; prefer Activate License command. |
FAQ
Q. What is a Liferay Client Extension?
A declarative package defined by a client-extension.yaml manifest. There are 28 supported types — 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), and Liferay Commerce integrations. Extensions are built into a .zip with blade gw buildClientExtensionZip and deployed to a Liferay DXP server.
Q. Does CX Composer replace Blade?
No — it complements Blade. CX Composer invokes Blade for build, but adds editor-first IntelliSense, validation, and a wizard-driven scaffold that Blade doesn't provide.
Q. Can I use CX Composer without paying?
Yes. LCP.json and Dockerfile validation plus yaml validation for four static-asset CX types (globalJS, globalCSS, themeSpritemap, jsImportMapsEntry) is free forever. Pro extends validation to the other 24 CX types and unlocks scaffolding, IntelliSense, snippets, and per-extension build.
Q. What Liferay DXP versions are supported?
CX Composer's schema targets Liferay DXP 2024.Q1+ and Liferay Portal GA100+. The Client Extension format has been stable since DXP 2023.Q4.
Q. Is CX Composer affiliated with Liferay?
No. CX Composer is an independent third-party product. See cxcomposer.dev/legal for the trademark notice.
Q. How is my license key stored?
In VS Code's built-in SecretStorage. Re-verification happens every 7 days with an additional 7-day offline grace period.
Support
Trademark notice
Liferay® and Liferay DXP® are registered trademarks of Liferay, Inc. CX Composer for Liferay is an independent third-party product and is not affiliated with, endorsed by, or sponsored by Liferay, Inc.