Modernization & upgrades
Move the codebase forward without stopping the roadmap.
React codebases age in predictable ways: class components nobody wants to touch, a Create React App build that the ecosystem has moved past, a React version several majors behind, state management chosen in a different era. The wrong response is a rewrite. The right response is a sequence of small, reversible moves — each one shippable, each one leaving the app better than it found it.
Migrations we run
- React version upgrades — 16 or 17 to 18, 18 to 19: concurrent-rendering readiness,
createRootadoption, StrictMode-revealed bugs, deprecated API cleanup, and third-party dependencies audited before anything is flipped. - Class components to hooks — converted incrementally, highest-churn components first, with behavior pinned by tests before conversion rather than after.
- Create React App exits — to Vite for SPAs that should stay SPAs, or to Next.js where routing, data fetching, or rendering strategy justify a framework. We help you make that call on your constraints, not on fashion.
- Incremental TypeScript adoption —
allowJsfirst, strictness ratcheted file by file, types added where they catch real bugs (API boundaries, component props, state) before anywhere else. - State-management refactors — server state moved into a query layer, stores trimmed to genuinely shared UI state, context split so updates stop rippling through the tree.
The discipline
Every migration follows the same rules: an audit before a plan, a plan before code, and increments that merge to main behind flags or alongside the old path. Codemods where they are safe, hands where they are not. Feature work continues throughout — a migration that freezes the roadmap is a failed migration, whatever it ships.
Engagement shape
Hourly time and materials. The usual entry point is an architecture & performance review that produces the migration plan with effort ranges; execution is then staffed to match your team's capacity — us leading, or your engineers leading with us alongside.