{"id":"d066a01f-925c-4a55-9a09-ed55272d63d1","shortId":"tzH7bP","kind":"skill","title":"Vercel Deployment","tagline":"Antigravity Awesome Skills skill by Sickn33","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"],"capabilities":["skill","source-sickn33","category-antigravity-awesome-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":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under sickn33/antigravity-awesome-skills","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:v1","enrichmentVersion":1,"enrichedAt":"2026-04-25T11:40:40.455Z","embedding":null,"createdAt":"2026-04-18T20:32:02.080Z","updatedAt":"2026-04-25T11:40:40.455Z","lastSeenAt":"2026-04-25T11:40:40.455Z","tsv":"'-10':785 '-256':1068 '-5':819 '/api':1591 '/api/heavy-task/start':904 '/api/heavy-task/status':908 '/api/revalidate?path=/posts':1742 '/client-':1982 '/new-page':453 '/old-page':451 '/posts':1722 '/prod-db':711 '/staging-db':721 '0':1081,1690,2015 '1':818,834,1149,2084,2120 '10':1123 '100':1206 '16':1078 '2':854,1080,1180,2091,2126 '3':784,872,1214,2097,2130 '300':1131 '308':456 '4':882,1236,2104 '5':899 '500':1902 '50mb':809 '60':1126,1245,1694,1699,2011 '76.76.21.21':424 '900':1133 'access':491,585,598,604,1444,1520,1528,1536,1557,1562,1572,1596,1792,1875,1925,1937 'access-control-allow-head':1535,1571 'access-control-allow-method':1527,1561 'access-control-allow-origin':1443,1519,1556,1595,1874 'accounts/content':653 'action':617,1363,1713,1786,1815,1844,1872,1906,1934,1965,2006 'add':409,1479,1498,1873,2007 'aggress':1643 'allow':1446,1522,1530,1538,1559,1564,1574,1598,1877 'also':124,676 'altern':1963 'alway':191,1679 'analyt':379,2059,2061 'analytics-architectur':2060 'analyz':277,293 'anon':88,550,553 'antigrav':3 'anyon':512 'apex':434 'apex/root':412 'api':113,119,151,157,167,206,475,490,614,771,895,915,921,955,982,1027,1360,1418,1433,1502,1736,1825,1852,1860,1881,1887,1895 'app':34,612,2023,2030,2074,2085,2089,2143 'app/api/data/route.ts':1504 'app/api/hello/route.ts':175 'app/api/slow/route.ts':1243 'app/api/users/route.ts':218 'appear':641,1613 'appropri':1912 'architectur':2062 'array.from':1071 'ask':2227 'async':181,227,447,842,1050,1153,1155,1187,1194,1506,1548,1587,1714 'attack':526 'audit':485 'auth':170,199,2045,2051,2054,2082,2098,2103 'authent':2046 'author':1543,1579 'auto':736 'auto-cr':735 'autom':2122 'automat':338,385,441,1478 'avail':1302,1840 'aw':1980,1986 'await':232,847,1065,1162,1168,1204,1513,1719 'awesom':4 'aws-sdk':1979,1985 'b':1076 'b.tostring':1077 'backend':2038,2041,2078,2096,2147 'background':1166,1229 'bake':1318,1341,1930 'banner':373 'behavior':1675 'block':1470 'boundari':2235 'branch':68,726,733 'break':497,656,803,945,1117,1296,1466,1640 'browser':79,465,481,517,1440,1455,1469,1784 'browserless.io':898 'buffer':1011 'bug':668 'build':240,243,510,1254,1262,1304,1321,1326,1339,1399,1932 'build-tim':1325 'bundl':249,276,292,310,508,874,1308,1343 'bundleanalyzerplugin':288,296 'cach':1359,1642,1647,1656,1662,1666,1674,1678,1744,1751,1755,1759,2018 'call':1417,1432,1883 'cannot':933 'capabl':19 'card':593 'category-antigravity-awesome-skills' 'caus':827,1085,1958 'chang':1277,1623 'charg':592 'check':129,171,200,309,873,909,981,1393,1743,1764 'child':962 'choos':145 'chunk':1199,1203 'ci/cd':2109 'clarif':2229 'clear':2202 'client':1232,1392 'cloudinari':891 'cname':426 'cname.vercel-dns.com':430 'code':128,364,661,969,1798,1940 'cold':164,208,766,816,870,1960 'collabor':2019 'comment':380 'compat':983 'complet':1235 'compon':611,775,1357,2027 'compress':811 'comput':217 'config':286,298,1376,1414,1992,2000,2055,2099,2128 'config.plugins.push':294 'configur':41,393,416,632,1659,2086 'consid':1962,2001 'consol':1441 'const':131,136,177,220,230,262,287,845,864,1029,1055,1059,1063,1160,1190,1198,1370,1511,1682,1688,1697,2009 'content':1541,1577,1619 'content-typ':1540,1576 'context':1919 'control':1196,1445,1521,1529,1537,1558,1563,1573,1597,1673,1876 'controller.close':1209 'controller.enqueue':1202 'cor':1415,1436,1480,1499,1855,1863 'corrupt':646,673 'crash':942 'creat':156,679,737,745 'createhash':1043 'criteria':2238 'critic':467,1771 'cross':1462,1472,1868 'cross-origin':1461,1471,1867 'crypto':960,995,1037,1045 'crypto.createhash':1014 'crypto.subtle':993,1016 'crypto.subtle.digest':1066 'custom':390,394 'dashboard':71,345,407,698,1281 'data':640,645,675,681,1060,1069,1161,1172,1173,1512,1517,1604,1611,1632 'databas':103,111,117,212,358,362,584,594,627,666,692,706,716,727,734,1105,1409,2036,2044,2092 'date':1974 'date-fn':1973 'db':597,739 'db.post.update':1720 'db.query':233 'default':223,1468 'defin':930,978 'deleg':2020 'delet':1569 'demand':1702 'dep':1022 'depend':822,881,1851 'deploy':2,10,14,21,65,246,256,315,319,341,347,624,658,796,940,1606,1616,1622,1737,2032,2042,2052,2063,2071,2105,2108,2114,2131,2135,2160,2165 'describ':2206 'design':556 'destin':452 'detail':1904 'detect':365 'dev':278,1284,1493 'develop':61,121,329 'devop':2115,2129 'devtool':482,518 'differ':350,1421,1428,1488,1627,1630 'direct':596 'disabl':378 'dns':415 'docker/self-hosting':269 'doesn':1275,1476,1636 'domain':391,395,408,410,1422,1429,1489,1526,1886 'dynam':304,836,1371,1374,1652,1683,1686,1988,1996 'earli':1151 'edg':23,141,161,179,189,192,458,859,866,911,923,946,986,989,1007,1040,1048,1650,1827,1836,1842,2186 'edge-funct':22 'encod':1056 'encoder.encode':1061 'engin':2118,2125 'enterpris':1132 'env':134,139,351,369,704,714,1268,1298,1335,1395 'env.local':126 'environ':27,37,42,46,58,73,107,130,634,695,700,1246,1258,1811,2180,2218 'environment-specif':2217 'environment-vari':26 'error':795,800,1416,1438,1830,1890,1900,1913,2058 'es':1969 'even':1651 'everi':331,1693 'example.com':411 'exceed':794,1136 'execut':1114,1142 'expect':1311 'expert':11,2223 'expir':1667 'export':176,180,193,219,226,841,863,1028,1154,1186,1369,1505,1547,1681,1687,1696,2008 'expos':77,461,487,1774 'extern':861,884,1216 'eyj':90,99,552,582 'fail':797,939,971,1046,1460,1495,1866 'fast':163,198,790 'faster':245,869 'featur':1403 'fetch':990 'fetchdata':1514 'file':214,1108 'find':486,934 'first':781 'fix':528,688,830,980,1144,1332,1497,1672,1785,1814,1843,1871,1905,1933,1964,2005 'flag':1404 'fns':1975 'forc':1366,1373,1676,1685 'force-dynam':1372,1684 'forg':602 'formdata':1001 'fresh':1680,1761 'frontend':1426,1484 'fs':936,958,1008 'fs/path':1838 'full':204,583 'function':24,144,182,194,228,301,762,791,806,813,832,843,903,925,1051,1083,1110,1156,1188,1223,1242,1507,1549,1715,2187,2193 'g':572 'g-xxxxxxx':571 'ga':569 'generat':894,1762,1928 'generatechunk':1201 'generatestaticparam':1348 'get':183,229,333,844,1189,1323,1508,1532,1566 'getserversideprop':620 'github':388 'go':402 'good':168,210 'handl':439,1145,1544,1891 'hardcod':1306,1799,1805 'hash':1038,1052 'hashbuff':1064,1074 'header':1000,1448,1481,1500,1518,1539,1555,1575,1588,1593,1747,1856,1864,1879 'heavi':216,307,821,839,856,887,1219 'hello':187 'high':629,769,917 'hit':1752 'hobbi':1122 'hook':1738 'host':710,720,2170 'hostnam':274 'id':570,1226,1717,1723 'imag':270,272,889 'imgix':892 'immedi':1175,1626 'impli':2154,2159,2164,2169,2174,2179,2185,2191 'import':259,305,837,848,1042,1706,1950,1956 'includ':520 'incomplet':1086,1104 'increas':1129,1237 'initi':778 'inlin':504 'inngest':1230 'input':2232 'instal':281 'instead':1035,1813,1976,1983 'integr':389 'ispreview':137 'isproduct':132 'isr':1691,2013 'javascript':507 'job':907,1225 'join':1082 'jwt':599 'key':89,98,114,120,476,488,551,554,564,581,588,1402,1594 'kill':1111,1139 'knowledg':12 'larg':764,812,880,1948,1954 'launch':2067 'lib':308,840 'like':823 'limit':166,793,810,1121,2194 'live':566,590 'load':779,851 'local':62,938 'local/dev':122 'localhost':1491 'lodash':1968 'lodash-':1967 'log':2057 'long':1092,1146,1184 'long-run':1091 'look':878 'main':67 'mani':953 'map':1075 'match':2203 'maxdur':1244 'may':1654,1865,1957 'mean':814 'medium':1089,1256,1424,1608 'mention':2152,2157,2162,2167,2172,2177,2183,2189 'merg':649 'messag':186,1053,1062,1772,1804,1831,1859,1894,1922,1953,1995 'method':1531,1565 'mid':1113,1141 'mid-execut':1112,1140 'middlewar':160,195,941,1364 'middleware.ts':190 'might':678 'minim':264 'miss':913,957,1248,1760,2240 'modul':935,967,1833 'module.exports':446,1586 'moment':1978 'monitor':2056,2065 'move':855,1935 'much':867 'multipl':902 'must':1378 'mutat':1705 'name':422,427 'nativ':966,1021 'need':853,1025,1398,2033,2043,2053,2064 'neon':728 'never':100,574 'new':53,295,1057,1072,1192,1211,1552,1615 'next':80,85,101,260,459,470,501,531,540,542,547,560,567,576,750,756,1344,1384,1767,1776,1788,1820,1943 'next.config.js':257,443,1347,1582 'next.js':18,2022,2034 'next/bundle-analyzer':282,313,877 'next/cache':1710 'nextconfig':261,263 'nextj':33,2029,2049,2073,2080,2088,2101,2142 'nextjs-app-rout':32,2028,2072,2087,2141 'nextjs-supabase-auth':2048,2079,2100 'nextrequest':197 'node':205,954,1033 'node.js':203,914,920,952,1026,1824,1832,1850 'nodej':222,1031,1847 'npm':280,1018 'npx':312,876 'null':1554 'old':1618,1661 'omit':225 'on-demand':1700 'oper':215,1087,1094,1106,1135,1147 'optim':241,242,271 'option':1534,1550,1570 'origin':1447,1459,1463,1473,1523,1560,1599,1869,1878 'os':1010 'output':265,266,2212 'packag':1019,1949,1955 'padstart':1079 'page':621,1350,1601,1635,1645,1653,1726,1989,1997,2025 'partial':961,1107 'pass':1390 'password':343 'path':959,1009,1592 'pattern':36,2035 'payment':376 'pdf':893 'per':106 'per-environ':105 'perman':454 'permiss':2233 'pipelin':2110,2127 'pk':565 'plan':1240 'planetscal':729 'polici':1437 'poll':1233 'post':1157,1533,1567,1728,1739 'postman':1452 'potenti':525 'pr':64,321,332,384,648,671,742 'prefix':472,499,1778,1790 'preflight':1545 'prepar':253 'prerequisit':29 'present':1252 'prevent':1207 'preview':63,115,140,314,318,336,340,354,355,366,370,372,381,623,637,657,712,713,738,755 'privat':91 'pro':1125,1239 'process':857,890,963,1152,1167,1171,1220,1227 'process-data':1170 'process.env.analyze':283 'process.env.vercel':133,138,368,1817 'processor':377 'prod':709 'prod-host':708 'prod-xxx.supabase.co':754 'product':66,109,112,135,255,359,361,404,626,643,644,665,674,686,702,703,749,1273,1288,2066,2175 'progress':910 'project':54,748 'proper':40,397,1148,1660 'protect':339,348 'public':75,81,86,102,460,471,502,532,535,541,543,548,559,561,568,577,751,757,1345,1385,1401,1768,1777,1789,1821,1944,1946 'publish':563 'puppet':824,897 'purg':1670,1724,1729,1734 'put':1568 'qa':2117,2124 'qa-engin':2116,2123 'queri':213 'queu':1179 'queue':905,1164 'queue.add':1169 'read':1338,1352,1368,1386,1916 'readablestream':1193 'real':110 'recommend':527,687,829,979,1143,1331,1496,1671 'redeploy':1290 'redirect':172,431,445,448 'reduc':299,831 'registrar':419 'relat':2136 'remotepattern':273 'remov':1787,1849 'request':196,782,788,991,1158,1159,1355,1449,1474,1494,1509,1510,1546,1870 'request.json':1163 'requir':30,289,1289,2231 'respons':992,1185,1212,1553,1746,1914 'response.json':185,238,1177,1516 'return':184,237,297,449,1070,1150,1174,1176,1210,1224,1515,1551,1589,1901,1911 'revalid':1689,1692,1698,1703,1991,1999,2003,2010 'revalidatepath':1707,1721 'revalidatetag':1708,1727 'review':322,2224 'right':147,1049 'role':97,580 'rout':152,158,615,772,1361,1419,1434,1503,1585,1853,1861,1888,1896 'router':35,613,622,2024,2031,2075,2090,2144 'run':659,948,1093 'runtim':148,162,178,221,865,912,924,932,947,973,1030,1034,1250,1266,1313,1351,1367,1380,1407,1828,1837,1846,1939 'safe':537 'safeti':2234 'same-origin':1457 'scope':2205 'sdk':1981,1987 'second':786,820,1103,1124,1127,1134,1695 'secret':462,478,587,600,1408,1765,1773,1915,1924,1936 'secur':484 'see':651,1629 'select':234 'sensit':474 'separ':633,691 'serv':1664,1753 'server':93,606,610,616,619,774,1356,1362,1388,1712,1796,1923,2026 'server-on':605 'server-sid':1795 'serverless':25,143,202,300,761,805,1222,2192 'servic':96,579,862,885,896,1217 'session':2047 'set':50,72,326,346,689,699,2002 'setinterv':1003 'settimeout':1002 'setup':39,392,2093 'sever':466,628,768,916,1088,1255,1423,1607,1770,1802,1829,1857,1892,1920,1951,1993 'sha':1067 'shake':1972 'sharp':457,825,846,849 'show':371,683,1602,1620 'sickn33':8 'side':1797 'simpl':173 'situat':468,630,770,918,1090,1257,1425,1609 'size':302,792,799,833,875 'sk':589 'skill':5,6,31,2068,2111,2137,2197 'sleep':1205 'slow':765,777,815,1959 'slower':207 'smaller':248,868 'sourc':450,483,494,1590 'source-sickn33' 'specif':1413,1525,2219 'split':900 'ssl':398 'stage':116,357,719,747 'staging-host':718 'staging-xxx.supabase.co':760 'stale':1603 'standalon':267 'start':165,209,767,817,871,1195,1961 'static':1349,1406,1644,1918,1927 'status':1178 'stop':2225 'strategi':2004,2132 'stream':1182,1191,1213 'string':1054,1718 'stripe':562,586 'subdomain':414 'subsequ':787 'substitut':2215 'success':2237 'supabas':82,87,95,544,549,578,730,744,752,758,2037,2040,2050,2077,2081,2095,2102,2146 'supabase-backend':2039,2076,2094,2145 'support':732,987,1005 'symptom':477,638,780,926,1097,1267,1435,1617 'tag':1733 'take':783 'task':888,1098,2201 'team':328 'test':118,375,639,652,680,2121,2221 'tester':677 'textdecod':997 'textencod':996,1058 'three':57 'time':511,1095,1099,1305,1327,1340 'timeout':1084,1120,1208,1238 'token':603 'transform':174 'treat':2210 'tree':1971 'trigger':1221,2021 'trigger.dev':1231 'true':284,455 'truli':534 'try/catch':1898,1909 'type':258,420,425,1542,1578 'uint8array':1013,1073 'undefin':1264,1271,1330 'understand':1333 'unexpect':489 'unhandl':1899 'uniqu':335 'unknown':493 'untest':660 'updat':1279,1292,1610,1633 'updatepost':1716 'upload':1109 'url':83,104,337,382,545,595,707,717,753,759,998,1400,1410,1801,1807,1810,1818,1823 'urlsearchparam':999 'use':49,155,252,303,317,325,349,356,360,374,401,469,530,539,575,618,625,664,723,835,883,919,985,1012,1015,1032,1181,1215,1383,1581,1808,1816,1834,1845,1942,1966,2150,2195 'user':231,236,239,523,650,1412,1628,2151,2156,2161,2166,2171,2176,2182,2188 'user-specif':1411 'v8':950 'valid':1763,2220 'valu':108,123,423,429,536,1274,1286,1293,1314,1328,1600,1929,1947 'var':352,608,1269,1299,1336,1396 'variabl':28,38,43,74,76,92,498,635,701,1247,1259,1346,1769,1812,2181 'vercel':1,9,16,20,56,60,70,344,387,406,438,697,724,804,1118,1475,1641,1750,1758,1800,1806,1809,1822,2070,2107,2113,2134,2155 'vercel-deploy':2069,2106,2112,2133 'vercel.json':1241 'versa':437 'version':1631,1663 'via':1735,1775 'vice':436 'view':514 'visibl':479,1625,1782 'vs':142 'warn':1803,1858,1893,1921,1952,1994 'web':994 'webpack':285,291 'webpack-bundle-analyz':290 'well':2139 'without':1358,1854,1862,1889,1897,1903,1990,1998 'work':937,1260,1282,1450,1456,2138 'workflow':316,330,2083,2119 'wrap':1907 'wrong':1041,1285 'www':428,432 'www.example.com':413 'x':927,975,1102,1749,1757 'x-vercel-cach':1748,1756 'xxx.supabase.co':84,546 'xxxxxxx':573 'your-cdn.com':275 'your-site.vercel.app':1741 'your-site.vercel.app/api/revalidate?path=/posts':1740","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-04-25T06:52:15.656Z"},{"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-04-25T11:40:40.455Z"}],"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","source":"skills_sh","category":"antigravity-awesome-skills","skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/vercel-deployment"},"updatedAt":"2026-04-25T11:40:40.455Z"}}