{"id":"d066a01f-925c-4a55-9a09-ed55272d63d1","shortId":"tzH7bP","kind":"skill","title":"vercel-deployment","tagline":"Expert knowledge for deploying to Vercel with Next.js","description":"# Vercel Deployment\n\nExpert knowledge for deploying to Vercel with Next.js\n\n## Capabilities\n\n- vercel\n- deployment\n- edge-functions\n- serverless\n- environment-variables\n\n## Prerequisites\n\n- Required skills: nextjs-app-router\n\n## Patterns\n\n### Environment Variables Setup\n\nProperly configure environment variables for all environments\n\n**When to use**: Setting up a new project on Vercel\n\n// Three environments in Vercel:\n// - Development (local)\n// - Preview (PR deployments)\n// - Production (main branch)\n\n// In Vercel Dashboard:\n// Settings → Environment Variables\n\n// PUBLIC variables (exposed to browser)\nNEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co\nNEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...\n\n// PRIVATE variables (server only)\nSUPABASE_SERVICE_ROLE_KEY=eyJ...  // Never NEXT_PUBLIC_!\nDATABASE_URL=postgresql://...\n\n// Per-environment values:\n// Production: Real database, production API keys\n// Preview: Staging database, test API keys\n// Development: Local/dev values (also in .env.local)\n\n// In code, check environment:\nconst isProduction = process.env.VERCEL_ENV === 'production'\nconst isPreview = process.env.VERCEL_ENV === 'preview'\n\n### Edge vs Serverless Functions\n\nChoose the right runtime for your API routes\n\n**When to use**: Creating API routes or middleware\n\n// EDGE RUNTIME - Fast cold starts, limited APIs\n// Good for: Auth checks, redirects, simple transforms\n\n// app/api/hello/route.ts\nexport const runtime = 'edge'\n\nexport async function GET() {\n  return Response.json({ message: 'Hello from Edge!' })\n}\n\n// middleware.ts (always edge)\nexport function middleware(request: NextRequest) {\n  // Fast auth checks here\n}\n\n// SERVERLESS (Node.js) - Full Node APIs, slower cold start\n// Good for: Database queries, file operations, heavy computation\n\n// app/api/users/route.ts\nexport const runtime = 'nodejs'  // Default, can omit\n\nexport async function GET() {\n  const users = await db.query('SELECT * FROM users')\n  return Response.json(users)\n}\n\n### Build Optimization\n\nOptimize build for faster deployments and smaller bundles\n\n**When to use**: Preparing for production deployment\n\n// next.config.js\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n  // Minimize output\n  output: 'standalone',  // For Docker/self-hosting\n\n  // Image optimization\n  images: {\n    remotePatterns: [\n      { hostname: 'your-cdn.com' },\n    ],\n  },\n\n  // Bundle analyzer (dev only)\n  // npm install @next/bundle-analyzer\n  ...(process.env.ANALYZE === 'true' && {\n    webpack: (config) => {\n      const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')\n      config.plugins.push(new BundleAnalyzerPlugin())\n      return config\n    },\n  }),\n}\n\n// Reduce serverless function size:\n// - Use dynamic imports for heavy libs\n// - Check bundle with: npx @next/bundle-analyzer\n\n### Preview Deployment Workflow\n\nUse preview deployments for PR reviews\n\n**When to use**: Setting up team development workflow\n\n// Every PR gets a unique preview URL automatically\n\n// Protect preview deployments with password:\n// Vercel Dashboard → Settings → Deployment Protection\n\n// Use different env vars for preview:\n// - PREVIEW: Use staging database\n// - PRODUCTION: Use production database\n\n// In code, detect preview:\nif (process.env.VERCEL_ENV === 'preview') {\n  // Show \"Preview\" banner\n  // Use test payment processor\n  // Disable analytics\n}\n\n// Comment preview URL on PR (automatic with Vercel GitHub integration)\n\n### Custom Domain Setup\n\nConfigure custom domains with proper SSL\n\n**When to use**: Going to production\n\n// In Vercel Dashboard → Domains\n\n// Add domains:\n// - example.com (apex/root)\n// - www.example.com (subdomain)\n\n// DNS Configuration (at your registrar):\n// Type: A, Name: @, Value: 76.76.21.21\n// Type: CNAME, Name: www, Value: cname.vercel-dns.com\n\n// Redirect www to apex (or vice versa):\n// Vercel handles this automatically\n\n// In next.config.js for redirects:\nmodule.exports = {\n  async redirects() {\n    return [\n      {\n        source: '/old-page',\n        destination: '/new-page',\n        permanent: true,  // 308\n      },\n    ]\n  },\n}\n\n## Sharp Edges\n\n### NEXT_PUBLIC_ exposes secrets to the browser\n\nSeverity: CRITICAL\n\nSituation: Using NEXT_PUBLIC_ prefix for sensitive API keys\n\nSymptoms:\n- Secrets visible in browser DevTools → Sources\n- Security audit finds exposed keys\n- Unexpected API access from unknown sources\n\nWhy this breaks:\nVariables prefixed with NEXT_PUBLIC_ are inlined into the JavaScript\nbundle at build time. Anyone can view them in browser DevTools.\nThis includes all your users and potential attackers.\n\nRecommended fix:\n\nOnly use NEXT_PUBLIC_ for truly public values:\n\n// SAFE to use NEXT_PUBLIC_\nNEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co\nNEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...  // Anon key is designed to be public\nNEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_...\nNEXT_PUBLIC_GA_ID=G-XXXXXXX\n\n// NEVER use NEXT_PUBLIC_\nSUPABASE_SERVICE_ROLE_KEY=eyJ...     // Full database access!\nSTRIPE_SECRET_KEY=sk_live_...         // Can charge cards!\nDATABASE_URL=postgresql://...          // Direct DB access!\nJWT_SECRET=...                         // Can forge tokens!\n\n// Access server-only vars in:\n// - Server Components (app router)\n// - API Routes\n// - Server Actions ('use server')\n// - getServerSideProps (pages router)\n\n### Preview deployments using production database\n\nSeverity: HIGH\n\nSituation: Not configuring separate environment variables for preview\n\nSymptoms:\n- Test data appearing in production\n- Production data corrupted after PR merge\n- Users seeing test accounts/content\n\nWhy this breaks:\nPreview deployments run untested code. If they use production database,\na bug in a PR can corrupt production data. Also, testers might create\ntest data that shows up in production.\n\nRecommended fix:\n\nSet up separate databases for each environment:\n\n// In Vercel Dashboard → Settings → Environment Variables\n\n// Production (production env only):\nDATABASE_URL=postgresql://prod-host/prod-db\n\n// Preview (preview env only):\nDATABASE_URL=postgresql://staging-host/staging-db\n\n// Or use Vercel's branching databases:\n// - Neon, PlanetScale, Supabase all support branch databases\n// - Auto-create preview DB for each PR\n\n// For Supabase, create a staging project:\n// Production:\nNEXT_PUBLIC_SUPABASE_URL=https://prod-xxx.supabase.co\n\n// Preview:\nNEXT_PUBLIC_SUPABASE_URL=https://staging-xxx.supabase.co\n\n### Serverless function too large, slow cold starts\n\nSeverity: HIGH\n\nSituation: API route or server component has slow initial load\n\nSymptoms:\n- First request takes 3-10+ seconds\n- Subsequent requests are fast\n- Function size limit exceeded error\n- Deployment fails with size error\n\nWhy this breaks:\nVercel serverless functions have a 50MB limit (compressed).\nLarge functions mean slow cold starts (1-5+ seconds).\nHeavy dependencies like puppeteer, sharp can cause this.\n\nRecommended fix:\n\nReduce function size:\n\n// 1. Use dynamic imports for heavy libs\nexport async function GET() {\n  const sharp = await import('sharp')  // Only loads when needed\n  // ...\n}\n\n// 2. Move heavy processing to edge or external service\nexport const runtime = 'edge'  // Much smaller, faster cold start\n\n// 3. Check bundle size\n// npx @next/bundle-analyzer\n// Look for large dependencies\n\n// 4. Use external services for heavy tasks\n// - Image processing: Cloudinary, imgix\n// - PDF generation: API service\n// - Puppeteer: Browserless.io\n\n// 5. Split into multiple functions\n// /api/heavy-task/start - Queue the job\n// /api/heavy-task/status - Check progress\n\n### Edge runtime missing Node.js APIs\n\nSeverity: HIGH\n\nSituation: Using Node.js APIs in edge runtime functions\n\nSymptoms:\n- X is not defined at runtime\n- Cannot find module fs\n- Works locally, fails deployed\n- Middleware crashes\n\nWhy this breaks:\nEdge runtime runs on V8, not Node.js. Many Node APIs are missing:\nfs, path, crypto (partial), child_process, and most native modules.\nYour code will fail at runtime with \"X is not defined\".\n\nRecommended fix:\n\nCheck API compatibility before using edge:\n\n// SUPPORTED in Edge:\n// - fetch, Request, Response\n// - crypto.subtle (Web Crypto)\n// - TextEncoder, TextDecoder\n// - URL, URLSearchParams\n// - Headers, FormData\n// - setTimeout, setInterval\n\n// NOT SUPPORTED in Edge:\n// - fs, path, os\n// - Buffer (use Uint8Array)\n// - crypto.createHash (use crypto.subtle)\n// - Most npm packages with native deps\n\n// If you need Node.js APIs:\nexport const runtime = 'nodejs'  // Use Node runtime instead\n\n// For crypto hashing in edge:\n// WRONG\nimport { createHash } from 'crypto'  // Fails in edge\n\n// RIGHT\nasync function hash(message: string) {\n  const encoder = new TextEncoder()\n  const data = encoder.encode(message)\n  const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n  return Array.from(new Uint8Array(hashBuffer))\n    .map(b => b.toString(16).padStart(2, '0'))\n    .join('')\n}\n\n### Function timeout causes incomplete operations\n\nSeverity: MEDIUM\n\nSituation: Long-running operations timing out\n\nSymptoms:\n- Task timed out after X seconds\n- Incomplete database operations\n- Partial file uploads\n- Function killed mid-execution\n\nWhy this breaks:\nVercel has timeout limits:\n- Hobby: 10 seconds\n- Pro: 60 seconds (can increase to 300)\n- Enterprise: 900 seconds\n\nOperations exceeding this are killed mid-execution.\n\nRecommended fix:\n\nHandle long operations properly:\n\n// 1. Return early, process async\nexport async function POST(request: Request) {\n  const data = await request.json()\n\n  // Queue for background processing\n  await queue.add('process-data', data)\n\n  // Return immediately\n  return Response.json({ status: 'queued' })\n}\n\n// 2. Use streaming for long responses\nexport async function GET() {\n  const stream = new ReadableStream({\n    async start(controller) {\n      for (const chunk of generateChunks()) {\n        controller.enqueue(chunk)\n        await sleep(100)  // Prevents timeout\n      }\n      controller.close()\n    }\n  })\n  return new Response(stream)\n}\n\n// 3. Use external services for heavy processing\n// - Trigger serverless function, return job ID\n// - Process in background (Inngest, Trigger.dev)\n// - Client polls for completion\n\n// 4. Increase timeout (Pro plan)\n// vercel.json:\n{\n  \"functions\": {\n    \"app/api/slow/route.ts\": {\n      \"maxDuration\": 60\n    }\n  }\n}\n\n### Environment variable missing at runtime but present at build\n\nSeverity: MEDIUM\n\nSituation: Environment variable works in build but undefined at runtime\n\nSymptoms:\n- Env var is undefined in production\n- Value doesn't change after updating in dashboard\n- Works in dev, wrong value in production\n- Requires redeploy to update value\n\nWhy this breaks:\nSome env vars are only available at build time (hardcoded into bundle).\nIf you expect a runtime value but it was baked in at build, you get\nthe build-time value or undefined.\n\nRecommended fix:\n\nUnderstand when env vars are read:\n\n// BUILD TIME (baked into bundle):\n// - NEXT_PUBLIC_* variables\n// - next.config.js\n// - generateStaticParams\n// - Static pages\n\n// RUNTIME (read on each request):\n// - Server Components (without cache)\n// - API Routes\n// - Server Actions\n// - Middleware\n\n// To force runtime reading:\nexport const dynamic = 'force-dynamic'\n\n// For config that must be runtime:\n// Don't use NEXT_PUBLIC_, read on server and pass to client\n\n// Check which env vars you need:\n// Build: URLs, public keys, feature flags (if static)\n// Runtime: Secrets, database URLs, user-specific config\n\n### CORS errors calling API routes from different domain\n\nSeverity: MEDIUM\n\nSituation: Frontend on different domain can't call API routes\n\nSymptoms:\n- CORS policy error in browser console\n- No Access-Control-Allow-Origin header\n- Requests work in Postman but not browser\n- Works same-origin, fails cross-origin\n\nWhy this breaks:\nBy default, browsers block cross-origin requests. Vercel doesn't\nautomatically add CORS headers. If your frontend is on a different\ndomain (or localhost in dev), requests fail.\n\nRecommended fix:\n\nAdd CORS headers to API routes:\n\n// app/api/data/route.ts\nexport async function GET(request: Request) {\n  const data = await fetchData()\n\n  return Response.json(data, {\n    headers: {\n      'Access-Control-Allow-Origin': '*',  // Or specific domain\n      'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n      'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n    },\n  })\n}\n\n// Handle preflight requests\nexport async function OPTIONS() {\n  return new Response(null, {\n    headers: {\n      'Access-Control-Allow-Origin': '*',\n      'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',\n      'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n    },\n  })\n}\n\n// Or use next.config.js for all routes:\nmodule.exports = {\n  async headers() {\n    return [\n      {\n        source: '/api/:path*',\n        headers: [\n          { key: 'Access-Control-Allow-Origin', value: '*' },\n        ],\n      },\n    ]\n  },\n}\n\n### Page shows stale data after deployment\n\nSeverity: MEDIUM\n\nSituation: Updated data not appearing after new deployment\n\nSymptoms:\n- Old content shows after deploy\n- Changes not visible immediately\n- Different users see different versions\n- Data updates but page doesn't\n\nWhy this breaks:\nVercel caches aggressively. Static pages are cached at the edge.\nEven dynamic pages may be cached if not configured properly.\nOld cached versions served until cache expires or is purged.\n\nRecommended fix:\n\nControl caching behavior:\n\n// Force no caching (always fresh)\nexport const dynamic = 'force-dynamic'\nexport const revalidate = 0\n\n// ISR - revalidate every 60 seconds\nexport const revalidate = 60\n\n// On-demand revalidation (after mutation)\nimport { revalidatePath, revalidateTag } from 'next/cache'\n\n// In Server Action:\nasync function updatePost(id: string) {\n  await db.post.update({ ... })\n  revalidatePath(`/posts/${id}`)  // Purge this page\n  revalidateTag('posts')          // Purge all with this tag\n}\n\n// Purge via API (deployment hook):\n// POST https://your-site.vercel.app/api/revalidate?path=/posts\n\n// Check caching in response headers:\n// x-vercel-cache: HIT = served from cache\n// x-vercel-cache: MISS = freshly generated\n\n## Validation Checks\n\n### Secret in NEXT_PUBLIC Variable\n\nSeverity: CRITICAL\n\nMessage: Secret exposed via NEXT_PUBLIC_ prefix. This will be visible in browser.\n\nFix action: Remove NEXT_PUBLIC_ prefix and access only in server-side code\n\n### Hardcoded Vercel URL\n\nSeverity: WARNING\n\nMessage: Hardcoded Vercel URL. Use VERCEL_URL environment variable instead.\n\nFix action: Use process.env.VERCEL_URL or NEXT_PUBLIC_VERCEL_URL\n\n### Node.js API in Edge Runtime\n\nSeverity: ERROR\n\nMessage: Node.js module used in Edge runtime. fs/path not available in Edge.\n\nFix action: Use runtime = 'nodejs' or remove Node.js dependencies\n\n### API Route Without CORS Headers\n\nSeverity: WARNING\n\nMessage: API route without CORS headers may fail cross-origin requests.\n\nFix action: Add Access-Control-Allow-Origin header if API is called from other domains\n\n### API Route Without Error Handling\n\nSeverity: WARNING\n\nMessage: API route without try/catch. Unhandled errors return 500 without details.\n\nFix action: Wrap in try/catch and return appropriate error responses\n\n### Secret Read in Static Context\n\nSeverity: WARNING\n\nMessage: Server secret accessed in static generation. Value baked into build.\n\nFix action: Move secret access to runtime code or use NEXT_PUBLIC_ for public values\n\n### Large Package Import\n\nSeverity: WARNING\n\nMessage: Large package imported. May cause slow cold starts. Consider alternatives.\n\nFix action: Use lodash-es with tree shaking, date-fns instead of moment, @aws-sdk/client-* instead of aws-sdk\n\n### Dynamic Page Without Revalidation Config\n\nSeverity: WARNING\n\nMessage: Dynamic page without revalidation config. Consider setting revalidation strategy.\n\nFix action: Add export const revalidate = 60 for ISR, or 0 for no cache\n\n## Collaboration\n\n### Delegation Triggers\n\n- next.js|app router|pages|server components -> nextjs-app-router (Deployment needs Next.js patterns)\n- database|supabase|backend -> supabase-backend (Deployment needs database)\n- auth|authentication|session -> nextjs-supabase-auth (Deployment needs auth config)\n- monitoring|logs|errors|analytics -> analytics-architecture (Deployment needs monitoring)\n\n### Production Launch\n\nSkills: vercel-deployment, nextjs-app-router, supabase-backend, nextjs-supabase-auth\n\nWorkflow:\n\n```\n1. App configuration (nextjs-app-router)\n2. Database setup (supabase-backend)\n3. Auth config (nextjs-supabase-auth)\n4. Deploy (vercel-deployment)\n```\n\n### CI/CD Pipeline\n\nSkills: vercel-deployment, devops, qa-engineering\n\nWorkflow:\n\n```\n1. Test automation (qa-engineering)\n2. Pipeline config (devops)\n3. Deploy strategy (vercel-deployment)\n```\n\n## Related Skills\n\nWorks well with: `nextjs-app-router`, `supabase-backend`\n\n## When to Use\n- User mentions or implies: vercel\n- User mentions or implies: deploy\n- User mentions or implies: deployment\n- User mentions or implies: hosting\n- User mentions or implies: production\n- User mentions or implies: environment variables\n- User mentions or implies: edge function\n- User mentions or implies: serverless function\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["vercel","deployment","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows"],"capabilities":["skill","source-sickn33","skill-vercel-deployment","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/vercel-deployment","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 37911 github stars · SKILL.md body (17,444 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:51:58.416Z","embedding":null,"createdAt":"2026-04-18T20:32:02.080Z","updatedAt":"2026-05-18T18:51:58.416Z","lastSeenAt":"2026-05-18T18:51:58.416Z","tsv":"'-10':788 '-256':1071 '-5':822 '/api':1594 '/api/heavy-task/start':907 '/api/heavy-task/status':911 '/api/revalidate?path=/posts':1745 '/client-':1985 '/new-page':456 '/old-page':454 '/posts':1725 '/prod-db':714 '/staging-db':724 '0':1084,1693,2018 '1':821,837,1152,2087,2123 '10':1126 '100':1209 '16':1081 '2':857,1083,1183,2094,2129 '3':787,875,1217,2100,2133 '300':1134 '308':459 '4':885,1239,2107 '5':902 '500':1905 '50mb':812 '60':1129,1248,1697,1702,2014 '76.76.21.21':427 '900':1136 'access':494,588,601,607,1447,1523,1531,1539,1560,1565,1575,1599,1795,1878,1928,1940 'access-control-allow-head':1538,1574 'access-control-allow-method':1530,1564 'access-control-allow-origin':1446,1522,1559,1598,1877 'accounts/content':656 'action':620,1366,1716,1789,1818,1847,1875,1909,1937,1968,2009 'add':412,1482,1501,1876,2010 'aggress':1646 'allow':1449,1525,1533,1541,1562,1567,1577,1601,1880 'also':127,679 'altern':1966 'alway':194,1682 'analyt':382,2062,2064 'analytics-architectur':2063 'analyz':280,296 'anon':91,553,556 'anyon':515 'apex':437 'apex/root':415 'api':116,122,154,160,170,209,478,493,617,774,898,918,924,958,985,1030,1363,1421,1436,1505,1739,1828,1855,1863,1884,1890,1898 'app':37,615,2026,2033,2077,2088,2092,2146 'app/api/data/route.ts':1507 'app/api/hello/route.ts':178 'app/api/slow/route.ts':1246 'app/api/users/route.ts':221 'appear':644,1616 'appropri':1915 'architectur':2065 'array.from':1074 'ask':2230 'async':184,230,450,845,1053,1156,1158,1190,1197,1509,1551,1590,1717 'attack':529 'audit':488 'auth':173,202,2048,2054,2057,2085,2101,2106 'authent':2049 'author':1546,1582 'auto':739 'auto-cr':738 'autom':2125 'automat':341,388,444,1481 'avail':1305,1843 'aw':1983,1989 'await':235,850,1068,1165,1171,1207,1516,1722 'aws-sdk':1982,1988 'b':1079 'b.tostring':1080 'backend':2041,2044,2081,2099,2150 'background':1169,1232 'bake':1321,1344,1933 'banner':376 'behavior':1678 'block':1473 'boundari':2238 'branch':71,729,736 'break':500,659,806,948,1120,1299,1469,1643 'browser':82,468,484,520,1443,1458,1472,1787 'browserless.io':901 'buffer':1014 'bug':671 'build':243,246,513,1257,1265,1307,1324,1329,1342,1402,1935 'build-tim':1328 'bundl':252,279,295,313,511,877,1311,1346 'bundleanalyzerplugin':291,299 'cach':1362,1645,1650,1659,1665,1669,1677,1681,1747,1754,1758,1762,2021 'call':1420,1435,1886 'cannot':936 'capabl':22 'card':596 'caus':830,1088,1961 'chang':1280,1626 'charg':595 'check':132,174,203,312,876,912,984,1396,1746,1767 'child':965 'choos':148 'chunk':1202,1206 'ci/cd':2112 'clarif':2232 'clear':2205 'client':1235,1395 'cloudinari':894 'cname':429 'cname.vercel-dns.com':433 'code':131,367,664,972,1801,1943 'cold':167,211,769,819,873,1963 'collabor':2022 'comment':383 'compat':986 'complet':1238 'compon':614,778,1360,2030 'compress':814 'comput':220 'config':289,301,1379,1417,1995,2003,2058,2102,2131 'config.plugins.push':297 'configur':44,396,419,635,1662,2089 'consid':1965,2004 'consol':1444 'const':134,139,180,223,233,265,290,848,867,1032,1058,1062,1066,1163,1193,1201,1373,1514,1685,1691,1700,2012 'content':1544,1580,1622 'content-typ':1543,1579 'context':1922 'control':1199,1448,1524,1532,1540,1561,1566,1576,1600,1676,1879 'controller.close':1212 'controller.enqueue':1205 'cor':1418,1439,1483,1502,1858,1866 'corrupt':649,676 'crash':945 'creat':159,682,740,748 'createhash':1046 'criteria':2241 'critic':470,1774 'cross':1465,1475,1871 'cross-origin':1464,1474,1870 'crypto':963,998,1040,1048 'crypto.createhash':1017 'crypto.subtle':996,1019 'crypto.subtle.digest':1069 'custom':393,397 'dashboard':74,348,410,701,1284 'data':643,648,678,684,1063,1072,1164,1175,1176,1515,1520,1607,1614,1635 'databas':106,114,120,215,361,365,587,597,630,669,695,709,719,730,737,1108,1412,2039,2047,2095 'date':1977 'date-fn':1976 'db':600,742 'db.post.update':1723 'db.query':236 'default':226,1471 'defin':933,981 'deleg':2023 'delet':1572 'demand':1705 'dep':1025 'depend':825,884,1854 'deploy':3,7,13,17,24,68,249,259,318,322,344,350,627,661,799,943,1609,1619,1625,1740,2035,2045,2055,2066,2074,2108,2111,2117,2134,2138,2163,2168 'describ':2209 'design':559 'destin':455 'detail':1907 'detect':368 'dev':281,1287,1496 'develop':64,124,332 'devop':2118,2132 'devtool':485,521 'differ':353,1424,1431,1491,1630,1633 'direct':599 'disabl':381 'dns':418 'docker/self-hosting':272 'doesn':1278,1479,1639 'domain':394,398,411,413,1425,1432,1492,1529,1889 'dynam':307,839,1374,1377,1655,1686,1689,1991,1999 'earli':1154 'edg':26,144,164,182,192,195,461,862,869,914,926,949,989,992,1010,1043,1051,1653,1830,1839,1845,2189 'edge-funct':25 'encod':1059 'encoder.encode':1064 'engin':2121,2128 'enterpris':1135 'env':137,142,354,372,707,717,1271,1301,1338,1398 'env.local':129 'environ':30,40,45,49,61,76,110,133,637,698,703,1249,1261,1814,2183,2221 'environment-specif':2220 'environment-vari':29 'error':798,803,1419,1441,1833,1893,1903,1916,2061 'es':1972 'even':1654 'everi':334,1696 'example.com':414 'exceed':797,1139 'execut':1117,1145 'expect':1314 'expert':4,14,2226 'expir':1670 'export':179,183,196,222,229,844,866,1031,1157,1189,1372,1508,1550,1684,1690,1699,2011 'expos':80,464,490,1777 'extern':864,887,1219 'eyj':93,102,555,585 'fail':800,942,974,1049,1463,1498,1869 'fast':166,201,793 'faster':248,872 'featur':1406 'fetch':993 'fetchdata':1517 'file':217,1111 'find':489,937 'first':784 'fix':531,691,833,983,1147,1335,1500,1675,1788,1817,1846,1874,1908,1936,1967,2008 'flag':1407 'fns':1978 'forc':1369,1376,1679,1688 'force-dynam':1375,1687 'forg':605 'formdata':1004 'fresh':1683,1764 'frontend':1429,1487 'fs':939,961,1011 'fs/path':1841 'full':207,586 'function':27,147,185,197,231,304,765,794,809,816,835,846,906,928,1054,1086,1113,1159,1191,1226,1245,1510,1552,1718,2190,2196 'g':575 'g-xxxxxxx':574 'ga':572 'generat':897,1765,1931 'generatechunk':1204 'generatestaticparam':1351 'get':186,232,336,847,1192,1326,1511,1535,1569 'getserversideprop':623 'github':391 'go':405 'good':171,213 'handl':442,1148,1547,1894 'hardcod':1309,1802,1808 'hash':1041,1055 'hashbuff':1067,1077 'header':1003,1451,1484,1503,1521,1542,1558,1578,1591,1596,1750,1859,1867,1882 'heavi':219,310,824,842,859,890,1222 'hello':190 'high':632,772,920 'hit':1755 'hobbi':1125 'hook':1741 'host':713,723,2173 'hostnam':277 'id':573,1229,1720,1726 'imag':273,275,892 'imgix':895 'immedi':1178,1629 'impli':2157,2162,2167,2172,2177,2182,2188,2194 'import':262,308,840,851,1045,1709,1953,1959 'includ':523 'incomplet':1089,1107 'increas':1132,1240 'initi':781 'inlin':507 'inngest':1233 'input':2235 'instal':284 'instead':1038,1816,1979,1986 'integr':392 'ispreview':140 'isproduct':135 'isr':1694,2016 'javascript':510 'job':910,1228 'join':1085 'jwt':602 'key':92,101,117,123,479,491,554,557,567,584,591,1405,1597 'kill':1114,1142 'knowledg':5,15 'larg':767,815,883,1951,1957 'launch':2070 'lib':311,843 'like':826 'limit':169,796,813,1124,2197 'live':569,593 'load':782,854 'local':65,941 'local/dev':125 'localhost':1494 'lodash':1971 'lodash-':1970 'log':2060 'long':1095,1149,1187 'long-run':1094 'look':881 'main':70 'mani':956 'map':1078 'match':2206 'maxdur':1247 'may':1657,1868,1960 'mean':817 'medium':1092,1259,1427,1611 'mention':2155,2160,2165,2170,2175,2180,2186,2192 'merg':652 'messag':189,1056,1065,1775,1807,1834,1862,1897,1925,1956,1998 'method':1534,1568 'mid':1116,1144 'mid-execut':1115,1143 'middlewar':163,198,944,1367 'middleware.ts':193 'might':681 'minim':267 'miss':916,960,1251,1763,2243 'modul':938,970,1836 'module.exports':449,1589 'moment':1981 'monitor':2059,2068 'move':858,1938 'much':870 'multipl':905 'must':1381 'mutat':1708 'name':425,430 'nativ':969,1024 'need':856,1028,1401,2036,2046,2056,2067 'neon':731 'never':103,577 'new':56,298,1060,1075,1195,1214,1555,1618 'next':83,88,104,263,462,473,504,534,543,545,550,563,570,579,753,759,1347,1387,1770,1779,1791,1823,1946 'next.config.js':260,446,1350,1585 'next.js':11,21,2025,2037 'next/bundle-analyzer':285,316,880 'next/cache':1713 'nextconfig':264,266 'nextj':36,2032,2052,2076,2083,2091,2104,2145 'nextjs-app-rout':35,2031,2075,2090,2144 'nextjs-supabase-auth':2051,2082,2103 'nextrequest':200 'node':208,957,1036 'node.js':206,917,923,955,1029,1827,1835,1853 'nodej':225,1034,1850 'npm':283,1021 'npx':315,879 'null':1557 'old':1621,1664 'omit':228 'on-demand':1703 'oper':218,1090,1097,1109,1138,1150 'optim':244,245,274 'option':1537,1553,1573 'origin':1450,1462,1466,1476,1526,1563,1602,1872,1881 'os':1013 'output':268,269,2215 'packag':1022,1952,1958 'padstart':1082 'page':624,1353,1604,1638,1648,1656,1729,1992,2000,2028 'partial':964,1110 'pass':1393 'password':346 'path':962,1012,1595 'pattern':39,2038 'payment':379 'pdf':896 'per':109 'per-environ':108 'perman':457 'permiss':2236 'pipelin':2113,2130 'pk':568 'plan':1243 'planetscal':732 'polici':1440 'poll':1236 'post':1160,1536,1570,1731,1742 'postman':1455 'potenti':528 'pr':67,324,335,387,651,674,745 'prefix':475,502,1781,1793 'preflight':1548 'prepar':256 'prerequisit':32 'present':1255 'prevent':1210 'preview':66,118,143,317,321,339,343,357,358,369,373,375,384,626,640,660,715,716,741,758 'privat':94 'pro':1128,1242 'process':860,893,966,1155,1170,1174,1223,1230 'process-data':1173 'process.env.analyze':286 'process.env.vercel':136,141,371,1820 'processor':380 'prod':712 'prod-host':711 'prod-xxx.supabase.co':757 'product':69,112,115,138,258,362,364,407,629,646,647,668,677,689,705,706,752,1276,1291,2069,2178 'progress':913 'project':57,751 'proper':43,400,1151,1663 'protect':342,351 'public':78,84,89,105,463,474,505,535,538,544,546,551,562,564,571,580,754,760,1348,1388,1404,1771,1780,1792,1824,1947,1949 'publish':566 'puppet':827,900 'purg':1673,1727,1732,1737 'put':1571 'qa':2120,2127 'qa-engin':2119,2126 'queri':216 'queu':1182 'queue':908,1167 'queue.add':1172 'read':1341,1355,1371,1389,1919 'readablestream':1196 'real':113 'recommend':530,690,832,982,1146,1334,1499,1674 'redeploy':1293 'redirect':175,434,448,451 'reduc':302,834 'registrar':422 'relat':2139 'remotepattern':276 'remov':1790,1852 'request':199,785,791,994,1161,1162,1358,1452,1477,1497,1512,1513,1549,1873 'request.json':1166 'requir':33,292,1292,2234 'respons':995,1188,1215,1556,1749,1917 'response.json':188,241,1180,1519 'return':187,240,300,452,1073,1153,1177,1179,1213,1227,1518,1554,1592,1904,1914 'revalid':1692,1695,1701,1706,1994,2002,2006,2013 'revalidatepath':1710,1724 'revalidatetag':1711,1730 'review':325,2227 'right':150,1052 'role':100,583 'rout':155,161,618,775,1364,1422,1437,1506,1588,1856,1864,1891,1899 'router':38,616,625,2027,2034,2078,2093,2147 'run':662,951,1096 'runtim':151,165,181,224,868,915,927,935,950,976,1033,1037,1253,1269,1316,1354,1370,1383,1410,1831,1840,1849,1942 'safe':540 'safeti':2237 'same-origin':1460 'scope':2208 'sdk':1984,1990 'second':789,823,1106,1127,1130,1137,1698 'secret':465,481,590,603,1411,1768,1776,1918,1927,1939 'secur':487 'see':654,1632 'select':237 'sensit':477 'separ':636,694 'serv':1667,1756 'server':96,609,613,619,622,777,1359,1365,1391,1715,1799,1926,2029 'server-on':608 'server-sid':1798 'serverless':28,146,205,303,764,808,1225,2195 'servic':99,582,865,888,899,1220 'session':2050 'set':53,75,329,349,692,702,2005 'setinterv':1006 'settimeout':1005 'setup':42,395,2096 'sever':469,631,771,919,1091,1258,1426,1610,1773,1805,1832,1860,1895,1923,1954,1996 'sha':1070 'shake':1975 'sharp':460,828,849,852 'show':374,686,1605,1623 'side':1800 'simpl':176 'situat':471,633,773,921,1093,1260,1428,1612 'size':305,795,802,836,878 'sk':592 'skill':34,2071,2114,2140,2200 'skill-vercel-deployment' 'sleep':1208 'slow':768,780,818,1962 'slower':210 'smaller':251,871 'sourc':453,486,497,1593 'source-sickn33' 'specif':1416,1528,2222 'split':903 'ssl':401 'stage':119,360,722,750 'staging-host':721 'staging-xxx.supabase.co':763 'stale':1606 'standalon':270 'start':168,212,770,820,874,1198,1964 'static':1352,1409,1647,1921,1930 'status':1181 'stop':2228 'strategi':2007,2135 'stream':1185,1194,1216 'string':1057,1721 'stripe':565,589 'subdomain':417 'subsequ':790 'substitut':2218 'success':2240 'supabas':85,90,98,547,552,581,733,747,755,761,2040,2043,2053,2080,2084,2098,2105,2149 'supabase-backend':2042,2079,2097,2148 'support':735,990,1008 'symptom':480,641,783,929,1100,1270,1438,1620 'tag':1736 'take':786 'task':891,1101,2204 'team':331 'test':121,378,642,655,683,2124,2224 'tester':680 'textdecod':1000 'textencod':999,1061 'three':60 'time':514,1098,1102,1308,1330,1343 'timeout':1087,1123,1211,1241 'token':606 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'transform':177 'treat':2213 'tree':1974 'trigger':1224,2024 'trigger.dev':1234 'true':287,458 'truli':537 'try/catch':1901,1912 'type':261,423,428,1545,1581 'uint8array':1016,1076 'undefin':1267,1274,1333 'understand':1336 'unexpect':492 'unhandl':1902 'uniqu':338 'unknown':496 'untest':663 'updat':1282,1295,1613,1636 'updatepost':1719 'upload':1112 'url':86,107,340,385,548,598,710,720,756,762,1001,1403,1413,1804,1810,1813,1821,1826 'urlsearchparam':1002 'use':52,158,255,306,320,328,352,359,363,377,404,472,533,542,578,621,628,667,726,838,886,922,988,1015,1018,1035,1184,1218,1386,1584,1811,1819,1837,1848,1945,1969,2153,2198 'user':234,239,242,526,653,1415,1631,2154,2159,2164,2169,2174,2179,2185,2191 'user-specif':1414 'v8':953 'valid':1766,2223 'valu':111,126,426,432,539,1277,1289,1296,1317,1331,1603,1932,1950 'var':355,611,1272,1302,1339,1399 'variabl':31,41,46,77,79,95,501,638,704,1250,1262,1349,1772,1815,2184 'vercel':2,9,12,19,23,59,63,73,347,390,409,441,700,727,807,1121,1478,1644,1753,1761,1803,1809,1812,1825,2073,2110,2116,2137,2158 'vercel-deploy':1,2072,2109,2115,2136 'vercel.json':1244 'versa':440 'version':1634,1666 'via':1738,1778 'vice':439 'view':517 'visibl':482,1628,1785 'vs':145 'warn':1806,1861,1896,1924,1955,1997 'web':997 'webpack':288,294 'webpack-bundle-analyz':293 'well':2142 'without':1361,1857,1865,1892,1900,1906,1993,2001 'work':940,1263,1285,1453,1459,2141 'workflow':319,333,2086,2122 'wrap':1910 'wrong':1044,1288 'www':431,435 'www.example.com':416 'x':930,978,1105,1752,1760 'x-vercel-cach':1751,1759 'xxx.supabase.co':87,549 'xxxxxxx':576 'your-cdn.com':278 'your-site.vercel.app':1744 'your-site.vercel.app/api/revalidate?path=/posts':1743","prices":[{"id":"a9627b37-715d-4246-9aa1-3a329af1ddc8","listingId":"d066a01f-925c-4a55-9a09-ed55272d63d1","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:32:02.080Z"}],"sources":[{"listingId":"d066a01f-925c-4a55-9a09-ed55272d63d1","source":"github","sourceId":"sickn33/antigravity-awesome-skills/vercel-deployment","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/vercel-deployment","isPrimary":false,"firstSeenAt":"2026-04-18T21:47:08.583Z","lastSeenAt":"2026-05-18T18:51:58.416Z"},{"listingId":"d066a01f-925c-4a55-9a09-ed55272d63d1","source":"skills_sh","sourceId":"sickn33/antigravity-awesome-skills/vercel-deployment","sourceUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/vercel-deployment","isPrimary":true,"firstSeenAt":"2026-04-18T20:32:02.080Z","lastSeenAt":"2026-05-07T22:40:33.710Z"}],"details":{"listingId":"d066a01f-925c-4a55-9a09-ed55272d63d1","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"vercel-deployment","github":{"repo":"sickn33/antigravity-awesome-skills","stars":37911,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-05-18T08:24:49Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"b47307c64828c21661ae22752b681849adc9e4d0","skill_md_path":"skills/vercel-deployment/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/vercel-deployment"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"vercel-deployment","description":"Expert knowledge for deploying to Vercel with Next.js"},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/vercel-deployment"},"updatedAt":"2026-05-18T18:51:58.416Z"}}