Kunj Hirapara

Next.js and React development

App Router applications built the way the framework intends, by someone who ships them to production rather than to a preview URL.

commit.kunjdeveloper.com
Commit, a project built with this service
Built with this service: Commit

Next.js rewards getting a few decisions right and punishes getting them wrong for the life of the project. Where state lives, what renders on the server, how data is cached and invalidated: these are not refactors you do later, they are the shape of the application.

I build App Router applications in TypeScript, on current versions rather than the patterns that were current two majors ago. This site runs Next.js 16 with React 19 and Tailwind CSS 4, including the parts most projects avoid: server components talking to a real database, streamed rendering, and a build that produces a standalone container.

Frontend work here is not decoration over somebody else’s API. It comes with the data layer attached, which is usually where the performance problems actually are.

What the work covers

Concretely, what is in the box. Anything not listed is worth asking about rather than assuming.

App Router applications

Server and client components split along the line that makes sense for your data, route handlers, server actions for mutations, and layouts that do not re-fetch the world on every navigation.

Rendering strategy

Static, dynamic, streamed or revalidated, chosen per route and justified. Cache invalidation wired to your writes so content updates without a deploy.

Performance

Core Web Vitals treated as a requirement. Bundle splitting, image handling, font loading and the request waterfalls that quietly dominate real load times on mid-range phones.

SEO-ready rendering

Server-rendered content crawlers can read, metadata and canonicals handled per route, structured data that matches what the page actually says, and a sitemap that reflects real content.

Accessibility

Keyboard reachable, visible focus, and contrast verified against WCAG AA with axe-core rather than estimated by eye. Interactive enhancements that degrade to working HTML when JavaScript does not run.

Migrations and upgrades

Pages Router to App Router, and major version upgrades where the breaking changes are real: proxy replacing middleware, Turbopack builds, Tailwind 4’s CSS-first config.

The stack I build on

Core

  • Next.js
  • React
  • TypeScript

Styling

  • Tailwind CSS
  • CSS
  • Framer Motion

State and data

  • TanStack Query
  • Zustand
  • Redux
  • Zod
  • react-hook-form

Server side

  • Server components
  • Server actions
  • Route handlers
  • NextAuth

How the work runs

The same five steps every time. The point of writing them down is that you can tell where a project is without asking.

  1. Scope call

    Thirty minutes on what you are building, who it is for, and what has to be true for it to count as done. You leave with a written scope and a rough shape of the work, whether or not we go ahead.

  2. Architecture and plan

    Data model, API surface, auth model and hosting decided before any feature code. This is where the expensive mistakes get made, so it happens in writing first.

  3. Build in visible slices

    Work ships to a staging URL continuously, not in one reveal at the end. You see progress weekly and can redirect while redirecting is still cheap.

  4. Harden

    Auth and access control, input validation, rate limiting, error handling and the failure paths that only show up under real traffic. Treated as part of the build, not a later pass.

  5. Deploy and hand over

    Containerised deploy, TLS, backups and a written runbook, into your infrastructure or mine. You get the repo, the credentials and a document that explains how to run it without me.

Where this has actually been done

Every claim on this page points at something you can read. These are the three that matter most here.

Next.js 16 in production, not in a sandbox

Commit runs on Next.js 16 with Convex, Clerk and the Stream video SDK, with a synchronised Monaco editor, role-based routing enforced before a protected page renders, and a standalone container build. The site you are reading now runs the same major version against PostgreSQL through server components.

Read the Commit case study

React performance work with a measured result

At NSEG Pvt Ltd, lifting shared state into React Context cut redundant API calls from fifteen or sixteen per page to a single request on initial render, removing repeat fetches across navigations and the server load that came with them.

See the full resume

The awkward integration problems, solved

Integrating a rich-text editor into a Next.js application meant resolving SSR hydration mismatches and keeping editor content synced to controlled form state, then handling the image lifecycle so deleted posts did not leave orphaned uploads behind.

See the full resume

How engagements are shaped

Three shapes cover almost everything. Which one fits is usually obvious within ten minutes of the first call.

Fixed-scope project

You know roughly what you want built

A written scope, a milestone schedule and one price agreed before work starts. Best when the requirements are stable enough to write down.

Monthly retainer

Ongoing product work

A set number of days a month on a standing backlog, re-prioritised as you learn. Best when the roadmap is still moving.

Short engagement

One defined problem

A performance problem, an auth rebuild, a deployment that needs to stop falling over. Scoped in days, not months.

What moves the number

There is no fixed price list here, because a number quoted before the scope exists is a guess dressed up as a quote. These are the things that actually decide it:

  • How much of the stack is in scope: a frontend against an existing API costs very differently from frontend, API, database and infrastructure together.
  • Whether there is an existing codebase, and what state it is in. Reading someone else’s code is real work and gets estimated as such.
  • Integrations. Each third-party service (payments, auth, email, video, storage) brings its own edge cases, webhooks and failure modes.
  • Who owns the infrastructure afterwards. Deploying into your cloud account with a handover runbook is more work than deploying somewhere I already run.
  • How firm the requirements are. A stable written scope is cheaper to deliver than a moving one, which is why the first call ends in writing.

Before you ask.

The questions that come up on nearly every first call.

Do you work in the App Router or the Pages Router?

App Router for new work. I take on Pages Router codebases for maintenance and for migrations, but I would not start something new on it today.

Can you take over a Next.js project someone else started?

Yes, and it starts with a read-through and a written assessment rather than an immediate estimate. Most inherited Next.js projects need the data and caching strategy settled before anything else is worth doing.

Do you do frontend only, against our existing API?

Yes. It is worth saying that many problems that look like frontend problems are shaped by the API, so expect feedback on the endpoints where it would change the result.

Will the site be fast and rank well?

Content renders on the server so crawlers see it without executing JavaScript, metadata and structured data are handled per route, and Core Web Vitals are treated as a requirement. Rankings depend on far more than the build, so I will not promise positions.

Which hosting do you deploy to?

Vercel where that suits you, and self-hosted Docker on a Linux VPS behind Nginx where cost or data residency rules it out. This site is the second kind.

Start a conversation.

Tell me what you are building and what has to be true for it to count as done. You get a straight answer on fit and timing, including when the answer is no.