[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vercel-deployments-cicd":3,"mdc--pa6359-key":34,"related-repo-vercel-deployments-cicd":3136,"related-org-vercel-deployments-cicd":3243},{"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},"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},"vercel","Vercel","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fvercel.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Operations","operations","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Deployment","deployment",{"name":21,"slug":22,"type":15},"CI\u002FCD","ci-cd",226,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fvercel-plugin","2026-04-06T18:56:22.054263",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\u002Fdeployments-cicd","---\nname: deployments-cicd\ndescription: 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.\nmetadata:\n  priority: 6\n  docs:\n    - \"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments\u002Foverview\"\n    - \"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fgit\"\n  sitemap: \"https:\u002F\u002Fvercel.com\u002Fsitemap\u002Fdocs.xml\"\n  pathPatterns:\n    - '.github\u002Fworkflows\u002F*.yml'\n    - '.github\u002Fworkflows\u002F*.yaml'\n    - '.gitlab-ci.yml'\n    - 'bitbucket-pipelines.yml'\n    - 'vercel.json'\n    - 'apps\u002F*\u002Fvercel.json'\n  bashPatterns:\n    - '\\bvercel\\s+deploy\\b'\n    - '\\bvercel\\s+--prod\\b'\n    - '\\bvercel\\s+promote\\b'\n    - '\\bvercel\\s+rollback\\b'\n    - '\\bvercel\\s+inspect\\b'\n    - '\\bvercel\\s+build\\b'\n    - '\\bvercel\\s+deploy\\s+--prebuilt\\b'\nvalidate:\n  -\n    pattern: 'cron:\\s*[''\"]|from\\s+[''\"](node-cron)[''\"]|cron\\.schedule\\('\n    message: 'Manual cron scheduling detected. Use Vercel Cron Jobs (vercel.json crons) for platform-native scheduled tasks.'\n    severity: recommended\n    skipIfFileContains: 'vercel\\.json.*crons|@vercel\u002Fcron'\nretrieval:\n  aliases:\n    - deploy\n    - ci cd\n    - continuous deployment\n    - release pipeline\n  intents:\n    - deploy to vercel\n    - set up ci cd\n    - promote deployment\n    - rollback deploy\n  entities:\n    - vercel deploy\n    - preview\n    - production\n    - rollback\n    - promote\n    - CI workflow\n---\n\n# Vercel Deployments & CI\u002FCD\n\nYou are an expert in Vercel deployment workflows — `vercel deploy`, `vercel promote`, `vercel rollback`, `vercel inspect`, `vercel build`, and CI\u002FCD pipeline integration with GitHub Actions, GitLab CI, and Bitbucket Pipelines.\n\n## Deployment Commands\n\n### Preview Deployment\n\n```bash\n# Deploy from project root (creates preview URL)\nvercel\n\n# Equivalent explicit form\nvercel deploy\n```\n\nPreview deployments are created automatically for every push to a non-production branch when using Git integration. They provide a unique URL for testing.\n\n### Production Deployment\n\n```bash\n# Deploy directly to production\nvercel --prod\nvercel deploy --prod\n\n# Force a new deployment (skip cache)\nvercel --prod --force\n```\n\n### Build Locally, Deploy Build Output\n\n```bash\n# Build locally (uses development env vars by default)\nvercel build\n\n# Build with production env vars\nvercel build --prod\n\n# Deploy only the build output (no remote build)\nvercel deploy --prebuilt\nvercel deploy --prebuilt --prod\n```\n\n**When to use `--prebuilt`:** Custom CI pipelines where you control the build step, need build caching at the CI level, or need to run tests between build and deploy.\n\n### Promote & Rollback\n\n```bash\n# Promote a preview deployment to production\nvercel promote \u003Cdeployment-url-or-id>\n\n# Rollback to the previous production deployment\nvercel rollback\n\n# Rollback to a specific deployment\nvercel rollback \u003Cdeployment-url-or-id>\n```\n\n**Promote vs deploy --prod:** `promote` is instant — it re-points the production alias without rebuilding. Use it when a preview deployment has been validated and is ready for production.\n\n### Inspect Deployments\n\n```bash\n# View deployment details (build info, functions, metadata)\nvercel inspect \u003Cdeployment-url>\n\n# List recent deployments\nvercel ls\n\n# View logs for a deployment\nvercel logs \u003Cdeployment-url>\nvercel logs \u003Cdeployment-url> --follow\n```\n\n## CI\u002FCD Integration\n\n### Required Environment Variables\n\nEvery CI pipeline needs these three variables:\n\n```bash\nVERCEL_TOKEN=\u003Cyour-token>        # Personal or team token\nVERCEL_ORG_ID=\u003Corg-id>           # From .vercel\u002Fproject.json\nVERCEL_PROJECT_ID=\u003Cproject-id>   # From .vercel\u002Fproject.json\n```\n\nSet these as secrets in your CI provider. Never commit them to source control.\n\n### GitHub Actions\n\n```yaml\nname: Deploy to Vercel\non:\n  push:\n    branches: [main]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Install Vercel CLI\n        run: npm install -g vercel\n\n      - name: Pull Vercel Environment\n        run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }}\n\n      - name: Build\n        run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }}\n\n      - name: Deploy\n        run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }}\n```\n\n### OIDC Federation (Secure Backend Access)\n\nVercel OIDC federation is for **secure backend access** — letting your deployed Vercel functions authenticate with third-party services (AWS, GCP, HashiCorp Vault) without storing long-lived secrets. It does **not** replace `VERCEL_TOKEN` for CLI deployments.\n\n**What OIDC does:** Your Vercel function requests a short-lived OIDC token from Vercel at runtime, then exchanges it with an external provider's STS\u002Ftoken endpoint for scoped credentials.\n\n**What OIDC does not do:** Authenticate the Vercel CLI in CI pipelines. All `vercel pull`, `vercel build`, and `vercel deploy` commands still require `--token=${{ secrets.VERCEL_TOKEN }}`.\n\n**When to use OIDC:**\n- Serverless functions that need to call AWS APIs (S3, DynamoDB, SQS)\n- Functions authenticating to GCP services via Workload Identity Federation\n- Any runtime service-to-service auth where you want to avoid storing static secrets in Vercel env vars\n\n### GitLab CI\n\n```yaml\ndeploy:\n  image: node:20\n  stage: deploy\n  script:\n    - npm install -g vercel\n    - vercel pull --yes --environment=production --token=$VERCEL_TOKEN\n    - vercel build --prod --token=$VERCEL_TOKEN\n    - vercel deploy --prebuilt --prod --token=$VERCEL_TOKEN\n  only:\n    - main\n```\n\n### Bitbucket Pipelines\n\n```yaml\npipelines:\n  branches:\n    main:\n      - step:\n          name: Deploy to Vercel\n          image: node:20\n          script:\n            - npm install -g vercel\n            - vercel pull --yes --environment=production --token=$VERCEL_TOKEN\n            - vercel build --prod --token=$VERCEL_TOKEN\n            - vercel deploy --prebuilt --prod --token=$VERCEL_TOKEN\n```\n\n## Common CI Patterns\n\n### Preview Deployments on PRs\n\n```yaml\n# GitHub Actions\non:\n  pull_request:\n    types: [opened, synchronize]\n\njobs:\n  preview:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - run: npm install -g vercel\n      - run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }}\n      - run: vercel build --token=${{ secrets.VERCEL_TOKEN }}\n      - id: deploy\n        run: echo \"url=$(vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }})\" >> $GITHUB_OUTPUT\n      - name: Comment PR\n        uses: actions\u002Fgithub-script@v7\n        with:\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: `Preview: ${{ steps.deploy.outputs.url }}`\n            })\n```\n\n### Promote After Tests Pass\n\n```yaml\njobs:\n  deploy-preview:\n    # ... deploy preview ...\n    outputs:\n      url: ${{ steps.deploy.outputs.url }}\n\n  e2e-tests:\n    needs: deploy-preview\n    runs-on: ubuntu-latest\n    steps:\n      - run: npx playwright test --base-url=${{ needs.deploy-preview.outputs.url }}\n\n  promote:\n    needs: [deploy-preview, e2e-tests]\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs\u002Fheads\u002Fmain'\n    steps:\n      - run: npm install -g vercel\n      - run: vercel promote ${{ needs.deploy-preview.outputs.url }} --token=${{ secrets.VERCEL_TOKEN }}\n```\n\n## Global CLI Flags for CI\n\n| Flag | Purpose |\n|------|---------|\n| `--token \u003Ctoken>` | Authenticate (required in CI) |\n| `--yes` \u002F `-y` | Skip confirmation prompts |\n| `--scope \u003Cteam>` | Execute as a specific team |\n| `--cwd \u003Cdir>` | Set working directory |\n\n## Best Practices\n\n1. **Always use `--prebuilt` in CI** — separates build from deploy, enables build caching and test gates\n2. **Use `vercel pull` before build** — ensures correct env vars and project settings\n3. **Prefer `promote` over re-deploy** — instant, no rebuild, same artifact\n4. **Use OIDC federation for runtime backend access** — lets Vercel functions auth to AWS\u002FGCP without static secrets (does not replace `VERCEL_TOKEN` for CLI)\n5. **Pin the Vercel CLI version in CI** — `npm install -g vercel@latest` can break unexpectedly\n6. **Add `--yes` flag in CI** — prevents interactive prompts from hanging pipelines\n\n## Deployment Strategy Matrix\n\n| Scenario | Strategy | Commands |\n|----------|----------|----------|\n| Standard team workflow | Git-push deploy | Push to main\u002Ffeature branches |\n| Custom CI\u002FCD (Actions, CircleCI) | Prebuilt deploy | `vercel build && vercel deploy --prebuilt` |\n| Monorepo with Turborepo | Affected + remote cache | `turbo run build --affected --remote-cache` |\n| Preview for every PR | Default behavior | Auto-creates preview URL per branch |\n| Promote preview to production | CLI promotion | `vercel promote \u003Curl>` |\n| Atomic deploys with DB migrations | Two-phase | Run migration → verify → `vercel promote` |\n| Edge-first architecture | Edge Functions | Set `runtime: 'edge'` in route config |\n\n## Common Build Errors\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| `ERR_PNPM_OUTDATED_LOCKFILE` | Lockfile doesn't match package.json | Run `pnpm install`, commit lockfile |\n| `NEXT_NOT_FOUND` | Root directory misconfigured | Set `rootDirectory` in Project Settings |\n| `Invalid next.config.js` | Config syntax error | Validate config locally with `next build` |\n| `functions\u002Fapi\u002F*.js` mismatch | Wrong file structure | Move to `app\u002Fapi\u002F` directory (App Router) |\n| `Error: EPERM` | File permission issue in build | Don't `chmod` in build scripts; use postinstall |\n\n## Deploy Summary Format\n\nPresent a structured deploy result block:\n\n```\n## Deploy Result\n- **URL**: \u003Cdeployment-url>\n- **Target**: production | preview\n- **Status**: READY | ERROR | BUILDING | QUEUED\n- **Commit**: \u003Cshort-sha>\n- **Framework**: \u003Cdetected-framework>\n- **Build Duration**: \u003Cduration>\n```\n\nIf the deployment failed, append:\n\n```\n- **Error**: \u003Csummary of failure from logs>\n```\n\nFor production deploys, also include:\n\n```\n### Post-Deploy Observability\n- **Error scan**: \u003CN errors found \u002F clean> (scanned via vercel logs --level error --since 1h)\n- **Drains**: \u003CN configured \u002F none>\n- **Monitoring**: \u003Cactive \u002F gaps identified>\n```\n\n## Deploy Next Steps\n\nBased on the deployment outcome:\n\n- **Success (preview)** → \"Visit the preview URL to verify. When ready, run `\u002Fdeploy prod` to promote to production.\"\n- **Success (production)** → \"Your production site is live. Run `\u002Fstatus` to see the full project overview.\"\n- **Build error** → \"Check the build logs above. Common fixes: verify `build` script in package.json, check for missing env vars with `\u002Fenv list`, ensure dependencies are installed.\"\n- **Missing env vars** → \"Run `\u002Fenv pull` to sync environment variables locally, or `\u002Fenv list` to review what's configured on Vercel.\"\n- **Monorepo issues** → \"Ensure the correct project root is configured in Vercel project settings. Check `vercel.json` for `rootDirectory`.\"\n- **Post-deploy errors detected** → \"Review errors above. Check `vercel logs \u003Curl> --level error` for details. If drains are configured, correlate with external monitoring.\"\n- **No monitoring configured** → \"Set up drains or install an error tracking integration before the next production deploy. Run `\u002Fstatus` for a full observability diagnostic.\"\n\n## Official Documentation\n\n- [Deployments](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments)\n- [Vercel CLI](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcli)\n- [GitHub Actions](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments\u002Fgit\u002Fvercel-for-github)\n- [GitLab CI](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments\u002Fgit\u002Fvercel-for-gitlab)\n- [Bitbucket Pipelines](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments\u002Fgit\u002Fvercel-for-bitbucket)\n- [OIDC Federation](https:\u002F\u002Fvercel.com\u002Fdocs\u002Foidc)\n",{"data":35,"body":81},{"name":4,"description":6,"metadata":36,"validate":57,"retrieval":63},{"priority":37,"docs":38,"sitemap":41,"pathPatterns":42,"bashPatterns":49},6,[39,40],"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments\u002Foverview","https:\u002F\u002Fvercel.com\u002Fdocs\u002Fgit","https:\u002F\u002Fvercel.com\u002Fsitemap\u002Fdocs.xml",[43,44,45,46,47,48],".github\u002Fworkflows\u002F*.yml",".github\u002Fworkflows\u002F*.yaml",".gitlab-ci.yml","bitbucket-pipelines.yml","vercel.json","apps\u002F*\u002Fvercel.json",[50,51,52,53,54,55,56],"\\bvercel\\s+deploy\\b","\\bvercel\\s+--prod\\b","\\bvercel\\s+promote\\b","\\bvercel\\s+rollback\\b","\\bvercel\\s+inspect\\b","\\bvercel\\s+build\\b","\\bvercel\\s+deploy\\s+--prebuilt\\b",[58],{"pattern":59,"message":60,"severity":61,"skipIfFileContains":62},"cron:\\s*['\"]|from\\s+['\"](node-cron)['\"]|cron\\.schedule\\(","Manual cron scheduling detected. Use Vercel Cron Jobs (vercel.json crons) for platform-native scheduled tasks.","recommended","vercel\\.json.*crons|@vercel\u002Fcron",{"aliases":64,"intents":69,"entities":74},[65,66,67,68],"deploy","ci cd","continuous deployment","release pipeline",[70,71,72,73],"deploy to vercel","set up ci cd","promote deployment","rollback deploy",[75,76,77,78,79,80],"vercel deploy","preview","production","rollback","promote","CI workflow",{"type":82,"children":83},"root",[84,93,136,143,150,216,221,227,302,308,420,439,445,564,581,587,735,741,747,752,838,843,849,1198,1204,1230,1240,1279,1287,1307,1313,1448,1454,1602,1608,1614,1975,1981,2264,2270,2374,2380,2487,2493,2671,2677,2853,2859,2864,2874,2879,2888,2893,2902,2908,2913,3062,3068,3130],{"type":85,"tag":86,"props":87,"children":89},"element","h1",{"id":88},"vercel-deployments-cicd",[90],{"type":91,"value":92},"text","Vercel Deployments & CI\u002FCD",{"type":85,"tag":94,"props":95,"children":96},"p",{},[97,99,105,107,113,114,120,121,127,128,134],{"type":91,"value":98},"You are an expert in Vercel deployment workflows — ",{"type":85,"tag":100,"props":101,"children":103},"code",{"className":102},[],[104],{"type":91,"value":75},{"type":91,"value":106},", ",{"type":85,"tag":100,"props":108,"children":110},{"className":109},[],[111],{"type":91,"value":112},"vercel promote",{"type":91,"value":106},{"type":85,"tag":100,"props":115,"children":117},{"className":116},[],[118],{"type":91,"value":119},"vercel rollback",{"type":91,"value":106},{"type":85,"tag":100,"props":122,"children":124},{"className":123},[],[125],{"type":91,"value":126},"vercel inspect",{"type":91,"value":106},{"type":85,"tag":100,"props":129,"children":131},{"className":130},[],[132],{"type":91,"value":133},"vercel build",{"type":91,"value":135},", and CI\u002FCD pipeline integration with GitHub Actions, GitLab CI, and Bitbucket Pipelines.",{"type":85,"tag":137,"props":138,"children":140},"h2",{"id":139},"deployment-commands",[141],{"type":91,"value":142},"Deployment Commands",{"type":85,"tag":144,"props":145,"children":147},"h3",{"id":146},"preview-deployment",[148],{"type":91,"value":149},"Preview Deployment",{"type":85,"tag":151,"props":152,"children":157},"pre",{"className":153,"code":154,"language":155,"meta":156,"style":156},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Deploy from project root (creates preview URL)\nvercel\n\n# Equivalent explicit form\nvercel deploy\n","bash","",[158],{"type":85,"tag":100,"props":159,"children":160},{"__ignoreMap":156},[161,173,183,193,202],{"type":85,"tag":162,"props":163,"children":166},"span",{"class":164,"line":165},"line",1,[167],{"type":85,"tag":162,"props":168,"children":170},{"style":169},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[171],{"type":91,"value":172},"# Deploy from project root (creates preview URL)\n",{"type":85,"tag":162,"props":174,"children":176},{"class":164,"line":175},2,[177],{"type":85,"tag":162,"props":178,"children":180},{"style":179},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[181],{"type":91,"value":182},"vercel\n",{"type":85,"tag":162,"props":184,"children":186},{"class":164,"line":185},3,[187],{"type":85,"tag":162,"props":188,"children":190},{"emptyLinePlaceholder":189},true,[191],{"type":91,"value":192},"\n",{"type":85,"tag":162,"props":194,"children":196},{"class":164,"line":195},4,[197],{"type":85,"tag":162,"props":198,"children":199},{"style":169},[200],{"type":91,"value":201},"# Equivalent explicit form\n",{"type":85,"tag":162,"props":203,"children":205},{"class":164,"line":204},5,[206,210],{"type":85,"tag":162,"props":207,"children":208},{"style":179},[209],{"type":91,"value":8},{"type":85,"tag":162,"props":211,"children":213},{"style":212},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[214],{"type":91,"value":215}," deploy\n",{"type":85,"tag":94,"props":217,"children":218},{},[219],{"type":91,"value":220},"Preview deployments are created automatically for every push to a non-production branch when using Git integration. They provide a unique URL for testing.",{"type":85,"tag":144,"props":222,"children":224},{"id":223},"production-deployment",[225],{"type":91,"value":226},"Production Deployment",{"type":85,"tag":151,"props":228,"children":230},{"className":153,"code":229,"language":155,"meta":156,"style":156},"# Deploy directly to production\nvercel --prod\nvercel deploy --prod\n\n# Force a new deployment (skip cache)\nvercel --prod --force\n",[231],{"type":85,"tag":100,"props":232,"children":233},{"__ignoreMap":156},[234,242,254,270,277,285],{"type":85,"tag":162,"props":235,"children":236},{"class":164,"line":165},[237],{"type":85,"tag":162,"props":238,"children":239},{"style":169},[240],{"type":91,"value":241},"# Deploy directly to production\n",{"type":85,"tag":162,"props":243,"children":244},{"class":164,"line":175},[245,249],{"type":85,"tag":162,"props":246,"children":247},{"style":179},[248],{"type":91,"value":8},{"type":85,"tag":162,"props":250,"children":251},{"style":212},[252],{"type":91,"value":253}," --prod\n",{"type":85,"tag":162,"props":255,"children":256},{"class":164,"line":185},[257,261,266],{"type":85,"tag":162,"props":258,"children":259},{"style":179},[260],{"type":91,"value":8},{"type":85,"tag":162,"props":262,"children":263},{"style":212},[264],{"type":91,"value":265}," deploy",{"type":85,"tag":162,"props":267,"children":268},{"style":212},[269],{"type":91,"value":253},{"type":85,"tag":162,"props":271,"children":272},{"class":164,"line":195},[273],{"type":85,"tag":162,"props":274,"children":275},{"emptyLinePlaceholder":189},[276],{"type":91,"value":192},{"type":85,"tag":162,"props":278,"children":279},{"class":164,"line":204},[280],{"type":85,"tag":162,"props":281,"children":282},{"style":169},[283],{"type":91,"value":284},"# Force a new deployment (skip cache)\n",{"type":85,"tag":162,"props":286,"children":287},{"class":164,"line":37},[288,292,297],{"type":85,"tag":162,"props":289,"children":290},{"style":179},[291],{"type":91,"value":8},{"type":85,"tag":162,"props":293,"children":294},{"style":212},[295],{"type":91,"value":296}," --prod",{"type":85,"tag":162,"props":298,"children":299},{"style":212},[300],{"type":91,"value":301}," --force\n",{"type":85,"tag":144,"props":303,"children":305},{"id":304},"build-locally-deploy-build-output",[306],{"type":91,"value":307},"Build Locally, Deploy Build Output",{"type":85,"tag":151,"props":309,"children":311},{"className":153,"code":310,"language":155,"meta":156,"style":156},"# Build locally (uses development env vars by default)\nvercel build\n\n# Build with production env vars\nvercel build --prod\n\n# Deploy only the build output (no remote build)\nvercel deploy --prebuilt\nvercel deploy --prebuilt --prod\n",[312],{"type":85,"tag":100,"props":313,"children":314},{"__ignoreMap":156},[315,323,335,342,350,366,373,382,399],{"type":85,"tag":162,"props":316,"children":317},{"class":164,"line":165},[318],{"type":85,"tag":162,"props":319,"children":320},{"style":169},[321],{"type":91,"value":322},"# Build locally (uses development env vars by default)\n",{"type":85,"tag":162,"props":324,"children":325},{"class":164,"line":175},[326,330],{"type":85,"tag":162,"props":327,"children":328},{"style":179},[329],{"type":91,"value":8},{"type":85,"tag":162,"props":331,"children":332},{"style":212},[333],{"type":91,"value":334}," build\n",{"type":85,"tag":162,"props":336,"children":337},{"class":164,"line":185},[338],{"type":85,"tag":162,"props":339,"children":340},{"emptyLinePlaceholder":189},[341],{"type":91,"value":192},{"type":85,"tag":162,"props":343,"children":344},{"class":164,"line":195},[345],{"type":85,"tag":162,"props":346,"children":347},{"style":169},[348],{"type":91,"value":349},"# Build with production env vars\n",{"type":85,"tag":162,"props":351,"children":352},{"class":164,"line":204},[353,357,362],{"type":85,"tag":162,"props":354,"children":355},{"style":179},[356],{"type":91,"value":8},{"type":85,"tag":162,"props":358,"children":359},{"style":212},[360],{"type":91,"value":361}," build",{"type":85,"tag":162,"props":363,"children":364},{"style":212},[365],{"type":91,"value":253},{"type":85,"tag":162,"props":367,"children":368},{"class":164,"line":37},[369],{"type":85,"tag":162,"props":370,"children":371},{"emptyLinePlaceholder":189},[372],{"type":91,"value":192},{"type":85,"tag":162,"props":374,"children":376},{"class":164,"line":375},7,[377],{"type":85,"tag":162,"props":378,"children":379},{"style":169},[380],{"type":91,"value":381},"# Deploy only the build output (no remote build)\n",{"type":85,"tag":162,"props":383,"children":385},{"class":164,"line":384},8,[386,390,394],{"type":85,"tag":162,"props":387,"children":388},{"style":179},[389],{"type":91,"value":8},{"type":85,"tag":162,"props":391,"children":392},{"style":212},[393],{"type":91,"value":265},{"type":85,"tag":162,"props":395,"children":396},{"style":212},[397],{"type":91,"value":398}," --prebuilt\n",{"type":85,"tag":162,"props":400,"children":402},{"class":164,"line":401},9,[403,407,411,416],{"type":85,"tag":162,"props":404,"children":405},{"style":179},[406],{"type":91,"value":8},{"type":85,"tag":162,"props":408,"children":409},{"style":212},[410],{"type":91,"value":265},{"type":85,"tag":162,"props":412,"children":413},{"style":212},[414],{"type":91,"value":415}," --prebuilt",{"type":85,"tag":162,"props":417,"children":418},{"style":212},[419],{"type":91,"value":253},{"type":85,"tag":94,"props":421,"children":422},{},[423,437],{"type":85,"tag":424,"props":425,"children":426},"strong",{},[427,429,435],{"type":91,"value":428},"When to use ",{"type":85,"tag":100,"props":430,"children":432},{"className":431},[],[433],{"type":91,"value":434},"--prebuilt",{"type":91,"value":436},":",{"type":91,"value":438}," Custom CI pipelines where you control the build step, need build caching at the CI level, or need to run tests between build and deploy.",{"type":85,"tag":144,"props":440,"children":442},{"id":441},"promote-rollback",[443],{"type":91,"value":444},"Promote & Rollback",{"type":85,"tag":151,"props":446,"children":448},{"className":153,"code":447,"language":155,"meta":156,"style":156},"# Promote a preview deployment to production\nvercel promote \u003Cdeployment-url-or-id>\n\n# Rollback to the previous production deployment\nvercel rollback\n\n# Rollback to a specific deployment\nvercel rollback \u003Cdeployment-url-or-id>\n",[449],{"type":85,"tag":100,"props":450,"children":451},{"__ignoreMap":156},[452,460,494,501,509,521,528,536],{"type":85,"tag":162,"props":453,"children":454},{"class":164,"line":165},[455],{"type":85,"tag":162,"props":456,"children":457},{"style":169},[458],{"type":91,"value":459},"# Promote a preview deployment to production\n",{"type":85,"tag":162,"props":461,"children":462},{"class":164,"line":175},[463,467,472,478,483,489],{"type":85,"tag":162,"props":464,"children":465},{"style":179},[466],{"type":91,"value":8},{"type":85,"tag":162,"props":468,"children":469},{"style":212},[470],{"type":91,"value":471}," promote",{"type":85,"tag":162,"props":473,"children":475},{"style":474},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[476],{"type":91,"value":477}," \u003C",{"type":85,"tag":162,"props":479,"children":480},{"style":212},[481],{"type":91,"value":482},"deployment-url-or-i",{"type":85,"tag":162,"props":484,"children":486},{"style":485},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[487],{"type":91,"value":488},"d",{"type":85,"tag":162,"props":490,"children":491},{"style":474},[492],{"type":91,"value":493},">\n",{"type":85,"tag":162,"props":495,"children":496},{"class":164,"line":185},[497],{"type":85,"tag":162,"props":498,"children":499},{"emptyLinePlaceholder":189},[500],{"type":91,"value":192},{"type":85,"tag":162,"props":502,"children":503},{"class":164,"line":195},[504],{"type":85,"tag":162,"props":505,"children":506},{"style":169},[507],{"type":91,"value":508},"# Rollback to the previous production deployment\n",{"type":85,"tag":162,"props":510,"children":511},{"class":164,"line":204},[512,516],{"type":85,"tag":162,"props":513,"children":514},{"style":179},[515],{"type":91,"value":8},{"type":85,"tag":162,"props":517,"children":518},{"style":212},[519],{"type":91,"value":520}," rollback\n",{"type":85,"tag":162,"props":522,"children":523},{"class":164,"line":37},[524],{"type":85,"tag":162,"props":525,"children":526},{"emptyLinePlaceholder":189},[527],{"type":91,"value":192},{"type":85,"tag":162,"props":529,"children":530},{"class":164,"line":375},[531],{"type":85,"tag":162,"props":532,"children":533},{"style":169},[534],{"type":91,"value":535},"# Rollback to a specific deployment\n",{"type":85,"tag":162,"props":537,"children":538},{"class":164,"line":384},[539,543,548,552,556,560],{"type":85,"tag":162,"props":540,"children":541},{"style":179},[542],{"type":91,"value":8},{"type":85,"tag":162,"props":544,"children":545},{"style":212},[546],{"type":91,"value":547}," rollback",{"type":85,"tag":162,"props":549,"children":550},{"style":474},[551],{"type":91,"value":477},{"type":85,"tag":162,"props":553,"children":554},{"style":212},[555],{"type":91,"value":482},{"type":85,"tag":162,"props":557,"children":558},{"style":485},[559],{"type":91,"value":488},{"type":85,"tag":162,"props":561,"children":562},{"style":474},[563],{"type":91,"value":493},{"type":85,"tag":94,"props":565,"children":566},{},[567,572,574,579],{"type":85,"tag":424,"props":568,"children":569},{},[570],{"type":91,"value":571},"Promote vs deploy --prod:",{"type":91,"value":573}," ",{"type":85,"tag":100,"props":575,"children":577},{"className":576},[],[578],{"type":91,"value":79},{"type":91,"value":580}," is instant — it re-points the production alias without rebuilding. Use it when a preview deployment has been validated and is ready for production.",{"type":85,"tag":144,"props":582,"children":584},{"id":583},"inspect-deployments",[585],{"type":91,"value":586},"Inspect Deployments",{"type":85,"tag":151,"props":588,"children":590},{"className":153,"code":589,"language":155,"meta":156,"style":156},"# View deployment details (build info, functions, metadata)\nvercel inspect \u003Cdeployment-url>\n\n# List recent deployments\nvercel ls\n\n# View logs for a deployment\nvercel logs \u003Cdeployment-url>\nvercel logs \u003Cdeployment-url> --follow\n",[591],{"type":85,"tag":100,"props":592,"children":593},{"__ignoreMap":156},[594,602,632,639,647,659,666,674,702],{"type":85,"tag":162,"props":595,"children":596},{"class":164,"line":165},[597],{"type":85,"tag":162,"props":598,"children":599},{"style":169},[600],{"type":91,"value":601},"# View deployment details (build info, functions, metadata)\n",{"type":85,"tag":162,"props":603,"children":604},{"class":164,"line":175},[605,609,614,618,623,628],{"type":85,"tag":162,"props":606,"children":607},{"style":179},[608],{"type":91,"value":8},{"type":85,"tag":162,"props":610,"children":611},{"style":212},[612],{"type":91,"value":613}," inspect",{"type":85,"tag":162,"props":615,"children":616},{"style":474},[617],{"type":91,"value":477},{"type":85,"tag":162,"props":619,"children":620},{"style":212},[621],{"type":91,"value":622},"deployment-ur",{"type":85,"tag":162,"props":624,"children":625},{"style":485},[626],{"type":91,"value":627},"l",{"type":85,"tag":162,"props":629,"children":630},{"style":474},[631],{"type":91,"value":493},{"type":85,"tag":162,"props":633,"children":634},{"class":164,"line":185},[635],{"type":85,"tag":162,"props":636,"children":637},{"emptyLinePlaceholder":189},[638],{"type":91,"value":192},{"type":85,"tag":162,"props":640,"children":641},{"class":164,"line":195},[642],{"type":85,"tag":162,"props":643,"children":644},{"style":169},[645],{"type":91,"value":646},"# List recent deployments\n",{"type":85,"tag":162,"props":648,"children":649},{"class":164,"line":204},[650,654],{"type":85,"tag":162,"props":651,"children":652},{"style":179},[653],{"type":91,"value":8},{"type":85,"tag":162,"props":655,"children":656},{"style":212},[657],{"type":91,"value":658}," ls\n",{"type":85,"tag":162,"props":660,"children":661},{"class":164,"line":37},[662],{"type":85,"tag":162,"props":663,"children":664},{"emptyLinePlaceholder":189},[665],{"type":91,"value":192},{"type":85,"tag":162,"props":667,"children":668},{"class":164,"line":375},[669],{"type":85,"tag":162,"props":670,"children":671},{"style":169},[672],{"type":91,"value":673},"# View logs for a deployment\n",{"type":85,"tag":162,"props":675,"children":676},{"class":164,"line":384},[677,681,686,690,694,698],{"type":85,"tag":162,"props":678,"children":679},{"style":179},[680],{"type":91,"value":8},{"type":85,"tag":162,"props":682,"children":683},{"style":212},[684],{"type":91,"value":685}," logs",{"type":85,"tag":162,"props":687,"children":688},{"style":474},[689],{"type":91,"value":477},{"type":85,"tag":162,"props":691,"children":692},{"style":212},[693],{"type":91,"value":622},{"type":85,"tag":162,"props":695,"children":696},{"style":485},[697],{"type":91,"value":627},{"type":85,"tag":162,"props":699,"children":700},{"style":474},[701],{"type":91,"value":493},{"type":85,"tag":162,"props":703,"children":704},{"class":164,"line":401},[705,709,713,717,721,725,730],{"type":85,"tag":162,"props":706,"children":707},{"style":179},[708],{"type":91,"value":8},{"type":85,"tag":162,"props":710,"children":711},{"style":212},[712],{"type":91,"value":685},{"type":85,"tag":162,"props":714,"children":715},{"style":474},[716],{"type":91,"value":477},{"type":85,"tag":162,"props":718,"children":719},{"style":212},[720],{"type":91,"value":622},{"type":85,"tag":162,"props":722,"children":723},{"style":485},[724],{"type":91,"value":627},{"type":85,"tag":162,"props":726,"children":727},{"style":474},[728],{"type":91,"value":729},">",{"type":85,"tag":162,"props":731,"children":732},{"style":212},[733],{"type":91,"value":734}," --follow\n",{"type":85,"tag":137,"props":736,"children":738},{"id":737},"cicd-integration",[739],{"type":91,"value":740},"CI\u002FCD Integration",{"type":85,"tag":144,"props":742,"children":744},{"id":743},"required-environment-variables",[745],{"type":91,"value":746},"Required Environment Variables",{"type":85,"tag":94,"props":748,"children":749},{},[750],{"type":91,"value":751},"Every CI pipeline needs these three variables:",{"type":85,"tag":151,"props":753,"children":755},{"className":153,"code":754,"language":155,"meta":156,"style":156},"VERCEL_TOKEN=\u003Cyour-token>        # Personal or team token\nVERCEL_ORG_ID=\u003Corg-id>           # From .vercel\u002Fproject.json\nVERCEL_PROJECT_ID=\u003Cproject-id>   # From .vercel\u002Fproject.json\n",[756],{"type":85,"tag":100,"props":757,"children":758},{"__ignoreMap":156},[759,786,812],{"type":85,"tag":162,"props":760,"children":761},{"class":164,"line":165},[762,767,772,777,781],{"type":85,"tag":162,"props":763,"children":764},{"style":485},[765],{"type":91,"value":766},"VERCEL_TOKEN",{"type":85,"tag":162,"props":768,"children":769},{"style":474},[770],{"type":91,"value":771},"=\u003C",{"type":85,"tag":162,"props":773,"children":774},{"style":212},[775],{"type":91,"value":776},"your-token",{"type":85,"tag":162,"props":778,"children":779},{"style":474},[780],{"type":91,"value":729},{"type":85,"tag":162,"props":782,"children":783},{"style":169},[784],{"type":91,"value":785},"        # Personal or team token\n",{"type":85,"tag":162,"props":787,"children":788},{"class":164,"line":175},[789,794,798,803,807],{"type":85,"tag":162,"props":790,"children":791},{"style":485},[792],{"type":91,"value":793},"VERCEL_ORG_ID",{"type":85,"tag":162,"props":795,"children":796},{"style":474},[797],{"type":91,"value":771},{"type":85,"tag":162,"props":799,"children":800},{"style":212},[801],{"type":91,"value":802},"org-id",{"type":85,"tag":162,"props":804,"children":805},{"style":474},[806],{"type":91,"value":729},{"type":85,"tag":162,"props":808,"children":809},{"style":169},[810],{"type":91,"value":811},"           # From .vercel\u002Fproject.json\n",{"type":85,"tag":162,"props":813,"children":814},{"class":164,"line":185},[815,820,824,829,833],{"type":85,"tag":162,"props":816,"children":817},{"style":485},[818],{"type":91,"value":819},"VERCEL_PROJECT_ID",{"type":85,"tag":162,"props":821,"children":822},{"style":474},[823],{"type":91,"value":771},{"type":85,"tag":162,"props":825,"children":826},{"style":212},[827],{"type":91,"value":828},"project-id",{"type":85,"tag":162,"props":830,"children":831},{"style":474},[832],{"type":91,"value":729},{"type":85,"tag":162,"props":834,"children":835},{"style":169},[836],{"type":91,"value":837},"   # From .vercel\u002Fproject.json\n",{"type":85,"tag":94,"props":839,"children":840},{},[841],{"type":91,"value":842},"Set these as secrets in your CI provider. Never commit them to source control.",{"type":85,"tag":144,"props":844,"children":846},{"id":845},"github-actions",[847],{"type":91,"value":848},"GitHub Actions",{"type":85,"tag":151,"props":850,"children":854},{"className":851,"code":852,"language":853,"meta":156,"style":156},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: Deploy to Vercel\non:\n  push:\n    branches: [main]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Install Vercel CLI\n        run: npm install -g vercel\n\n      - name: Pull Vercel Environment\n        run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }}\n\n      - name: Build\n        run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }}\n\n      - name: Deploy\n        run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }}\n","yaml",[855],{"type":85,"tag":100,"props":856,"children":857},{"__ignoreMap":156},[858,876,890,902,929,936,948,960,977,989,1012,1020,1042,1060,1068,1089,1106,1114,1135,1152,1160,1181],{"type":85,"tag":162,"props":859,"children":860},{"class":164,"line":165},[861,867,871],{"type":85,"tag":162,"props":862,"children":864},{"style":863},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[865],{"type":91,"value":866},"name",{"type":85,"tag":162,"props":868,"children":869},{"style":474},[870],{"type":91,"value":436},{"type":85,"tag":162,"props":872,"children":873},{"style":212},[874],{"type":91,"value":875}," Deploy to Vercel\n",{"type":85,"tag":162,"props":877,"children":878},{"class":164,"line":175},[879,885],{"type":85,"tag":162,"props":880,"children":882},{"style":881},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[883],{"type":91,"value":884},"on",{"type":85,"tag":162,"props":886,"children":887},{"style":474},[888],{"type":91,"value":889},":\n",{"type":85,"tag":162,"props":891,"children":892},{"class":164,"line":185},[893,898],{"type":85,"tag":162,"props":894,"children":895},{"style":863},[896],{"type":91,"value":897},"  push",{"type":85,"tag":162,"props":899,"children":900},{"style":474},[901],{"type":91,"value":889},{"type":85,"tag":162,"props":903,"children":904},{"class":164,"line":195},[905,910,914,919,924],{"type":85,"tag":162,"props":906,"children":907},{"style":863},[908],{"type":91,"value":909},"    branches",{"type":85,"tag":162,"props":911,"children":912},{"style":474},[913],{"type":91,"value":436},{"type":85,"tag":162,"props":915,"children":916},{"style":474},[917],{"type":91,"value":918}," [",{"type":85,"tag":162,"props":920,"children":921},{"style":212},[922],{"type":91,"value":923},"main",{"type":85,"tag":162,"props":925,"children":926},{"style":474},[927],{"type":91,"value":928},"]\n",{"type":85,"tag":162,"props":930,"children":931},{"class":164,"line":204},[932],{"type":85,"tag":162,"props":933,"children":934},{"emptyLinePlaceholder":189},[935],{"type":91,"value":192},{"type":85,"tag":162,"props":937,"children":938},{"class":164,"line":37},[939,944],{"type":85,"tag":162,"props":940,"children":941},{"style":863},[942],{"type":91,"value":943},"jobs",{"type":85,"tag":162,"props":945,"children":946},{"style":474},[947],{"type":91,"value":889},{"type":85,"tag":162,"props":949,"children":950},{"class":164,"line":375},[951,956],{"type":85,"tag":162,"props":952,"children":953},{"style":863},[954],{"type":91,"value":955},"  deploy",{"type":85,"tag":162,"props":957,"children":958},{"style":474},[959],{"type":91,"value":889},{"type":85,"tag":162,"props":961,"children":962},{"class":164,"line":384},[963,968,972],{"type":85,"tag":162,"props":964,"children":965},{"style":863},[966],{"type":91,"value":967},"    runs-on",{"type":85,"tag":162,"props":969,"children":970},{"style":474},[971],{"type":91,"value":436},{"type":85,"tag":162,"props":973,"children":974},{"style":212},[975],{"type":91,"value":976}," ubuntu-latest\n",{"type":85,"tag":162,"props":978,"children":979},{"class":164,"line":401},[980,985],{"type":85,"tag":162,"props":981,"children":982},{"style":863},[983],{"type":91,"value":984},"    steps",{"type":85,"tag":162,"props":986,"children":987},{"style":474},[988],{"type":91,"value":889},{"type":85,"tag":162,"props":990,"children":992},{"class":164,"line":991},10,[993,998,1003,1007],{"type":85,"tag":162,"props":994,"children":995},{"style":474},[996],{"type":91,"value":997},"      -",{"type":85,"tag":162,"props":999,"children":1000},{"style":863},[1001],{"type":91,"value":1002}," uses",{"type":85,"tag":162,"props":1004,"children":1005},{"style":474},[1006],{"type":91,"value":436},{"type":85,"tag":162,"props":1008,"children":1009},{"style":212},[1010],{"type":91,"value":1011}," actions\u002Fcheckout@v4\n",{"type":85,"tag":162,"props":1013,"children":1015},{"class":164,"line":1014},11,[1016],{"type":85,"tag":162,"props":1017,"children":1018},{"emptyLinePlaceholder":189},[1019],{"type":91,"value":192},{"type":85,"tag":162,"props":1021,"children":1023},{"class":164,"line":1022},12,[1024,1028,1033,1037],{"type":85,"tag":162,"props":1025,"children":1026},{"style":474},[1027],{"type":91,"value":997},{"type":85,"tag":162,"props":1029,"children":1030},{"style":863},[1031],{"type":91,"value":1032}," name",{"type":85,"tag":162,"props":1034,"children":1035},{"style":474},[1036],{"type":91,"value":436},{"type":85,"tag":162,"props":1038,"children":1039},{"style":212},[1040],{"type":91,"value":1041}," Install Vercel CLI\n",{"type":85,"tag":162,"props":1043,"children":1045},{"class":164,"line":1044},13,[1046,1051,1055],{"type":85,"tag":162,"props":1047,"children":1048},{"style":863},[1049],{"type":91,"value":1050},"        run",{"type":85,"tag":162,"props":1052,"children":1053},{"style":474},[1054],{"type":91,"value":436},{"type":85,"tag":162,"props":1056,"children":1057},{"style":212},[1058],{"type":91,"value":1059}," npm install -g vercel\n",{"type":85,"tag":162,"props":1061,"children":1063},{"class":164,"line":1062},14,[1064],{"type":85,"tag":162,"props":1065,"children":1066},{"emptyLinePlaceholder":189},[1067],{"type":91,"value":192},{"type":85,"tag":162,"props":1069,"children":1071},{"class":164,"line":1070},15,[1072,1076,1080,1084],{"type":85,"tag":162,"props":1073,"children":1074},{"style":474},[1075],{"type":91,"value":997},{"type":85,"tag":162,"props":1077,"children":1078},{"style":863},[1079],{"type":91,"value":1032},{"type":85,"tag":162,"props":1081,"children":1082},{"style":474},[1083],{"type":91,"value":436},{"type":85,"tag":162,"props":1085,"children":1086},{"style":212},[1087],{"type":91,"value":1088}," Pull Vercel Environment\n",{"type":85,"tag":162,"props":1090,"children":1092},{"class":164,"line":1091},16,[1093,1097,1101],{"type":85,"tag":162,"props":1094,"children":1095},{"style":863},[1096],{"type":91,"value":1050},{"type":85,"tag":162,"props":1098,"children":1099},{"style":474},[1100],{"type":91,"value":436},{"type":85,"tag":162,"props":1102,"children":1103},{"style":212},[1104],{"type":91,"value":1105}," vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }}\n",{"type":85,"tag":162,"props":1107,"children":1109},{"class":164,"line":1108},17,[1110],{"type":85,"tag":162,"props":1111,"children":1112},{"emptyLinePlaceholder":189},[1113],{"type":91,"value":192},{"type":85,"tag":162,"props":1115,"children":1117},{"class":164,"line":1116},18,[1118,1122,1126,1130],{"type":85,"tag":162,"props":1119,"children":1120},{"style":474},[1121],{"type":91,"value":997},{"type":85,"tag":162,"props":1123,"children":1124},{"style":863},[1125],{"type":91,"value":1032},{"type":85,"tag":162,"props":1127,"children":1128},{"style":474},[1129],{"type":91,"value":436},{"type":85,"tag":162,"props":1131,"children":1132},{"style":212},[1133],{"type":91,"value":1134}," Build\n",{"type":85,"tag":162,"props":1136,"children":1138},{"class":164,"line":1137},19,[1139,1143,1147],{"type":85,"tag":162,"props":1140,"children":1141},{"style":863},[1142],{"type":91,"value":1050},{"type":85,"tag":162,"props":1144,"children":1145},{"style":474},[1146],{"type":91,"value":436},{"type":85,"tag":162,"props":1148,"children":1149},{"style":212},[1150],{"type":91,"value":1151}," vercel build --prod --token=${{ secrets.VERCEL_TOKEN }}\n",{"type":85,"tag":162,"props":1153,"children":1155},{"class":164,"line":1154},20,[1156],{"type":85,"tag":162,"props":1157,"children":1158},{"emptyLinePlaceholder":189},[1159],{"type":91,"value":192},{"type":85,"tag":162,"props":1161,"children":1163},{"class":164,"line":1162},21,[1164,1168,1172,1176],{"type":85,"tag":162,"props":1165,"children":1166},{"style":474},[1167],{"type":91,"value":997},{"type":85,"tag":162,"props":1169,"children":1170},{"style":863},[1171],{"type":91,"value":1032},{"type":85,"tag":162,"props":1173,"children":1174},{"style":474},[1175],{"type":91,"value":436},{"type":85,"tag":162,"props":1177,"children":1178},{"style":212},[1179],{"type":91,"value":1180}," Deploy\n",{"type":85,"tag":162,"props":1182,"children":1184},{"class":164,"line":1183},22,[1185,1189,1193],{"type":85,"tag":162,"props":1186,"children":1187},{"style":863},[1188],{"type":91,"value":1050},{"type":85,"tag":162,"props":1190,"children":1191},{"style":474},[1192],{"type":91,"value":436},{"type":85,"tag":162,"props":1194,"children":1195},{"style":212},[1196],{"type":91,"value":1197}," vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }}\n",{"type":85,"tag":144,"props":1199,"children":1201},{"id":1200},"oidc-federation-secure-backend-access",[1202],{"type":91,"value":1203},"OIDC Federation (Secure Backend Access)",{"type":85,"tag":94,"props":1205,"children":1206},{},[1207,1209,1214,1216,1221,1223,1228],{"type":91,"value":1208},"Vercel OIDC federation is for ",{"type":85,"tag":424,"props":1210,"children":1211},{},[1212],{"type":91,"value":1213},"secure backend access",{"type":91,"value":1215}," — letting your deployed Vercel functions authenticate with third-party services (AWS, GCP, HashiCorp Vault) without storing long-lived secrets. It does ",{"type":85,"tag":424,"props":1217,"children":1218},{},[1219],{"type":91,"value":1220},"not",{"type":91,"value":1222}," replace ",{"type":85,"tag":100,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":91,"value":766},{"type":91,"value":1229}," for CLI deployments.",{"type":85,"tag":94,"props":1231,"children":1232},{},[1233,1238],{"type":85,"tag":424,"props":1234,"children":1235},{},[1236],{"type":91,"value":1237},"What OIDC does:",{"type":91,"value":1239}," Your Vercel function requests a short-lived OIDC token from Vercel at runtime, then exchanges it with an external provider's STS\u002Ftoken endpoint for scoped credentials.",{"type":85,"tag":94,"props":1241,"children":1242},{},[1243,1248,1250,1256,1257,1262,1264,1269,1271,1277],{"type":85,"tag":424,"props":1244,"children":1245},{},[1246],{"type":91,"value":1247},"What OIDC does not do:",{"type":91,"value":1249}," Authenticate the Vercel CLI in CI pipelines. All ",{"type":85,"tag":100,"props":1251,"children":1253},{"className":1252},[],[1254],{"type":91,"value":1255},"vercel pull",{"type":91,"value":106},{"type":85,"tag":100,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":91,"value":133},{"type":91,"value":1263},", and ",{"type":85,"tag":100,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":91,"value":75},{"type":91,"value":1270}," commands still require ",{"type":85,"tag":100,"props":1272,"children":1274},{"className":1273},[],[1275],{"type":91,"value":1276},"--token=${{ secrets.VERCEL_TOKEN }}",{"type":91,"value":1278},".",{"type":85,"tag":94,"props":1280,"children":1281},{},[1282],{"type":85,"tag":424,"props":1283,"children":1284},{},[1285],{"type":91,"value":1286},"When to use OIDC:",{"type":85,"tag":1288,"props":1289,"children":1290},"ul",{},[1291,1297,1302],{"type":85,"tag":1292,"props":1293,"children":1294},"li",{},[1295],{"type":91,"value":1296},"Serverless functions that need to call AWS APIs (S3, DynamoDB, SQS)",{"type":85,"tag":1292,"props":1298,"children":1299},{},[1300],{"type":91,"value":1301},"Functions authenticating to GCP services via Workload Identity Federation",{"type":85,"tag":1292,"props":1303,"children":1304},{},[1305],{"type":91,"value":1306},"Any runtime service-to-service auth where you want to avoid storing static secrets in Vercel env vars",{"type":85,"tag":144,"props":1308,"children":1310},{"id":1309},"gitlab-ci",[1311],{"type":91,"value":1312},"GitLab CI",{"type":85,"tag":151,"props":1314,"children":1316},{"className":851,"code":1315,"language":853,"meta":156,"style":156},"deploy:\n  image: node:20\n  stage: deploy\n  script:\n    - npm install -g vercel\n    - vercel pull --yes --environment=production --token=$VERCEL_TOKEN\n    - vercel build --prod --token=$VERCEL_TOKEN\n    - vercel deploy --prebuilt --prod --token=$VERCEL_TOKEN\n  only:\n    - main\n",[1317],{"type":85,"tag":100,"props":1318,"children":1319},{"__ignoreMap":156},[1320,1331,1348,1364,1376,1388,1400,1412,1424,1436],{"type":85,"tag":162,"props":1321,"children":1322},{"class":164,"line":165},[1323,1327],{"type":85,"tag":162,"props":1324,"children":1325},{"style":863},[1326],{"type":91,"value":65},{"type":85,"tag":162,"props":1328,"children":1329},{"style":474},[1330],{"type":91,"value":889},{"type":85,"tag":162,"props":1332,"children":1333},{"class":164,"line":175},[1334,1339,1343],{"type":85,"tag":162,"props":1335,"children":1336},{"style":863},[1337],{"type":91,"value":1338},"  image",{"type":85,"tag":162,"props":1340,"children":1341},{"style":474},[1342],{"type":91,"value":436},{"type":85,"tag":162,"props":1344,"children":1345},{"style":212},[1346],{"type":91,"value":1347}," node:20\n",{"type":85,"tag":162,"props":1349,"children":1350},{"class":164,"line":185},[1351,1356,1360],{"type":85,"tag":162,"props":1352,"children":1353},{"style":863},[1354],{"type":91,"value":1355},"  stage",{"type":85,"tag":162,"props":1357,"children":1358},{"style":474},[1359],{"type":91,"value":436},{"type":85,"tag":162,"props":1361,"children":1362},{"style":212},[1363],{"type":91,"value":215},{"type":85,"tag":162,"props":1365,"children":1366},{"class":164,"line":195},[1367,1372],{"type":85,"tag":162,"props":1368,"children":1369},{"style":863},[1370],{"type":91,"value":1371},"  script",{"type":85,"tag":162,"props":1373,"children":1374},{"style":474},[1375],{"type":91,"value":889},{"type":85,"tag":162,"props":1377,"children":1378},{"class":164,"line":204},[1379,1384],{"type":85,"tag":162,"props":1380,"children":1381},{"style":474},[1382],{"type":91,"value":1383},"    -",{"type":85,"tag":162,"props":1385,"children":1386},{"style":212},[1387],{"type":91,"value":1059},{"type":85,"tag":162,"props":1389,"children":1390},{"class":164,"line":37},[1391,1395],{"type":85,"tag":162,"props":1392,"children":1393},{"style":474},[1394],{"type":91,"value":1383},{"type":85,"tag":162,"props":1396,"children":1397},{"style":212},[1398],{"type":91,"value":1399}," vercel pull --yes --environment=production --token=$VERCEL_TOKEN\n",{"type":85,"tag":162,"props":1401,"children":1402},{"class":164,"line":375},[1403,1407],{"type":85,"tag":162,"props":1404,"children":1405},{"style":474},[1406],{"type":91,"value":1383},{"type":85,"tag":162,"props":1408,"children":1409},{"style":212},[1410],{"type":91,"value":1411}," vercel build --prod --token=$VERCEL_TOKEN\n",{"type":85,"tag":162,"props":1413,"children":1414},{"class":164,"line":384},[1415,1419],{"type":85,"tag":162,"props":1416,"children":1417},{"style":474},[1418],{"type":91,"value":1383},{"type":85,"tag":162,"props":1420,"children":1421},{"style":212},[1422],{"type":91,"value":1423}," vercel deploy --prebuilt --prod --token=$VERCEL_TOKEN\n",{"type":85,"tag":162,"props":1425,"children":1426},{"class":164,"line":401},[1427,1432],{"type":85,"tag":162,"props":1428,"children":1429},{"style":863},[1430],{"type":91,"value":1431},"  only",{"type":85,"tag":162,"props":1433,"children":1434},{"style":474},[1435],{"type":91,"value":889},{"type":85,"tag":162,"props":1437,"children":1438},{"class":164,"line":991},[1439,1443],{"type":85,"tag":162,"props":1440,"children":1441},{"style":474},[1442],{"type":91,"value":1383},{"type":85,"tag":162,"props":1444,"children":1445},{"style":212},[1446],{"type":91,"value":1447}," main\n",{"type":85,"tag":144,"props":1449,"children":1451},{"id":1450},"bitbucket-pipelines",[1452],{"type":91,"value":1453},"Bitbucket Pipelines",{"type":85,"tag":151,"props":1455,"children":1457},{"className":851,"code":1456,"language":853,"meta":156,"style":156},"pipelines:\n  branches:\n    main:\n      - step:\n          name: Deploy to Vercel\n          image: node:20\n          script:\n            - npm install -g vercel\n            - vercel pull --yes --environment=production --token=$VERCEL_TOKEN\n            - vercel build --prod --token=$VERCEL_TOKEN\n            - vercel deploy --prebuilt --prod --token=$VERCEL_TOKEN\n",[1458],{"type":85,"tag":100,"props":1459,"children":1460},{"__ignoreMap":156},[1461,1473,1485,1497,1513,1529,1545,1557,1569,1580,1591],{"type":85,"tag":162,"props":1462,"children":1463},{"class":164,"line":165},[1464,1469],{"type":85,"tag":162,"props":1465,"children":1466},{"style":863},[1467],{"type":91,"value":1468},"pipelines",{"type":85,"tag":162,"props":1470,"children":1471},{"style":474},[1472],{"type":91,"value":889},{"type":85,"tag":162,"props":1474,"children":1475},{"class":164,"line":175},[1476,1481],{"type":85,"tag":162,"props":1477,"children":1478},{"style":863},[1479],{"type":91,"value":1480},"  branches",{"type":85,"tag":162,"props":1482,"children":1483},{"style":474},[1484],{"type":91,"value":889},{"type":85,"tag":162,"props":1486,"children":1487},{"class":164,"line":185},[1488,1493],{"type":85,"tag":162,"props":1489,"children":1490},{"style":863},[1491],{"type":91,"value":1492},"    main",{"type":85,"tag":162,"props":1494,"children":1495},{"style":474},[1496],{"type":91,"value":889},{"type":85,"tag":162,"props":1498,"children":1499},{"class":164,"line":195},[1500,1504,1509],{"type":85,"tag":162,"props":1501,"children":1502},{"style":474},[1503],{"type":91,"value":997},{"type":85,"tag":162,"props":1505,"children":1506},{"style":863},[1507],{"type":91,"value":1508}," step",{"type":85,"tag":162,"props":1510,"children":1511},{"style":474},[1512],{"type":91,"value":889},{"type":85,"tag":162,"props":1514,"children":1515},{"class":164,"line":204},[1516,1521,1525],{"type":85,"tag":162,"props":1517,"children":1518},{"style":863},[1519],{"type":91,"value":1520},"          name",{"type":85,"tag":162,"props":1522,"children":1523},{"style":474},[1524],{"type":91,"value":436},{"type":85,"tag":162,"props":1526,"children":1527},{"style":212},[1528],{"type":91,"value":875},{"type":85,"tag":162,"props":1530,"children":1531},{"class":164,"line":37},[1532,1537,1541],{"type":85,"tag":162,"props":1533,"children":1534},{"style":863},[1535],{"type":91,"value":1536},"          image",{"type":85,"tag":162,"props":1538,"children":1539},{"style":474},[1540],{"type":91,"value":436},{"type":85,"tag":162,"props":1542,"children":1543},{"style":212},[1544],{"type":91,"value":1347},{"type":85,"tag":162,"props":1546,"children":1547},{"class":164,"line":375},[1548,1553],{"type":85,"tag":162,"props":1549,"children":1550},{"style":863},[1551],{"type":91,"value":1552},"          script",{"type":85,"tag":162,"props":1554,"children":1555},{"style":474},[1556],{"type":91,"value":889},{"type":85,"tag":162,"props":1558,"children":1559},{"class":164,"line":384},[1560,1565],{"type":85,"tag":162,"props":1561,"children":1562},{"style":474},[1563],{"type":91,"value":1564},"            -",{"type":85,"tag":162,"props":1566,"children":1567},{"style":212},[1568],{"type":91,"value":1059},{"type":85,"tag":162,"props":1570,"children":1571},{"class":164,"line":401},[1572,1576],{"type":85,"tag":162,"props":1573,"children":1574},{"style":474},[1575],{"type":91,"value":1564},{"type":85,"tag":162,"props":1577,"children":1578},{"style":212},[1579],{"type":91,"value":1399},{"type":85,"tag":162,"props":1581,"children":1582},{"class":164,"line":991},[1583,1587],{"type":85,"tag":162,"props":1584,"children":1585},{"style":474},[1586],{"type":91,"value":1564},{"type":85,"tag":162,"props":1588,"children":1589},{"style":212},[1590],{"type":91,"value":1411},{"type":85,"tag":162,"props":1592,"children":1593},{"class":164,"line":1014},[1594,1598],{"type":85,"tag":162,"props":1595,"children":1596},{"style":474},[1597],{"type":91,"value":1564},{"type":85,"tag":162,"props":1599,"children":1600},{"style":212},[1601],{"type":91,"value":1423},{"type":85,"tag":137,"props":1603,"children":1605},{"id":1604},"common-ci-patterns",[1606],{"type":91,"value":1607},"Common CI Patterns",{"type":85,"tag":144,"props":1609,"children":1611},{"id":1610},"preview-deployments-on-prs",[1612],{"type":91,"value":1613},"Preview Deployments on PRs",{"type":85,"tag":151,"props":1615,"children":1617},{"className":851,"code":1616,"language":853,"meta":156,"style":156},"# GitHub Actions\non:\n  pull_request:\n    types: [opened, synchronize]\n\njobs:\n  preview:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - run: npm install -g vercel\n      - run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }}\n      - run: vercel build --token=${{ secrets.VERCEL_TOKEN }}\n      - id: deploy\n        run: echo \"url=$(vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }})\" >> $GITHUB_OUTPUT\n      - name: Comment PR\n        uses: actions\u002Fgithub-script@v7\n        with:\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: `Preview: ${{ steps.deploy.outputs.url }}`\n            })\n",[1618],{"type":85,"tag":100,"props":1619,"children":1620},{"__ignoreMap":156},[1621,1629,1640,1652,1687,1694,1705,1717,1732,1743,1762,1782,1802,1822,1842,1858,1878,1895,1907,1924,1932,1940,1948,1957,1966],{"type":85,"tag":162,"props":1622,"children":1623},{"class":164,"line":165},[1624],{"type":85,"tag":162,"props":1625,"children":1626},{"style":169},[1627],{"type":91,"value":1628},"# GitHub Actions\n",{"type":85,"tag":162,"props":1630,"children":1631},{"class":164,"line":175},[1632,1636],{"type":85,"tag":162,"props":1633,"children":1634},{"style":881},[1635],{"type":91,"value":884},{"type":85,"tag":162,"props":1637,"children":1638},{"style":474},[1639],{"type":91,"value":889},{"type":85,"tag":162,"props":1641,"children":1642},{"class":164,"line":185},[1643,1648],{"type":85,"tag":162,"props":1644,"children":1645},{"style":863},[1646],{"type":91,"value":1647},"  pull_request",{"type":85,"tag":162,"props":1649,"children":1650},{"style":474},[1651],{"type":91,"value":889},{"type":85,"tag":162,"props":1653,"children":1654},{"class":164,"line":195},[1655,1660,1664,1668,1673,1678,1683],{"type":85,"tag":162,"props":1656,"children":1657},{"style":863},[1658],{"type":91,"value":1659},"    types",{"type":85,"tag":162,"props":1661,"children":1662},{"style":474},[1663],{"type":91,"value":436},{"type":85,"tag":162,"props":1665,"children":1666},{"style":474},[1667],{"type":91,"value":918},{"type":85,"tag":162,"props":1669,"children":1670},{"style":212},[1671],{"type":91,"value":1672},"opened",{"type":85,"tag":162,"props":1674,"children":1675},{"style":474},[1676],{"type":91,"value":1677},",",{"type":85,"tag":162,"props":1679,"children":1680},{"style":212},[1681],{"type":91,"value":1682}," synchronize",{"type":85,"tag":162,"props":1684,"children":1685},{"style":474},[1686],{"type":91,"value":928},{"type":85,"tag":162,"props":1688,"children":1689},{"class":164,"line":204},[1690],{"type":85,"tag":162,"props":1691,"children":1692},{"emptyLinePlaceholder":189},[1693],{"type":91,"value":192},{"type":85,"tag":162,"props":1695,"children":1696},{"class":164,"line":37},[1697,1701],{"type":85,"tag":162,"props":1698,"children":1699},{"style":863},[1700],{"type":91,"value":943},{"type":85,"tag":162,"props":1702,"children":1703},{"style":474},[1704],{"type":91,"value":889},{"type":85,"tag":162,"props":1706,"children":1707},{"class":164,"line":375},[1708,1713],{"type":85,"tag":162,"props":1709,"children":1710},{"style":863},[1711],{"type":91,"value":1712},"  preview",{"type":85,"tag":162,"props":1714,"children":1715},{"style":474},[1716],{"type":91,"value":889},{"type":85,"tag":162,"props":1718,"children":1719},{"class":164,"line":384},[1720,1724,1728],{"type":85,"tag":162,"props":1721,"children":1722},{"style":863},[1723],{"type":91,"value":967},{"type":85,"tag":162,"props":1725,"children":1726},{"style":474},[1727],{"type":91,"value":436},{"type":85,"tag":162,"props":1729,"children":1730},{"style":212},[1731],{"type":91,"value":976},{"type":85,"tag":162,"props":1733,"children":1734},{"class":164,"line":401},[1735,1739],{"type":85,"tag":162,"props":1736,"children":1737},{"style":863},[1738],{"type":91,"value":984},{"type":85,"tag":162,"props":1740,"children":1741},{"style":474},[1742],{"type":91,"value":889},{"type":85,"tag":162,"props":1744,"children":1745},{"class":164,"line":991},[1746,1750,1754,1758],{"type":85,"tag":162,"props":1747,"children":1748},{"style":474},[1749],{"type":91,"value":997},{"type":85,"tag":162,"props":1751,"children":1752},{"style":863},[1753],{"type":91,"value":1002},{"type":85,"tag":162,"props":1755,"children":1756},{"style":474},[1757],{"type":91,"value":436},{"type":85,"tag":162,"props":1759,"children":1760},{"style":212},[1761],{"type":91,"value":1011},{"type":85,"tag":162,"props":1763,"children":1764},{"class":164,"line":1014},[1765,1769,1774,1778],{"type":85,"tag":162,"props":1766,"children":1767},{"style":474},[1768],{"type":91,"value":997},{"type":85,"tag":162,"props":1770,"children":1771},{"style":863},[1772],{"type":91,"value":1773}," run",{"type":85,"tag":162,"props":1775,"children":1776},{"style":474},[1777],{"type":91,"value":436},{"type":85,"tag":162,"props":1779,"children":1780},{"style":212},[1781],{"type":91,"value":1059},{"type":85,"tag":162,"props":1783,"children":1784},{"class":164,"line":1022},[1785,1789,1793,1797],{"type":85,"tag":162,"props":1786,"children":1787},{"style":474},[1788],{"type":91,"value":997},{"type":85,"tag":162,"props":1790,"children":1791},{"style":863},[1792],{"type":91,"value":1773},{"type":85,"tag":162,"props":1794,"children":1795},{"style":474},[1796],{"type":91,"value":436},{"type":85,"tag":162,"props":1798,"children":1799},{"style":212},[1800],{"type":91,"value":1801}," vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }}\n",{"type":85,"tag":162,"props":1803,"children":1804},{"class":164,"line":1044},[1805,1809,1813,1817],{"type":85,"tag":162,"props":1806,"children":1807},{"style":474},[1808],{"type":91,"value":997},{"type":85,"tag":162,"props":1810,"children":1811},{"style":863},[1812],{"type":91,"value":1773},{"type":85,"tag":162,"props":1814,"children":1815},{"style":474},[1816],{"type":91,"value":436},{"type":85,"tag":162,"props":1818,"children":1819},{"style":212},[1820],{"type":91,"value":1821}," vercel build --token=${{ secrets.VERCEL_TOKEN }}\n",{"type":85,"tag":162,"props":1823,"children":1824},{"class":164,"line":1062},[1825,1829,1834,1838],{"type":85,"tag":162,"props":1826,"children":1827},{"style":474},[1828],{"type":91,"value":997},{"type":85,"tag":162,"props":1830,"children":1831},{"style":863},[1832],{"type":91,"value":1833}," id",{"type":85,"tag":162,"props":1835,"children":1836},{"style":474},[1837],{"type":91,"value":436},{"type":85,"tag":162,"props":1839,"children":1840},{"style":212},[1841],{"type":91,"value":215},{"type":85,"tag":162,"props":1843,"children":1844},{"class":164,"line":1070},[1845,1849,1853],{"type":85,"tag":162,"props":1846,"children":1847},{"style":863},[1848],{"type":91,"value":1050},{"type":85,"tag":162,"props":1850,"children":1851},{"style":474},[1852],{"type":91,"value":436},{"type":85,"tag":162,"props":1854,"children":1855},{"style":212},[1856],{"type":91,"value":1857}," echo \"url=$(vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }})\" >> $GITHUB_OUTPUT\n",{"type":85,"tag":162,"props":1859,"children":1860},{"class":164,"line":1091},[1861,1865,1869,1873],{"type":85,"tag":162,"props":1862,"children":1863},{"style":474},[1864],{"type":91,"value":997},{"type":85,"tag":162,"props":1866,"children":1867},{"style":863},[1868],{"type":91,"value":1032},{"type":85,"tag":162,"props":1870,"children":1871},{"style":474},[1872],{"type":91,"value":436},{"type":85,"tag":162,"props":1874,"children":1875},{"style":212},[1876],{"type":91,"value":1877}," Comment PR\n",{"type":85,"tag":162,"props":1879,"children":1880},{"class":164,"line":1108},[1881,1886,1890],{"type":85,"tag":162,"props":1882,"children":1883},{"style":863},[1884],{"type":91,"value":1885},"        uses",{"type":85,"tag":162,"props":1887,"children":1888},{"style":474},[1889],{"type":91,"value":436},{"type":85,"tag":162,"props":1891,"children":1892},{"style":212},[1893],{"type":91,"value":1894}," actions\u002Fgithub-script@v7\n",{"type":85,"tag":162,"props":1896,"children":1897},{"class":164,"line":1116},[1898,1903],{"type":85,"tag":162,"props":1899,"children":1900},{"style":863},[1901],{"type":91,"value":1902},"        with",{"type":85,"tag":162,"props":1904,"children":1905},{"style":474},[1906],{"type":91,"value":889},{"type":85,"tag":162,"props":1908,"children":1909},{"class":164,"line":1137},[1910,1914,1918],{"type":85,"tag":162,"props":1911,"children":1912},{"style":863},[1913],{"type":91,"value":1552},{"type":85,"tag":162,"props":1915,"children":1916},{"style":474},[1917],{"type":91,"value":436},{"type":85,"tag":162,"props":1919,"children":1921},{"style":1920},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1922],{"type":91,"value":1923}," |\n",{"type":85,"tag":162,"props":1925,"children":1926},{"class":164,"line":1154},[1927],{"type":85,"tag":162,"props":1928,"children":1929},{"style":212},[1930],{"type":91,"value":1931},"            github.rest.issues.createComment({\n",{"type":85,"tag":162,"props":1933,"children":1934},{"class":164,"line":1162},[1935],{"type":85,"tag":162,"props":1936,"children":1937},{"style":212},[1938],{"type":91,"value":1939},"              issue_number: context.issue.number,\n",{"type":85,"tag":162,"props":1941,"children":1942},{"class":164,"line":1183},[1943],{"type":85,"tag":162,"props":1944,"children":1945},{"style":212},[1946],{"type":91,"value":1947},"              owner: context.repo.owner,\n",{"type":85,"tag":162,"props":1949,"children":1951},{"class":164,"line":1950},23,[1952],{"type":85,"tag":162,"props":1953,"children":1954},{"style":212},[1955],{"type":91,"value":1956},"              repo: context.repo.repo,\n",{"type":85,"tag":162,"props":1958,"children":1960},{"class":164,"line":1959},24,[1961],{"type":85,"tag":162,"props":1962,"children":1963},{"style":212},[1964],{"type":91,"value":1965},"              body: `Preview: ${{ steps.deploy.outputs.url }}`\n",{"type":85,"tag":162,"props":1967,"children":1969},{"class":164,"line":1968},25,[1970],{"type":85,"tag":162,"props":1971,"children":1972},{"style":212},[1973],{"type":91,"value":1974},"            })\n",{"type":85,"tag":144,"props":1976,"children":1978},{"id":1977},"promote-after-tests-pass",[1979],{"type":91,"value":1980},"Promote After Tests Pass",{"type":85,"tag":151,"props":1982,"children":1984},{"className":851,"code":1983,"language":853,"meta":156,"style":156},"jobs:\n  deploy-preview:\n    # ... deploy preview ...\n    outputs:\n      url: ${{ steps.deploy.outputs.url }}\n\n  e2e-tests:\n    needs: deploy-preview\n    runs-on: ubuntu-latest\n    steps:\n      - run: npx playwright test --base-url=${{ needs.deploy-preview.outputs.url }}\n\n  promote:\n    needs: [deploy-preview, e2e-tests]\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs\u002Fheads\u002Fmain'\n    steps:\n      - run: npm install -g vercel\n      - run: vercel promote ${{ needs.deploy-preview.outputs.url }} --token=${{ secrets.VERCEL_TOKEN }}\n",[1985],{"type":85,"tag":100,"props":1986,"children":1987},{"__ignoreMap":156},[1988,1999,2011,2019,2031,2048,2055,2067,2084,2099,2110,2130,2137,2149,2182,2197,2214,2225,2244],{"type":85,"tag":162,"props":1989,"children":1990},{"class":164,"line":165},[1991,1995],{"type":85,"tag":162,"props":1992,"children":1993},{"style":863},[1994],{"type":91,"value":943},{"type":85,"tag":162,"props":1996,"children":1997},{"style":474},[1998],{"type":91,"value":889},{"type":85,"tag":162,"props":2000,"children":2001},{"class":164,"line":175},[2002,2007],{"type":85,"tag":162,"props":2003,"children":2004},{"style":863},[2005],{"type":91,"value":2006},"  deploy-preview",{"type":85,"tag":162,"props":2008,"children":2009},{"style":474},[2010],{"type":91,"value":889},{"type":85,"tag":162,"props":2012,"children":2013},{"class":164,"line":185},[2014],{"type":85,"tag":162,"props":2015,"children":2016},{"style":169},[2017],{"type":91,"value":2018},"    # ... deploy preview ...\n",{"type":85,"tag":162,"props":2020,"children":2021},{"class":164,"line":195},[2022,2027],{"type":85,"tag":162,"props":2023,"children":2024},{"style":863},[2025],{"type":91,"value":2026},"    outputs",{"type":85,"tag":162,"props":2028,"children":2029},{"style":474},[2030],{"type":91,"value":889},{"type":85,"tag":162,"props":2032,"children":2033},{"class":164,"line":204},[2034,2039,2043],{"type":85,"tag":162,"props":2035,"children":2036},{"style":863},[2037],{"type":91,"value":2038},"      url",{"type":85,"tag":162,"props":2040,"children":2041},{"style":474},[2042],{"type":91,"value":436},{"type":85,"tag":162,"props":2044,"children":2045},{"style":212},[2046],{"type":91,"value":2047}," ${{ steps.deploy.outputs.url }}\n",{"type":85,"tag":162,"props":2049,"children":2050},{"class":164,"line":37},[2051],{"type":85,"tag":162,"props":2052,"children":2053},{"emptyLinePlaceholder":189},[2054],{"type":91,"value":192},{"type":85,"tag":162,"props":2056,"children":2057},{"class":164,"line":375},[2058,2063],{"type":85,"tag":162,"props":2059,"children":2060},{"style":863},[2061],{"type":91,"value":2062},"  e2e-tests",{"type":85,"tag":162,"props":2064,"children":2065},{"style":474},[2066],{"type":91,"value":889},{"type":85,"tag":162,"props":2068,"children":2069},{"class":164,"line":384},[2070,2075,2079],{"type":85,"tag":162,"props":2071,"children":2072},{"style":863},[2073],{"type":91,"value":2074},"    needs",{"type":85,"tag":162,"props":2076,"children":2077},{"style":474},[2078],{"type":91,"value":436},{"type":85,"tag":162,"props":2080,"children":2081},{"style":212},[2082],{"type":91,"value":2083}," deploy-preview\n",{"type":85,"tag":162,"props":2085,"children":2086},{"class":164,"line":401},[2087,2091,2095],{"type":85,"tag":162,"props":2088,"children":2089},{"style":863},[2090],{"type":91,"value":967},{"type":85,"tag":162,"props":2092,"children":2093},{"style":474},[2094],{"type":91,"value":436},{"type":85,"tag":162,"props":2096,"children":2097},{"style":212},[2098],{"type":91,"value":976},{"type":85,"tag":162,"props":2100,"children":2101},{"class":164,"line":991},[2102,2106],{"type":85,"tag":162,"props":2103,"children":2104},{"style":863},[2105],{"type":91,"value":984},{"type":85,"tag":162,"props":2107,"children":2108},{"style":474},[2109],{"type":91,"value":889},{"type":85,"tag":162,"props":2111,"children":2112},{"class":164,"line":1014},[2113,2117,2121,2125],{"type":85,"tag":162,"props":2114,"children":2115},{"style":474},[2116],{"type":91,"value":997},{"type":85,"tag":162,"props":2118,"children":2119},{"style":863},[2120],{"type":91,"value":1773},{"type":85,"tag":162,"props":2122,"children":2123},{"style":474},[2124],{"type":91,"value":436},{"type":85,"tag":162,"props":2126,"children":2127},{"style":212},[2128],{"type":91,"value":2129}," npx playwright test --base-url=${{ needs.deploy-preview.outputs.url }}\n",{"type":85,"tag":162,"props":2131,"children":2132},{"class":164,"line":1022},[2133],{"type":85,"tag":162,"props":2134,"children":2135},{"emptyLinePlaceholder":189},[2136],{"type":91,"value":192},{"type":85,"tag":162,"props":2138,"children":2139},{"class":164,"line":1044},[2140,2145],{"type":85,"tag":162,"props":2141,"children":2142},{"style":863},[2143],{"type":91,"value":2144},"  promote",{"type":85,"tag":162,"props":2146,"children":2147},{"style":474},[2148],{"type":91,"value":889},{"type":85,"tag":162,"props":2150,"children":2151},{"class":164,"line":1062},[2152,2156,2160,2164,2169,2173,2178],{"type":85,"tag":162,"props":2153,"children":2154},{"style":863},[2155],{"type":91,"value":2074},{"type":85,"tag":162,"props":2157,"children":2158},{"style":474},[2159],{"type":91,"value":436},{"type":85,"tag":162,"props":2161,"children":2162},{"style":474},[2163],{"type":91,"value":918},{"type":85,"tag":162,"props":2165,"children":2166},{"style":212},[2167],{"type":91,"value":2168},"deploy-preview",{"type":85,"tag":162,"props":2170,"children":2171},{"style":474},[2172],{"type":91,"value":1677},{"type":85,"tag":162,"props":2174,"children":2175},{"style":212},[2176],{"type":91,"value":2177}," e2e-tests",{"type":85,"tag":162,"props":2179,"children":2180},{"style":474},[2181],{"type":91,"value":928},{"type":85,"tag":162,"props":2183,"children":2184},{"class":164,"line":1070},[2185,2189,2193],{"type":85,"tag":162,"props":2186,"children":2187},{"style":863},[2188],{"type":91,"value":967},{"type":85,"tag":162,"props":2190,"children":2191},{"style":474},[2192],{"type":91,"value":436},{"type":85,"tag":162,"props":2194,"children":2195},{"style":212},[2196],{"type":91,"value":976},{"type":85,"tag":162,"props":2198,"children":2199},{"class":164,"line":1091},[2200,2205,2209],{"type":85,"tag":162,"props":2201,"children":2202},{"style":863},[2203],{"type":91,"value":2204},"    if",{"type":85,"tag":162,"props":2206,"children":2207},{"style":474},[2208],{"type":91,"value":436},{"type":85,"tag":162,"props":2210,"children":2211},{"style":212},[2212],{"type":91,"value":2213}," github.ref == 'refs\u002Fheads\u002Fmain'\n",{"type":85,"tag":162,"props":2215,"children":2216},{"class":164,"line":1108},[2217,2221],{"type":85,"tag":162,"props":2218,"children":2219},{"style":863},[2220],{"type":91,"value":984},{"type":85,"tag":162,"props":2222,"children":2223},{"style":474},[2224],{"type":91,"value":889},{"type":85,"tag":162,"props":2226,"children":2227},{"class":164,"line":1116},[2228,2232,2236,2240],{"type":85,"tag":162,"props":2229,"children":2230},{"style":474},[2231],{"type":91,"value":997},{"type":85,"tag":162,"props":2233,"children":2234},{"style":863},[2235],{"type":91,"value":1773},{"type":85,"tag":162,"props":2237,"children":2238},{"style":474},[2239],{"type":91,"value":436},{"type":85,"tag":162,"props":2241,"children":2242},{"style":212},[2243],{"type":91,"value":1059},{"type":85,"tag":162,"props":2245,"children":2246},{"class":164,"line":1137},[2247,2251,2255,2259],{"type":85,"tag":162,"props":2248,"children":2249},{"style":474},[2250],{"type":91,"value":997},{"type":85,"tag":162,"props":2252,"children":2253},{"style":863},[2254],{"type":91,"value":1773},{"type":85,"tag":162,"props":2256,"children":2257},{"style":474},[2258],{"type":91,"value":436},{"type":85,"tag":162,"props":2260,"children":2261},{"style":212},[2262],{"type":91,"value":2263}," vercel promote ${{ needs.deploy-preview.outputs.url }} --token=${{ secrets.VERCEL_TOKEN }}\n",{"type":85,"tag":137,"props":2265,"children":2267},{"id":2266},"global-cli-flags-for-ci",[2268],{"type":91,"value":2269},"Global CLI Flags for CI",{"type":85,"tag":2271,"props":2272,"children":2273},"table",{},[2274,2293],{"type":85,"tag":2275,"props":2276,"children":2277},"thead",{},[2278],{"type":85,"tag":2279,"props":2280,"children":2281},"tr",{},[2282,2288],{"type":85,"tag":2283,"props":2284,"children":2285},"th",{},[2286],{"type":91,"value":2287},"Flag",{"type":85,"tag":2283,"props":2289,"children":2290},{},[2291],{"type":91,"value":2292},"Purpose",{"type":85,"tag":2294,"props":2295,"children":2296},"tbody",{},[2297,2315,2340,2357],{"type":85,"tag":2279,"props":2298,"children":2299},{},[2300,2310],{"type":85,"tag":2301,"props":2302,"children":2303},"td",{},[2304],{"type":85,"tag":100,"props":2305,"children":2307},{"className":2306},[],[2308],{"type":91,"value":2309},"--token \u003Ctoken>",{"type":85,"tag":2301,"props":2311,"children":2312},{},[2313],{"type":91,"value":2314},"Authenticate (required in CI)",{"type":85,"tag":2279,"props":2316,"children":2317},{},[2318,2335],{"type":85,"tag":2301,"props":2319,"children":2320},{},[2321,2327,2329],{"type":85,"tag":100,"props":2322,"children":2324},{"className":2323},[],[2325],{"type":91,"value":2326},"--yes",{"type":91,"value":2328}," \u002F ",{"type":85,"tag":100,"props":2330,"children":2332},{"className":2331},[],[2333],{"type":91,"value":2334},"-y",{"type":85,"tag":2301,"props":2336,"children":2337},{},[2338],{"type":91,"value":2339},"Skip confirmation prompts",{"type":85,"tag":2279,"props":2341,"children":2342},{},[2343,2352],{"type":85,"tag":2301,"props":2344,"children":2345},{},[2346],{"type":85,"tag":100,"props":2347,"children":2349},{"className":2348},[],[2350],{"type":91,"value":2351},"--scope \u003Cteam>",{"type":85,"tag":2301,"props":2353,"children":2354},{},[2355],{"type":91,"value":2356},"Execute as a specific team",{"type":85,"tag":2279,"props":2358,"children":2359},{},[2360,2369],{"type":85,"tag":2301,"props":2361,"children":2362},{},[2363],{"type":85,"tag":100,"props":2364,"children":2366},{"className":2365},[],[2367],{"type":91,"value":2368},"--cwd \u003Cdir>",{"type":85,"tag":2301,"props":2370,"children":2371},{},[2372],{"type":91,"value":2373},"Set working directory",{"type":85,"tag":137,"props":2375,"children":2377},{"id":2376},"best-practices",[2378],{"type":91,"value":2379},"Best Practices",{"type":85,"tag":2381,"props":2382,"children":2383},"ol",{},[2384,2401,2418,2435,2452,2470],{"type":85,"tag":1292,"props":2385,"children":2386},{},[2387,2399],{"type":85,"tag":424,"props":2388,"children":2389},{},[2390,2392,2397],{"type":91,"value":2391},"Always use ",{"type":85,"tag":100,"props":2393,"children":2395},{"className":2394},[],[2396],{"type":91,"value":434},{"type":91,"value":2398}," in CI",{"type":91,"value":2400}," — separates build from deploy, enables build caching and test gates",{"type":85,"tag":1292,"props":2402,"children":2403},{},[2404,2416],{"type":85,"tag":424,"props":2405,"children":2406},{},[2407,2409,2414],{"type":91,"value":2408},"Use ",{"type":85,"tag":100,"props":2410,"children":2412},{"className":2411},[],[2413],{"type":91,"value":1255},{"type":91,"value":2415}," before build",{"type":91,"value":2417}," — ensures correct env vars and project settings",{"type":85,"tag":1292,"props":2419,"children":2420},{},[2421,2433],{"type":85,"tag":424,"props":2422,"children":2423},{},[2424,2426,2431],{"type":91,"value":2425},"Prefer ",{"type":85,"tag":100,"props":2427,"children":2429},{"className":2428},[],[2430],{"type":91,"value":79},{"type":91,"value":2432}," over re-deploy",{"type":91,"value":2434}," — instant, no rebuild, same artifact",{"type":85,"tag":1292,"props":2436,"children":2437},{},[2438,2443,2445,2450],{"type":85,"tag":424,"props":2439,"children":2440},{},[2441],{"type":91,"value":2442},"Use OIDC federation for runtime backend access",{"type":91,"value":2444}," — lets Vercel functions auth to AWS\u002FGCP without static secrets (does not replace ",{"type":85,"tag":100,"props":2446,"children":2448},{"className":2447},[],[2449],{"type":91,"value":766},{"type":91,"value":2451}," for CLI)",{"type":85,"tag":1292,"props":2453,"children":2454},{},[2455,2460,2462,2468],{"type":85,"tag":424,"props":2456,"children":2457},{},[2458],{"type":91,"value":2459},"Pin the Vercel CLI version in CI",{"type":91,"value":2461}," — ",{"type":85,"tag":100,"props":2463,"children":2465},{"className":2464},[],[2466],{"type":91,"value":2467},"npm install -g vercel@latest",{"type":91,"value":2469}," can break unexpectedly",{"type":85,"tag":1292,"props":2471,"children":2472},{},[2473,2485],{"type":85,"tag":424,"props":2474,"children":2475},{},[2476,2478,2483],{"type":91,"value":2477},"Add ",{"type":85,"tag":100,"props":2479,"children":2481},{"className":2480},[],[2482],{"type":91,"value":2326},{"type":91,"value":2484}," flag in CI",{"type":91,"value":2486}," — prevents interactive prompts from hanging pipelines",{"type":85,"tag":137,"props":2488,"children":2490},{"id":2489},"deployment-strategy-matrix",[2491],{"type":91,"value":2492},"Deployment Strategy Matrix",{"type":85,"tag":2271,"props":2494,"children":2495},{},[2496,2517],{"type":85,"tag":2275,"props":2497,"children":2498},{},[2499],{"type":85,"tag":2279,"props":2500,"children":2501},{},[2502,2507,2512],{"type":85,"tag":2283,"props":2503,"children":2504},{},[2505],{"type":91,"value":2506},"Scenario",{"type":85,"tag":2283,"props":2508,"children":2509},{},[2510],{"type":91,"value":2511},"Strategy",{"type":85,"tag":2283,"props":2513,"children":2514},{},[2515],{"type":91,"value":2516},"Commands",{"type":85,"tag":2294,"props":2518,"children":2519},{},[2520,2538,2560,2582,2600,2622,2645],{"type":85,"tag":2279,"props":2521,"children":2522},{},[2523,2528,2533],{"type":85,"tag":2301,"props":2524,"children":2525},{},[2526],{"type":91,"value":2527},"Standard team workflow",{"type":85,"tag":2301,"props":2529,"children":2530},{},[2531],{"type":91,"value":2532},"Git-push deploy",{"type":85,"tag":2301,"props":2534,"children":2535},{},[2536],{"type":91,"value":2537},"Push to main\u002Ffeature branches",{"type":85,"tag":2279,"props":2539,"children":2540},{},[2541,2546,2551],{"type":85,"tag":2301,"props":2542,"children":2543},{},[2544],{"type":91,"value":2545},"Custom CI\u002FCD (Actions, CircleCI)",{"type":85,"tag":2301,"props":2547,"children":2548},{},[2549],{"type":91,"value":2550},"Prebuilt deploy",{"type":85,"tag":2301,"props":2552,"children":2553},{},[2554],{"type":85,"tag":100,"props":2555,"children":2557},{"className":2556},[],[2558],{"type":91,"value":2559},"vercel build && vercel deploy --prebuilt",{"type":85,"tag":2279,"props":2561,"children":2562},{},[2563,2568,2573],{"type":85,"tag":2301,"props":2564,"children":2565},{},[2566],{"type":91,"value":2567},"Monorepo with Turborepo",{"type":85,"tag":2301,"props":2569,"children":2570},{},[2571],{"type":91,"value":2572},"Affected + remote cache",{"type":85,"tag":2301,"props":2574,"children":2575},{},[2576],{"type":85,"tag":100,"props":2577,"children":2579},{"className":2578},[],[2580],{"type":91,"value":2581},"turbo run build --affected --remote-cache",{"type":85,"tag":2279,"props":2583,"children":2584},{},[2585,2590,2595],{"type":85,"tag":2301,"props":2586,"children":2587},{},[2588],{"type":91,"value":2589},"Preview for every PR",{"type":85,"tag":2301,"props":2591,"children":2592},{},[2593],{"type":91,"value":2594},"Default behavior",{"type":85,"tag":2301,"props":2596,"children":2597},{},[2598],{"type":91,"value":2599},"Auto-creates preview URL per branch",{"type":85,"tag":2279,"props":2601,"children":2602},{},[2603,2608,2613],{"type":85,"tag":2301,"props":2604,"children":2605},{},[2606],{"type":91,"value":2607},"Promote preview to production",{"type":85,"tag":2301,"props":2609,"children":2610},{},[2611],{"type":91,"value":2612},"CLI promotion",{"type":85,"tag":2301,"props":2614,"children":2615},{},[2616],{"type":85,"tag":100,"props":2617,"children":2619},{"className":2618},[],[2620],{"type":91,"value":2621},"vercel promote \u003Curl>",{"type":85,"tag":2279,"props":2623,"children":2624},{},[2625,2630,2635],{"type":85,"tag":2301,"props":2626,"children":2627},{},[2628],{"type":91,"value":2629},"Atomic deploys with DB migrations",{"type":85,"tag":2301,"props":2631,"children":2632},{},[2633],{"type":91,"value":2634},"Two-phase",{"type":85,"tag":2301,"props":2636,"children":2637},{},[2638,2640],{"type":91,"value":2639},"Run migration → verify → ",{"type":85,"tag":100,"props":2641,"children":2643},{"className":2642},[],[2644],{"type":91,"value":112},{"type":85,"tag":2279,"props":2646,"children":2647},{},[2648,2653,2658],{"type":85,"tag":2301,"props":2649,"children":2650},{},[2651],{"type":91,"value":2652},"Edge-first architecture",{"type":85,"tag":2301,"props":2654,"children":2655},{},[2656],{"type":91,"value":2657},"Edge Functions",{"type":85,"tag":2301,"props":2659,"children":2660},{},[2661,2663,2669],{"type":91,"value":2662},"Set ",{"type":85,"tag":100,"props":2664,"children":2666},{"className":2665},[],[2667],{"type":91,"value":2668},"runtime: 'edge'",{"type":91,"value":2670}," in route config",{"type":85,"tag":137,"props":2672,"children":2674},{"id":2673},"common-build-errors",[2675],{"type":91,"value":2676},"Common Build Errors",{"type":85,"tag":2271,"props":2678,"children":2679},{},[2680,2701],{"type":85,"tag":2275,"props":2681,"children":2682},{},[2683],{"type":85,"tag":2279,"props":2684,"children":2685},{},[2686,2691,2696],{"type":85,"tag":2283,"props":2687,"children":2688},{},[2689],{"type":91,"value":2690},"Error",{"type":85,"tag":2283,"props":2692,"children":2693},{},[2694],{"type":91,"value":2695},"Cause",{"type":85,"tag":2283,"props":2697,"children":2698},{},[2699],{"type":91,"value":2700},"Fix",{"type":85,"tag":2294,"props":2702,"children":2703},{},[2704,2734,2763,2791,2823],{"type":85,"tag":2279,"props":2705,"children":2706},{},[2707,2716,2721],{"type":85,"tag":2301,"props":2708,"children":2709},{},[2710],{"type":85,"tag":100,"props":2711,"children":2713},{"className":2712},[],[2714],{"type":91,"value":2715},"ERR_PNPM_OUTDATED_LOCKFILE",{"type":85,"tag":2301,"props":2717,"children":2718},{},[2719],{"type":91,"value":2720},"Lockfile doesn't match package.json",{"type":85,"tag":2301,"props":2722,"children":2723},{},[2724,2726,2732],{"type":91,"value":2725},"Run ",{"type":85,"tag":100,"props":2727,"children":2729},{"className":2728},[],[2730],{"type":91,"value":2731},"pnpm install",{"type":91,"value":2733},", commit lockfile",{"type":85,"tag":2279,"props":2735,"children":2736},{},[2737,2746,2751],{"type":85,"tag":2301,"props":2738,"children":2739},{},[2740],{"type":85,"tag":100,"props":2741,"children":2743},{"className":2742},[],[2744],{"type":91,"value":2745},"NEXT_NOT_FOUND",{"type":85,"tag":2301,"props":2747,"children":2748},{},[2749],{"type":91,"value":2750},"Root directory misconfigured",{"type":85,"tag":2301,"props":2752,"children":2753},{},[2754,2755,2761],{"type":91,"value":2662},{"type":85,"tag":100,"props":2756,"children":2758},{"className":2757},[],[2759],{"type":91,"value":2760},"rootDirectory",{"type":91,"value":2762}," in Project Settings",{"type":85,"tag":2279,"props":2764,"children":2765},{},[2766,2775,2780],{"type":85,"tag":2301,"props":2767,"children":2768},{},[2769],{"type":85,"tag":100,"props":2770,"children":2772},{"className":2771},[],[2773],{"type":91,"value":2774},"Invalid next.config.js",{"type":85,"tag":2301,"props":2776,"children":2777},{},[2778],{"type":91,"value":2779},"Config syntax error",{"type":85,"tag":2301,"props":2781,"children":2782},{},[2783,2785],{"type":91,"value":2784},"Validate config locally with ",{"type":85,"tag":100,"props":2786,"children":2788},{"className":2787},[],[2789],{"type":91,"value":2790},"next build",{"type":85,"tag":2279,"props":2792,"children":2793},{},[2794,2805,2810],{"type":85,"tag":2301,"props":2795,"children":2796},{},[2797,2803],{"type":85,"tag":100,"props":2798,"children":2800},{"className":2799},[],[2801],{"type":91,"value":2802},"functions\u002Fapi\u002F*.js",{"type":91,"value":2804}," mismatch",{"type":85,"tag":2301,"props":2806,"children":2807},{},[2808],{"type":91,"value":2809},"Wrong file structure",{"type":85,"tag":2301,"props":2811,"children":2812},{},[2813,2815,2821],{"type":91,"value":2814},"Move to ",{"type":85,"tag":100,"props":2816,"children":2818},{"className":2817},[],[2819],{"type":91,"value":2820},"app\u002Fapi\u002F",{"type":91,"value":2822}," directory (App Router)",{"type":85,"tag":2279,"props":2824,"children":2825},{},[2826,2835,2840],{"type":85,"tag":2301,"props":2827,"children":2828},{},[2829],{"type":85,"tag":100,"props":2830,"children":2832},{"className":2831},[],[2833],{"type":91,"value":2834},"Error: EPERM",{"type":85,"tag":2301,"props":2836,"children":2837},{},[2838],{"type":91,"value":2839},"File permission issue in build",{"type":85,"tag":2301,"props":2841,"children":2842},{},[2843,2845,2851],{"type":91,"value":2844},"Don't ",{"type":85,"tag":100,"props":2846,"children":2848},{"className":2847},[],[2849],{"type":91,"value":2850},"chmod",{"type":91,"value":2852}," in build scripts; use postinstall",{"type":85,"tag":137,"props":2854,"children":2856},{"id":2855},"deploy-summary-format",[2857],{"type":91,"value":2858},"Deploy Summary Format",{"type":85,"tag":94,"props":2860,"children":2861},{},[2862],{"type":91,"value":2863},"Present a structured deploy result block:",{"type":85,"tag":151,"props":2865,"children":2869},{"className":2866,"code":2868,"language":91},[2867],"language-text","## Deploy Result\n- **URL**: \u003Cdeployment-url>\n- **Target**: production | preview\n- **Status**: READY | ERROR | BUILDING | QUEUED\n- **Commit**: \u003Cshort-sha>\n- **Framework**: \u003Cdetected-framework>\n- **Build Duration**: \u003Cduration>\n",[2870],{"type":85,"tag":100,"props":2871,"children":2872},{"__ignoreMap":156},[2873],{"type":91,"value":2868},{"type":85,"tag":94,"props":2875,"children":2876},{},[2877],{"type":91,"value":2878},"If the deployment failed, append:",{"type":85,"tag":151,"props":2880,"children":2883},{"className":2881,"code":2882,"language":91},[2867],"- **Error**: \u003Csummary of failure from logs>\n",[2884],{"type":85,"tag":100,"props":2885,"children":2886},{"__ignoreMap":156},[2887],{"type":91,"value":2882},{"type":85,"tag":94,"props":2889,"children":2890},{},[2891],{"type":91,"value":2892},"For production deploys, also include:",{"type":85,"tag":151,"props":2894,"children":2897},{"className":2895,"code":2896,"language":91},[2867],"### Post-Deploy Observability\n- **Error scan**: \u003CN errors found \u002F clean> (scanned via vercel logs --level error --since 1h)\n- **Drains**: \u003CN configured \u002F none>\n- **Monitoring**: \u003Cactive \u002F gaps identified>\n",[2898],{"type":85,"tag":100,"props":2899,"children":2900},{"__ignoreMap":156},[2901],{"type":91,"value":2896},{"type":85,"tag":137,"props":2903,"children":2905},{"id":2904},"deploy-next-steps",[2906],{"type":91,"value":2907},"Deploy Next Steps",{"type":85,"tag":94,"props":2909,"children":2910},{},[2911],{"type":91,"value":2912},"Based on the deployment outcome:",{"type":85,"tag":1288,"props":2914,"children":2915},{},[2916,2934,2952,2978,3003,3027,3045],{"type":85,"tag":1292,"props":2917,"children":2918},{},[2919,2924,2926,2932],{"type":85,"tag":424,"props":2920,"children":2921},{},[2922],{"type":91,"value":2923},"Success (preview)",{"type":91,"value":2925}," → \"Visit the preview URL to verify. When ready, run ",{"type":85,"tag":100,"props":2927,"children":2929},{"className":2928},[],[2930],{"type":91,"value":2931},"\u002Fdeploy prod",{"type":91,"value":2933}," to promote to production.\"",{"type":85,"tag":1292,"props":2935,"children":2936},{},[2937,2942,2944,2950],{"type":85,"tag":424,"props":2938,"children":2939},{},[2940],{"type":91,"value":2941},"Success (production)",{"type":91,"value":2943}," → \"Your production site is live. Run ",{"type":85,"tag":100,"props":2945,"children":2947},{"className":2946},[],[2948],{"type":91,"value":2949},"\u002Fstatus",{"type":91,"value":2951}," to see the full project overview.\"",{"type":85,"tag":1292,"props":2953,"children":2954},{},[2955,2960,2962,2968,2970,2976],{"type":85,"tag":424,"props":2956,"children":2957},{},[2958],{"type":91,"value":2959},"Build error",{"type":91,"value":2961}," → \"Check the build logs above. Common fixes: verify ",{"type":85,"tag":100,"props":2963,"children":2965},{"className":2964},[],[2966],{"type":91,"value":2967},"build",{"type":91,"value":2969}," script in package.json, check for missing env vars with ",{"type":85,"tag":100,"props":2971,"children":2973},{"className":2972},[],[2974],{"type":91,"value":2975},"\u002Fenv list",{"type":91,"value":2977},", ensure dependencies are installed.\"",{"type":85,"tag":1292,"props":2979,"children":2980},{},[2981,2986,2988,2994,2996,3001],{"type":85,"tag":424,"props":2982,"children":2983},{},[2984],{"type":91,"value":2985},"Missing env vars",{"type":91,"value":2987}," → \"Run ",{"type":85,"tag":100,"props":2989,"children":2991},{"className":2990},[],[2992],{"type":91,"value":2993},"\u002Fenv pull",{"type":91,"value":2995}," to sync environment variables locally, or ",{"type":85,"tag":100,"props":2997,"children":2999},{"className":2998},[],[3000],{"type":91,"value":2975},{"type":91,"value":3002}," to review what's configured on Vercel.\"",{"type":85,"tag":1292,"props":3004,"children":3005},{},[3006,3011,3013,3018,3020,3025],{"type":85,"tag":424,"props":3007,"children":3008},{},[3009],{"type":91,"value":3010},"Monorepo issues",{"type":91,"value":3012}," → \"Ensure the correct project root is configured in Vercel project settings. Check ",{"type":85,"tag":100,"props":3014,"children":3016},{"className":3015},[],[3017],{"type":91,"value":47},{"type":91,"value":3019}," for ",{"type":85,"tag":100,"props":3021,"children":3023},{"className":3022},[],[3024],{"type":91,"value":2760},{"type":91,"value":3026},".\"",{"type":85,"tag":1292,"props":3028,"children":3029},{},[3030,3035,3037,3043],{"type":85,"tag":424,"props":3031,"children":3032},{},[3033],{"type":91,"value":3034},"Post-deploy errors detected",{"type":91,"value":3036}," → \"Review errors above. Check ",{"type":85,"tag":100,"props":3038,"children":3040},{"className":3039},[],[3041],{"type":91,"value":3042},"vercel logs \u003Curl> --level error",{"type":91,"value":3044}," for details. If drains are configured, correlate with external monitoring.\"",{"type":85,"tag":1292,"props":3046,"children":3047},{},[3048,3053,3055,3060],{"type":85,"tag":424,"props":3049,"children":3050},{},[3051],{"type":91,"value":3052},"No monitoring configured",{"type":91,"value":3054}," → \"Set up drains or install an error tracking integration before the next production deploy. Run ",{"type":85,"tag":100,"props":3056,"children":3058},{"className":3057},[],[3059],{"type":91,"value":2949},{"type":91,"value":3061}," for a full observability diagnostic.\"",{"type":85,"tag":137,"props":3063,"children":3065},{"id":3064},"official-documentation",[3066],{"type":91,"value":3067},"Official Documentation",{"type":85,"tag":1288,"props":3069,"children":3070},{},[3071,3083,3093,3102,3111,3120],{"type":85,"tag":1292,"props":3072,"children":3073},{},[3074],{"type":85,"tag":3075,"props":3076,"children":3080},"a",{"href":3077,"rel":3078},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments",[3079],"nofollow",[3081],{"type":91,"value":3082},"Deployments",{"type":85,"tag":1292,"props":3084,"children":3085},{},[3086],{"type":85,"tag":3075,"props":3087,"children":3090},{"href":3088,"rel":3089},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcli",[3079],[3091],{"type":91,"value":3092},"Vercel CLI",{"type":85,"tag":1292,"props":3094,"children":3095},{},[3096],{"type":85,"tag":3075,"props":3097,"children":3100},{"href":3098,"rel":3099},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments\u002Fgit\u002Fvercel-for-github",[3079],[3101],{"type":91,"value":848},{"type":85,"tag":1292,"props":3103,"children":3104},{},[3105],{"type":85,"tag":3075,"props":3106,"children":3109},{"href":3107,"rel":3108},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments\u002Fgit\u002Fvercel-for-gitlab",[3079],[3110],{"type":91,"value":1312},{"type":85,"tag":1292,"props":3112,"children":3113},{},[3114],{"type":85,"tag":3075,"props":3115,"children":3118},{"href":3116,"rel":3117},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments\u002Fgit\u002Fvercel-for-bitbucket",[3079],[3119],{"type":91,"value":1453},{"type":85,"tag":1292,"props":3121,"children":3122},{},[3123],{"type":85,"tag":3075,"props":3124,"children":3127},{"href":3125,"rel":3126},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Foidc",[3079],[3128],{"type":91,"value":3129},"OIDC Federation",{"type":85,"tag":3131,"props":3132,"children":3133},"style",{},[3134],{"type":91,"value":3135},"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":3137,"total":3242},[3138,3155,3175,3190,3207,3224,3231],{"slug":3139,"name":3139,"fn":3140,"description":3141,"org":3142,"tags":3143,"stars":23,"repoUrl":24,"updatedAt":3154},"ai-gateway","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},[3144,3147,3150,3153],{"name":3145,"slug":3146,"type":15},"AI Infrastructure","ai-infrastructure",{"name":3148,"slug":3149,"type":15},"Cost Optimization","cost-optimization",{"name":3151,"slug":3152,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:06.57787",{"slug":3156,"name":3156,"fn":3157,"description":3158,"org":3159,"tags":3160,"stars":23,"repoUrl":24,"updatedAt":3174},"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},[3161,3164,3167,3170,3173],{"name":3162,"slug":3163,"type":15},"Auth0","auth0",{"name":3165,"slug":3166,"type":15},"Authentication","authentication",{"name":3168,"slug":3169,"type":15},"Next.js","next-js",{"name":3171,"slug":3172,"type":15},"Security","security",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:17.050565",{"slug":3176,"name":3176,"fn":3177,"description":3178,"org":3179,"tags":3180,"stars":23,"repoUrl":24,"updatedAt":3189},"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},[3181,3184,3185,3188],{"name":3182,"slug":3183,"type":15},"Configuration","configuration",{"name":18,"slug":19,"type":15},{"name":3186,"slug":3187,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:18.297868",{"slug":3191,"name":3191,"fn":3192,"description":3193,"org":3194,"tags":3195,"stars":23,"repoUrl":24,"updatedAt":3206},"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},[3196,3199,3202,3205],{"name":3197,"slug":3198,"type":15},"Caching","caching",{"name":3200,"slug":3201,"type":15},"Observability","observability",{"name":3203,"slug":3204,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-07-30T05:31:34.628944",{"slug":3208,"name":3208,"fn":3209,"description":3210,"org":3211,"tags":3212,"stars":23,"repoUrl":24,"updatedAt":3223},"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},[3213,3216,3219,3222],{"name":3214,"slug":3215,"type":15},"Agents","agents",{"name":3217,"slug":3218,"type":15},"Messaging","messaging",{"name":3220,"slug":3221,"type":15},"SDK","sdk",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:26.921901",{"slug":4,"name":4,"fn":5,"description":6,"org":3225,"tags":3226,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3227,3228,3229,3230],{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":3232,"name":3232,"fn":3233,"description":3234,"org":3235,"tags":3236,"stars":23,"repoUrl":24,"updatedAt":3241},"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},[3237,3238,3239,3240],{"name":3182,"slug":3183,"type":15},{"name":13,"slug":14,"type":15},{"name":3171,"slug":3172,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:56:28.150777",29,{"items":3244,"total":3407},[3245,3263,3275,3292,3303,3316,3332,3346,3358,3377,3387,3397],{"slug":3246,"name":3246,"fn":3247,"description":3248,"org":3249,"tags":3250,"stars":3260,"repoUrl":3261,"updatedAt":3262},"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},[3251,3252,3255,3258,3259],{"name":3197,"slug":3198,"type":15},{"name":3253,"slug":3254,"type":15},"Frontend","frontend",{"name":3256,"slug":3257,"type":15},"Migration","migration",{"name":3168,"slug":3169,"type":15},{"name":9,"slug":8,"type":15},141208,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fnext.js","2026-07-24T05:38:30.118542",{"slug":3264,"name":3264,"fn":3265,"description":3266,"org":3267,"tags":3268,"stars":3260,"repoUrl":3261,"updatedAt":3274},"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},[3269,3270,3271,3272,3273],{"name":3197,"slug":3198,"type":15},{"name":3253,"slug":3254,"type":15},{"name":3168,"slug":3169,"type":15},{"name":3203,"slug":3204,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:31:10.674078",{"slug":3276,"name":3276,"fn":3277,"description":3278,"org":3279,"tags":3280,"stars":3260,"repoUrl":3261,"updatedAt":3291},"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},[3281,3284,3285,3286,3287,3288],{"name":3282,"slug":3283,"type":15},"Debugging","debugging",{"name":3253,"slug":3254,"type":15},{"name":3186,"slug":3187,"type":15},{"name":3168,"slug":3169,"type":15},{"name":9,"slug":8,"type":15},{"name":3289,"slug":3290,"type":15},"Web Development","web-development","2026-05-22T06:45:28.627735",{"slug":3293,"name":3293,"fn":3294,"description":3295,"org":3296,"tags":3297,"stars":3260,"repoUrl":3261,"updatedAt":3302},"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},[3298,3299,3300,3301],{"name":3253,"slug":3254,"type":15},{"name":3168,"slug":3169,"type":15},{"name":3203,"slug":3204,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:31:11.591864",{"slug":3304,"name":3304,"fn":3305,"description":3306,"org":3307,"tags":3308,"stars":3313,"repoUrl":3314,"updatedAt":3315},"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},[3309,3310,3311],{"name":21,"slug":22,"type":15},{"name":3203,"slug":3204,"type":15},{"name":3312,"slug":3304,"type":15},"Turborepo",30809,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fturborepo","2026-07-30T05:32:14.920116",{"slug":3317,"name":3317,"fn":3318,"description":3319,"org":3320,"tags":3321,"stars":3329,"repoUrl":3330,"updatedAt":3331},"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},[3322,3325,3328],{"name":3323,"slug":3324,"type":15},"AI SDK","ai-sdk",{"name":3326,"slug":3327,"type":15},"Testing","testing",{"name":9,"slug":8,"type":15},25670,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai","2026-04-06T18:55:51.318866",{"slug":3333,"name":3333,"fn":3334,"description":3335,"org":3336,"tags":3337,"stars":3329,"repoUrl":3330,"updatedAt":3345},"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},[3338,3339,3340,3343,3344],{"name":3214,"slug":3215,"type":15},{"name":3323,"slug":3324,"type":15},{"name":3341,"slug":3342,"type":15},"Harness","harness",{"name":3220,"slug":3221,"type":15},{"name":9,"slug":8,"type":15},"2026-06-18T08:29:19.858737",{"slug":3347,"name":3347,"fn":3348,"description":3349,"org":3350,"tags":3351,"stars":3329,"repoUrl":3330,"updatedAt":3357},"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},[3352,3353,3356],{"name":3323,"slug":3324,"type":15},{"name":3354,"slug":3355,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},"2026-04-06T18:55:47.45549",{"slug":3359,"name":3359,"fn":3360,"description":3361,"org":3362,"tags":3363,"stars":3329,"repoUrl":3330,"updatedAt":3376},"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},[3364,3367,3370,3373],{"name":3365,"slug":3366,"type":15},"ADR","adr",{"name":3368,"slug":3369,"type":15},"Architecture","architecture",{"name":3371,"slug":3372,"type":15},"Documentation","documentation",{"name":3374,"slug":3375,"type":15},"Engineering","engineering","2026-04-06T18:55:50.043694",{"slug":3324,"name":3324,"fn":3378,"description":3379,"org":3380,"tags":3381,"stars":3329,"repoUrl":3330,"updatedAt":3386},"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},[3382,3383,3384,3385],{"name":3214,"slug":3215,"type":15},{"name":3323,"slug":3324,"type":15},{"name":3151,"slug":3152,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:48.739463",{"slug":3388,"name":3388,"fn":3389,"description":3390,"org":3391,"tags":3392,"stars":3329,"repoUrl":3330,"updatedAt":3396},"capture-api-response-test-fixture","capture API response test fixtures","Capture API response test fixture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3393,3394,3395],{"name":3354,"slug":3355,"type":15},{"name":3326,"slug":3327,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:56.374433",{"slug":3398,"name":3398,"fn":3399,"description":3400,"org":3401,"tags":3402,"stars":3329,"repoUrl":3330,"updatedAt":3406},"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},[3403,3404,3405],{"name":3323,"slug":3324,"type":15},{"name":3326,"slug":3327,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:55.088956",68]