Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/cloudflare/vinext/llms.txt

Use this file to discover all available pages before exploring further.

Current Limitations

These are known limitations in the current version of vinext. Most are related to build-time optimizations that don’t affect runtime behavior.

Image Optimization

Image optimization doesn’t happen at build time.
  • Remote images: Work via @unpic/react, which auto-detects 28 CDN providers including Cloudinary, Imgix, and Cloudflare Images
  • Local images: Routed through a /_vinext/image endpoint that can resize and transcode on Cloudflare Workers (via the Images binding) in production
  • Missing: Build-time optimization, static image resizing, automatic format conversion during build
import Image from "next/image";

// Remote images work with CDN optimization
<Image
  src="https://example.com/photo.jpg"
  width={800}
  height={600}
  alt="Photo"
/>

// Local images work but without build-time optimization
import photo from "./photo.jpg";
<Image src={photo} alt="Photo" />

Font Loading

Google Fonts are loaded from the CDN, not self-hosted.
  • Fonts are loaded at runtime via CDN links
  • No size-adjust fallback font metrics
  • No build-time subsetting or optimization
  • Local fonts work but @font-face CSS is injected at runtime, not extracted at build time
import { Inter } from "next/font/google";

const inter = Inter({ subsets: ["latin"] });
// Loads from Google Fonts CDN at runtime

Layout Segment Hooks

useSelectedLayoutSegment(s) derives segments from the pathname rather than being truly layout-aware.
  • Works correctly for most use cases
  • May differ from Next.js in edge cases with parallel routes
  • The hook infers segments from URL structure instead of React component tree position

Route Segment Config

runtime and preferredRegion segment config options are ignored. vinext runs in a single environment (Cloudflare Workers), so these configuration options have no effect:
// Parsed but ignored
export const runtime = "edge";
export const preferredRegion = "iad1";

// These work correctly
export const revalidate = 60;
export const dynamic = "force-static";
export const dynamicParams = true;

Node.js Production Server

The Node.js production server (vinext start) works for testing but is less complete than Workers deployment.
  • Cloudflare Workers is the primary deployment target
  • The Node.js server is intended for local testing only
  • Some features may behave differently on Node.js vs Workers
  • For production, use vinext deploy to deploy to Cloudflare Workers

Native Node Modules in Dev Mode

Native Node modules (sharp, resvg, satori, lightningcss, @napi-rs/canvas) crash Vite’s RSC dev environment.
  • Dynamic OG image/icon routes using these modules work in production builds
  • They don’t work in dev mode due to Vite’s RSC environment limitations
  • These are auto-stubbed during vinext deploy
  • Workaround: Test OG images in production build (vinext build && vinext start)

Intentionally Not Supported

These features are intentionally excluded from vinext:

Vercel-Specific Features

  • @vercel/og edge runtime — Use the standard version instead
  • Vercel Analytics integration — Use Cloudflare Analytics or Web Analytics
  • Vercel KV/Blob/Postgres bindings — Use Cloudflare equivalents (Workers KV, R2, D1)
// ❌ Don't use Vercel-specific imports
import { kv } from "@vercel/kv";

// ✅ Use Cloudflare bindings instead
export default async function handler(request, env) {
  const value = await env.MY_KV.get("key");
  return Response.json({ value });
}

Deprecated Features

  • AMP — Deprecated since Next.js 13. useAmp() returns false
  • next export (legacy) — Use output: 'export' in config instead
  • Old image component — Use the modern next/image API

Build Tool Configuration

  • Turbopack/webpack configuration — vinext runs on Vite. Use Vite plugins instead
  • webpack loaders — Use equivalent Vite plugins
  • Turbopack config — Use Vite config instead
// ❌ webpack config doesn't apply
module.exports = {
  webpack: (config) => {
    // This won't work
    return config;
  },
};

// ✅ Use Vite config instead
import { defineConfig } from "vite";
import vinext from "vinext";

export default defineConfig({
  plugins: [
    vinext(),
    // Add Vite plugins here
  ],
});

Testing

  • next/jest — Use Vitest instead, which has better Vite integration
# ❌ Don't use next/jest
npm install --save-dev jest @testing-library/react @testing-library/jest-dom

# ✅ Use Vitest
npm install --save-dev vitest @testing-library/react @testing-library/dom

Scaffolding

  • create-next-app scaffolding — Not a goal. Use manual installation or migrate an existing Next.js app

Bug-for-Bug Parity

If it’s not in the Next.js docs, we probably don’t replicate it. vinext aims for pragmatic compatibility with documented Next.js behavior, not bug-for-bug parity with undocumented edge cases or Vercel-specific implementation details.

RSC Module Caching (Dev Mode)

In development, RSC modules may be cached across requests. This can affect patterns that expect fresh data on each render:
// May return cached value in dev mode
const timestamp = Date.now();
This is a known issue being investigated. Use time-based revalidation or force-dynamic for pages that need fresh data on every request.

Workarounds

For most limitations, there are practical workarounds:

Image Optimization

Use a CDN that supports automatic optimization:
// Use Cloudflare Images with automatic optimization
<Image
  src="https://imagedelivery.net/YOUR_ACCOUNT_HASH/image-id/public"
  width={800}
  height={600}
  alt="Photo"
/>

Font Optimization

Self-host fonts if you need build-time optimization:
import { Inter } from "next/font/local";

const inter = Inter({
  src: "./fonts/inter-var.woff2",
  variable: "--font-inter",
});

Native Modules in Dev

Test OG images in production builds:
vinext build
vinext start
# Navigate to /api/og routes

Reporting Issues

If you encounter a limitation not listed here:
  1. Check the GitHub issues
  2. Search the test tracking document
  3. File a new issue with:
    • What you’re trying to do
    • The error message or unexpected behavior
    • A minimal reproduction if possible
Many issues can be diagnosed by AI agents. Try using Claude Code, Cursor, or OpenCode to trace through the vinext source before filing an issue.

Build docs developers (and LLMs) love