Welcome to
the CWA
Welcome to
the CWA
The power of a
predictable data structure
The power of a
predictable data structure
With the rise in decoupled websites and the power of front-end frameworks, we began to think about a data structure that would fit for every website; what did every website need?
We didn't want to have to re-make common functionality for each website every time, and if we had a predictable data structure, it would be possible to have a powerful website builder and advanced functionality, while enabling a developer to create any website with complete flexibility.
Decoupled web apps
Low-code, great DX
Convention over configuration
Free & Open-Source
Love writing content
draft, refine, publish
Love writing content
draft, refine, publish
Making updates to a website requires time and thought. With publishable components, drafts are created when you make changes and ready to publish when signed off.
- Easy to configure
- Just 2 lines of code - an annotation and a trait and your component is enabled for advanced publishable features.
- Add state-specific validation
- Use pre-defined validation groups to apply validation specific to the component state. In the example, the Title resource cannot have a blank title property when it is in a published state.
api/src/Entity/Title.php<?php ... #[Silverback\Publishable] #[ApiResource(mercure: true)] #[Orm\Entity] class Title extends AbstractComponent { use PublishableTrait; #[Assert\NotBlank(groups: ['Title:published'])] #[Orm\Column(type: 'text', nullable: true)] public ?string $title = null; }
Prefer trusting
the web designers
Prefer trusting
the web designers
Unlike other website builders, we don't believe website admins should have unlimited creative freedom.
- Components used as intended
- As a developer, you can easily specify which components can be added to which component groups.
- Pre-configure styles
- Designers and developers define the styles that a website admin can select from. This keeps your client on brand, no matter who updates the site.
- Build components your way
- Web designers and developers are provided with helpers. We do not impose any HTML structure of stylistic choices. Build, extend and express as you want.
Feel united with
real-time updates
Feel united with
real-time updates
We integrate with Mercure to push real-time updates from the API to website users.
- Publish changes immediately
- When you make a change, affected users get an immediate notification so they can stay up to date.
- Collaborate on changes
- Multiple website admins can work together on changes without external tools.
- Authenticated updates
- With authentication built in by default, the browser will only receive updates for relevant resources. Website visitors will not be exposed to draft component updates.
Impress & convert
with fast websites
Impress & convert
with fast websites
We have optimised the system for the fastest response times and an enhanced user experience.
- Simple, small API responses
- Each API request returns a small amount of data and a single resource instead of complex and deeply nested data.
- UX: Speedy first impressions
- The page UI updates as soon as the primary resources are loaded from the API or local cache for the fastest FCP (First Contentful Paint) possible. The CWA only loads resources that are required for each page, and reuses resources from a local cache if they exist on multiple pages.
- Caching and Preload Hints
- We leverage a smart static cache layer, which is only cleared when resources change. We also leverage Vulcain with preload hints to improve response times.
Freedom to choose
your own (file) path
Freedom to choose
your own (file) path
We have built in easily configurable file uploads and a file storage abstraction layer with Flysystem.
- Easy to configure
- Similar to publishable components, with a little config and annotations, you'll have file uploads setup in no time.
- Pre-configured file-systems
- Flysystem has several file storage systems already built in, such as Google Cloud, AWS S3, Azure Blob and Local Storage.
- Build your own file storage adapter
- Documentation to configure your own file storage is readily available and there are more third-party file storage providers available.
Easy & flexible to
build & deploy
Easy & flexible to
build & deploy
When it comes to deploying your application, we know designing the tech stack can be difficult. We have done all the heavy lifting.
- Dockerized
- We have built the tech stack into Docker containers and Docker Compose configurations so it is vendor agnostic and can be easily deployed.
- Kubernetes & Helm
- Deploy to your own Kubernetes cluster and take advantage of HPA and VPA with easy to customise templates using our included Helm chart.
- Bash scripts for CI
- Although we have a vendor specific GitLab configuration, it is easy to create your own for other CI providers as we have created a bash script with functions to carry out the common tasks.
- Optimised tech stack
- We use a Caddy server with FrankenPHP in our tech stack for optimal performance. We noted a 95% reduced latency vs a previous FPM configuration when under heavy loads. The Caddy modules for Mercure, Vulcain and Souin are also pre-configured.