[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vercel-env-vars":3,"mdc-efcw7k-key":34,"related-repo-vercel-env-vars":2902,"related-org-vercel-env-vars":3008},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"env-vars","manage Vercel environment variables","Vercel environment variable expert guidance. Use when working with .env files, vercel env commands, OIDC tokens, or managing environment-specific configuration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"vercel","Vercel","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fvercel.png",[12,16,19,20],{"name":13,"slug":14,"type":15},"Security","security","tag",{"name":17,"slug":18,"type":15},"Operations","operations",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Configuration","configuration",226,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fvercel-plugin","2026-04-06T18:56:28.150777",null,36,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Comprehensive Vercel ecosystem plugin — relational knowledge graph, skills for every major product, specialized agents, and Vercel conventions. Turns any AI agent into a Vercel expert.","https:\u002F\u002Fgithub.com\u002Fvercel\u002Fvercel-plugin\u002Ftree\u002FHEAD\u002Fskills\u002Fenv-vars","---\nname: env-vars\ndescription: Vercel environment variable expert guidance. Use when working with .env files, vercel env commands, OIDC tokens, or managing environment-specific configuration.\nmetadata:\n  priority: 7\n  docs:\n    - \"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fenvironment-variables\"\n  sitemap: \"https:\u002F\u002Fvercel.com\u002Fsitemap\u002Fdocs.xml\"\n  pathPatterns:\n    - '.env'\n    - '.env.*'\n    - '.env.local'\n    - '.env.production'\n    - '.env.development'\n    - '.env.test'\n    - '.env.production.local'\n    - '.env.development.local'\n    - '.env.test.local'\n    - '.env.example'\n  bashPatterns:\n    - '\\bvercel\\s+env\\s+pull\\b'\n    - '\\bvercel\\s+env\\s+add\\b'\n    - '\\bvercel\\s+env\\s+rm\\b'\n    - '\\bvercel\\s+env\\s+ls\\b'\nchainTo:\n  -\n    pattern: '\\b(OPENAI_API_KEY|ANTHROPIC_API_KEY|GOOGLE_API_KEY)\\b'\n    targetSkill: ai-gateway\n    message: 'Direct provider API key detected — loading AI Gateway guidance for OIDC auth (no manual keys needed on Vercel).'\nretrieval:\n  aliases:\n    - environment variables\n    - env file\n    - secrets\n    - config vars\n  intents:\n    - set env var\n    - manage secrets\n    - pull env vars\n    - configure environment\n  entities:\n    - .env\n    - vercel env\n    - OIDC\n    - environment variable\n\n---\n\n# Vercel Environment Variables\n\nYou are an expert in Vercel environment variable management — `.env` file conventions, the `vercel env` CLI, OIDC token lifecycle, and environment-specific configuration.\n\n## .env File Hierarchy\n\nVercel and Next.js load environment variables in a specific order. Later files override earlier ones:\n\n| File | Purpose | Git-tracked? |\n|------|---------|-------------|\n| `.env` | Default values for all environments | Yes |\n| `.env.local` | Local overrides and secrets | **No** (gitignored) |\n| `.env.development` | Development-specific defaults | Yes |\n| `.env.development.local` | Local dev overrides | **No** |\n| `.env.production` | Production-specific defaults | Yes |\n| `.env.production.local` | Local prod overrides | **No** |\n| `.env.test` | Test-specific defaults | Yes |\n| `.env.test.local` | Local test overrides | **No** |\n\n### Load Order (Next.js)\n\n1. `.env` (lowest priority)\n2. `.env.[environment]` (development, production, or test)\n3. `.env.local` (skipped in test environment)\n4. `.env.[environment].local` (highest priority, skipped in test)\n\n### Critical Rules\n\n- **Never commit secrets** to `.env`, `.env.development`, or `.env.production` — use `.local` variants or Vercel environment variables\n- `.env.local` is always gitignored by Next.js — this is where `vercel env pull` writes secrets\n- Variables prefixed with `NEXT_PUBLIC_` are exposed to the browser bundle — never put secrets in `NEXT_PUBLIC_` vars\n- All other variables are server-only (API routes, Server Components, middleware)\n\n## vercel env CLI\n\n### Pull Environment Variables\n\n```bash\n# Pull all env vars for the current environment into .env.local\nvercel env pull .env.local\n\n# Pull for a specific environment\nvercel env pull .env.local --environment=production\nvercel env pull .env.local --environment=preview\nvercel env pull .env.local --environment=development\n\n# Overwrite existing file without prompting\nvercel env pull .env.local --yes\n\n# Pull to a custom file\nvercel env pull .env.production.local --environment=production\n```\n\n### Add Environment Variables\n\n```bash\n# Interactive — prompts for value and environments\nvercel env add MY_SECRET\n\n# Non-interactive\necho \"secret-value\" | vercel env add MY_SECRET production\n\n# Add to multiple environments\necho \"secret-value\" | vercel env add MY_SECRET production preview development\n\n# Add a sensitive variable (encrypted, not shown in logs)\nvercel env add MY_SECRET --sensitive\n```\n\n### List Environment Variables\n\n```bash\n# List all environment variables\nvercel env ls\n\n# Filter by environment\nvercel env ls production\n```\n\n### Remove Environment Variables\n\n```bash\n# Remove from specific environment\nvercel env rm MY_SECRET production\n\n# Remove from all environments\nvercel env rm MY_SECRET\n```\n\n## Bootstrap Flow (Fresh Clone \u002F New Machine)\n\nUse this sequence when setting up a project from scratch:\n\n```bash\n# 1) Link first so pulls target the correct Vercel project\nvercel link --yes --project \u003Cname-or-id> --scope \u003Cteam>\n\n# 2) Pull env vars into .env.local\nvercel env pull .env.local --yes\n\n# 3) Verify required keys from .env.example exist in .env.local\nwhile IFS='=' read -r key _; do\n  [[ -z \"$key\" || \"$key\" == \\#* ]] && continue\n  grep -q \"^${key}=\" .env.local || echo \"Missing in .env.local: $key\"\ndone \u003C .env.example\n```\n\n### Temporary Path: Run With Vercel Envs Without Writing a File\n\nIf you need Vercel environment variables immediately but do not want to write `.env.local` yet:\n\n```bash\nvercel env run -- npm run dev\n```\n\nThis is useful for quick validation during bootstrap, but still pull `.env.local` for a normal local workflow.\n\n### Re-pull After Secret or Provisioning Changes\n\nAfter creating\u002Fupdating secrets (`vercel env add`, dashboard changes) or provisioning integrations that add env vars (for example Neon\u002FUpstash), re-run:\n\n```bash\nvercel env pull .env.local --yes\n```\n\n## OIDC Token Lifecycle\n\nVercel uses **OIDC (OpenID Connect)** tokens for secure, keyless authentication between your app and Vercel services (AI Gateway, storage, etc.).\n\n### How It Works\n\n1. **On Vercel deployments**: `VERCEL_OIDC_TOKEN` is automatically injected as a short-lived JWT and auto-refreshed — zero configuration needed\n2. **Local development**: `vercel env pull .env.local` provisions a `VERCEL_OIDC_TOKEN` valid for ~12 hours\n3. **Token expiry**: When the local OIDC token expires, re-run `vercel env pull .env.local --yes` to get a fresh one. Consider re-pulling at the start of each dev session to avoid mid-session auth failures\n\n### Common OIDC Patterns\n\n```ts\n\u002F\u002F The @vercel\u002Foidc package reads VERCEL_OIDC_TOKEN automatically\nimport { getVercelOidcToken } from '@vercel\u002Foidc'\n\n\u002F\u002F AI Gateway uses OIDC by default — no manual token handling needed\nimport { gateway } from 'ai'\nconst result = await generateText({\n  model: gateway('openai\u002Fgpt-5.2'),\n  prompt: 'Hello',\n})\n```\n\n### Troubleshooting OIDC\n\n| Symptom | Cause | Fix |\n|---------|-------|-----|\n| `VERCEL_OIDC_TOKEN` missing locally | Haven't pulled env vars | `vercel env pull .env.local` |\n| Auth errors after ~12h locally | Token expired | `vercel env pull .env.local --yes` |\n| Works on Vercel, fails locally | Token not in `.env.local` | `vercel env pull .env.local` |\n| `AI_GATEWAY_API_KEY` vs OIDC | Both set, key takes priority | Remove `AI_GATEWAY_API_KEY` to use OIDC |\n\n## Environment-Specific Configuration\n\n### Vercel Dashboard vs .env Files\n\n| Use Case | Where to Set |\n|----------|-------------|\n| Secrets (API keys, tokens) | Vercel Dashboard (`https:\u002F\u002Fvercel.com\u002F{team}\u002F{project}\u002Fsettings\u002Fenvironment-variables`) or `vercel env add` |\n| Public config (site URL, feature flags) | `.env` or `.env.[environment]` files |\n| Local-only overrides | `.env.local` |\n| CI\u002FCD secrets | Vercel Dashboard (`https:\u002F\u002Fvercel.com\u002F{team}\u002F{project}\u002Fsettings\u002Fenvironment-variables`) with environment scoping |\n\n### Environment Scoping on Vercel\n\nVariables set in the Vercel Dashboard at `https:\u002F\u002Fvercel.com\u002F{team}\u002F{project}\u002Fsettings\u002Fenvironment-variables` can be scoped to:\n\n- **Production** — only `vercel.app` production deployments\n- **Preview** — branch\u002FPR deployments\n- **Development** — `vercel dev` and `vercel env pull`\n\nA variable can be assigned to one, two, or all three environments.\n\n### Git Branch Overrides\n\nPreview environment variables can be scoped to specific Git branches:\n\n```bash\n# Add a variable only for the \"staging\" branch\necho \"staging-value\" | vercel env add DATABASE_URL preview --git-branch=staging\n```\n\n## Gotchas\n\n### `vercel env pull` Overwrites Custom Variables\n\n`vercel env pull .env.local` **replaces the entire file** — any manually added variables (custom secrets, local overrides, debug flags) are lost. Always back up or re-add custom vars after pulling:\n\n```bash\n# Save custom vars before pulling\ngrep -v '^#' .env.local | grep -v '^VERCEL_\\|^POSTGRES_\\|^NEXT_PUBLIC_' > .env.custom.bak\nvercel env pull .env.local --yes\ncat .env.custom.bak >> .env.local  # Re-append custom vars\n```\n\nOr maintain custom vars in a separate `.env.development.local` file (loaded after `.env.local` by Next.js).\n\n### Scripts Don't Auto-Load `.env.local`\n\nOnly Next.js auto-loads `.env.local`. Standalone scripts (`drizzle-kit`, `tsx`, custom Node scripts) need explicit loading:\n\n```bash\n# Use dotenv-cli\nnpm install -D dotenv-cli\nnpx dotenv -e .env.local -- npx drizzle-kit push\nnpx dotenv -e .env.local -- npx tsx scripts\u002Fseed.ts\n\n# Or source manually\nsource \u003C(grep -v '^#' .env.local | sed 's\u002F^\u002Fexport \u002F') && node scripts\u002Fmigrate.js\n```\n\n## Best Practices\n\n1. **Use `vercel env pull` as part of your setup workflow** — document it in your README\n2. **Never hardcode secrets** — always use environment variables\n3. **Scope narrowly** — don't give preview deployments production database access\n4. **Rotate OIDC tokens regularly in local dev** — re-pull when you see auth errors\n5. **Use `.env.example`** — commit a template with empty values so teammates know which vars are needed\n6. **Prefix client-side vars with `NEXT_PUBLIC_`** — and never put secrets in them\n7. **Keep custom vars in `.env.development.local`** — protects them from `vercel env pull` overwrites\n\n## Official Documentation\n\n- [Environment Variables](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fenvironment-variables)\n- [Vercel CLI: env](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcli\u002Fenv)\n- [Next.js Environment Variables](https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fbuilding-your-application\u002Fconfiguring\u002Fenvironment-variables)\n",{"data":35,"body":77},{"name":4,"description":6,"metadata":36,"chainTo":57,"retrieval":62},{"priority":37,"docs":38,"sitemap":40,"pathPatterns":41,"bashPatterns":52},7,[39],"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fenvironment-variables","https:\u002F\u002Fvercel.com\u002Fsitemap\u002Fdocs.xml",[42,43,44,45,46,47,48,49,50,51],".env",".env.*",".env.local",".env.production",".env.development",".env.test",".env.production.local",".env.development.local",".env.test.local",".env.example",[53,54,55,56],"\\bvercel\\s+env\\s+pull\\b","\\bvercel\\s+env\\s+add\\b","\\bvercel\\s+env\\s+rm\\b","\\bvercel\\s+env\\s+ls\\b",[58],{"pattern":59,"targetSkill":60,"message":61},"\\b(OPENAI_API_KEY|ANTHROPIC_API_KEY|GOOGLE_API_KEY)\\b","ai-gateway","Direct provider API key detected — loading AI Gateway guidance for OIDC auth (no manual keys needed on Vercel).",{"aliases":63,"intents":68,"entities":73},[64,65,66,67],"environment variables","env file","secrets","config vars",[69,70,71,72],"set env var","manage secrets","pull env vars","configure environment",[42,74,75,76],"vercel env","OIDC","environment variable",{"type":78,"children":79},"root",[80,89,110,117,122,332,339,386,392,478,484,490,716,722,934,940,1006,1012,1085,1091,1096,1459,1465,1477,1519,1531,1537,1550,1580,1586,1598,1604,1667,1673,1909,1915,2046,2052,2058,2166,2172,2184,2238,2243,2249,2254,2319,2325,2336,2353,2484,2503,2514,2541,2749,2755,2856,2862,2896],{"type":81,"tag":82,"props":83,"children":85},"element","h1",{"id":84},"vercel-environment-variables",[86],{"type":87,"value":88},"text","Vercel Environment Variables",{"type":81,"tag":90,"props":91,"children":92},"p",{},[93,95,101,103,108],{"type":87,"value":94},"You are an expert in Vercel environment variable management — ",{"type":81,"tag":96,"props":97,"children":99},"code",{"className":98},[],[100],{"type":87,"value":42},{"type":87,"value":102}," file conventions, the ",{"type":81,"tag":96,"props":104,"children":106},{"className":105},[],[107],{"type":87,"value":74},{"type":87,"value":109}," CLI, OIDC token lifecycle, and environment-specific configuration.",{"type":81,"tag":111,"props":112,"children":114},"h2",{"id":113},"env-file-hierarchy",[115],{"type":87,"value":116},".env File Hierarchy",{"type":81,"tag":90,"props":118,"children":119},{},[120],{"type":87,"value":121},"Vercel and Next.js load environment variables in a specific order. Later files override earlier ones:",{"type":81,"tag":123,"props":124,"children":125},"table",{},[126,150],{"type":81,"tag":127,"props":128,"children":129},"thead",{},[130],{"type":81,"tag":131,"props":132,"children":133},"tr",{},[134,140,145],{"type":81,"tag":135,"props":136,"children":137},"th",{},[138],{"type":87,"value":139},"File",{"type":81,"tag":135,"props":141,"children":142},{},[143],{"type":87,"value":144},"Purpose",{"type":81,"tag":135,"props":146,"children":147},{},[148],{"type":87,"value":149},"Git-tracked?",{"type":81,"tag":151,"props":152,"children":153},"tbody",{},[154,176,203,223,246,266,289,309],{"type":81,"tag":131,"props":155,"children":156},{},[157,166,171],{"type":81,"tag":158,"props":159,"children":160},"td",{},[161],{"type":81,"tag":96,"props":162,"children":164},{"className":163},[],[165],{"type":87,"value":42},{"type":81,"tag":158,"props":167,"children":168},{},[169],{"type":87,"value":170},"Default values for all environments",{"type":81,"tag":158,"props":172,"children":173},{},[174],{"type":87,"value":175},"Yes",{"type":81,"tag":131,"props":177,"children":178},{},[179,187,192],{"type":81,"tag":158,"props":180,"children":181},{},[182],{"type":81,"tag":96,"props":183,"children":185},{"className":184},[],[186],{"type":87,"value":44},{"type":81,"tag":158,"props":188,"children":189},{},[190],{"type":87,"value":191},"Local overrides and secrets",{"type":81,"tag":158,"props":193,"children":194},{},[195,201],{"type":81,"tag":196,"props":197,"children":198},"strong",{},[199],{"type":87,"value":200},"No",{"type":87,"value":202}," (gitignored)",{"type":81,"tag":131,"props":204,"children":205},{},[206,214,219],{"type":81,"tag":158,"props":207,"children":208},{},[209],{"type":81,"tag":96,"props":210,"children":212},{"className":211},[],[213],{"type":87,"value":46},{"type":81,"tag":158,"props":215,"children":216},{},[217],{"type":87,"value":218},"Development-specific defaults",{"type":81,"tag":158,"props":220,"children":221},{},[222],{"type":87,"value":175},{"type":81,"tag":131,"props":224,"children":225},{},[226,234,239],{"type":81,"tag":158,"props":227,"children":228},{},[229],{"type":81,"tag":96,"props":230,"children":232},{"className":231},[],[233],{"type":87,"value":49},{"type":81,"tag":158,"props":235,"children":236},{},[237],{"type":87,"value":238},"Local dev overrides",{"type":81,"tag":158,"props":240,"children":241},{},[242],{"type":81,"tag":196,"props":243,"children":244},{},[245],{"type":87,"value":200},{"type":81,"tag":131,"props":247,"children":248},{},[249,257,262],{"type":81,"tag":158,"props":250,"children":251},{},[252],{"type":81,"tag":96,"props":253,"children":255},{"className":254},[],[256],{"type":87,"value":45},{"type":81,"tag":158,"props":258,"children":259},{},[260],{"type":87,"value":261},"Production-specific defaults",{"type":81,"tag":158,"props":263,"children":264},{},[265],{"type":87,"value":175},{"type":81,"tag":131,"props":267,"children":268},{},[269,277,282],{"type":81,"tag":158,"props":270,"children":271},{},[272],{"type":81,"tag":96,"props":273,"children":275},{"className":274},[],[276],{"type":87,"value":48},{"type":81,"tag":158,"props":278,"children":279},{},[280],{"type":87,"value":281},"Local prod overrides",{"type":81,"tag":158,"props":283,"children":284},{},[285],{"type":81,"tag":196,"props":286,"children":287},{},[288],{"type":87,"value":200},{"type":81,"tag":131,"props":290,"children":291},{},[292,300,305],{"type":81,"tag":158,"props":293,"children":294},{},[295],{"type":81,"tag":96,"props":296,"children":298},{"className":297},[],[299],{"type":87,"value":47},{"type":81,"tag":158,"props":301,"children":302},{},[303],{"type":87,"value":304},"Test-specific defaults",{"type":81,"tag":158,"props":306,"children":307},{},[308],{"type":87,"value":175},{"type":81,"tag":131,"props":310,"children":311},{},[312,320,325],{"type":81,"tag":158,"props":313,"children":314},{},[315],{"type":81,"tag":96,"props":316,"children":318},{"className":317},[],[319],{"type":87,"value":50},{"type":81,"tag":158,"props":321,"children":322},{},[323],{"type":87,"value":324},"Local test overrides",{"type":81,"tag":158,"props":326,"children":327},{},[328],{"type":81,"tag":196,"props":329,"children":330},{},[331],{"type":87,"value":200},{"type":81,"tag":333,"props":334,"children":336},"h3",{"id":335},"load-order-nextjs",[337],{"type":87,"value":338},"Load Order (Next.js)",{"type":81,"tag":340,"props":341,"children":342},"ol",{},[343,354,365,375],{"type":81,"tag":344,"props":345,"children":346},"li",{},[347,352],{"type":81,"tag":96,"props":348,"children":350},{"className":349},[],[351],{"type":87,"value":42},{"type":87,"value":353}," (lowest priority)",{"type":81,"tag":344,"props":355,"children":356},{},[357,363],{"type":81,"tag":96,"props":358,"children":360},{"className":359},[],[361],{"type":87,"value":362},".env.[environment]",{"type":87,"value":364}," (development, production, or test)",{"type":81,"tag":344,"props":366,"children":367},{},[368,373],{"type":81,"tag":96,"props":369,"children":371},{"className":370},[],[372],{"type":87,"value":44},{"type":87,"value":374}," (skipped in test environment)",{"type":81,"tag":344,"props":376,"children":377},{},[378,384],{"type":81,"tag":96,"props":379,"children":381},{"className":380},[],[382],{"type":87,"value":383},".env.[environment].local",{"type":87,"value":385}," (highest priority, skipped in test)",{"type":81,"tag":333,"props":387,"children":389},{"id":388},"critical-rules",[390],{"type":87,"value":391},"Critical Rules",{"type":81,"tag":393,"props":394,"children":395},"ul",{},[396,435,453,473],{"type":81,"tag":344,"props":397,"children":398},{},[399,404,406,411,413,418,420,425,427,433],{"type":81,"tag":196,"props":400,"children":401},{},[402],{"type":87,"value":403},"Never commit secrets",{"type":87,"value":405}," to ",{"type":81,"tag":96,"props":407,"children":409},{"className":408},[],[410],{"type":87,"value":42},{"type":87,"value":412},", ",{"type":81,"tag":96,"props":414,"children":416},{"className":415},[],[417],{"type":87,"value":46},{"type":87,"value":419},", or ",{"type":81,"tag":96,"props":421,"children":423},{"className":422},[],[424],{"type":87,"value":45},{"type":87,"value":426}," — use ",{"type":81,"tag":96,"props":428,"children":430},{"className":429},[],[431],{"type":87,"value":432},".local",{"type":87,"value":434}," variants or Vercel environment variables",{"type":81,"tag":344,"props":436,"children":437},{},[438,443,445,451],{"type":81,"tag":96,"props":439,"children":441},{"className":440},[],[442],{"type":87,"value":44},{"type":87,"value":444}," is always gitignored by Next.js — this is where ",{"type":81,"tag":96,"props":446,"children":448},{"className":447},[],[449],{"type":87,"value":450},"vercel env pull",{"type":87,"value":452}," writes secrets",{"type":81,"tag":344,"props":454,"children":455},{},[456,458,464,466,471],{"type":87,"value":457},"Variables prefixed with ",{"type":81,"tag":96,"props":459,"children":461},{"className":460},[],[462],{"type":87,"value":463},"NEXT_PUBLIC_",{"type":87,"value":465}," are exposed to the browser bundle — never put secrets in ",{"type":81,"tag":96,"props":467,"children":469},{"className":468},[],[470],{"type":87,"value":463},{"type":87,"value":472}," vars",{"type":81,"tag":344,"props":474,"children":475},{},[476],{"type":87,"value":477},"All other variables are server-only (API routes, Server Components, middleware)",{"type":81,"tag":111,"props":479,"children":481},{"id":480},"vercel-env-cli",[482],{"type":87,"value":483},"vercel env CLI",{"type":81,"tag":333,"props":485,"children":487},{"id":486},"pull-environment-variables",[488],{"type":87,"value":489},"Pull Environment Variables",{"type":81,"tag":491,"props":492,"children":497},"pre",{"className":493,"code":494,"language":495,"meta":496,"style":496},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Pull all env vars for the current environment into .env.local\nvercel env pull .env.local\n\n# Pull for a specific environment\nvercel env pull .env.local --environment=production\nvercel env pull .env.local --environment=preview\nvercel env pull .env.local --environment=development\n\n# Overwrite existing file without prompting\nvercel env pull .env.local --yes\n\n# Pull to a custom file\nvercel env pull .env.production.local --environment=production\n","bash","",[498],{"type":81,"tag":96,"props":499,"children":500},{"__ignoreMap":496},[501,513,538,548,557,583,608,632,640,649,674,682,691],{"type":81,"tag":502,"props":503,"children":506},"span",{"class":504,"line":505},"line",1,[507],{"type":81,"tag":502,"props":508,"children":510},{"style":509},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[511],{"type":87,"value":512},"# Pull all env vars for the current environment into .env.local\n",{"type":81,"tag":502,"props":514,"children":516},{"class":504,"line":515},2,[517,522,528,533],{"type":81,"tag":502,"props":518,"children":520},{"style":519},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[521],{"type":87,"value":8},{"type":81,"tag":502,"props":523,"children":525},{"style":524},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[526],{"type":87,"value":527}," env",{"type":81,"tag":502,"props":529,"children":530},{"style":524},[531],{"type":87,"value":532}," pull",{"type":81,"tag":502,"props":534,"children":535},{"style":524},[536],{"type":87,"value":537}," .env.local\n",{"type":81,"tag":502,"props":539,"children":541},{"class":504,"line":540},3,[542],{"type":81,"tag":502,"props":543,"children":545},{"emptyLinePlaceholder":544},true,[546],{"type":87,"value":547},"\n",{"type":81,"tag":502,"props":549,"children":551},{"class":504,"line":550},4,[552],{"type":81,"tag":502,"props":553,"children":554},{"style":509},[555],{"type":87,"value":556},"# Pull for a specific environment\n",{"type":81,"tag":502,"props":558,"children":560},{"class":504,"line":559},5,[561,565,569,573,578],{"type":81,"tag":502,"props":562,"children":563},{"style":519},[564],{"type":87,"value":8},{"type":81,"tag":502,"props":566,"children":567},{"style":524},[568],{"type":87,"value":527},{"type":81,"tag":502,"props":570,"children":571},{"style":524},[572],{"type":87,"value":532},{"type":81,"tag":502,"props":574,"children":575},{"style":524},[576],{"type":87,"value":577}," .env.local",{"type":81,"tag":502,"props":579,"children":580},{"style":524},[581],{"type":87,"value":582}," --environment=production\n",{"type":81,"tag":502,"props":584,"children":586},{"class":504,"line":585},6,[587,591,595,599,603],{"type":81,"tag":502,"props":588,"children":589},{"style":519},[590],{"type":87,"value":8},{"type":81,"tag":502,"props":592,"children":593},{"style":524},[594],{"type":87,"value":527},{"type":81,"tag":502,"props":596,"children":597},{"style":524},[598],{"type":87,"value":532},{"type":81,"tag":502,"props":600,"children":601},{"style":524},[602],{"type":87,"value":577},{"type":81,"tag":502,"props":604,"children":605},{"style":524},[606],{"type":87,"value":607}," --environment=preview\n",{"type":81,"tag":502,"props":609,"children":610},{"class":504,"line":37},[611,615,619,623,627],{"type":81,"tag":502,"props":612,"children":613},{"style":519},[614],{"type":87,"value":8},{"type":81,"tag":502,"props":616,"children":617},{"style":524},[618],{"type":87,"value":527},{"type":81,"tag":502,"props":620,"children":621},{"style":524},[622],{"type":87,"value":532},{"type":81,"tag":502,"props":624,"children":625},{"style":524},[626],{"type":87,"value":577},{"type":81,"tag":502,"props":628,"children":629},{"style":524},[630],{"type":87,"value":631}," --environment=development\n",{"type":81,"tag":502,"props":633,"children":635},{"class":504,"line":634},8,[636],{"type":81,"tag":502,"props":637,"children":638},{"emptyLinePlaceholder":544},[639],{"type":87,"value":547},{"type":81,"tag":502,"props":641,"children":643},{"class":504,"line":642},9,[644],{"type":81,"tag":502,"props":645,"children":646},{"style":509},[647],{"type":87,"value":648},"# Overwrite existing file without prompting\n",{"type":81,"tag":502,"props":650,"children":652},{"class":504,"line":651},10,[653,657,661,665,669],{"type":81,"tag":502,"props":654,"children":655},{"style":519},[656],{"type":87,"value":8},{"type":81,"tag":502,"props":658,"children":659},{"style":524},[660],{"type":87,"value":527},{"type":81,"tag":502,"props":662,"children":663},{"style":524},[664],{"type":87,"value":532},{"type":81,"tag":502,"props":666,"children":667},{"style":524},[668],{"type":87,"value":577},{"type":81,"tag":502,"props":670,"children":671},{"style":524},[672],{"type":87,"value":673}," --yes\n",{"type":81,"tag":502,"props":675,"children":677},{"class":504,"line":676},11,[678],{"type":81,"tag":502,"props":679,"children":680},{"emptyLinePlaceholder":544},[681],{"type":87,"value":547},{"type":81,"tag":502,"props":683,"children":685},{"class":504,"line":684},12,[686],{"type":81,"tag":502,"props":687,"children":688},{"style":509},[689],{"type":87,"value":690},"# Pull to a custom file\n",{"type":81,"tag":502,"props":692,"children":694},{"class":504,"line":693},13,[695,699,703,707,712],{"type":81,"tag":502,"props":696,"children":697},{"style":519},[698],{"type":87,"value":8},{"type":81,"tag":502,"props":700,"children":701},{"style":524},[702],{"type":87,"value":527},{"type":81,"tag":502,"props":704,"children":705},{"style":524},[706],{"type":87,"value":532},{"type":81,"tag":502,"props":708,"children":709},{"style":524},[710],{"type":87,"value":711}," .env.production.local",{"type":81,"tag":502,"props":713,"children":714},{"style":524},[715],{"type":87,"value":582},{"type":81,"tag":333,"props":717,"children":719},{"id":718},"add-environment-variables",[720],{"type":87,"value":721},"Add Environment Variables",{"type":81,"tag":491,"props":723,"children":725},{"className":493,"code":724,"language":495,"meta":496,"style":496},"# Interactive — prompts for value and environments\nvercel env add MY_SECRET\n\n# Non-interactive\necho \"secret-value\" | vercel env add MY_SECRET production\n\n# Add to multiple environments\necho \"secret-value\" | vercel env add MY_SECRET production preview development\n\n# Add a sensitive variable (encrypted, not shown in logs)\nvercel env add MY_SECRET --sensitive\n",[726],{"type":81,"tag":96,"props":727,"children":728},{"__ignoreMap":496},[729,737,758,765,773,826,833,841,895,902,910],{"type":81,"tag":502,"props":730,"children":731},{"class":504,"line":505},[732],{"type":81,"tag":502,"props":733,"children":734},{"style":509},[735],{"type":87,"value":736},"# Interactive — prompts for value and environments\n",{"type":81,"tag":502,"props":738,"children":739},{"class":504,"line":515},[740,744,748,753],{"type":81,"tag":502,"props":741,"children":742},{"style":519},[743],{"type":87,"value":8},{"type":81,"tag":502,"props":745,"children":746},{"style":524},[747],{"type":87,"value":527},{"type":81,"tag":502,"props":749,"children":750},{"style":524},[751],{"type":87,"value":752}," add",{"type":81,"tag":502,"props":754,"children":755},{"style":524},[756],{"type":87,"value":757}," MY_SECRET\n",{"type":81,"tag":502,"props":759,"children":760},{"class":504,"line":540},[761],{"type":81,"tag":502,"props":762,"children":763},{"emptyLinePlaceholder":544},[764],{"type":87,"value":547},{"type":81,"tag":502,"props":766,"children":767},{"class":504,"line":550},[768],{"type":81,"tag":502,"props":769,"children":770},{"style":509},[771],{"type":87,"value":772},"# Non-interactive\n",{"type":81,"tag":502,"props":774,"children":775},{"class":504,"line":559},[776,782,788,793,798,803,808,812,816,821],{"type":81,"tag":502,"props":777,"children":779},{"style":778},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[780],{"type":87,"value":781},"echo",{"type":81,"tag":502,"props":783,"children":785},{"style":784},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[786],{"type":87,"value":787}," \"",{"type":81,"tag":502,"props":789,"children":790},{"style":524},[791],{"type":87,"value":792},"secret-value",{"type":81,"tag":502,"props":794,"children":795},{"style":784},[796],{"type":87,"value":797},"\"",{"type":81,"tag":502,"props":799,"children":800},{"style":784},[801],{"type":87,"value":802}," |",{"type":81,"tag":502,"props":804,"children":805},{"style":519},[806],{"type":87,"value":807}," vercel",{"type":81,"tag":502,"props":809,"children":810},{"style":524},[811],{"type":87,"value":527},{"type":81,"tag":502,"props":813,"children":814},{"style":524},[815],{"type":87,"value":752},{"type":81,"tag":502,"props":817,"children":818},{"style":524},[819],{"type":87,"value":820}," MY_SECRET",{"type":81,"tag":502,"props":822,"children":823},{"style":524},[824],{"type":87,"value":825}," production\n",{"type":81,"tag":502,"props":827,"children":828},{"class":504,"line":585},[829],{"type":81,"tag":502,"props":830,"children":831},{"emptyLinePlaceholder":544},[832],{"type":87,"value":547},{"type":81,"tag":502,"props":834,"children":835},{"class":504,"line":37},[836],{"type":81,"tag":502,"props":837,"children":838},{"style":509},[839],{"type":87,"value":840},"# Add to multiple environments\n",{"type":81,"tag":502,"props":842,"children":843},{"class":504,"line":634},[844,848,852,856,860,864,868,872,876,880,885,890],{"type":81,"tag":502,"props":845,"children":846},{"style":778},[847],{"type":87,"value":781},{"type":81,"tag":502,"props":849,"children":850},{"style":784},[851],{"type":87,"value":787},{"type":81,"tag":502,"props":853,"children":854},{"style":524},[855],{"type":87,"value":792},{"type":81,"tag":502,"props":857,"children":858},{"style":784},[859],{"type":87,"value":797},{"type":81,"tag":502,"props":861,"children":862},{"style":784},[863],{"type":87,"value":802},{"type":81,"tag":502,"props":865,"children":866},{"style":519},[867],{"type":87,"value":807},{"type":81,"tag":502,"props":869,"children":870},{"style":524},[871],{"type":87,"value":527},{"type":81,"tag":502,"props":873,"children":874},{"style":524},[875],{"type":87,"value":752},{"type":81,"tag":502,"props":877,"children":878},{"style":524},[879],{"type":87,"value":820},{"type":81,"tag":502,"props":881,"children":882},{"style":524},[883],{"type":87,"value":884}," production",{"type":81,"tag":502,"props":886,"children":887},{"style":524},[888],{"type":87,"value":889}," preview",{"type":81,"tag":502,"props":891,"children":892},{"style":524},[893],{"type":87,"value":894}," development\n",{"type":81,"tag":502,"props":896,"children":897},{"class":504,"line":642},[898],{"type":81,"tag":502,"props":899,"children":900},{"emptyLinePlaceholder":544},[901],{"type":87,"value":547},{"type":81,"tag":502,"props":903,"children":904},{"class":504,"line":651},[905],{"type":81,"tag":502,"props":906,"children":907},{"style":509},[908],{"type":87,"value":909},"# Add a sensitive variable (encrypted, not shown in logs)\n",{"type":81,"tag":502,"props":911,"children":912},{"class":504,"line":676},[913,917,921,925,929],{"type":81,"tag":502,"props":914,"children":915},{"style":519},[916],{"type":87,"value":8},{"type":81,"tag":502,"props":918,"children":919},{"style":524},[920],{"type":87,"value":527},{"type":81,"tag":502,"props":922,"children":923},{"style":524},[924],{"type":87,"value":752},{"type":81,"tag":502,"props":926,"children":927},{"style":524},[928],{"type":87,"value":820},{"type":81,"tag":502,"props":930,"children":931},{"style":524},[932],{"type":87,"value":933}," --sensitive\n",{"type":81,"tag":333,"props":935,"children":937},{"id":936},"list-environment-variables",[938],{"type":87,"value":939},"List Environment Variables",{"type":81,"tag":491,"props":941,"children":943},{"className":493,"code":942,"language":495,"meta":496,"style":496},"# List all environment variables\nvercel env ls\n\n# Filter by environment\nvercel env ls production\n",[944],{"type":81,"tag":96,"props":945,"children":946},{"__ignoreMap":496},[947,955,971,978,986],{"type":81,"tag":502,"props":948,"children":949},{"class":504,"line":505},[950],{"type":81,"tag":502,"props":951,"children":952},{"style":509},[953],{"type":87,"value":954},"# List all environment variables\n",{"type":81,"tag":502,"props":956,"children":957},{"class":504,"line":515},[958,962,966],{"type":81,"tag":502,"props":959,"children":960},{"style":519},[961],{"type":87,"value":8},{"type":81,"tag":502,"props":963,"children":964},{"style":524},[965],{"type":87,"value":527},{"type":81,"tag":502,"props":967,"children":968},{"style":524},[969],{"type":87,"value":970}," ls\n",{"type":81,"tag":502,"props":972,"children":973},{"class":504,"line":540},[974],{"type":81,"tag":502,"props":975,"children":976},{"emptyLinePlaceholder":544},[977],{"type":87,"value":547},{"type":81,"tag":502,"props":979,"children":980},{"class":504,"line":550},[981],{"type":81,"tag":502,"props":982,"children":983},{"style":509},[984],{"type":87,"value":985},"# Filter by environment\n",{"type":81,"tag":502,"props":987,"children":988},{"class":504,"line":559},[989,993,997,1002],{"type":81,"tag":502,"props":990,"children":991},{"style":519},[992],{"type":87,"value":8},{"type":81,"tag":502,"props":994,"children":995},{"style":524},[996],{"type":87,"value":527},{"type":81,"tag":502,"props":998,"children":999},{"style":524},[1000],{"type":87,"value":1001}," ls",{"type":81,"tag":502,"props":1003,"children":1004},{"style":524},[1005],{"type":87,"value":825},{"type":81,"tag":333,"props":1007,"children":1009},{"id":1008},"remove-environment-variables",[1010],{"type":87,"value":1011},"Remove Environment Variables",{"type":81,"tag":491,"props":1013,"children":1015},{"className":493,"code":1014,"language":495,"meta":496,"style":496},"# Remove from specific environment\nvercel env rm MY_SECRET production\n\n# Remove from all environments\nvercel env rm MY_SECRET\n",[1016],{"type":81,"tag":96,"props":1017,"children":1018},{"__ignoreMap":496},[1019,1027,1051,1058,1066],{"type":81,"tag":502,"props":1020,"children":1021},{"class":504,"line":505},[1022],{"type":81,"tag":502,"props":1023,"children":1024},{"style":509},[1025],{"type":87,"value":1026},"# Remove from specific environment\n",{"type":81,"tag":502,"props":1028,"children":1029},{"class":504,"line":515},[1030,1034,1038,1043,1047],{"type":81,"tag":502,"props":1031,"children":1032},{"style":519},[1033],{"type":87,"value":8},{"type":81,"tag":502,"props":1035,"children":1036},{"style":524},[1037],{"type":87,"value":527},{"type":81,"tag":502,"props":1039,"children":1040},{"style":524},[1041],{"type":87,"value":1042}," rm",{"type":81,"tag":502,"props":1044,"children":1045},{"style":524},[1046],{"type":87,"value":820},{"type":81,"tag":502,"props":1048,"children":1049},{"style":524},[1050],{"type":87,"value":825},{"type":81,"tag":502,"props":1052,"children":1053},{"class":504,"line":540},[1054],{"type":81,"tag":502,"props":1055,"children":1056},{"emptyLinePlaceholder":544},[1057],{"type":87,"value":547},{"type":81,"tag":502,"props":1059,"children":1060},{"class":504,"line":550},[1061],{"type":81,"tag":502,"props":1062,"children":1063},{"style":509},[1064],{"type":87,"value":1065},"# Remove from all environments\n",{"type":81,"tag":502,"props":1067,"children":1068},{"class":504,"line":559},[1069,1073,1077,1081],{"type":81,"tag":502,"props":1070,"children":1071},{"style":519},[1072],{"type":87,"value":8},{"type":81,"tag":502,"props":1074,"children":1075},{"style":524},[1076],{"type":87,"value":527},{"type":81,"tag":502,"props":1078,"children":1079},{"style":524},[1080],{"type":87,"value":1042},{"type":81,"tag":502,"props":1082,"children":1083},{"style":524},[1084],{"type":87,"value":757},{"type":81,"tag":111,"props":1086,"children":1088},{"id":1087},"bootstrap-flow-fresh-clone-new-machine",[1089],{"type":87,"value":1090},"Bootstrap Flow (Fresh Clone \u002F New Machine)",{"type":81,"tag":90,"props":1092,"children":1093},{},[1094],{"type":87,"value":1095},"Use this sequence when setting up a project from scratch:",{"type":81,"tag":491,"props":1097,"children":1099},{"className":493,"code":1098,"language":495,"meta":496,"style":496},"# 1) Link first so pulls target the correct Vercel project\nvercel link --yes --project \u003Cname-or-id> --scope \u003Cteam>\n\n# 2) Pull env vars into .env.local\nvercel env pull .env.local --yes\n\n# 3) Verify required keys from .env.example exist in .env.local\nwhile IFS='=' read -r key _; do\n  [[ -z \"$key\" || \"$key\" == \\#* ]] && continue\n  grep -q \"^${key}=\" .env.local || echo \"Missing in .env.local: $key\"\ndone \u003C .env.example\n",[1100],{"type":81,"tag":96,"props":1101,"children":1102},{"__ignoreMap":496},[1103,1111,1178,1185,1193,1216,1223,1231,1293,1366,1442],{"type":81,"tag":502,"props":1104,"children":1105},{"class":504,"line":505},[1106],{"type":81,"tag":502,"props":1107,"children":1108},{"style":509},[1109],{"type":87,"value":1110},"# 1) Link first so pulls target the correct Vercel project\n",{"type":81,"tag":502,"props":1112,"children":1113},{"class":504,"line":515},[1114,1118,1123,1128,1133,1138,1143,1149,1154,1159,1163,1168,1173],{"type":81,"tag":502,"props":1115,"children":1116},{"style":519},[1117],{"type":87,"value":8},{"type":81,"tag":502,"props":1119,"children":1120},{"style":524},[1121],{"type":87,"value":1122}," link",{"type":81,"tag":502,"props":1124,"children":1125},{"style":524},[1126],{"type":87,"value":1127}," --yes",{"type":81,"tag":502,"props":1129,"children":1130},{"style":524},[1131],{"type":87,"value":1132}," --project",{"type":81,"tag":502,"props":1134,"children":1135},{"style":784},[1136],{"type":87,"value":1137}," \u003C",{"type":81,"tag":502,"props":1139,"children":1140},{"style":524},[1141],{"type":87,"value":1142},"name-or-i",{"type":81,"tag":502,"props":1144,"children":1146},{"style":1145},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1147],{"type":87,"value":1148},"d",{"type":81,"tag":502,"props":1150,"children":1151},{"style":784},[1152],{"type":87,"value":1153},">",{"type":81,"tag":502,"props":1155,"children":1156},{"style":524},[1157],{"type":87,"value":1158}," --scope",{"type":81,"tag":502,"props":1160,"children":1161},{"style":784},[1162],{"type":87,"value":1137},{"type":81,"tag":502,"props":1164,"children":1165},{"style":524},[1166],{"type":87,"value":1167},"tea",{"type":81,"tag":502,"props":1169,"children":1170},{"style":1145},[1171],{"type":87,"value":1172},"m",{"type":81,"tag":502,"props":1174,"children":1175},{"style":784},[1176],{"type":87,"value":1177},">\n",{"type":81,"tag":502,"props":1179,"children":1180},{"class":504,"line":540},[1181],{"type":81,"tag":502,"props":1182,"children":1183},{"emptyLinePlaceholder":544},[1184],{"type":87,"value":547},{"type":81,"tag":502,"props":1186,"children":1187},{"class":504,"line":550},[1188],{"type":81,"tag":502,"props":1189,"children":1190},{"style":509},[1191],{"type":87,"value":1192},"# 2) Pull env vars into .env.local\n",{"type":81,"tag":502,"props":1194,"children":1195},{"class":504,"line":559},[1196,1200,1204,1208,1212],{"type":81,"tag":502,"props":1197,"children":1198},{"style":519},[1199],{"type":87,"value":8},{"type":81,"tag":502,"props":1201,"children":1202},{"style":524},[1203],{"type":87,"value":527},{"type":81,"tag":502,"props":1205,"children":1206},{"style":524},[1207],{"type":87,"value":532},{"type":81,"tag":502,"props":1209,"children":1210},{"style":524},[1211],{"type":87,"value":577},{"type":81,"tag":502,"props":1213,"children":1214},{"style":524},[1215],{"type":87,"value":673},{"type":81,"tag":502,"props":1217,"children":1218},{"class":504,"line":585},[1219],{"type":81,"tag":502,"props":1220,"children":1221},{"emptyLinePlaceholder":544},[1222],{"type":87,"value":547},{"type":81,"tag":502,"props":1224,"children":1225},{"class":504,"line":37},[1226],{"type":81,"tag":502,"props":1227,"children":1228},{"style":509},[1229],{"type":87,"value":1230},"# 3) Verify required keys from .env.example exist in .env.local\n",{"type":81,"tag":502,"props":1232,"children":1233},{"class":504,"line":634},[1234,1240,1245,1250,1255,1259,1263,1268,1273,1278,1283,1288],{"type":81,"tag":502,"props":1235,"children":1237},{"style":1236},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1238],{"type":87,"value":1239},"while",{"type":81,"tag":502,"props":1241,"children":1242},{"style":1145},[1243],{"type":87,"value":1244}," IFS",{"type":81,"tag":502,"props":1246,"children":1247},{"style":784},[1248],{"type":87,"value":1249},"=",{"type":81,"tag":502,"props":1251,"children":1252},{"style":784},[1253],{"type":87,"value":1254},"'",{"type":81,"tag":502,"props":1256,"children":1257},{"style":524},[1258],{"type":87,"value":1249},{"type":81,"tag":502,"props":1260,"children":1261},{"style":784},[1262],{"type":87,"value":1254},{"type":81,"tag":502,"props":1264,"children":1265},{"style":778},[1266],{"type":87,"value":1267}," read",{"type":81,"tag":502,"props":1269,"children":1270},{"style":524},[1271],{"type":87,"value":1272}," -r",{"type":81,"tag":502,"props":1274,"children":1275},{"style":524},[1276],{"type":87,"value":1277}," key",{"type":81,"tag":502,"props":1279,"children":1280},{"style":524},[1281],{"type":87,"value":1282}," _",{"type":81,"tag":502,"props":1284,"children":1285},{"style":784},[1286],{"type":87,"value":1287},";",{"type":81,"tag":502,"props":1289,"children":1290},{"style":1236},[1291],{"type":87,"value":1292}," do\n",{"type":81,"tag":502,"props":1294,"children":1295},{"class":504,"line":642},[1296,1301,1306,1310,1315,1319,1324,1328,1332,1336,1341,1346,1351,1356,1361],{"type":81,"tag":502,"props":1297,"children":1298},{"style":784},[1299],{"type":87,"value":1300},"  [[",{"type":81,"tag":502,"props":1302,"children":1303},{"style":784},[1304],{"type":87,"value":1305}," -z",{"type":81,"tag":502,"props":1307,"children":1308},{"style":784},[1309],{"type":87,"value":787},{"type":81,"tag":502,"props":1311,"children":1312},{"style":1145},[1313],{"type":87,"value":1314},"$key",{"type":81,"tag":502,"props":1316,"children":1317},{"style":784},[1318],{"type":87,"value":797},{"type":81,"tag":502,"props":1320,"children":1321},{"style":784},[1322],{"type":87,"value":1323}," ||",{"type":81,"tag":502,"props":1325,"children":1326},{"style":784},[1327],{"type":87,"value":787},{"type":81,"tag":502,"props":1329,"children":1330},{"style":1145},[1331],{"type":87,"value":1314},{"type":81,"tag":502,"props":1333,"children":1334},{"style":784},[1335],{"type":87,"value":797},{"type":81,"tag":502,"props":1337,"children":1338},{"style":784},[1339],{"type":87,"value":1340}," ==",{"type":81,"tag":502,"props":1342,"children":1343},{"style":1145},[1344],{"type":87,"value":1345}," \\#",{"type":81,"tag":502,"props":1347,"children":1348},{"style":784},[1349],{"type":87,"value":1350},"*",{"type":81,"tag":502,"props":1352,"children":1353},{"style":784},[1354],{"type":87,"value":1355}," ]]",{"type":81,"tag":502,"props":1357,"children":1358},{"style":784},[1359],{"type":87,"value":1360}," &&",{"type":81,"tag":502,"props":1362,"children":1363},{"style":1236},[1364],{"type":87,"value":1365}," continue\n",{"type":81,"tag":502,"props":1367,"children":1368},{"class":504,"line":651},[1369,1374,1379,1383,1388,1393,1398,1403,1407,1411,1415,1419,1424,1428,1433,1437],{"type":81,"tag":502,"props":1370,"children":1371},{"style":519},[1372],{"type":87,"value":1373},"  grep",{"type":81,"tag":502,"props":1375,"children":1376},{"style":524},[1377],{"type":87,"value":1378}," -q",{"type":81,"tag":502,"props":1380,"children":1381},{"style":784},[1382],{"type":87,"value":787},{"type":81,"tag":502,"props":1384,"children":1385},{"style":524},[1386],{"type":87,"value":1387},"^",{"type":81,"tag":502,"props":1389,"children":1390},{"style":784},[1391],{"type":87,"value":1392},"${",{"type":81,"tag":502,"props":1394,"children":1395},{"style":1145},[1396],{"type":87,"value":1397},"key",{"type":81,"tag":502,"props":1399,"children":1400},{"style":784},[1401],{"type":87,"value":1402},"}",{"type":81,"tag":502,"props":1404,"children":1405},{"style":524},[1406],{"type":87,"value":1249},{"type":81,"tag":502,"props":1408,"children":1409},{"style":784},[1410],{"type":87,"value":797},{"type":81,"tag":502,"props":1412,"children":1413},{"style":524},[1414],{"type":87,"value":577},{"type":81,"tag":502,"props":1416,"children":1417},{"style":784},[1418],{"type":87,"value":1323},{"type":81,"tag":502,"props":1420,"children":1421},{"style":778},[1422],{"type":87,"value":1423}," echo",{"type":81,"tag":502,"props":1425,"children":1426},{"style":784},[1427],{"type":87,"value":787},{"type":81,"tag":502,"props":1429,"children":1430},{"style":524},[1431],{"type":87,"value":1432},"Missing in .env.local: ",{"type":81,"tag":502,"props":1434,"children":1435},{"style":1145},[1436],{"type":87,"value":1314},{"type":81,"tag":502,"props":1438,"children":1439},{"style":784},[1440],{"type":87,"value":1441},"\"\n",{"type":81,"tag":502,"props":1443,"children":1444},{"class":504,"line":676},[1445,1450,1454],{"type":81,"tag":502,"props":1446,"children":1447},{"style":1236},[1448],{"type":87,"value":1449},"done",{"type":81,"tag":502,"props":1451,"children":1452},{"style":784},[1453],{"type":87,"value":1137},{"type":81,"tag":502,"props":1455,"children":1456},{"style":1145},[1457],{"type":87,"value":1458}," .env.example\n",{"type":81,"tag":333,"props":1460,"children":1462},{"id":1461},"temporary-path-run-with-vercel-envs-without-writing-a-file",[1463],{"type":87,"value":1464},"Temporary Path: Run With Vercel Envs Without Writing a File",{"type":81,"tag":90,"props":1466,"children":1467},{},[1468,1470,1475],{"type":87,"value":1469},"If you need Vercel environment variables immediately but do not want to write ",{"type":81,"tag":96,"props":1471,"children":1473},{"className":1472},[],[1474],{"type":87,"value":44},{"type":87,"value":1476}," yet:",{"type":81,"tag":491,"props":1478,"children":1480},{"className":493,"code":1479,"language":495,"meta":496,"style":496},"vercel env run -- npm run dev\n",[1481],{"type":81,"tag":96,"props":1482,"children":1483},{"__ignoreMap":496},[1484],{"type":81,"tag":502,"props":1485,"children":1486},{"class":504,"line":505},[1487,1491,1495,1500,1505,1510,1514],{"type":81,"tag":502,"props":1488,"children":1489},{"style":519},[1490],{"type":87,"value":8},{"type":81,"tag":502,"props":1492,"children":1493},{"style":524},[1494],{"type":87,"value":527},{"type":81,"tag":502,"props":1496,"children":1497},{"style":524},[1498],{"type":87,"value":1499}," run",{"type":81,"tag":502,"props":1501,"children":1502},{"style":524},[1503],{"type":87,"value":1504}," --",{"type":81,"tag":502,"props":1506,"children":1507},{"style":524},[1508],{"type":87,"value":1509}," npm",{"type":81,"tag":502,"props":1511,"children":1512},{"style":524},[1513],{"type":87,"value":1499},{"type":81,"tag":502,"props":1515,"children":1516},{"style":524},[1517],{"type":87,"value":1518}," dev\n",{"type":81,"tag":90,"props":1520,"children":1521},{},[1522,1524,1529],{"type":87,"value":1523},"This is useful for quick validation during bootstrap, but still pull ",{"type":81,"tag":96,"props":1525,"children":1527},{"className":1526},[],[1528],{"type":87,"value":44},{"type":87,"value":1530}," for a normal local workflow.",{"type":81,"tag":333,"props":1532,"children":1534},{"id":1533},"re-pull-after-secret-or-provisioning-changes",[1535],{"type":87,"value":1536},"Re-pull After Secret or Provisioning Changes",{"type":81,"tag":90,"props":1538,"children":1539},{},[1540,1542,1548],{"type":87,"value":1541},"After creating\u002Fupdating secrets (",{"type":81,"tag":96,"props":1543,"children":1545},{"className":1544},[],[1546],{"type":87,"value":1547},"vercel env add",{"type":87,"value":1549},", dashboard changes) or provisioning integrations that add env vars (for example Neon\u002FUpstash), re-run:",{"type":81,"tag":491,"props":1551,"children":1553},{"className":493,"code":1552,"language":495,"meta":496,"style":496},"vercel env pull .env.local --yes\n",[1554],{"type":81,"tag":96,"props":1555,"children":1556},{"__ignoreMap":496},[1557],{"type":81,"tag":502,"props":1558,"children":1559},{"class":504,"line":505},[1560,1564,1568,1572,1576],{"type":81,"tag":502,"props":1561,"children":1562},{"style":519},[1563],{"type":87,"value":8},{"type":81,"tag":502,"props":1565,"children":1566},{"style":524},[1567],{"type":87,"value":527},{"type":81,"tag":502,"props":1569,"children":1570},{"style":524},[1571],{"type":87,"value":532},{"type":81,"tag":502,"props":1573,"children":1574},{"style":524},[1575],{"type":87,"value":577},{"type":81,"tag":502,"props":1577,"children":1578},{"style":524},[1579],{"type":87,"value":673},{"type":81,"tag":111,"props":1581,"children":1583},{"id":1582},"oidc-token-lifecycle",[1584],{"type":87,"value":1585},"OIDC Token Lifecycle",{"type":81,"tag":90,"props":1587,"children":1588},{},[1589,1591,1596],{"type":87,"value":1590},"Vercel uses ",{"type":81,"tag":196,"props":1592,"children":1593},{},[1594],{"type":87,"value":1595},"OIDC (OpenID Connect)",{"type":87,"value":1597}," tokens for secure, keyless authentication between your app and Vercel services (AI Gateway, storage, etc.).",{"type":81,"tag":333,"props":1599,"children":1601},{"id":1600},"how-it-works",[1602],{"type":87,"value":1603},"How It Works",{"type":81,"tag":340,"props":1605,"children":1606},{},[1607,1625,1649],{"type":81,"tag":344,"props":1608,"children":1609},{},[1610,1615,1617,1623],{"type":81,"tag":196,"props":1611,"children":1612},{},[1613],{"type":87,"value":1614},"On Vercel deployments",{"type":87,"value":1616},": ",{"type":81,"tag":96,"props":1618,"children":1620},{"className":1619},[],[1621],{"type":87,"value":1622},"VERCEL_OIDC_TOKEN",{"type":87,"value":1624}," is automatically injected as a short-lived JWT and auto-refreshed — zero configuration needed",{"type":81,"tag":344,"props":1626,"children":1627},{},[1628,1633,1634,1640,1642,1647],{"type":81,"tag":196,"props":1629,"children":1630},{},[1631],{"type":87,"value":1632},"Local development",{"type":87,"value":1616},{"type":81,"tag":96,"props":1635,"children":1637},{"className":1636},[],[1638],{"type":87,"value":1639},"vercel env pull .env.local",{"type":87,"value":1641}," provisions a ",{"type":81,"tag":96,"props":1643,"children":1645},{"className":1644},[],[1646],{"type":87,"value":1622},{"type":87,"value":1648}," valid for ~12 hours",{"type":81,"tag":344,"props":1650,"children":1651},{},[1652,1657,1659,1665],{"type":81,"tag":196,"props":1653,"children":1654},{},[1655],{"type":87,"value":1656},"Token expiry",{"type":87,"value":1658},": When the local OIDC token expires, re-run ",{"type":81,"tag":96,"props":1660,"children":1662},{"className":1661},[],[1663],{"type":87,"value":1664},"vercel env pull .env.local --yes",{"type":87,"value":1666}," to get a fresh one. Consider re-pulling at the start of each dev session to avoid mid-session auth failures",{"type":81,"tag":333,"props":1668,"children":1670},{"id":1669},"common-oidc-patterns",[1671],{"type":87,"value":1672},"Common OIDC Patterns",{"type":81,"tag":491,"props":1674,"children":1678},{"className":1675,"code":1676,"language":1677,"meta":496,"style":496},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F The @vercel\u002Foidc package reads VERCEL_OIDC_TOKEN automatically\nimport { getVercelOidcToken } from '@vercel\u002Foidc'\n\n\u002F\u002F AI Gateway uses OIDC by default — no manual token handling needed\nimport { gateway } from 'ai'\nconst result = await generateText({\n  model: gateway('openai\u002Fgpt-5.2'),\n  prompt: 'Hello',\n})\n","ts",[1679],{"type":81,"tag":96,"props":1680,"children":1681},{"__ignoreMap":496},[1682,1690,1733,1740,1748,1785,1823,1868,1897],{"type":81,"tag":502,"props":1683,"children":1684},{"class":504,"line":505},[1685],{"type":81,"tag":502,"props":1686,"children":1687},{"style":509},[1688],{"type":87,"value":1689},"\u002F\u002F The @vercel\u002Foidc package reads VERCEL_OIDC_TOKEN automatically\n",{"type":81,"tag":502,"props":1691,"children":1692},{"class":504,"line":515},[1693,1698,1703,1708,1713,1718,1723,1728],{"type":81,"tag":502,"props":1694,"children":1695},{"style":1236},[1696],{"type":87,"value":1697},"import",{"type":81,"tag":502,"props":1699,"children":1700},{"style":784},[1701],{"type":87,"value":1702}," {",{"type":81,"tag":502,"props":1704,"children":1705},{"style":1145},[1706],{"type":87,"value":1707}," getVercelOidcToken",{"type":81,"tag":502,"props":1709,"children":1710},{"style":784},[1711],{"type":87,"value":1712}," }",{"type":81,"tag":502,"props":1714,"children":1715},{"style":1236},[1716],{"type":87,"value":1717}," from",{"type":81,"tag":502,"props":1719,"children":1720},{"style":784},[1721],{"type":87,"value":1722}," '",{"type":81,"tag":502,"props":1724,"children":1725},{"style":524},[1726],{"type":87,"value":1727},"@vercel\u002Foidc",{"type":81,"tag":502,"props":1729,"children":1730},{"style":784},[1731],{"type":87,"value":1732},"'\n",{"type":81,"tag":502,"props":1734,"children":1735},{"class":504,"line":540},[1736],{"type":81,"tag":502,"props":1737,"children":1738},{"emptyLinePlaceholder":544},[1739],{"type":87,"value":547},{"type":81,"tag":502,"props":1741,"children":1742},{"class":504,"line":550},[1743],{"type":81,"tag":502,"props":1744,"children":1745},{"style":509},[1746],{"type":87,"value":1747},"\u002F\u002F AI Gateway uses OIDC by default — no manual token handling needed\n",{"type":81,"tag":502,"props":1749,"children":1750},{"class":504,"line":559},[1751,1755,1759,1764,1768,1772,1776,1781],{"type":81,"tag":502,"props":1752,"children":1753},{"style":1236},[1754],{"type":87,"value":1697},{"type":81,"tag":502,"props":1756,"children":1757},{"style":784},[1758],{"type":87,"value":1702},{"type":81,"tag":502,"props":1760,"children":1761},{"style":1145},[1762],{"type":87,"value":1763}," gateway",{"type":81,"tag":502,"props":1765,"children":1766},{"style":784},[1767],{"type":87,"value":1712},{"type":81,"tag":502,"props":1769,"children":1770},{"style":1236},[1771],{"type":87,"value":1717},{"type":81,"tag":502,"props":1773,"children":1774},{"style":784},[1775],{"type":87,"value":1722},{"type":81,"tag":502,"props":1777,"children":1778},{"style":524},[1779],{"type":87,"value":1780},"ai",{"type":81,"tag":502,"props":1782,"children":1783},{"style":784},[1784],{"type":87,"value":1732},{"type":81,"tag":502,"props":1786,"children":1787},{"class":504,"line":585},[1788,1794,1799,1803,1808,1813,1818],{"type":81,"tag":502,"props":1789,"children":1791},{"style":1790},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1792],{"type":87,"value":1793},"const",{"type":81,"tag":502,"props":1795,"children":1796},{"style":1145},[1797],{"type":87,"value":1798}," result ",{"type":81,"tag":502,"props":1800,"children":1801},{"style":784},[1802],{"type":87,"value":1249},{"type":81,"tag":502,"props":1804,"children":1805},{"style":1236},[1806],{"type":87,"value":1807}," await",{"type":81,"tag":502,"props":1809,"children":1810},{"style":778},[1811],{"type":87,"value":1812}," generateText",{"type":81,"tag":502,"props":1814,"children":1815},{"style":1145},[1816],{"type":87,"value":1817},"(",{"type":81,"tag":502,"props":1819,"children":1820},{"style":784},[1821],{"type":87,"value":1822},"{\n",{"type":81,"tag":502,"props":1824,"children":1825},{"class":504,"line":37},[1826,1832,1837,1841,1845,1849,1854,1858,1863],{"type":81,"tag":502,"props":1827,"children":1829},{"style":1828},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[1830],{"type":87,"value":1831},"  model",{"type":81,"tag":502,"props":1833,"children":1834},{"style":784},[1835],{"type":87,"value":1836},":",{"type":81,"tag":502,"props":1838,"children":1839},{"style":778},[1840],{"type":87,"value":1763},{"type":81,"tag":502,"props":1842,"children":1843},{"style":1145},[1844],{"type":87,"value":1817},{"type":81,"tag":502,"props":1846,"children":1847},{"style":784},[1848],{"type":87,"value":1254},{"type":81,"tag":502,"props":1850,"children":1851},{"style":524},[1852],{"type":87,"value":1853},"openai\u002Fgpt-5.2",{"type":81,"tag":502,"props":1855,"children":1856},{"style":784},[1857],{"type":87,"value":1254},{"type":81,"tag":502,"props":1859,"children":1860},{"style":1145},[1861],{"type":87,"value":1862},")",{"type":81,"tag":502,"props":1864,"children":1865},{"style":784},[1866],{"type":87,"value":1867},",\n",{"type":81,"tag":502,"props":1869,"children":1870},{"class":504,"line":634},[1871,1876,1880,1884,1889,1893],{"type":81,"tag":502,"props":1872,"children":1873},{"style":1828},[1874],{"type":87,"value":1875},"  prompt",{"type":81,"tag":502,"props":1877,"children":1878},{"style":784},[1879],{"type":87,"value":1836},{"type":81,"tag":502,"props":1881,"children":1882},{"style":784},[1883],{"type":87,"value":1722},{"type":81,"tag":502,"props":1885,"children":1886},{"style":524},[1887],{"type":87,"value":1888},"Hello",{"type":81,"tag":502,"props":1890,"children":1891},{"style":784},[1892],{"type":87,"value":1254},{"type":81,"tag":502,"props":1894,"children":1895},{"style":784},[1896],{"type":87,"value":1867},{"type":81,"tag":502,"props":1898,"children":1899},{"class":504,"line":642},[1900,1904],{"type":81,"tag":502,"props":1901,"children":1902},{"style":784},[1903],{"type":87,"value":1402},{"type":81,"tag":502,"props":1905,"children":1906},{"style":1145},[1907],{"type":87,"value":1908},")\n",{"type":81,"tag":333,"props":1910,"children":1912},{"id":1911},"troubleshooting-oidc",[1913],{"type":87,"value":1914},"Troubleshooting OIDC",{"type":81,"tag":123,"props":1916,"children":1917},{},[1918,1939],{"type":81,"tag":127,"props":1919,"children":1920},{},[1921],{"type":81,"tag":131,"props":1922,"children":1923},{},[1924,1929,1934],{"type":81,"tag":135,"props":1925,"children":1926},{},[1927],{"type":87,"value":1928},"Symptom",{"type":81,"tag":135,"props":1930,"children":1931},{},[1932],{"type":87,"value":1933},"Cause",{"type":81,"tag":135,"props":1935,"children":1936},{},[1937],{"type":87,"value":1938},"Fix",{"type":81,"tag":151,"props":1940,"children":1941},{},[1942,1968,1989,2015],{"type":81,"tag":131,"props":1943,"children":1944},{},[1945,1955,1960],{"type":81,"tag":158,"props":1946,"children":1947},{},[1948,1953],{"type":81,"tag":96,"props":1949,"children":1951},{"className":1950},[],[1952],{"type":87,"value":1622},{"type":87,"value":1954}," missing locally",{"type":81,"tag":158,"props":1956,"children":1957},{},[1958],{"type":87,"value":1959},"Haven't pulled env vars",{"type":81,"tag":158,"props":1961,"children":1962},{},[1963],{"type":81,"tag":96,"props":1964,"children":1966},{"className":1965},[],[1967],{"type":87,"value":1639},{"type":81,"tag":131,"props":1969,"children":1970},{},[1971,1976,1981],{"type":81,"tag":158,"props":1972,"children":1973},{},[1974],{"type":87,"value":1975},"Auth errors after ~12h locally",{"type":81,"tag":158,"props":1977,"children":1978},{},[1979],{"type":87,"value":1980},"Token expired",{"type":81,"tag":158,"props":1982,"children":1983},{},[1984],{"type":81,"tag":96,"props":1985,"children":1987},{"className":1986},[],[1988],{"type":87,"value":1664},{"type":81,"tag":131,"props":1990,"children":1991},{},[1992,1997,2007],{"type":81,"tag":158,"props":1993,"children":1994},{},[1995],{"type":87,"value":1996},"Works on Vercel, fails locally",{"type":81,"tag":158,"props":1998,"children":1999},{},[2000,2002],{"type":87,"value":2001},"Token not in ",{"type":81,"tag":96,"props":2003,"children":2005},{"className":2004},[],[2006],{"type":87,"value":44},{"type":81,"tag":158,"props":2008,"children":2009},{},[2010],{"type":81,"tag":96,"props":2011,"children":2013},{"className":2012},[],[2014],{"type":87,"value":1639},{"type":81,"tag":131,"props":2016,"children":2017},{},[2018,2029,2034],{"type":81,"tag":158,"props":2019,"children":2020},{},[2021,2027],{"type":81,"tag":96,"props":2022,"children":2024},{"className":2023},[],[2025],{"type":87,"value":2026},"AI_GATEWAY_API_KEY",{"type":87,"value":2028}," vs OIDC",{"type":81,"tag":158,"props":2030,"children":2031},{},[2032],{"type":87,"value":2033},"Both set, key takes priority",{"type":81,"tag":158,"props":2035,"children":2036},{},[2037,2039,2044],{"type":87,"value":2038},"Remove ",{"type":81,"tag":96,"props":2040,"children":2042},{"className":2041},[],[2043],{"type":87,"value":2026},{"type":87,"value":2045}," to use OIDC",{"type":81,"tag":111,"props":2047,"children":2049},{"id":2048},"environment-specific-configuration",[2050],{"type":87,"value":2051},"Environment-Specific Configuration",{"type":81,"tag":333,"props":2053,"children":2055},{"id":2054},"vercel-dashboard-vs-env-files",[2056],{"type":87,"value":2057},"Vercel Dashboard vs .env Files",{"type":81,"tag":123,"props":2059,"children":2060},{},[2061,2077],{"type":81,"tag":127,"props":2062,"children":2063},{},[2064],{"type":81,"tag":131,"props":2065,"children":2066},{},[2067,2072],{"type":81,"tag":135,"props":2068,"children":2069},{},[2070],{"type":87,"value":2071},"Use Case",{"type":81,"tag":135,"props":2073,"children":2074},{},[2075],{"type":87,"value":2076},"Where to Set",{"type":81,"tag":151,"props":2078,"children":2079},{},[2080,2106,2131,2147],{"type":81,"tag":131,"props":2081,"children":2082},{},[2083,2088],{"type":81,"tag":158,"props":2084,"children":2085},{},[2086],{"type":87,"value":2087},"Secrets (API keys, tokens)",{"type":81,"tag":158,"props":2089,"children":2090},{},[2091,2093,2099,2101],{"type":87,"value":2092},"Vercel Dashboard (",{"type":81,"tag":96,"props":2094,"children":2096},{"className":2095},[],[2097],{"type":87,"value":2098},"https:\u002F\u002Fvercel.com\u002F{team}\u002F{project}\u002Fsettings\u002Fenvironment-variables",{"type":87,"value":2100},") or ",{"type":81,"tag":96,"props":2102,"children":2104},{"className":2103},[],[2105],{"type":87,"value":1547},{"type":81,"tag":131,"props":2107,"children":2108},{},[2109,2114],{"type":81,"tag":158,"props":2110,"children":2111},{},[2112],{"type":87,"value":2113},"Public config (site URL, feature flags)",{"type":81,"tag":158,"props":2115,"children":2116},{},[2117,2122,2124,2129],{"type":81,"tag":96,"props":2118,"children":2120},{"className":2119},[],[2121],{"type":87,"value":42},{"type":87,"value":2123}," or ",{"type":81,"tag":96,"props":2125,"children":2127},{"className":2126},[],[2128],{"type":87,"value":362},{"type":87,"value":2130}," files",{"type":81,"tag":131,"props":2132,"children":2133},{},[2134,2139],{"type":81,"tag":158,"props":2135,"children":2136},{},[2137],{"type":87,"value":2138},"Local-only overrides",{"type":81,"tag":158,"props":2140,"children":2141},{},[2142],{"type":81,"tag":96,"props":2143,"children":2145},{"className":2144},[],[2146],{"type":87,"value":44},{"type":81,"tag":131,"props":2148,"children":2149},{},[2150,2155],{"type":81,"tag":158,"props":2151,"children":2152},{},[2153],{"type":87,"value":2154},"CI\u002FCD secrets",{"type":81,"tag":158,"props":2156,"children":2157},{},[2158,2159,2164],{"type":87,"value":2092},{"type":81,"tag":96,"props":2160,"children":2162},{"className":2161},[],[2163],{"type":87,"value":2098},{"type":87,"value":2165},") with environment scoping",{"type":81,"tag":333,"props":2167,"children":2169},{"id":2168},"environment-scoping-on-vercel",[2170],{"type":87,"value":2171},"Environment Scoping on Vercel",{"type":81,"tag":90,"props":2173,"children":2174},{},[2175,2177,2182],{"type":87,"value":2176},"Variables set in the Vercel Dashboard at ",{"type":81,"tag":96,"props":2178,"children":2180},{"className":2179},[],[2181],{"type":87,"value":2098},{"type":87,"value":2183}," can be scoped to:",{"type":81,"tag":393,"props":2185,"children":2186},{},[2187,2205,2215],{"type":81,"tag":344,"props":2188,"children":2189},{},[2190,2195,2197,2203],{"type":81,"tag":196,"props":2191,"children":2192},{},[2193],{"type":87,"value":2194},"Production",{"type":87,"value":2196}," — only ",{"type":81,"tag":96,"props":2198,"children":2200},{"className":2199},[],[2201],{"type":87,"value":2202},"vercel.app",{"type":87,"value":2204}," production deployments",{"type":81,"tag":344,"props":2206,"children":2207},{},[2208,2213],{"type":81,"tag":196,"props":2209,"children":2210},{},[2211],{"type":87,"value":2212},"Preview",{"type":87,"value":2214}," — branch\u002FPR deployments",{"type":81,"tag":344,"props":2216,"children":2217},{},[2218,2223,2225,2231,2233],{"type":81,"tag":196,"props":2219,"children":2220},{},[2221],{"type":87,"value":2222},"Development",{"type":87,"value":2224}," — ",{"type":81,"tag":96,"props":2226,"children":2228},{"className":2227},[],[2229],{"type":87,"value":2230},"vercel dev",{"type":87,"value":2232}," and ",{"type":81,"tag":96,"props":2234,"children":2236},{"className":2235},[],[2237],{"type":87,"value":450},{"type":81,"tag":90,"props":2239,"children":2240},{},[2241],{"type":87,"value":2242},"A variable can be assigned to one, two, or all three environments.",{"type":81,"tag":333,"props":2244,"children":2246},{"id":2245},"git-branch-overrides",[2247],{"type":87,"value":2248},"Git Branch Overrides",{"type":81,"tag":90,"props":2250,"children":2251},{},[2252],{"type":87,"value":2253},"Preview environment variables can be scoped to specific Git branches:",{"type":81,"tag":491,"props":2255,"children":2257},{"className":493,"code":2256,"language":495,"meta":496,"style":496},"# Add a variable only for the \"staging\" branch\necho \"staging-value\" | vercel env add DATABASE_URL preview --git-branch=staging\n",[2258],{"type":81,"tag":96,"props":2259,"children":2260},{"__ignoreMap":496},[2261,2269],{"type":81,"tag":502,"props":2262,"children":2263},{"class":504,"line":505},[2264],{"type":81,"tag":502,"props":2265,"children":2266},{"style":509},[2267],{"type":87,"value":2268},"# Add a variable only for the \"staging\" branch\n",{"type":81,"tag":502,"props":2270,"children":2271},{"class":504,"line":515},[2272,2276,2280,2285,2289,2293,2297,2301,2305,2310,2314],{"type":81,"tag":502,"props":2273,"children":2274},{"style":778},[2275],{"type":87,"value":781},{"type":81,"tag":502,"props":2277,"children":2278},{"style":784},[2279],{"type":87,"value":787},{"type":81,"tag":502,"props":2281,"children":2282},{"style":524},[2283],{"type":87,"value":2284},"staging-value",{"type":81,"tag":502,"props":2286,"children":2287},{"style":784},[2288],{"type":87,"value":797},{"type":81,"tag":502,"props":2290,"children":2291},{"style":784},[2292],{"type":87,"value":802},{"type":81,"tag":502,"props":2294,"children":2295},{"style":519},[2296],{"type":87,"value":807},{"type":81,"tag":502,"props":2298,"children":2299},{"style":524},[2300],{"type":87,"value":527},{"type":81,"tag":502,"props":2302,"children":2303},{"style":524},[2304],{"type":87,"value":752},{"type":81,"tag":502,"props":2306,"children":2307},{"style":524},[2308],{"type":87,"value":2309}," DATABASE_URL",{"type":81,"tag":502,"props":2311,"children":2312},{"style":524},[2313],{"type":87,"value":889},{"type":81,"tag":502,"props":2315,"children":2316},{"style":524},[2317],{"type":87,"value":2318}," --git-branch=staging\n",{"type":81,"tag":111,"props":2320,"children":2322},{"id":2321},"gotchas",[2323],{"type":87,"value":2324},"Gotchas",{"type":81,"tag":333,"props":2326,"children":2328},{"id":2327},"vercel-env-pull-overwrites-custom-variables",[2329,2334],{"type":81,"tag":96,"props":2330,"children":2332},{"className":2331},[],[2333],{"type":87,"value":450},{"type":87,"value":2335}," Overwrites Custom Variables",{"type":81,"tag":90,"props":2337,"children":2338},{},[2339,2344,2346,2351],{"type":81,"tag":96,"props":2340,"children":2342},{"className":2341},[],[2343],{"type":87,"value":1639},{"type":87,"value":2345}," ",{"type":81,"tag":196,"props":2347,"children":2348},{},[2349],{"type":87,"value":2350},"replaces the entire file",{"type":87,"value":2352}," — any manually added variables (custom secrets, local overrides, debug flags) are lost. Always back up or re-add custom vars after pulling:",{"type":81,"tag":491,"props":2354,"children":2356},{"className":493,"code":2355,"language":495,"meta":496,"style":496},"# Save custom vars before pulling\ngrep -v '^#' .env.local | grep -v '^VERCEL_\\|^POSTGRES_\\|^NEXT_PUBLIC_' > .env.custom.bak\nvercel env pull .env.local --yes\ncat .env.custom.bak >> .env.local  # Re-append custom vars\n",[2357],{"type":81,"tag":96,"props":2358,"children":2359},{"__ignoreMap":496},[2360,2368,2434,2457],{"type":81,"tag":502,"props":2361,"children":2362},{"class":504,"line":505},[2363],{"type":81,"tag":502,"props":2364,"children":2365},{"style":509},[2366],{"type":87,"value":2367},"# Save custom vars before pulling\n",{"type":81,"tag":502,"props":2369,"children":2370},{"class":504,"line":515},[2371,2376,2381,2385,2390,2394,2398,2402,2407,2411,2415,2420,2424,2429],{"type":81,"tag":502,"props":2372,"children":2373},{"style":519},[2374],{"type":87,"value":2375},"grep",{"type":81,"tag":502,"props":2377,"children":2378},{"style":524},[2379],{"type":87,"value":2380}," -v",{"type":81,"tag":502,"props":2382,"children":2383},{"style":784},[2384],{"type":87,"value":1722},{"type":81,"tag":502,"props":2386,"children":2387},{"style":524},[2388],{"type":87,"value":2389},"^#",{"type":81,"tag":502,"props":2391,"children":2392},{"style":784},[2393],{"type":87,"value":1254},{"type":81,"tag":502,"props":2395,"children":2396},{"style":524},[2397],{"type":87,"value":577},{"type":81,"tag":502,"props":2399,"children":2400},{"style":784},[2401],{"type":87,"value":802},{"type":81,"tag":502,"props":2403,"children":2404},{"style":519},[2405],{"type":87,"value":2406}," grep",{"type":81,"tag":502,"props":2408,"children":2409},{"style":524},[2410],{"type":87,"value":2380},{"type":81,"tag":502,"props":2412,"children":2413},{"style":784},[2414],{"type":87,"value":1722},{"type":81,"tag":502,"props":2416,"children":2417},{"style":524},[2418],{"type":87,"value":2419},"^VERCEL_\\|^POSTGRES_\\|^NEXT_PUBLIC_",{"type":81,"tag":502,"props":2421,"children":2422},{"style":784},[2423],{"type":87,"value":1254},{"type":81,"tag":502,"props":2425,"children":2426},{"style":784},[2427],{"type":87,"value":2428}," >",{"type":81,"tag":502,"props":2430,"children":2431},{"style":524},[2432],{"type":87,"value":2433}," .env.custom.bak\n",{"type":81,"tag":502,"props":2435,"children":2436},{"class":504,"line":540},[2437,2441,2445,2449,2453],{"type":81,"tag":502,"props":2438,"children":2439},{"style":519},[2440],{"type":87,"value":8},{"type":81,"tag":502,"props":2442,"children":2443},{"style":524},[2444],{"type":87,"value":527},{"type":81,"tag":502,"props":2446,"children":2447},{"style":524},[2448],{"type":87,"value":532},{"type":81,"tag":502,"props":2450,"children":2451},{"style":524},[2452],{"type":87,"value":577},{"type":81,"tag":502,"props":2454,"children":2455},{"style":524},[2456],{"type":87,"value":673},{"type":81,"tag":502,"props":2458,"children":2459},{"class":504,"line":550},[2460,2465,2470,2475,2479],{"type":81,"tag":502,"props":2461,"children":2462},{"style":519},[2463],{"type":87,"value":2464},"cat",{"type":81,"tag":502,"props":2466,"children":2467},{"style":524},[2468],{"type":87,"value":2469}," .env.custom.bak",{"type":81,"tag":502,"props":2471,"children":2472},{"style":784},[2473],{"type":87,"value":2474}," >>",{"type":81,"tag":502,"props":2476,"children":2477},{"style":524},[2478],{"type":87,"value":577},{"type":81,"tag":502,"props":2480,"children":2481},{"style":509},[2482],{"type":87,"value":2483},"  # Re-append custom vars\n",{"type":81,"tag":90,"props":2485,"children":2486},{},[2487,2489,2494,2496,2501],{"type":87,"value":2488},"Or maintain custom vars in a separate ",{"type":81,"tag":96,"props":2490,"children":2492},{"className":2491},[],[2493],{"type":87,"value":49},{"type":87,"value":2495}," file (loaded after ",{"type":81,"tag":96,"props":2497,"children":2499},{"className":2498},[],[2500],{"type":87,"value":44},{"type":87,"value":2502}," by Next.js).",{"type":81,"tag":333,"props":2504,"children":2506},{"id":2505},"scripts-dont-auto-load-envlocal",[2507,2509],{"type":87,"value":2508},"Scripts Don't Auto-Load ",{"type":81,"tag":96,"props":2510,"children":2512},{"className":2511},[],[2513],{"type":87,"value":44},{"type":81,"tag":90,"props":2515,"children":2516},{},[2517,2519,2524,2526,2532,2533,2539],{"type":87,"value":2518},"Only Next.js auto-loads ",{"type":81,"tag":96,"props":2520,"children":2522},{"className":2521},[],[2523],{"type":87,"value":44},{"type":87,"value":2525},". Standalone scripts (",{"type":81,"tag":96,"props":2527,"children":2529},{"className":2528},[],[2530],{"type":87,"value":2531},"drizzle-kit",{"type":87,"value":412},{"type":81,"tag":96,"props":2534,"children":2536},{"className":2535},[],[2537],{"type":87,"value":2538},"tsx",{"type":87,"value":2540},", custom Node scripts) need explicit loading:",{"type":81,"tag":491,"props":2542,"children":2544},{"className":493,"code":2543,"language":495,"meta":496,"style":496},"# Use dotenv-cli\nnpm install -D dotenv-cli\nnpx dotenv -e .env.local -- npx drizzle-kit push\nnpx dotenv -e .env.local -- npx tsx scripts\u002Fseed.ts\n\n# Or source manually\nsource \u003C(grep -v '^#' .env.local | sed 's\u002F^\u002Fexport \u002F') && node scripts\u002Fmigrate.js\n",[2545],{"type":81,"tag":96,"props":2546,"children":2547},{"__ignoreMap":496},[2548,2556,2579,2620,2657,2664,2672],{"type":81,"tag":502,"props":2549,"children":2550},{"class":504,"line":505},[2551],{"type":81,"tag":502,"props":2552,"children":2553},{"style":509},[2554],{"type":87,"value":2555},"# Use dotenv-cli\n",{"type":81,"tag":502,"props":2557,"children":2558},{"class":504,"line":515},[2559,2564,2569,2574],{"type":81,"tag":502,"props":2560,"children":2561},{"style":519},[2562],{"type":87,"value":2563},"npm",{"type":81,"tag":502,"props":2565,"children":2566},{"style":524},[2567],{"type":87,"value":2568}," install",{"type":81,"tag":502,"props":2570,"children":2571},{"style":524},[2572],{"type":87,"value":2573}," -D",{"type":81,"tag":502,"props":2575,"children":2576},{"style":524},[2577],{"type":87,"value":2578}," dotenv-cli\n",{"type":81,"tag":502,"props":2580,"children":2581},{"class":504,"line":540},[2582,2587,2592,2597,2601,2605,2610,2615],{"type":81,"tag":502,"props":2583,"children":2584},{"style":519},[2585],{"type":87,"value":2586},"npx",{"type":81,"tag":502,"props":2588,"children":2589},{"style":524},[2590],{"type":87,"value":2591}," dotenv",{"type":81,"tag":502,"props":2593,"children":2594},{"style":524},[2595],{"type":87,"value":2596}," -e",{"type":81,"tag":502,"props":2598,"children":2599},{"style":524},[2600],{"type":87,"value":577},{"type":81,"tag":502,"props":2602,"children":2603},{"style":524},[2604],{"type":87,"value":1504},{"type":81,"tag":502,"props":2606,"children":2607},{"style":524},[2608],{"type":87,"value":2609}," npx",{"type":81,"tag":502,"props":2611,"children":2612},{"style":524},[2613],{"type":87,"value":2614}," drizzle-kit",{"type":81,"tag":502,"props":2616,"children":2617},{"style":524},[2618],{"type":87,"value":2619}," push\n",{"type":81,"tag":502,"props":2621,"children":2622},{"class":504,"line":550},[2623,2627,2631,2635,2639,2643,2647,2652],{"type":81,"tag":502,"props":2624,"children":2625},{"style":519},[2626],{"type":87,"value":2586},{"type":81,"tag":502,"props":2628,"children":2629},{"style":524},[2630],{"type":87,"value":2591},{"type":81,"tag":502,"props":2632,"children":2633},{"style":524},[2634],{"type":87,"value":2596},{"type":81,"tag":502,"props":2636,"children":2637},{"style":524},[2638],{"type":87,"value":577},{"type":81,"tag":502,"props":2640,"children":2641},{"style":524},[2642],{"type":87,"value":1504},{"type":81,"tag":502,"props":2644,"children":2645},{"style":524},[2646],{"type":87,"value":2609},{"type":81,"tag":502,"props":2648,"children":2649},{"style":524},[2650],{"type":87,"value":2651}," tsx",{"type":81,"tag":502,"props":2653,"children":2654},{"style":524},[2655],{"type":87,"value":2656}," scripts\u002Fseed.ts\n",{"type":81,"tag":502,"props":2658,"children":2659},{"class":504,"line":559},[2660],{"type":81,"tag":502,"props":2661,"children":2662},{"emptyLinePlaceholder":544},[2663],{"type":87,"value":547},{"type":81,"tag":502,"props":2665,"children":2666},{"class":504,"line":585},[2667],{"type":81,"tag":502,"props":2668,"children":2669},{"style":509},[2670],{"type":87,"value":2671},"# Or source manually\n",{"type":81,"tag":502,"props":2673,"children":2674},{"class":504,"line":37},[2675,2680,2685,2689,2694,2698,2702,2706,2711,2716,2721,2725,2730,2735,2739,2744],{"type":81,"tag":502,"props":2676,"children":2677},{"style":778},[2678],{"type":87,"value":2679},"source",{"type":81,"tag":502,"props":2681,"children":2682},{"style":784},[2683],{"type":87,"value":2684}," \u003C(",{"type":81,"tag":502,"props":2686,"children":2687},{"style":519},[2688],{"type":87,"value":2375},{"type":81,"tag":502,"props":2690,"children":2691},{"style":524},[2692],{"type":87,"value":2693}," -v ",{"type":81,"tag":502,"props":2695,"children":2696},{"style":784},[2697],{"type":87,"value":1254},{"type":81,"tag":502,"props":2699,"children":2700},{"style":524},[2701],{"type":87,"value":2389},{"type":81,"tag":502,"props":2703,"children":2704},{"style":784},[2705],{"type":87,"value":1254},{"type":81,"tag":502,"props":2707,"children":2708},{"style":524},[2709],{"type":87,"value":2710}," .env.local ",{"type":81,"tag":502,"props":2712,"children":2713},{"style":784},[2714],{"type":87,"value":2715},"|",{"type":81,"tag":502,"props":2717,"children":2718},{"style":519},[2719],{"type":87,"value":2720}," sed",{"type":81,"tag":502,"props":2722,"children":2723},{"style":784},[2724],{"type":87,"value":1722},{"type":81,"tag":502,"props":2726,"children":2727},{"style":524},[2728],{"type":87,"value":2729},"s\u002F^\u002Fexport \u002F",{"type":81,"tag":502,"props":2731,"children":2732},{"style":784},[2733],{"type":87,"value":2734},"')",{"type":81,"tag":502,"props":2736,"children":2737},{"style":784},[2738],{"type":87,"value":1360},{"type":81,"tag":502,"props":2740,"children":2741},{"style":519},[2742],{"type":87,"value":2743}," node",{"type":81,"tag":502,"props":2745,"children":2746},{"style":524},[2747],{"type":87,"value":2748}," scripts\u002Fmigrate.js\n",{"type":81,"tag":111,"props":2750,"children":2752},{"id":2751},"best-practices",[2753],{"type":87,"value":2754},"Best Practices",{"type":81,"tag":340,"props":2756,"children":2757},{},[2758,2775,2785,2795,2805,2819,2834],{"type":81,"tag":344,"props":2759,"children":2760},{},[2761,2773],{"type":81,"tag":196,"props":2762,"children":2763},{},[2764,2766,2771],{"type":87,"value":2765},"Use ",{"type":81,"tag":96,"props":2767,"children":2769},{"className":2768},[],[2770],{"type":87,"value":450},{"type":87,"value":2772}," as part of your setup workflow",{"type":87,"value":2774}," — document it in your README",{"type":81,"tag":344,"props":2776,"children":2777},{},[2778,2783],{"type":81,"tag":196,"props":2779,"children":2780},{},[2781],{"type":87,"value":2782},"Never hardcode secrets",{"type":87,"value":2784}," — always use environment variables",{"type":81,"tag":344,"props":2786,"children":2787},{},[2788,2793],{"type":81,"tag":196,"props":2789,"children":2790},{},[2791],{"type":87,"value":2792},"Scope narrowly",{"type":87,"value":2794}," — don't give preview deployments production database access",{"type":81,"tag":344,"props":2796,"children":2797},{},[2798,2803],{"type":81,"tag":196,"props":2799,"children":2800},{},[2801],{"type":87,"value":2802},"Rotate OIDC tokens regularly in local dev",{"type":87,"value":2804}," — re-pull when you see auth errors",{"type":81,"tag":344,"props":2806,"children":2807},{},[2808,2817],{"type":81,"tag":196,"props":2809,"children":2810},{},[2811,2812],{"type":87,"value":2765},{"type":81,"tag":96,"props":2813,"children":2815},{"className":2814},[],[2816],{"type":87,"value":51},{"type":87,"value":2818}," — commit a template with empty values so teammates know which vars are needed",{"type":81,"tag":344,"props":2820,"children":2821},{},[2822,2832],{"type":81,"tag":196,"props":2823,"children":2824},{},[2825,2827],{"type":87,"value":2826},"Prefix client-side vars with ",{"type":81,"tag":96,"props":2828,"children":2830},{"className":2829},[],[2831],{"type":87,"value":463},{"type":87,"value":2833}," — and never put secrets in them",{"type":81,"tag":344,"props":2835,"children":2836},{},[2837,2847,2849,2854],{"type":81,"tag":196,"props":2838,"children":2839},{},[2840,2842],{"type":87,"value":2841},"Keep custom vars in ",{"type":81,"tag":96,"props":2843,"children":2845},{"className":2844},[],[2846],{"type":87,"value":49},{"type":87,"value":2848}," — protects them from ",{"type":81,"tag":96,"props":2850,"children":2852},{"className":2851},[],[2853],{"type":87,"value":450},{"type":87,"value":2855}," overwrites",{"type":81,"tag":111,"props":2857,"children":2859},{"id":2858},"official-documentation",[2860],{"type":87,"value":2861},"Official Documentation",{"type":81,"tag":393,"props":2863,"children":2864},{},[2865,2876,2886],{"type":81,"tag":344,"props":2866,"children":2867},{},[2868],{"type":81,"tag":2869,"props":2870,"children":2873},"a",{"href":39,"rel":2871},[2872],"nofollow",[2874],{"type":87,"value":2875},"Environment Variables",{"type":81,"tag":344,"props":2877,"children":2878},{},[2879],{"type":81,"tag":2869,"props":2880,"children":2883},{"href":2881,"rel":2882},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcli\u002Fenv",[2872],[2884],{"type":87,"value":2885},"Vercel CLI: env",{"type":81,"tag":344,"props":2887,"children":2888},{},[2889],{"type":81,"tag":2869,"props":2890,"children":2893},{"href":2891,"rel":2892},"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fbuilding-your-application\u002Fconfiguring\u002Fenvironment-variables",[2872],[2894],{"type":87,"value":2895},"Next.js Environment Variables",{"type":81,"tag":2897,"props":2898,"children":2899},"style",{},[2900],{"type":87,"value":2901},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2903,"total":3007},[2904,2920,2938,2953,2970,2987,3000],{"slug":60,"name":60,"fn":2905,"description":2906,"org":2907,"tags":2908,"stars":23,"repoUrl":24,"updatedAt":2919},"configure and manage Vercel AI Gateway","Vercel AI Gateway expert guidance. Use when configuring model routing, provider failover, cost tracking, or managing multiple AI providers through a unified API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2909,2912,2915,2918],{"name":2910,"slug":2911,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2913,"slug":2914,"type":15},"Cost Optimization","cost-optimization",{"name":2916,"slug":2917,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:06.57787",{"slug":2921,"name":2921,"fn":2922,"description":2923,"org":2924,"tags":2925,"stars":23,"repoUrl":24,"updatedAt":2937},"auth","integrate authentication in Next.js apps","Authentication integration guidance — Clerk (native Vercel Marketplace), Descope, and Auth0 setup for Next.js applications. Covers middleware auth patterns, sign-in\u002Fsign-up flows, and Marketplace provisioning. Use when implementing user authentication.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2926,2929,2932,2935,2936],{"name":2927,"slug":2928,"type":15},"Auth0","auth0",{"name":2930,"slug":2931,"type":15},"Authentication","authentication",{"name":2933,"slug":2934,"type":15},"Next.js","next-js",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:56:17.050565",{"slug":2939,"name":2939,"fn":2940,"description":2941,"org":2942,"tags":2943,"stars":23,"repoUrl":24,"updatedAt":2952},"bootstrap","bootstrap Vercel-linked repositories","Project bootstrapping orchestrator for repos that depend on Vercel-linked resources (databases, auth, and managed integrations). Use when setting up or repairing a repository so linking, environment provisioning, env pulls, and first-run db\u002Fdev commands happen in the correct safe order.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2944,2945,2948,2951],{"name":21,"slug":22,"type":15},{"name":2946,"slug":2947,"type":15},"Deployment","deployment",{"name":2949,"slug":2950,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:18.297868",{"slug":2954,"name":2954,"fn":2955,"description":2956,"org":2957,"tags":2958,"stars":23,"repoUrl":24,"updatedAt":2969},"cdn-caching","debug Vercel CDN caching behavior","Debug Vercel CDN caching — cache hit rate, stale content, revalidation behavior, ISR + PPR, per-request cache reasons (cacheReason) and PPR state (ppr_state), and costs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2959,2962,2965,2968],{"name":2960,"slug":2961,"type":15},"Caching","caching",{"name":2963,"slug":2964,"type":15},"Observability","observability",{"name":2966,"slug":2967,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-07-30T05:31:34.628944",{"slug":2971,"name":2971,"fn":2972,"description":2973,"org":2974,"tags":2975,"stars":23,"repoUrl":24,"updatedAt":2986},"chat-sdk","build multi-platform chatbots with Vercel","Vercel Chat SDK expert guidance. Use when building multi-platform chat bots — Slack, Telegram, Microsoft Teams, Discord, Google Chat, GitHub, Linear — with a single codebase. Covers the Chat class, adapters, threads, messages, cards, modals, streaming, state management, and webhook setup.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2976,2979,2982,2985],{"name":2977,"slug":2978,"type":15},"Agents","agents",{"name":2980,"slug":2981,"type":15},"Messaging","messaging",{"name":2983,"slug":2984,"type":15},"SDK","sdk",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:26.921901",{"slug":2988,"name":2988,"fn":2989,"description":2990,"org":2991,"tags":2992,"stars":23,"repoUrl":24,"updatedAt":2999},"deployments-cicd","manage Vercel deployments and CI\u002FCD","Vercel deployment and CI\u002FCD expert guidance. Use when deploying, promoting, rolling back, inspecting deployments, building with --prebuilt, or configuring CI workflow files for Vercel.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2993,2996,2997,2998],{"name":2994,"slug":2995,"type":15},"CI\u002FCD","ci-cd",{"name":2946,"slug":2947,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:56:22.054263",{"slug":4,"name":4,"fn":5,"description":6,"org":3001,"tags":3002,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3003,3004,3005,3006],{"name":21,"slug":22,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},29,{"items":3009,"total":3172},[3010,3028,3040,3057,3068,3081,3097,3111,3123,3142,3152,3162],{"slug":3011,"name":3011,"fn":3012,"description":3013,"org":3014,"tags":3015,"stars":3025,"repoUrl":3026,"updatedAt":3027},"next-cache-components-adoption","enable and migrate to Next.js Cache Components","Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the `cacheComponents` flag, work through a flood of blocking-prerender \u002F instant validation errors, run the `cache-components-instant-false` codemod, or decide between opting routes out with `export const instant = false` and fixing them in place.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3016,3017,3020,3023,3024],{"name":2960,"slug":2961,"type":15},{"name":3018,"slug":3019,"type":15},"Frontend","frontend",{"name":3021,"slug":3022,"type":15},"Migration","migration",{"name":2933,"slug":2934,"type":15},{"name":9,"slug":8,"type":15},141208,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fnext.js","2026-07-24T05:38:30.118542",{"slug":3029,"name":3029,"fn":3030,"description":3031,"org":3032,"tags":3033,"stars":3025,"repoUrl":3026,"updatedAt":3039},"next-cache-components-optimizer","optimize Next.js cache components","Drive a Next.js route to instant navigation by setting up an agentic loop, under Cache Components \u002F PPR, on initial load (hard navigation) and client-side navigation (soft navigation). Encode the goal as a failing @next\u002Fplaywright instant() e2e and work it to green, one verified route at a time; the shipped test then guards against regression. Use when asked to make a route's navigation instant (its static shell commits immediately), fix a route whose static shell isn't prerendered\u002Fserved\u002Fprefetched, grow a route's static shell or fix its slow first paint, diagnose which Suspense boundary keeps a route out of its static shell, or write the instant() e2e guard for one. Requires Next.js 16.3+ with cacheComponents; directs an upgrade if older.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3034,3035,3036,3037,3038],{"name":2960,"slug":2961,"type":15},{"name":3018,"slug":3019,"type":15},{"name":2933,"slug":2934,"type":15},{"name":2966,"slug":2967,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:31:10.674078",{"slug":3041,"name":3041,"fn":3042,"description":3043,"org":3044,"tags":3045,"stars":3025,"repoUrl":3026,"updatedAt":3056},"next-dev-loop","verify Next.js runtime behavior","Verify Next.js runtime behavior after editing app code. Use this skill to confirm a change actually works in a running app — not just that it compiles or type-checks. Combines \u002F_next\u002Fmcp (Next.js's view) with agent-browser (the browser's view). Requires a running `next dev`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3046,3049,3050,3051,3052,3053],{"name":3047,"slug":3048,"type":15},"Debugging","debugging",{"name":3018,"slug":3019,"type":15},{"name":2949,"slug":2950,"type":15},{"name":2933,"slug":2934,"type":15},{"name":9,"slug":8,"type":15},{"name":3054,"slug":3055,"type":15},"Web Development","web-development","2026-05-22T06:45:28.627735",{"slug":3058,"name":3058,"fn":3059,"description":3060,"org":3061,"tags":3062,"stars":3025,"repoUrl":3026,"updatedAt":3067},"next-partial-prefetching-adoption","adopt Partial Prefetching in Next.js apps","Turn on Partial Prefetching in a Next.js app and work through the insights it surfaces. Use when the user wants to enable or adopt Partial Prefetching, flip the `partialPrefetching` flag, opt routes in with `export const prefetch = 'partial'`, audit `\u003CLink prefetch={true}>` calls, or resolve the link-prefetch-partial and instant-shell-url-data insights.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3063,3064,3065,3066],{"name":3018,"slug":3019,"type":15},{"name":2933,"slug":2934,"type":15},{"name":2966,"slug":2967,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:31:11.591864",{"slug":3069,"name":3069,"fn":3070,"description":3071,"org":3072,"tags":3073,"stars":3078,"repoUrl":3079,"updatedAt":3080},"turborepo","manage monorepos with Turborepo","Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines,\ndependsOn, caching, remote cache, the \"turbo\" CLI, --filter, --affected, CI optimization, environment\nvariables, internal packages, monorepo structure\u002Fbest practices, and boundaries.\n\nUse when user: configures tasks\u002Fworkflows\u002Fpipelines, creates packages, sets up\nmonorepo, shares code between apps, runs changed\u002Faffected packages, debugs cache,\nor has apps\u002Fpackages directories.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3074,3075,3076],{"name":2994,"slug":2995,"type":15},{"name":2966,"slug":2967,"type":15},{"name":3077,"slug":3069,"type":15},"Turborepo",30809,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fturborepo","2026-07-30T05:32:14.920116",{"slug":3082,"name":3082,"fn":3083,"description":3084,"org":3085,"tags":3086,"stars":3094,"repoUrl":3095,"updatedAt":3096},"add-function-examples","add AI function examples for testing","Guide for adding new AI function examples, for testing specific features against the actual provider APIs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3087,3090,3093],{"name":3088,"slug":3089,"type":15},"AI SDK","ai-sdk",{"name":3091,"slug":3092,"type":15},"Testing","testing",{"name":9,"slug":8,"type":15},25670,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai","2026-04-06T18:55:51.318866",{"slug":3098,"name":3098,"fn":3099,"description":3100,"org":3101,"tags":3102,"stars":3094,"repoUrl":3095,"updatedAt":3110},"add-harness-package","add AI SDK harness packages","Guide for adding new AI SDK harness packages. Use when creating a new @ai-sdk\u002Fharness-\u003Cname> package that adapts a coding-agent runtime to HarnessV1.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3103,3104,3105,3108,3109],{"name":2977,"slug":2978,"type":15},{"name":3088,"slug":3089,"type":15},{"name":3106,"slug":3107,"type":15},"Harness","harness",{"name":2983,"slug":2984,"type":15},{"name":9,"slug":8,"type":15},"2026-06-18T08:29:19.858737",{"slug":3112,"name":3112,"fn":3113,"description":3114,"org":3115,"tags":3116,"stars":3094,"repoUrl":3095,"updatedAt":3122},"add-provider-package","add new provider packages to AI SDK","Guide for adding new AI provider packages to the AI SDK. Use when creating a new @ai-sdk\u002F\u003Cprovider> package to integrate an AI service into the SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3117,3118,3121],{"name":3088,"slug":3089,"type":15},{"name":3119,"slug":3120,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},"2026-04-06T18:55:47.45549",{"slug":3124,"name":3124,"fn":3125,"description":3126,"org":3127,"tags":3128,"stars":3094,"repoUrl":3095,"updatedAt":3141},"adr-skill","create and maintain architecture decision records","Create and maintain Architecture Decision Records (ADRs) optimized for agentic coding workflows. Use when you need to propose, write, update, accept\u002Freject, deprecate, or supersede an ADR; bootstrap an adr folder and index; consult existing ADRs before implementing changes; or enforce ADR conventions. This skill uses Socratic questioning to capture intent before drafting, and validates output against an agent-readiness checklist.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3129,3132,3135,3138],{"name":3130,"slug":3131,"type":15},"ADR","adr",{"name":3133,"slug":3134,"type":15},"Architecture","architecture",{"name":3136,"slug":3137,"type":15},"Documentation","documentation",{"name":3139,"slug":3140,"type":15},"Engineering","engineering","2026-04-06T18:55:50.043694",{"slug":3089,"name":3089,"fn":3143,"description":3144,"org":3145,"tags":3146,"stars":3094,"repoUrl":3095,"updatedAt":3151},"build AI features with Vercel AI SDK","Answer questions about the AI SDK and help build AI-powered features. Use when developers: (1) Ask about AI SDK functions like generateText, streamText, ToolLoopAgent, embed, or tools, (2) Want to build AI agents, chatbots, RAG systems, or text generation features, (3) Have questions about AI providers (OpenAI, Anthropic, Google, etc.), streaming, tool calling, structured output, or embeddings, (4) Use React hooks like useChat or useCompletion. Triggers on: \"AI SDK\", \"Vercel AI SDK\", \"generateText\", \"streamText\", \"add AI to my app\", \"build an agent\", \"tool calling\", \"structured output\", \"useChat\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3147,3148,3149,3150],{"name":2977,"slug":2978,"type":15},{"name":3088,"slug":3089,"type":15},{"name":2916,"slug":2917,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:48.739463",{"slug":3153,"name":3153,"fn":3154,"description":3155,"org":3156,"tags":3157,"stars":3094,"repoUrl":3095,"updatedAt":3161},"capture-api-response-test-fixture","capture API response test fixtures","Capture API response test fixture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3158,3159,3160],{"name":3119,"slug":3120,"type":15},{"name":3091,"slug":3092,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:56.374433",{"slug":3163,"name":3163,"fn":3164,"description":3165,"org":3166,"tags":3167,"stars":3094,"repoUrl":3095,"updatedAt":3171},"develop-ai-functions-example","develop AI SDK function examples","Develop examples for AI SDK functions. Use when creating, running, or modifying examples under examples\u002Fai-functions\u002Fsrc to validate provider support, demonstrate features, or create test fixtures.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3168,3169,3170],{"name":3088,"slug":3089,"type":15},{"name":3091,"slug":3092,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:55.088956",68]