The CWA is in heavy development
The CWA is still in alpha and not ready for production - some code and implementations are likely to change. If you would like to try out the CWA, please enjoy what we have provided and feel free to provide feedback, or get involved on GitHub.
Introduction

Introduction

CWA is a full-stack framework for building content-driven web applications with an inline CMS, real-time updates, and a clean developer API.

Every website has the same skeleton.

A layout — the persistent outer shell with header, navigation, and footer. Pages that live inside it, each divided into named component groups — regions like "hero", "sidebar", or "navigation". And filling those regions, the actual content components: headings, images, rich text, navigation links.

This structure is so universal that CWA makes it a first-class data model. Layouts, pages, routes, and components aren't configuration files — they're records in a database, managed through an API. That shift changes what becomes possible:

  • Content editors can create pages, restructure regions, or publish changes without a deployment or a developer — the structure lives in the database, not code.
  • Every open browser session sees those changes instantly — no page reload, no polling. Powered by Mercure, wired up automatically.
  • Your clients edit content directly on the page — no separate CMS to log into, no context switch. Enter edit mode and everything becomes manageable inline.
  • Add one PHP annotation to a component type and it gets a full draft/publish lifecycle — role-based access control, publish-time validation, the lot.

Your job as a developer: define what components look like and what data they hold. Routing, the admin CMS, real-time updates, draft/publish workflows, caching — handled.

How it fits together

You write one PHP entity, one Vue display component, and one admin tab per component type. The module resolves every URL to the right layout, page, and component tree — no routing code, no CMS wiring.

Try it live

Before writing any code, see what you're building towards. The playground is a complete CWA site — try editing content in the inline CMS, publishing a change, and watching it propagate live across browser tabs.

Open the playground

The two parts

A CWA application has two sides that communicate through a typed REST API:

The API — a Symfony application with the API Components Bundle installed. You extend AbstractComponent to define content types, annotate them with #[Publishable], #[Uploadable], or #[Timestamped], and run migrations. The bundle provides authentication, serialisation, Mercure real-time publishing, and all the admin endpoints.

The Nuxt app — a Nuxt application with the CWA module. You create layout files in app/cwa/layouts/, page templates in app/cwa/pages/, and component Vue files in app/cwa/components/. The module handles route resolution, resource fetching, SSR, and the full inline CMS.

The mapping is automatic: a Title PHP class renders via app/cwa/components/Title/Title.vue. No manual registration.

Get started

Scaffold a new project with the interactive CLI — pick your features, optionally wire GitHub Actions or GitLab CI, and get Docker running in one step:

pnpm create cwa my-project

Full installation guide →