Avant
Problem
The team needed to modernize a long-lived consumer-lending platform: bring the frontend onto a server-rendering React framework for faster page loads on regulated content, expand test coverage so feature work could ship without manual QA bottlenecks, and incrementally migrate a large JavaScript codebase to TypeScript without freezing product delivery.
Constraints
Production traffic and regulatory copy meant zero tolerance for visible regressions. The TypeScript migration had to happen file-by-file alongside feature work, not as a freeze-and-rewrite. Backend (Python/Django) and frontend teams shared ownership of contract evolution — every change had to be discussed across stacks.
Approach
Stood up Remix.run for new server-rendered routes while keeping the existing React shell intact, so migration could happen route-at-a-time. Added Cypress for end-to-end coverage of credit-flow happy paths and Playwright for newer feature work where the cross-browser matrix mattered. Drove the JS→TS migration with strict-mode-on-by-default on new files and incremental opt-in (`// @ts-check` then `.ts`) for legacy modules; reviewed every cross-stack interface change with the Django side before merging.
Outcome
Server-rendered routes shipped without rollback. Test coverage went from spot-checked manual QA to a fast Cypress+Playwright suite gating CI. The TS migration progressed steadily over the engagement, with no feature-delivery freeze. Cross-stack API contract changes now go through a documented review path that catches breakages before they hit staging.
Tech
- Cypress
- Django
- JavaScript
- Playwright
- PostCSS
- Python
- React
- Remix
- TypeScript