The problem
React makes it easy to start and easy to get slow. Six months in, the bundle is two megabytes, every keystroke rerenders half the page, three developers have invented three different buttons, and nobody wants to touch the state management.
On a fast laptop it feels fine. On a mid range Android phone on a patchy connection, which is where most of your users are, it does not.
What we build instead
Interfaces with a performance budget agreed up front and enforced by the build, so a regression fails the pipeline rather than reaching production. Typed data access, so a change to the API surfaces as a compile error rather than a blank screen at eleven at night.
One component library, documented, so the fourth developer builds the same button as the first.
How we work
- Interface and data model. We agree what the screens are and what data each one needs before writing components.
- Component library first. Buttons, inputs, tables, empty states, loading states, error states. The boring ones are the ones that get skipped.
- Screens. Assembled from the library, reviewed weekly against real data.
- Measure. Real device testing and a Lighthouse budget before launch.
Accessibility is part of the build
Keyboard operability, correct roles and labels, visible focus, and contrast that passes at 4.5 to 1. It is far cheaper to build in than to retrofit, and in many sectors it is now a procurement requirement.
Who this is for
Teams building dashboards, portals, booking systems and internal tools, and teams with an existing React codebase that has become difficult to change.
Why React applications get slow
The pattern is consistent. Every component fetches its own data, so one screen makes thirty requests. State lives in a global store that rerenders half the tree on every keystroke. The bundle grows because a date library was imported for one function. Nobody notices, because everyone develops on a fast laptop on office broadband.
Then it ships, and a customer on a three year old Android phone waits eleven seconds.
We set a performance budget at the start and enforce it in the pipeline. A pull request that pushes the bundle past the limit fails, which turns performance into a rule rather than an argument.
Next.js or plain React
Next.js for anything public facing that needs to be found, because it renders on the server and crawlers receive real HTML. If search visibility matters at all, this is not a preference, it is a requirement.
Plain React for tools behind a login, where nothing needs indexing and the extra framework surface buys you nothing.
We will tell you which applies rather than defaulting to whichever is fashionable.
Rescuing a slow application
We start by measuring rather than guessing, profiling render counts, bundle composition and network waterfalls on real hardware.
The output is a prioritised list with the cost and the expected gain of each fix, so you can decide how far to go. Frequently a handful of changes recover most of the performance without a rewrite, and we will say so even though a rewrite is the larger project.
Design systems
If you have more than two products, or more than three developers, a documented component library pays for itself within months. Without one, each developer invents their own spacing, colours and interaction patterns, and the product slowly stops looking like one product.
We deliver it as a living styleguide that runs in the browser rather than a static document, so it cannot drift out of date with the code.
Accessibility
Keyboard operability, correct roles and labels, visible focus, sensible focus order and contrast that passes at 4.5 to 1. Building it in adds a small percentage to the project. Retrofitting it after launch routinely costs several times more, and it is increasingly a procurement requirement in enterprise and government work.
Testing
Component tests on the pieces that carry logic, and end to end tests through the journeys that matter commercially: sign in, search, checkout, submit. Enough to deploy on a Friday without anxiety, not so many that the suite becomes the thing slowing you down.




