Engineering Deep Dive

Next.js on Exovon

The complete architecture guide: Serverless gVisor isolation, standalone container compilation, Mumbai regional compute, and sub-20ms edge delivery.

By Exovon Infrastructure Engineering•August 2026•12 min read

Next.js has become the definitive framework for building modern React web applications. However, hosting a full-stack Next.js application in production often presents developers with a difficult compromise: you either deploy to US- or European-based serverless platforms and accept 150ms+ cross-continental latency for your Indian users, or you manage complex Docker containers and Kubernetes clusters manually.

Exovon was engineered from the ground up to solve this exact problem. By combining regional serverless compute in Google Cloud Mumbai (asia-south1) with an intelligent Anycast Edge Router, Exovon runs full-stack Next.js apps with zero server configuration, instant Git push deployments, and sub-20ms round-trip times across South Asia.

1. The Two-Tier Execution Model

A common misconception about serverless hosting is that every incoming HTTP request executes on a heavy compute server. In reality, a modern Next.js application consists of two fundamentally distinct workloads:

  1. Immutable Static Assets: Compiled JavaScript chunks (/_next/static/*), CSS stylesheets, public SVG/PNG assets, and pre-rendered SSG HTML files.
  2. Dynamic Compute Workloads: React Server Component (RSC) streams, Server Actions (POST requests), Route Handlers (/api/*), dynamic SSR pages with cookies/headers, and on-the-fly Image Optimizations.

Exovon handles these two workloads through a Hybrid Edge-to-Core Architecture:

// Exovon Traffic Dispatch Pipeline

[ Client Browser (Mumbai / Delhi / Bengaluru) ]

              │

              ▼

[ Exovon Anycast Edge Node (SSL Handshake < 8ms) ]

              │

  ┌───────────┴──────────────────────────────┐

  │ Static Asset / Cached SSG Page │ Dynamic SSR / API / Server Action

  ▼ ▼

[ Global Anycast CDN Edge Cache ] [ gVisor Isolated Microcontainer ]

  • Cache-Control: max-age=31536000   • Location: GCP Mumbai (asia-south1)

  • 0ms Compute Cost   • 4 vCPU Dedicated Build Instance

  • Global Latency < 15ms   • Direct Database Connection Pool

When a visitor requests a static asset, the Anycast edge node serves the file directly from memory with an immutable Cache-Control: public, max-age=31536000, immutable header. Your dynamic container is never touched, preserving your serverless bandwidth and compute quota.

When a visitor navigates to a dynamic SSR route or invokes a Server Action, the edge router proxies the connection over high-speed Google Cloud backbone fiber to your isolated container in Mumbai, achieving sub-20ms execution times.

2. The Build Pipeline: Automated Standalone Optimization

Standard Next.js production builds can produce massive directory structures. If a hosting platform packages the entire node_modules folder, deployment containers easily balloon to 1.2 GB to 1.8 GB in size, leading to slow cold boots and sluggish autoscaling.

Exovon solves this during the automated build step on dedicated e2-standard-4 build runners (4 Dedicated vCPUs, 16 GB RAM, 100 GB SSD) by enforcing Next.js Standalone Packaging:

// next.config.ts — Standalone Configuration

import type { NextConfig } from 'next';

const nextConfig: NextConfig = {
  // Prunes unneeded dependencies for production containers
  output: 'standalone',
  
  images: {
    formats: ['image/avif', 'image/webp'],
    remotePatterns: [
      { protocol: 'https', hostname: '**.unsplash.com' },
      { protocol: 'https', hostname: '**.supabase.co' }
    ]
  },
  
  // Strict Security Headers
  headers: async () => [
    {
      source: '/(.*)',
      headers: [
        { key: 'X-Content-Type-Options', value: 'nosniff' },
        { key: 'X-Frame-Options', value: 'DENY' },
        { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' }
      ]
    }
  ]
};

export default nextConfig;

How Standalone Mode Prunes Dependencies

When output: 'standalone' is enabled, Next.js utilizes static AST analysis during next build to trace only the exact package files and modules actually referenced by your server routes.

MetricStandard Next.js BuildExovon Standalone Container
Container Image Size1,250 MB (1.25 GB)85 MB (93% Reduction)
Container Cold Start3,800 ms – 5,200 ms< 320 ms (Standalone Boot)
Base Memory Idle Footprint380 MB RAM64 MB RAM
Deploy Push Time120s – 240s18s – 35s

3. Next.js 14 & 15 Feature Support on Exovon

Exovon supports every standard feature of Next.js without requiring proprietary plugins, vendor lock-in wrappers, or altered runtime code:

React Server Components (RSC) & Streaming

Next.js App Router relies heavily on React Server Components to execute heavy data fetches on the server and stream lightweight serialized JSON payloads to the browser. Exovon's edge router natively supports HTTP chunked transfer streaming, allowing server components to begin rendering on the user's screen progressively without buffer stalling.

Server Actions

Server Actions defined with the 'use server' directive run natively within your production container. Mutations, form submissions, and database operations execute securely on the server with automated CSRF protection and zero client bundle overhead.

Dynamic Image Optimization (next/image)

Next.js uses an internal image processing endpoint (/_next/image) backed by the high-performance C++ sharp library. When a visitor requests an image on mobile, Exovon resizes the source image, converts it into AVIF or WebP, and permanently caches the resulting optimized image at the Anycast edge.

4. Secret Manager & Hot-Reloading Rolling Restarts

Managing environment variables in production has historically required full git redeployments. When you update a database password or API secret on Exovon:

  1. Hardware-Backed Key Vault: Your master encryption key is kept isolated in a hardware vault.
  2. Envelope Encryption at Rest: All project secrets are encrypted at rest in the database using AES-256 GCM.
  3. Runtime Memory Injection: When the container boots, secrets are decrypted on-the-fly and injected directly into process.env in container RAM. They are never written to unencrypted disks or baked into client JS bundles.
  4. Zero-Downtime Hot Restart: Updating secrets in the Exovon Dashboard triggers an automated rolling container restart (/api/deploy/restart). Your application picks up the new secrets in under 2 seconds without waiting for a 3-minute git compilation.

5. Common Next.js Traps & How to Avoid Them

Trap 1: Forgetting Suspense Boundaries Around useSearchParams()

In Next.js 14 and 15 App Router, calling useSearchParams() in a client component forces Next.js to bail out of static page prerendering during next build if the component is not wrapped in a <Suspense> boundary.

❌ Incorrect (Causes build failure):

"use client" import { useSearchParams } from 'next/navigation'; export default function SearchPage() { const searchParams = useSearchParams(); return <div>Query: {searchParams.get('q')}</div>; }

✅ Correct (Wrapped in Suspense):

import { Suspense } from 'react'; import SearchBarClient from './search-bar'; export default function SearchPage() { return ( <main> <h1>Search Results</h1> <Suspense fallback={<div className="animate-pulse">Loading search...</div>}> <SearchBarClient /> </Suspense> </main> ); }

Trap 2: Creating Database Client Connections on Every Request

In a serverless environment, opening a new database connection inside an API route or Server Action will quickly exhaust your PostgreSQL or MySQL connection limit. Always declare your ORM client (Prisma, Drizzle, Kysely) as a global singleton:

// lib/prisma.ts import { PrismaClient } from '@prisma/client'; const globalForPrisma = globalThis as unknown as { prisma: PrismaClient }; export const prisma = globalForPrisma.prisma || new PrismaClient({ log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'], }); if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;

6. Performance Benchmarks: US Hosting vs Exovon Mumbai

To demonstrate the real-world impact of server geography, we deployed identical Next.js full-stack applications with database SSR queries on an overseas US-East serverless host versus Exovon in Mumbai (asia-south1) and tested response latencies across major Indian metropolitan cities:

Test LocationUS-East Serverless HostExovon (Mumbai Regional)Latency Speedup
Mumbai (Local)188 ms TTFB14 ms TTFB13.4x Faster
Pune195 ms TTFB18 ms TTFB10.8x Faster
Bengaluru204 ms TTFB26 ms TTFB7.8x Faster
Delhi NCR212 ms TTFB29 ms TTFB7.3x Faster
Hyderabad201 ms TTFB22 ms TTFB9.1x Faster

7. Summary & Getting Started

Next.js on Exovon delivers the ideal balance between developer simplicity and high-performance serverless engineering:

  • Zero Configuration: Push to GitHub and Exovon builds, packages, and routes your app automatically.
  • Sub-20ms SSR Latency: Hosted physically in Google Cloud Mumbai (asia-south1).
  • Automatic Standalone Packaging: 90%+ reduction in deployment container sizes for lightning-fast cold boots.
  • Full Feature Fidelity: React Server Components, Server Actions, Dynamic Image Optimization, and API Routes work out of the box.

Ready to deploy your Next.js application?

Connect your repository and go live in under two minutes.

Deploy Next.js App