Architectural plan of portable software

Software Architecture

The Great Divide: Making a WordPress Platform Portable

How I rearchitected an agency's WordPress platform to support independent deployments, reusable software, and client ownership.

Overview

The hidden cost of leaving

Imagine investing thousands of dollars in a website, only to discover that leaving your agency means rebuilding it somewhere else.

That was a limitation of the WordPress platform I worked on at PracticeMadePerfect (PMP).

The agency managed multiple client websites through a shared WordPress multisite network. Its proprietary theme and plugin made development and maintenance efficient, but they also created a dependency.

Clients owned their content. They didn't own the software that made their websites work.

Ending the relationship could mean losing the functional website they'd invested in.

I saw an opportunity to rethink that arrangement.

What if clients could leave with their working websites while the agency retained ownership of its proprietary software?

That question became the foundation of an architectural transformation I called The Great Divide.

Client Website to Agency Platform blueprint

Client website connected to an agency-controlled platform.

The Breaking Point

Three websites changed the equation

The problem became concrete when a new client arrived with three websites that needed redesigning.

The project required a dedicated WordPress multisite network, but it also needed to reuse the agency's existing theme and plugin.

There was a catch.

Our software lived inside a monorepo alongside the existing network's configuration and deployment infrastructure.

We could duplicate the code, but that would create two implementations to maintain. Every improvement, bug fix, or feature would eventually need to be synchronized.

The more networks we added, the more complicated that relationship would become.

We needed to share the software without forcing every network to share the same development and deployment lifecycle.

What started as a three-website project became an opportunity to redesign how the agency delivered software.

The Great Divide

Breaking apart to work together

I proposed splitting the platform into four repositories.

Two would manage the WordPress networks. The other two would contain the shared theme and plugin.

Instead of embedding the software directly inside each network, both networks would consume independently versioned packages through Composer.

Architectural plan of portable software

Before: One monorepo containing the agency network and shared software.

After: Two independent WordPress networks consuming a shared theme and plugin through Composer.

This introduced three important capabilities:

  • One source of truth: Shared functionality could evolve without duplicating code.
  • Independent deployments: Networks could adopt software updates on their own schedules.
  • Client portability: A dedicated network could be handed over without exposing the agency's broader infrastructure.

It was a cleaner architecture on paper.

Making it work without breaking existing websites was another story.

The moment of truth

The theme and plugin depended on build processes, installation paths, and runtime dependencies inherited from the monorepo.

I extracted them into standalone packages and established a release workflow using GitHub Actions, compiled assets, and version tags.

Each network could now install a complete, versioned package without rebuilding the software during deployment.

Pipeline from source to network

Source code → Build → Versioned package → Composer → WordPress networks

But the migration carried a serious risk.

Our existing deployment process used rsync --delete, meaning an incorrectly placed package could remove a working theme or plugin from production.

I treated the transition as a controlled migration rather than a routine refactor.

I preserved package histories, established a validated baseline, temporarily disabled production deployment triggers, and introduced checks for installation paths, compiled assets, and runtime dependencies.

Dry runs exposed potentially destructive changes before they reached production.

Validation compared a 198-file theme build tree, confirmed byte-identical CSS and JSON output, and checked critical website functionality across development and staging.

Only after those safeguards were validated did I re-enable production deployments.

The platform could now evolve independently without requiring existing client websites to change alongside it.

The Transformation

One foundation, different paths

The benefit became clear during subsequent development.

The new client needed hierarchical locations to support its website structure.

With the new architecture, I could develop that functionality in the shared plugin, publish a new version, and adopt it in the client's network while the agency's existing network remained on its validated release.

Both networks still shared the same software.

They simply didn't have to move at the same pace.

Networks using different versions of shared package

Two WordPress networks consuming different versions of the same shared packages.

Later enhancements introduced reusable content components, compatibility checks, and per-site feature controls, extending the shared platform without duplicating implementations.

The architecture also addressed the original ownership problem.

Clients could retain their working websites and installed software packages when their agency relationship ended. Future proprietary updates remained under the agency's control.

Hosting, maintenance, and external integrations still required separate arrangements, but the technical foundation for a practical handover was now in place.

Client continuity and proprietary software ownership no longer had to be mutually exclusive.

Final Thoughts

The cost of independence

Moving from one repository to four introduced new responsibilities: package releases, compatibility management, dependency updates, and coordination between environments.

But that complexity gave us something more valuable: control.

Shared software could evolve centrally, individual networks could adopt changes independently, and clients had a practical path to retaining the websites they'd invested in.

The biggest lesson wasn't that a monorepo needed to become multiple repositories.

It was that technical architecture can influence business relationships.

By considering ownership, portability, and continuity as engineering requirements, I helped turn a tightly connected platform into a more flexible foundation for both the agency and its clients.