From harness-claude
Configures Nuxt for production deployments to Vercel, Cloudflare, Netlify, or Node servers using Nitro presets, route rules for prerendering, ISR, static/hybrid/edge modes.
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeThis skill uses the workspace's default tool permissions.
> Target Node.js servers, edge runtimes, static hosting, or hybrid modes using Nitro presets and route rules
Optimizes Nuxt 5 production: fixes hydration mismatches with ClientOnly comments, improves performance and Core Web Vitals, adds Vitest testing, deploys to Cloudflare/Vercel/Netlify, migrates from Nuxt 4.
Generates Next.js deployment configs for Vercel (vercel.json), self-hosted Node.js (PM2), Docker (Dockerfile, docker-compose), static export, Edge Runtime, GitHub Actions CI/CD, env vars, health checks, monitoring, and Turbopack builds.
Optimizes Nuxt 4 production: hydration mismatch debugging, Core Web Vitals performance, Vitest testing, Cloudflare/Vercel/Netlify deployment, v3 to v4 migration.
Share bugs, ideas, or general feedback.
Target Node.js servers, edge runtimes, static hosting, or hybrid modes using Nitro presets and route rules
Selecting an output preset:
NITRO_PRESET environment variable or in nuxt.config.ts:// nuxt.config.ts
export default defineNuxtConfig({
nitro: {
preset: 'vercel-edge', // or 'cloudflare-pages', 'netlify', 'node-server', etc.
},
});
Common presets:
| Preset | Target |
|---|---|
node-server (default) | Node.js server (Docker, Railway, Render) |
vercel | Vercel serverless functions |
vercel-edge | Vercel Edge Network |
cloudflare-pages | Cloudflare Pages + Workers |
netlify | Netlify Functions |
netlify-edge | Netlify Edge Functions |
static | Full static export |
Static prerendering:
export default defineNuxtConfig({
nitro: {
prerender: {
routes: ['/sitemap.xml', '/robots.txt', '/'],
crawlLinks: true, // follow <a> tags from prerendered pages
},
},
});
definePageMeta({ prerender: true });
export default defineNuxtConfig({
ssr: true,
nitro: {
prerender: { crawlLinks: true, routes: ['/'] },
},
});
Hybrid rendering with routeRules:
routeRules:export default defineNuxtConfig({
routeRules: {
// Static generation at build time
'/': { prerender: true },
'/blog/**': { prerender: true },
// ISR — revalidate every 60 seconds
'/products/**': { isr: 60 },
// Full SSR — no caching
'/dashboard/**': { ssr: true },
// SPA-only — no SSR
'/admin/**': { ssr: false },
// Redirect
'/old-page': { redirect: '/new-page' },
// Headers
'/api/**': { headers: { 'cache-control': 's-maxage=3600' } },
// CORS
'/api/public/**': { cors: true },
},
});
Client-only mode:
export default defineNuxtConfig({
ssr: false,
});
Edge deployment considerations:
fs module — use KV stores or R2/S3 for persistenceprocess.env — use Nitro runtime config// nuxt.config.ts
export default defineNuxtConfig({
nitro: {
preset: 'cloudflare-pages',
// Polyfill or replace Node APIs
externals: { traceInclude: ['./server/db.ts'] },
},
});
Runtime config for deployment variables:
export default defineNuxtConfig({
runtimeConfig: {
// Server-only (private)
databaseUrl: process.env.DATABASE_URL,
secretKey: process.env.SECRET_KEY,
// Exposed to client
public: {
apiBase: process.env.NUXT_PUBLIC_API_BASE ?? '/api',
},
},
});
Build output structure:
Running nuxt build produces .output/:
.output/
public/ ← static assets, served directly by CDN
server/ ← Nitro server bundle
index.mjs ← server entry point
chunks/
The .output/server/index.mjs is environment-agnostic — the preset wraps it for the target platform.
ISR vs. SWR:
Both revalidate cached responses in the background:
isr: 60 — revalidate every 60 seconds (time-based, Vercel-style)swr: true — stale-while-revalidate (serve cached, revalidate in background)Prerender vs. generate:
In Nuxt 3, nuxt generate is an alias for nuxt build with the static preset. The prerender.crawlLinks option replaces the Nuxt 2 routes array generation.
Caching headers with routeRules:
The headers rule sets response headers on the Nitro server. For CDN caching, use s-maxage; for browser caching, use max-age:
'/assets/**': { headers: { 'cache-control': 'max-age=31536000, immutable' } }
When to use each rendering mode:
https://nuxt.com/docs/getting-started/deployment