We approached this project in three parallel workstreams: architecture planning, UI/UX redesign, and phased migration.
Domain-driven decomposition
Before writing any code, we mapped the entire monolith's functionality into logical domains — content management, user management, media handling, permissions, analytics. Each domain became a candidate microservice. We evaluated coupling between domains and defined clean API contracts between services before separating them.
Go backend development
Each microservice was built in Go — chosen for its performance, concurrency handling, and suitability for API-heavy architectures. Services communicate through well-defined REST APIs with clear versioning, making each service independently deployable and testable.
API integration layer
We designed a unified API gateway that routes requests to the appropriate microservice. This layer handles authentication, rate limiting, and request routing — giving the frontend a single, clean interface while the backend services operate independently.
UI/UX redesign
Simultaneously, we redesigned the CMS interface from the ground up. We conducted usability testing with existing Axivo users to understand their workflows, pain points, and mental models. The new design preserved familiar navigation patterns while modernizing the visual language — cleaner typography, better information hierarchy, and faster task completion for common operations like content editing and publishing.
Phased migration
Rather than a risky big-bang switchover, we migrated service by service. Each microservice was deployed alongside the legacy system, with traffic gradually shifted over. This allowed us to validate each service in production before decommissioning the corresponding monolith component.