Frontend Development Services

Next.js for app shells, React + Vite for SPAs, Bootstrap for internal tools. 95+ Lighthouse on every ship, not just the demo.

Typed React web apps. Tailwind tokens. Deployed where you already host.

— React web apps. Built for real users.

The stack we ship with

What we use. Why we pick it.

  • 01Next.js App Router - product apps

    Server Components by default, client islands where they are needed. Streaming, Suspense, Server Actions, route groups. The honest modern React setup for anything that is an app, not a page.

  • 02Plain React + Vite - pure SPAs

    Admin panels, internal tools, rich editors. When the thing is genuinely an app and server rendering buys nothing, we skip Next.js overhead and ship a Vite SPA.

  • 03Bootstrap 5 - admin portals and prototypes

    Pre-built grid system, battle-tested components. Fast to scaffold an internal tool or early MVP. We use it when the priority is speed over pixel control - Tailwind when the design needs precision.

  • 04jQuery + ES6+ JS - legacy systems

    Half the internet still runs on jQuery. We maintain it without shame and migrate it to React or Next.js incrementally - one module at a time, production live throughout.

  • 05TypeScript (strict)

    Every prop, every API response, every form field typed. 'undefined is not an object' production crashes stop happening.

  • 06Tailwind + shadcn/ui

    Radix primitives styled in our repo, not in a node_module. Full control over markup, no library upgrade nightmares, ARIA handled correctly upstream.

  • 07TanStack Query (client) / RSC (server)

    Server components for data that lives on the server. TanStack Query for anything client-side. Pick per component, not per project.

  • 08Zustand / Redux Toolkit

    Zustand for most UI state: minimal API, no boilerplate, easy to test. Redux Toolkit for complex multi-step flows where the state logic genuinely earns a structured store.

  • 09React Hook Form + Zod

    Forms validated by the same Zod schemas the API uses. Client-server drift on form fields stops being a bug class.

  • 10Playwright + Vitest

    Unit tests for business logic, Playwright for critical flows. Visual regression where design fidelity matters.

  • 11axe-core + keyboard audit

    Automated a11y checks on every PR. Keyboard pass before every ship.

Pick your framework

Which framework, when.

Framework choice is a product decision, not a preference. Here is how we make the call.

  • 01 Most used

    Next.js App Router

    Product apps and dashboards

    Best for Auth surfaces, data-heavy apps, SSR with React

    • Server Components by default
    • Streaming and Suspense built in
    • Server Actions replace most API routes
    • One stack for pages and APIs

    Avoid for pure static content — plain React + Vite ships less

  • 02

    React + Vite

    Pure SPAs and admin panels

    Best for Internal tools, rich editors, data grids

    • No SSR overhead when it buys nothing
    • Instant HMR in development
    • Full client-side control
    • Module Federation for micro-frontends

    Avoid for public pages where organic search ranking drives traffic - pick Next.js instead

  • 03

    Bootstrap 5 + jQuery

    Legacy systems and internal tools

    Best for Rapid admin portals, legacy migrations, ops dashboards

    • Pre-built grid — functional UI in days
    • jQuery maintained and migrated incrementally
    • Strangler Fig pattern — no production freeze
    • Bootstrap where speed beats pixel control

    Avoid for public-facing products with a bespoke design system

Same Tailwind token system and shadcn/ui components work across Next.js and React + Vite. The framework changes — the design system does not.

Core Web Vitals

Every ship. Not just the demo.

Lighthouse CI gates block the merge if a score drops. These numbers are the floor, not a one-time screenshot.

Performance

LCP · INP · CLS

Accessibility

WCAG 2.2 AA

Best Practices

HTTPS · no console errors

Responsive

375px · 768px · 1440px

Scores from Lighthouse CI on production builds — not throttled desktop lab runs.

Verticals

Surfaces we have built before.

Each vertical has its own hard constraints. We have already run into most of them.

  • 01

    Fintech

    Live price feeds, 60fps charts, multi-currency displays, KYC flows.

    • Chart.js
    • Socket.IO
    • React Query
  • 02

    Marketplaces

    Algolia or Typesense search, cart state, Stripe and multi-gateway payments.

    • Algolia
    • Stripe
    • Next.js
  • 03

    SaaS dashboards

    Role-based UI, Zod-validated forms, virtual scrolling for large data sets.

    • Zod
    • TanStack Table
    • Zustand
  • 04

    Healthcare

    WCAG 2.2 AA hard requirement on every flow. No client-side PII.

    • WCAG 2.2 AA
    • Playwright
  • 05

    Internal tools

    Bootstrap 5, drag-and-drop interfaces, permission matrices, multi-step ops flows.

    • Bootstrap 5
    • dnd-kit
    • CASL
Case studies

Three surfaces. Three different frontend picks.

React for the trading dashboard, Next.js for the reseller portal, React + React Native for the live auction platform - three products, three deliberate picks.

  • 01/03
    Sabika Gold - gold trading platform screenshot

    Sabika Gold - gold trading platform

    React + Flutter Web from one stack. Live Socket.IO price feed.

    Admin dashboard on React, investor-facing screens in Flutter Web. Six chart timeframes, tick-by-tick price updates, gold custody integration. One team, one backend contract.

    • 6 Chart timeframes
    • Live Price feed
    • One Backend contract
    ReactFlutter WebSocket.IOChart.js
    Read full case
  • 02/03
    Cross-border airtime top-ups screenshot

    Cross-border airtime top-ups

    Next.js reseller dashboard. Stripe + multi-gateway. OTA deploys.

    Web team already lived in TypeScript - shared validation logic between mobile (React Native) and the reseller portal (Next.js). Multi-gateway payments, real-time order status, zero downtime OTA updates via Expo.

    • 130+ Countries
    • Real-time Order status
    • OTA Zero-downtime deploys
    Next.jsTypeScriptStripeReact Native
    Read full case
  • 03/03
    Live auction bidding app screenshot

    Live auction bidding app

    Server-authoritative timer. WebSocket bid stream. No clock drift.

    React Native buyer app and React admin dashboard both driven by a FastAPI WebSocket backend. The countdown runs server-side - clients display what the server says. Atomic bid handling with Postgres row locking resolves simultaneous bids cleanly.

    • Live Server timer
    • Atomic Bid conflict resolve
    • 24w Shipped in
    ReactReact NativeFastAPIWebSocket
    Read full case
How we engage

How we work on a frontend engagement.

Lighthouse gates from day one. Not bolted on at the end.

  1. Week 1

    Architecture

    Framework pick, design-token system, routing strategy, server-vs-client boundaries, deploy target, Lighthouse baseline. Every decision written down before any code ships.

  2. Weeks 2-4

    The spine

    Shell, auth flow, design system wired in, first real page at production quality. Preview URL live from day two. Lighthouse gates on every PR from this point forward.

  3. Weeks 5-10

    Pages and features

    One to two pages per sprint, each passing CI Lighthouse gates before merge. API wiring, third-party SDK integrations (Stripe, analytics, maps, LLMs), Playwright critical-path tests added as flows ship.

  4. Weeks 11-12

    Polish and launch

    Full accessibility audit (WCAG 2.2 AA), CWV dashboard live, error boundaries and loading skeletons on every async surface. Production deploy after staging sign-off.

Engagement models

Same engineers, different shapes.

Same engineers across every model. The shape changes, the bar does not.

  • MVP sprint

    Most picked

    Fixed scope, fixed timeline, one platform, one to two flows.

    Best for Pre-seed founders validating an idea before fundraising.
  • Full product build

    Discovery to launch, our team owns the delivery. Best for startups and companies without an in-house engineering team.

  • Dedicated team

    Your roadmap, our developers, onboarding in three to five days. Best for scale-ups with an existing product and a backlog that is outrunning the team.

  • Rescue and audit

    Audit of the existing frontend - bundle size, CWV regressions, accessibility gaps, component quality - then we fix the parts that earn it.

  • Staff augmentation

    Specific frontend skills added to your team - React, Next.js, Tailwind, Playwright. Best for engineering teams filling a gap without a full hire.

What you actually want from a modern frontend

Speed on real networks, not localhost. Accessibility without an accessibility consultant. Design tokens that survive a rebrand. A component system that lives in the repo, not in a library you cannot change. Tests that run in CI and block merges. Deploys that roll back in one click.

Every one of those is boring. All of them matter more than the framework brand.

Legacy frontend modernisation

Most jQuery and AngularJS codebases are not broken - they are just expensive to change. New features take three times as long. Hiring is harder. Every PR risks something unrelated.

The fix is not a rewrite. A full rewrite means six months of no new features while you rebuild what you already have. We use the Strangler Fig pattern instead.

How it works:

  • New React or Next.js modules run alongside the legacy codebase from day one.
  • Routing intercepts redirect specific paths to the new stack.
  • Feature flags control which users see which version.
  • Legacy modules are retired one at a time as the new equivalents ship.
  • Production stays live. Your roadmap keeps moving.

We have migrated jQuery SPAs, AngularJS dashboards, and server-rendered PHP frontends using this approach. The typical timeline for a mid-size product is 4 to 9 months - faster if the legacy codebase has clear module boundaries, slower if the data model is entangled.

Tell us what you are running and we will tell you the migration order that causes the least pain.

Micro-frontend architectures

When does a monolithic frontend stop working?

When five teams are merging into the same repo and someone’s checkout flow breaks the marketing team’s homepage. When a dependency upgrade needs sign-off from three product areas. When a deploy affects ten teams but only one requested it.

Micro-frontends split the frontend the same way microservices split the backend. Each domain - payments, catalogue, account, admin - owns its own codebase, its own CI pipeline, and its own release cycle.

The mechanism: Webpack Module Federation or a Vite-based federated runtime. Child modules load dynamically at runtime. The host shell assembles them. Each team ships independently without touching anyone else’s code.

When you do not need this:

  • Single product team, under 20 frontend engineers, clear module boundaries you can enforce with a monorepo.

When you do:

  • Multiple squads blocked by a shared deploy, business units that need independent release cycles, acquisitions being integrated into an existing product.

We will tell you which applies before you spend three months wiring it up.

State management - picking the right tool

Client state in a React app has two distinct problems. Mixing them causes most of the bugs.

Server state - data that lives on the server and needs to stay in sync with the UI. TanStack Query (React Query) for REST. SWR when the pattern is simpler. These handle background refetching, stale-while-revalidate, optimistic updates, and cache invalidation. They are not global state libraries - they are async synchronisation tools.

UI state - what the user has open, selected, or typed that does not need to survive a page refresh. Zustand for most things: minimal API, no boilerplate, easy to test in isolation. Redux Toolkit when the state logic is genuinely complex - multi-step transactions, undo/redo, cross-slice derived state. MobX when the team already knows it and the reactive model fits.

The mistake we see most: global Redux store for data that should be a server fetch, and prop drilling for state that should be in Zustand. We document the split in the architecture doc before writing a single hook.

Core Web Vitals as a design discipline

Fast pages are not an optimization at the end. They come from decisions made early:

  • LCP (largest contentful paint) - preload the hero image and hero font. No layout shift for above-the-fold content.
  • INP (interaction to next paint) - keep hydration islands small. Defer non-critical JS to idle.
  • CLS (cumulative layout shift) - always set image width and height. Reserve space for anything that loads late.

We instrument CWV with Vercel Analytics or a self-hosted alternative. The dashboard tells us when a deploy regressed something. Regressions are caught and fixed, not discovered from a user complaint.

Accessibility, not theatre

Every ship passes a keyboard-only pass and a screen-reader pass (VoiceOver + NVDA). We use Radix under shadcn because the ARIA is done correctly upstream. axe-core runs on every PR. Contrast ratios are part of the design token system, not a last-minute fix.

For UK and EU clients this is not optional - WCAG 2.2 AA is required under the European Accessibility Act and the UK Equality Act. We build it in from day one, not audited out at the end.

Accessibility is not a compliance checkbox. An app that works with a keyboard works for a user holding a baby, a user with tendonitis, a user on a train, and a user behind a screen reader.

Tailwind, shadcn/ui, and Bootstrap - which and why

Most component libraries (MUI, Chakra, Ant Design) solve the “I need a button” problem and create two new problems:

  1. The styles live in node_modules. Changing a border-radius means fighting the library or shipping CSS overrides.
  2. The bundle bloats. Even with tree-shaking, a component library is 80 to 200KB of CSS + JS you did not write.

shadcn/ui on Tailwind is our default for custom UIs. Radix primitives (which handle ARIA correctly) styled with Tailwind in your repo. Want to change the button? Edit the file. No library upgrade path breaks your design.

Bootstrap 5 has its place - rapid prototypes, internal admin panels, early MVPs where the goal is a working interface in days, not a pixel-perfect one in weeks. It is faster to scaffold. The trade-off is less CSS control and a grid system you did not design. We use it when the brief earns it.

How we test frontend code

Shipping a component that looks right on your laptop is not the same as shipping one that works on an iPhone SE at 3G, with a screen reader running, in a right-to-left locale.

What we check before any merge:

Visual parity - font weights, spacing, and layout matched to the design file on Chrome, Firefox, and Safari. Playwright visual regression catches pixel-level drift on every PR.

Component states - every interactive element tested across all states: default, hover, focus, active, disabled, loading, error, empty, and tooltip. Most bugs live in the states you tested once and assumed were done.

Responsive layout - mobile (375px), tablet (768px), desktop (1280px), and wide (1920px). Flexbox and grid contracts checked at each breakpoint. No stretched images or broken overflow.

Content tolerance - components tested with minimum content (one word) and maximum content (500 characters). Text wrapping and overflow are explicit, not assumed.

Accessibility - axe-core on every PR. Keyboard navigation tested on every flow. VoiceOver and NVDA pass before ship. Contrast ratios enforced at the design token level.

Performance - Lighthouse on every PR via CI. Regressions block merge. LCP, INP, and CLS tracked against baseline. Animations checked at 60fps on a throttled device profile.

E2E coverage - Playwright covering critical user flows against a live preview URL. Not 100% coverage - the flows that, if broken, would stop a user from completing their goal.

Design systems and component libraries

  • Design tokens in CSS variables - one source of truth for colour, spacing, type scale, radii, shadows.
  • shadcn/ui on Radix primitives - copy-in components, not a dependency. ARIA correct upstream.
  • Storybook for component libraries that need isolated review across teams.
  • Figma design tokens synced to CSS variables via a token pipeline when the design team changes often.

Deploys, CI, and rollbacks

  • GitHub Actions - type-check, unit tests, Playwright against preview on every PR.
  • Preview deploys per branch. Product reviews happen on real URLs.
  • Production behind a protected branch. Manual gate before promote.
  • One-click rollback. vercel rollback or equivalent. We test the rollback in the first week, before we need it.

What we will not do

  • Rewriting jQuery on a deadline. If the codebase is jQuery, we maintain it and migrate incrementally. A big-bang rewrite that stops all features for six months is the wrong call almost every time.
  • Webflow as the final answer. Fine for a 4-week marketing MVP. Not fine for a product that needs to grow.
  • CSS-in-JS runtimes on new builds. The performance tax is real. The ergonomics win is marginal against Tailwind + CSS variables.
  • Chasing 100% test coverage. We chase the tests that catch regressions, not the metric.

Why teams pick our frontend delivery

We pick the framework to match the product: Next.js for apps, plain React + Vite for SPAs, Bootstrap where speed beats precision. Opinionated, but not married to any of them.

Core Web Vitals go on the dashboard from week 1, not after a user complaint. Accessibility is engineering: Radix for ARIA, axe-core on every PR, keyboard pass before every ship. Design tokens live in CSS variables so a brand colour change moves one line, not twelve files. Legacy codebases maintained and migrated without a production freeze. Senior engineers on the product. Source and design files yours at launch.

FAQ

Questions people ask before we start.

Next.js or plain React - which do you pick?

Depends on what you are building. Next.js for apps with auth, data fetching, and user state - anything that is an app, not a page. Plain React + Vite for pure SPAs (admin panels, internal tools, rich editors) where server rendering buys nothing. We pick and explain the call in the discovery doc.

Should I use Server Components?

Yes, where they fit. Server Components cut the client bundle dramatically for read-heavy pages. Client components for anything that needs browser state or interaction. The split is per-component, not per-project, and we make it explicit in the architecture doc.

We're on jQuery - can you migrate us without taking the site offline?

Yes. We use the Strangler Fig pattern - new React or Next.js modules run alongside the legacy codebase via routing intercepts and feature flags. The old code is retired one page at a time. Production stays live throughout.

When does Bootstrap make sense over Tailwind?

Bootstrap wins on speed: admin panels, internal tools, early prototypes where pixel-perfect isn't the brief. Tailwind wins when the design is bespoke, the site is public-facing, and you need full CSS control without fighting a grid system you didn't design.

What is a micro-frontend and do I need one?

A micro-frontend splits a large app into independently deployable modules - each with its own codebase, team, and release cycle. You need one when multiple teams are blocked by a single monolithic frontend repo. For most startups and mid-market products it's overkill. We'll tell you if it fits.

Do you meet WCAG 2.2 AA?

Yes. Radix primitives under shadcn handle ARIA correctly upstream. axe-core runs on every PR. We keyboard-test every flow before ship. For UK and EU clients this covers the European Accessibility Act and UK Equality Act obligations.

Can you add a frontend engineer to our existing team?

Yes. Staff augmentation is one of our engagement models. Senior engineers, overlapping timezone hours, NDA signed, IP stays with you. We integrate into your repo, your standup, your review process.

How do you handle real-time data in dashboards?

TanStack Query for client-server data sync with background refetching and optimistic updates. WebSocket or SSE for true push - prices, notifications, live feeds. We pick per feature, not per project, and we document the choice.

How do you do design tokens and theming?

CSS variables in a token file. Tailwind config reads from them. shadcn components consume them. Light and dark modes from the same tokens. Brand colour changes once and the whole app follows.

Do you handle deploys?

Yes. Vercel (default), Netlify, Cloudflare Pages, AWS Amplify, or a self-hosted container on the customer's infrastructure. Preview deploys per branch. Production behind a protected branch. Rollback is one click.

How do you handle testing?

Unit tests (Vitest) for business logic. Playwright covering critical user flows against a preview URL on every PR. Visual regression where the design needs it. We do not chase 100% coverage - we chase the tests that catch regressions.

Start a frontend development services engagement

Tell us what you’re building.

Send us what you are building - product, users, and what fast means for them. We reply with a framework pick, a timeline, and a scoped proposal for a discovery sprint. NDA signed on request. Response within 1 business day.

The team on the call

Sameer Donga

Founder & Lead Engineer

Shipping Flutter, FastAPI, and AI systems since 2019. Reviews the architecture on every engagement.

Contact

Tell us what you’re building.

Share the problem, timeline, and where you need the sharpest engineering help. Wherever you’re based, we reply within 1 business day in your time zone.

326, Naroda Business Point, Haridarshan Cross Roads, Shri Balaji Rd, Nava Naroda, Ahmedabad, Gujarat 382330, India
Attachment (optional)
Attach a brief, spec, or mockup — PDF, Word, image, ZIP (max 10 MB)