Platforms · React / Next.js
React & Next.js Maintenance & Management
Production React and Next.js sites maintained under SLA, covering deployment, edge runtime, security, and performance, from Cape Town.
Build pipeline, runtime, middleware, and the content API behind it, maintained as one deployment rather than four separate vendor surfaces. One engineer carrying the context forward across every framework release.
Why TurboPress for React and Next.js
Modern React and Next.js sites fail differently from WordPress. The failures are in ISR revalidation that quietly stops firing after a schema change, edge runtime behaviour that diverges from Node in ways the documentation understates, environment configuration that drifts between preview and production, middleware that adds fifty milliseconds to every request, third-party script weight the marketing team keeps adding to, and CSP rules that block something six weeks after deploy because a vendor silently moved a CDN.
The platform is fast by default, which is the real hazard. Problems stay invisible until they are harder to diagnose, because nothing obviously broke and the Lighthouse score still looks fine. Most of the work here is observability, hygiene, and catching regressions that ship silently.
What I actually do for React and Next.js sites
Stacked by discipline, not by framework feature. Each area below is ongoing work, not a tick-box.
Deployment and hosting
Vercel for teams that want the default experience, Cloudflare Pages and Workers for teams that want edge-first and predictable pricing at scale, and self-hosted Node or Docker for teams that need full control. Build pipelines reviewed against actual cold-start behaviour, not the marketing numbers.
Preview environment hygiene counts as part of the work. Feature branches that spin up real infrastructure with stale env vars, mismatched secrets, or unbounded preview counts quietly run up bills and leak credentials. The retainer covers that too.
Runtime behaviour
ISR and on-demand revalidation configured against the real cadence of content changes, not the framework default. Edge runtime work for routes that genuinely benefit from the edge, and a Node runtime for routes that do not, because pretending everything belongs on the edge is a common and expensive mistake.
Middleware reviewed for weight, because middleware runs on every request and the cost compounds. Route handler patterns kept consistent across the app so that caching behaviour is predictable and error handling does not differ from one handler to the next.
Environment and secret hygiene
Env var management across development, preview, and production, with the build-time versus runtime boundary reviewed properly so that server-only secrets do not accidentally surface in the client bundle. Secret rotation documented and actually performed on a schedule, not promised and deferred.
Security
CSP headers configured deliberately, not copied from a template, and maintained as the third-party script footprint changes. Middleware rate limits on the endpoints that actually need them, auth flow review across App Router patterns, and API route protection that does not rely on the obscurity of the URL.
Dependency audits run on a cadence rather than when something breaks. Transitive dependency surface in a modern React app is wider than most teams track. The work is keeping it honest.
Headless integrations
Headless front-ends talking to WordPress via REST or GraphQL, Sanity and Contentful for content-led stacks, and Shopify’s Storefront API where the storefront is in Next.js rather than Liquid. Preview mode reliability gets attention, because editors lose trust in a CMS the first time a preview fails silently.
Performance
Bundle analysis that identifies the libraries actually responsible for client-side weight, client component boundary review so that interactivity does not leak into components that should render on the server, and font and image optimisation configured against the real set of assets the site ships.
Core Web Vitals measured from the field, not the lab, and regressions chased down the week they appear rather than at the next quarterly review.
Where Next.js sites silently regress
Specific regression patterns that do not throw, do not alert, and do not show up on a Lighthouse run. The kind that stay hidden until a user reports them.
ISR serving last week’s data
The classic failure is a revalidateTag or revalidatePath call whose argument has drifted out of sync with the tag that was actually used at the fetch layer, often because a rename happened in one file and not the other. Nothing throws. The page silently serves stale data, and the first sign is usually a customer email. Tests rarely catch this because they hit the route fresh each time. The fix is a tag and path contract that lives in a single module, asserted at both the fetch and revalidation call sites, with a CI check that breaks on drift instead of waiting for production to surface it.
Middleware matcher drifting as the route tree grows
The middleware.config.matcher gets written carefully on day one. Six months and several feature branches later, new protected routes have been added without touching the matcher, and the auth or rewrite logic that was supposed to guard every protected route is quietly only running on the old ones. There is no type error, no warning, and no failing test, because the framework does not know what you intended the matcher to cover. The fix is treating the matcher as a contract diffed against the actual route tree on a cadence, not as a config file written once and trusted forever.
next/image bypassing optimisation at origin
A misconfigured images.loader, a custom loader that skips the optimisation pipeline, or an unoptimized flag that leaked into production from a workaround nobody circled back to remove, all end up serving full-resolution images straight from origin. The home page still looks fine because the hero is hand-crafted. The rest of the catalogue is paying for it in LCP, origin egress, and Vercel bandwidth spend that looks vaguely high and gets waved through. This is usually a ten-minute config fix that can recover hundreds of megabytes per month on a mid-sized catalogue, once somebody actually looks.
Proof of work
The public track record so far lives on the WordPress engagement log, with PHP-FPM rescues, Redis exposure finds, and MariaDB redo log recovery. The method carries into React and Next.js work without change: measure before touching anything, work under agreement, and ship fixes that hold up across the next framework release.
The retainer model
React and Next.js retainers tend to weight hours towards runtime tuning, dependency and middleware audits, and the glue work between the app and whatever headless CMS or commerce API sits behind it. Hours flex to whatever the deploy pipeline has been doing that month, rather than getting pinned to a rigid weekly checklist.
The shared tier pricing, SLA text, and monthly hour split are documented once, on a single page.
Tell me about the app
A deployment audit exposes what the Lighthouse score does not. A short conversation exposes whether we work well together before either of us commits to a retainer.