⏳ This skill is pending AI review.
Scores will appear once the review pipeline completes.
migrate-to-vinext
Migrates Next.js projects to vinext (Vite-based Next.js reimplementation). Load when asked to migrate, convert, or switch from Next.js to vinext. Handles compatibility scanning, package replacement, Vite config generation, ESM conversion, and deployment setup (Cloudflare Workers natively, other platforms via Nitro).
// RATINGS
// README
vinext
Run Next.js applications on Vite, with Cloudflare Workers as the primary deployment target.
Website: vinext.dev
Documentation: vinext.dev/docs
Read the announcement: How we rebuilt Next.js with AI in one week
Under active development. vinext supports substantial Next.js applications today, but it is not yet a drop-in replacement for every application or production workload. Expect compatibility gaps, especially in newer App Router features, and evaluate it against your own application before adopting it.
vinext reimplements the Next.js API surface on Vite rather than consuming next build output. It supports both the App Router and Pages Router, React Server Components, Server Actions, middleware, route handlers, ISR, static export, and the most commonly used next/* modules. Cloudflare Workers has the deepest integration; Node.js and other platforms are available with different levels of support.
Project status
What works today
- App Router and Pages Router in development and production builds
- React Server Components, Server Actions, route handlers, and middleware
- Static generation, ISR,
output: "export", and standalone Node.js output - Core Next.js APIs and modules, including
next/link,next/image,next/navigation,next/headers,next/cache, and the Metadata API - Cloudflare Workers deployment with bindings, cache adapters, and image optimization support
- Migration tooling through
vinext check,vinext init, and the vinext Agent Skill
Known gaps we're working on
These are active compatibility areas, not permanent exclusions:
- Cache Components and Partial Prerendering:
"use cache"is partially implemented, but fullcacheComponentsbehavior is still incomplete. Cache profiles, tags, partial shells, resume behavior, prefetching, and some dev/build cache semantics do not yet match Next.js in every case. - Build-time image and font optimization: images can be optimized at request time on Cloudflare, but vinext does not yet reproduce Next.js's complete build-time image pipeline. Google Fonts are loaded from the CDN, and local font CSS is injected at runtime rather than extracted during the build.
- Native modules in App Router development: packages such as
sharp,resvg,satori,lightningcss, and@napi-rs/canvascan fail in Vite's RSC development environment. Production builds support more of these cases than development mode. - Platform-specific and advanced Next.js behavior:
runtimeandpreferredRegionroute config are currently ignored, and some recently introduced or undocumented Next.js behavior may not yet be reproduced.
Run vinext check against an existing application before migrating. If a gap is not listed here, check the open issues or file a focused reproduction.
Quick start
Use the official setup commands below. They are the recommended way to create or migrate a vinext project because they configure dependencies, scripts, Vite, and your deployment target for you.
Start a new project with create-vinext-app:
pnpm create vinext-app@latest my-app
Migrate an existing Next.js project with vinext init:
npx vinext init
Optional: migrate with an AI agent
Prefer vinext init for a direct, repeatable migration. If you want an AI agent to investigate compatibility issues and guide the migration, vinext also includes an optional Agent Skill. It works with Claude Code, OpenCode, Cursor, Codex, and dozens of other AI coding tools:
npx skills add cloudflare/vinext
Then open your Next.js project in any supported tool and say:
migrate this project to vinext
The skill handles compatibility checking, dependency installation, config generation, and dev server startup. It knows what vinext supports and will flag anything that needs manual attention.
Or do it manually
npm install vinext
npm install -D vite @vitejs/plugin-react
If you're using the App Router, also install:
npm install react-server-dom-webpack
npm install -D @vitejs/plugin-rsc
Replace next with vinext in your scripts:
{
"scripts": {
"dev": "vinext dev",
"build": "vinext build",
"start": "vinext start"
}
}
vinext dev # Development server with HMR
vinext build # Production build
npx @vinext/cloudflare deploy # Build and deploy to Cloudflare Workers
With Vite+, use vpx @vinext/cloudflare deploy, or
vp exec vinext-cloudflare deploy when running the locally installed bin.
vinext auto-detects your app/ or pages/ directory, loads next.config.js, and configures Vite automatically. No vite.config.ts required for basic usage.
Your existing pages/, app/, next.config.js, and public/ directories work as-is. Run vinext check first to scan for known compatibility issues, or use vinext init to automate the full migration.
CLI reference
| Command | Description |
|---|---|
vinext dev | Start dev server with HMR |
vinext build | Production build (multi-environment for App Router: RSC + SSR + client) |
vinext start | Start local production server for testing |
npx @vinext/cloudflare deploy | Build and deploy to Cloudflare Workers |
vp exec vinext-cloudflare deploy | Build and deploy to Cloudflare Workers with Vite+ |
vinext init | Migrate a Next.js project to run under vinext |
vinext check | Scan your Next.js app for compatibility issues before migrating |
vinext lint | Delegate to eslint or oxlint |
Options: -p / --port <port>, -H / --hostname <host>, --turbopack (accepted, no-op).
@vinext/cloudflare deploy options: --preview, --env <name>, --name <name>, --skip-build, --dry-run, --experimental-traffic-aware-warm-cache.
vinext init prompts for a deployment target, defaulting to Cloudflare. Agents must ask the
user which target they want, then pass --platform=cloudflare or --platform=node.
Other options: --port <port> (default: 3001), --skip-check, --force.
If your next.config.* sets output: "standalone", vinext build emits a self-hosting bundle at dist/standalone/. Start it with:
node dist/standalone/server.js
Environment variables: PORT (default 3000), HOST (default 0.0.0.0).
Note: Next.js standalone uses
HOSTNAMEfor the bind address, but vinext usesHOSTto avoid collision with the system-setHOSTNAMEvariable on Linux. Update your deployment config accordingly.
Starting a new vinext project
Use create-vinext-app for new projects. It creates a TypeScript App Router project
with Tailwind CSS and then runs the same vinext init setup used for existing apps:
pnpm create vinext-app@latest my-app
The generated project is Cloudflare Workers-ready by default. Pass
--platform=node if you want the Node target instead.
Migrating an existing Next.js project
vinext init automates the migration in one command:
npx vinext init
This will:
- Run
vinext checkto scan for compatibility issues - Install vinext runtime packages as dependencies and Vite/plugin tooling as devDependencies
- Rename CJS config files (e.g. `postcss.c
// HOW IT'S BUILT
KEY FILES