Components before screens
A component set is defined first, because building screens individually means building the same elements repeatedly.
For interfaces that genuinely need to be applications.
React is the right answer for interfaces with real state – dashboards, configurators, multi-step flows, anything that behaves like software. It is the wrong answer for a brochure site, and I will say so before quoting.
React solved a real problem: keeping a complex interface in step with complex state. When a screen has dozens of interacting elements that all respond to the same changing data, describing what the interface should look like for a given state is far more reliable than manually updating pieces of a page.
That makes it excellent for dashboards, configurators, multi-step forms with conditional logic, booking flows, anything with live data, and interfaces where a user is doing work rather than reading. In those cases the component model earns its complexity several times over.
It also makes it the wrong tool for a great many sites it gets used on. A brochure site or a blog built as a client-side React application ships a large JavaScript bundle to render text that could have arrived as HTML, and then has to work to make it indexable and accessible again. That is effort spent undoing a decision.
Where the content is the point but you still want the component model, Next.js server rendering is usually the honest middle ground – real HTML delivered to the browser, with React handling the parts that are genuinely interactive. The distinction is worth making before a project starts rather than during it.
Reusable, documented components with variants, states and accessibility handled once rather than per screen.
Your team ships consistent interfaces without rebuilding the same button five times.
Data-dense screens with tables, filtering, charts and bulk actions that stay usable at real data volumes.
Staff who can work quickly instead of waiting for a table to render.
Server-rendered and statically generated sites where content matters and you still want components.
Real HTML for crawlers and slow connections, with interactivity where it earns its place.
React or Next.js front ends on WooCommerce, Shopify or BigCommerce commerce APIs.
Complete design freedom with orders and payments still handled by a proven platform.
Profiling existing applications for unnecessary re-renders, oversized bundles and expensive work in the render path.
Interfaces that respond immediately instead of stuttering under real data.
Keyboard navigation, focus management, ARIA where it is genuinely needed, and testing with assistive technology.
An interface that can be used by everyone who needs to use it.
Restraint, mostly. The ecosystem makes it very easy to add things.
A component set is defined first, because building screens individually means building the same elements repeatedly.
Semantic elements, keyboard operation and focus management built in. Retro-fitting accessibility costs several times what doing it once does.
Every package is weight someone downloads and code someone maintains. Added when it earns its place, not because it is popular.
Profiled with realistic data volumes, because a table is fast with ten rows and often not with ten thousand.
If the content matters for search or slow connections, it is server rendered rather than assembled in the browser.
Props, variants and usage written down, so the library gets used rather than worked around by the next developer.
Interfaces where the user is working, not reading.
Data-dense screens where staff or customers do real work.
Configurators, builders and multi-step flows with conditional logic.
Several products needing consistent, documented, accessible components.
Complete design freedom while commerce stays on a proven platform.
A React application stuttering under real data volumes.
An existing interface that cannot be operated by keyboard or screen reader.
React skill is abundant in Bangalore, which is genuinely useful – it means anything I build here can be handed to a local team or a new hire without difficulty. Choosing it is a low-risk decision from a staffing point of view, which is not true of every framework.
What is worth designing for specifically is the device and connection profile. A dashboard that performs well on a development laptop can be unusable on a mid-range Android phone over patchy mobile data, and a large JavaScript bundle is paid for on every metered connection.
I work with businesses across Bangalore and India, and with clients in the UK, USA, Canada, the UAE and Singapore.
Abundant local skill, so handover is straightforward.
Tested where your users actually are.
Every kilobyte is paid for on mobile data.
India, the UK, USA, Canada, the UAE and Singapore.
Serving Chennai, Bangalore, India, Canada, UK, USA, Dubai, Singapore.
Wherever the screen is a tool rather than a page.
Typically needs: The product interface itself, used daily by people doing work.
How I help: A documented component library, data-dense screens and performance under real usage.
Typically needs: Live tracking and dispatch boards updating continuously.
How I help: Real-time updates without re-rendering everything, and views scoped per role.
Typically needs: Clinical interfaces where speed and accuracy both matter.
How I help: Fast, keyboard-operable interfaces with accessibility taken seriously rather than claimed.
Typically needs: Dashboards, calculators and multi-step applications with rules.
How I help: Conditional flows with validation, and figures that stay correct as state changes.
Typically needs: Configurators and headless storefronts needing design freedom.
How I help: Product configurators and front ends on commerce APIs, server rendered where content matters.
Typically needs: Operations screens built around how a team actually works.
How I help: Task-shaped interfaces with bulk actions, filtering and exports that hold up at volume.
Starting with whether this should be a React application at all.
I establish what the interface does, who uses it, on what devices, what data it handles, and whether the complexity genuinely warrants a front-end framework.
You get: A written scope, a fixed quote and a straight answer on whether this is the right approach.
Why it matters: A brochure site built as a client-side application is a decision that costs for years.
The component set, state management approach and rendering strategy are decided – what is server rendered, what is static, what genuinely needs to be client side.
You get: A component list and an architecture decision you have signed off.
Why it matters: Rendering strategy chosen late is expensive to change and shapes everything about performance.
Design for components rather than screens, including states, variants, empty and error cases, at phone width first.
You get: Designs for the component set and key screens, with states specified.
Why it matters: Designing only screens produces components that work in exactly one layout.
The build: components with their states, composed into screens, with real data wired in as early as possible.
You get: A working interface with real data, updated as components land.
Why it matters: Placeholder data hides every problem your real data will cause.
Testing across devices and browsers, keyboard operation and screen reader checks, and performance profiled under realistic data volumes.
You get: A tested interface, an accessibility report and performance numbers.
Why it matters: Accessibility and performance both degrade silently, and neither shows up on a developer laptop.
Deployment, then documentation of the components – props, variants and usage – and a walkthrough for whoever maintains it.
You get: A live interface and a documented component library.
Why it matters: An undocumented component library gets bypassed, and then you have two design systems.
A deliberately small set. The ecosystem is enormous and most of it is optional.
Scoped against the interface, not offered as a package.
A client-side React application delivers an almost empty HTML document and assembles the page in the browser. Search engines can execute JavaScript, but it costs them crawl budget and adds delay, and anything else reading the page may not execute it at all.
If the content matters for search, it should be server rendered or statically generated. That is a Next.js decision made at the start of the project, and it is expensive to retro-fit.
The same point applies more strongly to automated readers than to search engines. Many tools fetching a page do not execute JavaScript at all, so a client-rendered application is effectively empty to them. Server rendering is the whole difference.
The practical reasons, rather than the adjectives.
A great many sites built in React should have been HTML. If yours is one, you will hear that before quoting rather than after shipping a bundle to render a paragraph.
Keyboard operation, focus management and screen reader testing are part of the build. Retro-fitting them costs several times what doing it once does.
Every package is weight your users download and code someone maintains. Added when it earns its place, not because it is what everyone uses.
I also build server-rendered sites, so the rendering decision is made on your requirements rather than on what I happen to be comfortable with.
Tell me what you need. I reply within one working day, and the first conversation costs nothing.