Every time I have inherited a slow React app, the bottleneck has been the same. State that belongs to the server has been pulled into the client and re-derived on every render. Forms own data they should be reading. Lists own filters that should live in the URL.
The fix is rarely a faster reconciler or a heavier memoization strategy. The fix is moving state to the boundary that owns it. Server state goes to the server cache. URL state goes to the URL. Form state stays inside the form. Component state stays small and local.
Once those boundaries are right, the app gets faster without anyone touching a render path. And — more importantly — the next engineer has somewhere obvious to put new state.
From a systems perspective, implementing this solution required auditing our telemetry structures. We mapped key transactions across our distributed database queries and evaluated the locking overheads under heavy load. By setting up strict validation rules in Prisma, we isolated runtime query errors before they could trickle up to the client view.
Ultimately, building durable systems means choosing boring abstractions and documenting architectural decisions (ADRs) meticulously. When infrastructure behaves predictably, your team can deploy with high confidence. We enforce these performance and security budgets in our continuous integration (CI) workflows, ensuring that every merge maintains the same standard.