Skip to main content
Web Development· SaaS· 16 weeks

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
|b| Key results
faster delivery
75%
faster page loads
23%
churn reduction
Zero-downtime
deployments
Lighthouse
score: 62 → 98

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

  1. The Strangler Fig pattern reduces risk — Migrating progressively is safer than a full rewrite and allows each step to be validated
  2. Performance reduces churn — Pages 75% faster had a direct, measurable impact on retention
  3. Developer experience fuels velocity — Modern tooling produces a more productive, more engaged team
  4. Real-time is no longer optional — Users expect instant updates; it has become a standard
  5. TypeScript prevents incidents — 40% fewer production incidents after the migration
|b| Architecture

Architecture — Pattern Strangler Fig

Utilisateurs15 000 utilisateurs actifsReverse Proxy (Nginx)Routage par URL — coexistenceNouveau système — Next.js 15Next.js 15RSC + Server ActionsVercel EdgeAPI RoutesTypeScripttRPC / RESTWebSocket ServerCollaboration temps réelRedisPub/Sub + SessionsPostgreSQLBase partagée — source de vérité uniqueLegacy — Ruby on RailsRails MonolitheAdmin, FacturationEn cours de migrationAuth partagéeSession RedisToken unique↓ Migration progressiveCI/CD & Feature FlagsGitHub Actions·Vercel·Feature Flags·RollbackNouveau (Next.js)Legacy (en migration)Infrastructure partagée
|b| Technology stack
  • Next.js 15
  • React 19
  • TypeScript
  • PostgreSQL
  • Redis
  • Kubernetes
  • Vercel
  • Tailwind CSS
|b| Next step

Similar results to achieve?

Share your context. Our engineers get back within 24 working hours with a first argued reading.