Migrating a Monolith to a Modular Next.js Architecture
Context
A growing SaaS product was built as a React SPA with a Node.js Express backend. As the team scaled from 3 to 12 engineers, the monolithic architecture became a bottleneck — slow builds, merge conflicts, and difficulty onboarding new developers.
Architecture
I led the migration to a Next.js App Router architecture with clear module boundaries. The approach was incremental — we migrated one feature at a time while keeping the existing app running. Phase 1: Established the new Next.js project with shared component library and design system.
Phase 2: Migrated read-heavy public pages first, using Server Components for instant performance gains.
Phase 3: Moved authenticated features, replacing the Express API with Next.js API routes and Supabase.
Phase 4: Deprecated the old SPA once all features were migrated and traffic was shifted.
Challenges
- Maintaining feature parity during migration without freezing development
- Training team members on Server Components and the App Router paradigm
- Handling authentication state across old and new systems during the transition
- Ensuring SEO improvements didn't cause ranking disruptions
Solutions
- Built a feature flag system to gradually shift traffic between old and new implementations
- Created comprehensive internal documentation and ran weekly migration workshops
- Implemented a shared authentication layer that worked across both systems
- Set up proper redirects and canonical URLs to preserve SEO equity
Results
Built a feature flag system to gradually shift traffic between old and new implementations Created comprehensive internal documentation and ran weekly migration workshops Implemented a shared authentication layer that worked across both systems Set up proper redirects and canonical URLs to preserve SEO equity