SolvisseContact
All articles

Scaling dotCMS: Lessons from Building PartnerCMS as a UX-First Layer

Maikel Pereira ·

In the previous articles of this series, we explored how we replatformed thousands of partner websites onto dotCMS and how we engineered a multi‑site, multi‑tenant content architecture that could scale without losing control. But architecture alone doesn’t solve the real problem.

Once you’re operating at this level of scale, the CMS itself becomes a constraint if it’s not designed for the people who actually use it. That realization led us to build PartnerCMS.

The Real Bottleneck: CMS UX at Scale

DotCMS is a powerful and flexible platform. It excels as a centralized content repository and governance engine. However, its native UI is designed for trained marketing teams—not for thousands of non‑technical partners who need to make frequent, small updates without risking brand integrity.

Early on, we saw the friction:

Rather than forcing partners to adapt to a tool that wasn’t built for them, we flipped the model.

We kept dotCMS exactly where it shines—behind the scenes—and introduced a purpose‑built experience in front of it. That experience became PartnerCMS.

PartnerCMS: A Purpose‑Built Control Layer

PartnerCMS is not a CMS replacement. It’s a UX‑driven control layer that sits between partners and dotCMS, using dotCMS purely as a content engine accessed through APIs.

The guiding principles were simple:

Partners manage only what they’re allowed to manage. Everything else—templates, shared containers, global components, and governance—remains centrally controlled.

Frontend Architecture: Angular, Designed for Guardrails

The PartnerCMS frontend is a single‑page application built with Angular. We chose Angular for its strong modularity, predictable structure, and suitability for large, long‑lived enterprise applications.

Key frontend characteristics:

Responsive design using Bootstrap and SCSS for predictable theming

Editing Without Risk

Instead of exposing raw HTML or generic CMS fields, PartnerCMS provides form‑driven editors tied directly to approved content models:

For richer experiences, we selectively introduced visual tooling:

At no point can a partner break layout, inject unsafe markup, or bypass brand rules—by design.

Accessibility and Usability

Accessibility wasn’t treated as an afterthought:

Backend Architecture: Reactive by Design

Behind PartnerCMS sits a reactive Java backend built with Spring WebFlux. The decision to go reactive was intentional.

At peak, the system needs to support:

WebFlux allows us to handle this load efficiently using non‑blocking I/O and a small thread footprint.

Layered Backend Design

The backend is organized into clearly defined layers:

  1. Controllers
    REST endpoints grouped by feature (articles, banners, analytics, publishing, etc.)
  2. Published Services Layer
    Core business logic: validation, guardrails, content limits, and workflows
  3. Feature Services & Clients
    • Direct dotCMS REST clients
    • Optional proxy APIs when abstraction or transformation is required
  4. Domain & Mapping Layer
    DTOs and assemblers mapping PartnerCMS models to dotCMS content types

This separation keeps the system testable, maintainable, and resilient to change.

Authentication, Authorization, and Safety

PartnerCMS integrates with the parent company’s identity platform using OAuth2. Authentication is fully stateless and token‑based.

Security highlights:

Even destructive actions are guarded. For example:

This ensures content safety while preserving operational flexibility.

Reliability and Operational Discipline

From day one, PartnerCMS was treated as a production‑critical system.

That meant:

The goal wasn’t just to ship features—it was to build something that could be trusted at scale.

What Partners Actually Experience

From the partner’s point of view, none of the underlying complexity exists.

They see:

They don’t see:

And that’s exactly the point.

Closing the Loop

PartnerCMS completes the architectural story we started in the first two articles.

Together, they form a system where thousands of independent partners can confidently manage their digital presence—without ever putting the brand, performance, or platform at risk.

In the final article of this series, we’ll dive into how we keep this entire ecosystem synchronized daily using scheduled jobs, Redis caching, proxy APIs, and programmatic publishing at scale.