From legacy monolith to modern SaaS: 5× faster delivery
How we modernized a project management SaaS platform using the Strangler Fig pattern — Next.js, Kubernetes and DevOps — to multiply delivery velocity by five and reduce churn by 23%.
- Client
- ProjectFlow (anonymized)
- Timeframe
- 16 weeks
- Published
The context
ProjectFlow is a project management SaaS platform with 15,000 users and $8M in ARR. Built in 2014 on a Ruby on Rails monolith, it carried ten years of technical debt: 4-second load times, no real-time features, two-week delivery cycles and recurring production incidents.
The consequences were measurable: an 8% monthly churn rate (versus 5% for the market), contracts lost to more agile competitors, and an engineering team whose morale was at an all-time low. Hiring was becoming difficult — candidates declined offers when faced with an aging stack.
The challenge: modernize without rewriting from scratch, and without disrupting the 15,000 existing users.
Our approach
We adopted the Strangler Fig pattern — a progressive replacement of the monolith with modern services, while keeping the existing system in production.
Phase 1 — Foundations (Weeks 1-4)
The new technical foundation was defined: Next.js 15 with React 19 Server Components for the frontend, TypeScript for type safety, Tailwind CSS for rapid development, PostgreSQL (migrated from MySQL) and Redis for real-time features.
Traffic analysis allowed us to prioritize modernization by impact: the task dashboard (40% of traffic) and the project view (25%) were targeted first.
Phase 2 — Dashboard rewrite (Weeks 5-8)
The dashboard — the core of the application — was rebuilt from the ground up with React 19 Server Components. Server-side rendering with streaming and Suspense boundaries brought load time down to 0.9 seconds (from 4.2 s previously).
User interactions were redesigned around Server Actions and optimistic transitions: every change (status, assignment, priority) is reflected instantly on the client before server confirmation.
Phase 3 — Real-time collaboration (Weeks 9-12)
The feature users requested most — and the legacy team dreaded most — was implemented: real-time collaboration via WebSockets and Redis Pub/Sub.
User presence, instant task updates, live notifications — all with optimistic updates powered by React 19’s useOptimistic hook, guaranteeing a smooth experience even under network latency.
Phase 4 — Migration and coexistence (Weeks 13-16)
A reverse proxy ensured coexistence between the old and new systems: modernized routes (dashboard, projects, API) were directed to Next.js, while functions not yet migrated (admin, billing) remained on Rails.
Authentication was shared between the two systems via Redis, providing a single seamless session for the user. On the deployment side, an automated CI/CD pipeline with GitHub Actions and Vercel enabled more than 10 deployments per day with instant rollback.
Results
Performance — Load times reduced by 75% on the main pages. Core Web Vitals transformed: LCP from 4.5 s to 1.2 s, FID from 180 ms to 45 ms, CLS from 0.25 to 0.02. Lighthouse score up from 62 to 98.
| Page | Before | After | Improvement |
|---|---|---|---|
| Dashboard | 4.2 s | 0.9 s | 78% |
| Project view | 3.8 s | 1.1 s | 71% |
| Task list | 5.1 s | 1.3 s | 75% |
Delivery velocity — Feature development: from 2 weeks to 2 days. Deployment frequency: from every 2 weeks to 10+ per day. Test coverage: from 35% to 85%.
Business impact — Monthly churn reduced from 8% to 5.2% (-23%). NPS up from 32 to 58. ARR growth accelerated from 15% to 35%. New customers: +40%.
Team — Engineer satisfaction: from 5.2 to 8.9/10. Onboarding time for a new developer: from 4 weeks to 3 days. Five senior engineers successfully hired, drawn by the modern stack.
The modernization turned ProjectFlow from a follower into a market leader in product innovation — without ever interrupting the service.
Lessons learned
- The Strangler Fig pattern reduces risk — Migrating progressively is safer than a full rewrite and allows each step to be validated
- Performance reduces churn — Pages 75% faster had a direct, measurable impact on retention
- Developer experience fuels velocity — Modern tooling produces a more productive, more engaged team
- Real-time is no longer optional — Users expect instant updates; it has become a standard
- TypeScript prevents incidents — 40% fewer production incidents after the migration
Architecture — Pattern Strangler Fig
- Next.js 15
- React 19
- TypeScript
- PostgreSQL
- Redis
- Kubernetes
- Vercel
- Tailwind CSS