Skip to content

ci: refactor wait-for-vercel-project to use GitHub Deployments API#1861

Merged
TooTallNate merged 4 commits intomainfrom
ci/wait-for-vercel-via-github-api
Apr 28, 2026
Merged

ci: refactor wait-for-vercel-project to use GitHub Deployments API#1861
TooTallNate merged 4 commits intomainfrom
ci/wait-for-vercel-via-github-api

Conversation

@TooTallNate
Copy link
Copy Markdown
Member

@TooTallNate TooTallNate commented Apr 28, 2026

Summary

Refactors the wait-for-vercel-project composite action to discover the deployment via the GitHub Deployments API instead of the Vercel REST API. This drops the per-team Vercel API token requirement (VERCEL_DOCS_TOKEN is now unreferenced anywhere in the repo) and shrinks the action's bundled dist/index.js from 5.4MB → 828KB (90K LOC removed) by dropping @vercel/sdk.

How it works

  1. Resolve the target SHA from the GitHub event payload (same as before).
  2. Find the GitHub Deployment for (sha, environment) where environment matches the Vercel-app-created naming pattern: Preview – <project-slug> or Production – <project-slug> (em-dash).
  3. Poll its latest deployment status. success and inactive are both terminal-OK — Vercel emits inactive immediately for skipped duplicate builds, and the environment_url in that case still points at the live previously-deployed URL.
  4. Resolve the dpl_xxx deployment ID from the matching commit status. Vercel posts a Vercel – <project-slug> commit status whose target_url's last path segment is the inspector ID — which equals the deployment ID without the dpl_ prefix. Action throws if the ID can't be resolved (consumers wire it into VERCEL_DEPLOYMENT_ID, which world-target uses to pick between the vercel and local worlds — an empty value would silently flip execution mode).

The action never makes a request to the deployment URL itself. By the time GitHub's deployment status reaches success, the Vercel app has already verified the deployment is live and routing is primed. This means there's no readiness probe and no need for a Deployment Protection bypass token in the action.

Inputs

Before After
team-id (required) removed
project-id (required, prj_xxx) removed
vercel-token (required) removed
project-slug (required)
github-token (optional, defaults to ${{ github.token }})
timeout, check-interval, environment unchanged

Outputs (deployment-url, deployment-id) are unchanged.

Testing

Manually verified all three scenarios against real recent commits in this repo:

  • Workbench preview (example-nextjs-workflow-webpack) — resolves URL + dpl_xxx ID
  • Workbench production — resolves URL + dpl_xxx ID
  • Docs preview with inactive (skipped duplicate build) — resolves URL of the still-live previous deployment

Call site changes

All four invocations updated:

  • .github/workflows/tests.yml — workbench e2e jobs
  • .github/workflows/benchmarks.yml — benchmark jobs
  • .github/workflows/docs-checks.yml — docs smoke checks (also dropped the unused VERCEL_DOCS_TOKEN env var that was being forwarded into check-docs-smoke.mjs despite never being read)
  • .github/workflows/dispatch-front-workflow-release-pr.yml — front release PR dispatch. This workflow has a top-level permissions: contents: read block that would prevent the default GITHUB_TOKEN from reading the Deployments / Statuses APIs, so it explicitly passes the GitHub App token (already generated for workflow,front) via the new github-token input.

VERCEL_LABS_TOKEN is still used to set WORKFLOW_VERCEL_AUTH_TOKEN for the e2e test runtime, so it stays. VERCEL_DOCS_TOKEN is now unreferenced anywhere in the repo and can be deleted from GH after this PR merges.

Notes

  • CI-only change; no changeset needed (pnpm changeset status confirms).
  • The action's package.json now depends on @types/node@^22.19.0 directly instead of the workspace catalog: entry — pnpm install against this package uses --ignore-workspace since it's outside the workspace root.

Replaces the Vercel SDK / Vercel API token-based implementation with one
that resolves the deployment URL via the GitHub Deployments API:

- Find the GitHub Deployment for (target SHA, environment) where
  environment matches the Vercel-app-created "Preview \u2013 <slug>" or
  "Production \u2013 <slug>" naming pattern.
- Wait for the latest deployment status to be `success` (or `inactive`
  when Vercel skips a duplicate build, in which case its environment_url
  still points at the live deployment).
- Probe the URL to confirm the edge can route to it (any non-5xx
  response counts as live, including 401/403 from Deployment Protection
  and 404/405 from the app). Manual redirect handling treats redirects
  to vercel.com as "still building".
- Resolve the dpl_xxx deployment ID from the matching commit status
  (Vercel posts `Vercel \u2013 <slug>` statuses where target_url's last
  path segment is the inspector ID == deployment ID without the prefix).

Inputs change: project-slug + bypass-secret + github-token (with
GITHUB_TOKEN default) replace team-id + project-id + vercel-token.

Removes the @vercel/sdk dependency, shrinking the bundled dist from
5.4MB to 829KB. The VERCEL_DOCS_TOKEN secret is no longer referenced
anywhere in the repo and can be deleted from GH after this lands.
Copilot AI review requested due to automatic review settings April 28, 2026 17:27
@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Apr 28, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment Apr 28, 2026 7:41pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Apr 28, 2026 7:41pm
example-workflow Ready Ready Preview, Comment Apr 28, 2026 7:41pm
workbench-astro-workflow Ready Ready Preview, Comment Apr 28, 2026 7:41pm
workbench-express-workflow Ready Ready Preview, Comment Apr 28, 2026 7:41pm
workbench-fastify-workflow Ready Ready Preview, Comment Apr 28, 2026 7:41pm
workbench-hono-workflow Ready Ready Preview, Comment Apr 28, 2026 7:41pm
workbench-nitro-workflow Ready Ready Preview, Comment Apr 28, 2026 7:41pm
workbench-nuxt-workflow Ready Ready Preview, Comment Apr 28, 2026 7:41pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Apr 28, 2026 7:41pm
workbench-vite-workflow Ready Ready Preview, Comment Apr 28, 2026 7:41pm
workflow-docs Ready Ready Preview, Comment, Open in v0 Apr 28, 2026 7:41pm
workflow-swc-playground Ready Ready Preview, Comment Apr 28, 2026 7:41pm
workflow-web Ready Ready Preview, Comment Apr 28, 2026 7:41pm

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 28, 2026

⚠️ No Changeset found

Latest commit: 24aa506

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 28, 2026

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 978 0 67 1045
✅ 💻 Local Development 1054 0 86 1140
✅ 📦 Local Production 1054 0 86 1140
✅ 🐘 Local Postgres 1054 0 86 1140
✅ 🪟 Windows 95 0 0 95
✅ 📋 Other 267 0 18 285
Total 4502 0 343 4845

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 88 0 7
✅ example 88 0 7
✅ express 88 0 7
✅ fastify 88 0 7
✅ hono 88 0 7
✅ nextjs-turbopack 93 0 2
✅ nextjs-webpack 93 0 2
✅ nitro 88 0 7
✅ nuxt 88 0 7
✅ sveltekit 88 0 7
✅ vite 88 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 89 0 6
✅ express-stable 89 0 6
✅ fastify-stable 89 0 6
✅ hono-stable 89 0 6
✅ nextjs-turbopack-canary 76 0 19
✅ nextjs-turbopack-stable 95 0 0
✅ nextjs-webpack-canary 76 0 19
✅ nextjs-webpack-stable 95 0 0
✅ nitro-stable 89 0 6
✅ nuxt-stable 89 0 6
✅ sveltekit-stable 89 0 6
✅ vite-stable 89 0 6
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 89 0 6
✅ express-stable 89 0 6
✅ fastify-stable 89 0 6
✅ hono-stable 89 0 6
✅ nextjs-turbopack-canary 76 0 19
✅ nextjs-turbopack-stable 95 0 0
✅ nextjs-webpack-canary 76 0 19
✅ nextjs-webpack-stable 95 0 0
✅ nitro-stable 89 0 6
✅ nuxt-stable 89 0 6
✅ sveltekit-stable 89 0 6
✅ vite-stable 89 0 6
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 89 0 6
✅ express-stable 89 0 6
✅ fastify-stable 89 0 6
✅ hono-stable 89 0 6
✅ nextjs-turbopack-canary 76 0 19
✅ nextjs-turbopack-stable 95 0 0
✅ nextjs-webpack-canary 76 0 19
✅ nextjs-webpack-stable 95 0 0
✅ nitro-stable 89 0 6
✅ nuxt-stable 89 0 6
✅ sveltekit-stable 89 0 6
✅ vite-stable 89 0 6
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 95 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 89 0 6
✅ e2e-local-postgres-nest-stable 89 0 6
✅ e2e-local-prod-nest-stable 89 0 6

📋 View full workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 28, 2026

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 0.042s (-3.0%) 1.005s (~) 0.964s 10 1.00x
💻 Local Express 0.044s (-1.4%) 1.005s (~) 0.961s 10 1.05x
💻 Local Next.js (Turbopack) 0.046s 1.005s 0.959s 10 1.10x
🐘 Postgres Express 0.060s (+3.8%) 1.010s (~) 0.950s 10 1.44x
🐘 Postgres Nitro 0.061s (-36.1% 🟢) 1.010s (-3.2%) 0.949s 10 1.45x
🐘 Postgres Next.js (Turbopack) 0.067s 1.013s 0.946s 10 1.60x
workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 1.114s 2.005s 0.892s 10 1.00x
💻 Local Nitro 1.126s (~) 2.006s (~) 0.880s 10 1.01x
💻 Local Express 1.131s (+0.5%) 2.005s (~) 0.874s 10 1.02x
🐘 Postgres Nitro 1.145s (~) 2.009s (~) 0.864s 10 1.03x
🐘 Postgres Next.js (Turbopack) 1.146s 2.011s 0.866s 10 1.03x
🐘 Postgres Express 1.148s (~) 2.011s (~) 0.863s 10 1.03x
workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 10.786s 11.024s 0.238s 3 1.00x
🐘 Postgres Nitro 10.877s (~) 11.021s (~) 0.144s 3 1.01x
🐘 Postgres Next.js (Turbopack) 10.903s 11.024s 0.120s 3 1.01x
🐘 Postgres Express 10.911s (~) 11.022s (~) 0.111s 3 1.01x
💻 Local Nitro 10.944s (~) 11.022s (~) 0.078s 3 1.01x
💻 Local Express 10.958s (~) 11.024s (~) 0.066s 3 1.02x
workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 14.537s (~) 15.023s (~) 0.486s 4 1.00x
🐘 Postgres Express 14.540s (~) 15.021s (~) 0.481s 4 1.00x
💻 Local Next.js (Turbopack) 14.593s 15.028s 0.435s 4 1.00x
🐘 Postgres Next.js (Turbopack) 14.639s 15.026s 0.387s 4 1.01x
💻 Local Express 15.000s (~) 15.280s (+1.7%) 0.279s 4 1.03x
💻 Local Nitro 15.029s (~) 15.531s (-3.1%) 0.502s 4 1.03x
workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 13.990s (~) 14.308s (~) 0.318s 7 1.00x
🐘 Postgres Express 14.008s (~) 14.445s (-1.0%) 0.437s 7 1.00x
🐘 Postgres Next.js (Turbopack) 14.181s 14.886s 0.706s 7 1.01x
💻 Local Next.js (Turbopack) 15.999s 16.363s 0.364s 6 1.14x
💻 Local Express 16.472s (-0.8%) 17.032s (~) 0.560s 6 1.18x
💻 Local Nitro 16.820s (~) 17.032s (~) 0.212s 6 1.20x
Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.251s 2.010s 0.759s 15 1.00x
🐘 Postgres Nitro 1.272s (~) 2.010s (~) 0.738s 15 1.02x
🐘 Postgres Express 1.276s (+1.2%) 2.009s (~) 0.734s 15 1.02x
💻 Local Nitro 1.512s (-7.3% 🟢) 2.005s (-3.3%) 0.493s 15 1.21x
💻 Local Express 1.523s (+2.3%) 2.006s (~) 0.483s 15 1.22x
💻 Local Next.js (Turbopack) 1.559s 2.073s 0.513s 15 1.25x
Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.319s (-1.8%) 3.010s (~) 0.691s 10 1.00x
🐘 Postgres Nitro 2.330s (-0.9%) 3.009s (~) 0.679s 10 1.00x
🐘 Postgres Next.js (Turbopack) 2.473s 3.010s 0.537s 10 1.07x
💻 Local Express 2.802s (-5.1% 🟢) 3.009s (-12.9% 🟢) 0.207s 10 1.21x
💻 Local Next.js (Turbopack) 2.910s 3.453s 0.543s 9 1.26x
💻 Local Nitro 3.043s (-3.2%) 3.675s (-5.4% 🟢) 0.633s 9 1.31x
Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.453s (-0.8%) 4.011s (~) 0.558s 8 1.00x
🐘 Postgres Express 3.474s (~) 4.010s (~) 0.536s 8 1.01x
🐘 Postgres Next.js (Turbopack) 3.742s 4.011s 0.269s 8 1.08x
💻 Local Express 7.428s (-10.9% 🟢) 8.021s (-11.1% 🟢) 0.592s 4 2.15x
💻 Local Next.js (Turbopack) 7.731s 8.268s 0.537s 4 2.24x
💻 Local Nitro 9.085s (+8.8% 🔺) 10.024s (+11.1% 🔺) 0.939s 3 2.63x
Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.245s 2.009s 0.765s 15 1.00x
🐘 Postgres Express 1.258s (~) 2.008s (~) 0.750s 15 1.01x
🐘 Postgres Nitro 1.268s (+0.9%) 2.008s (~) 0.739s 15 1.02x
💻 Local Next.js (Turbopack) 1.483s 2.006s 0.523s 15 1.19x
💻 Local Express 1.559s (-17.7% 🟢) 2.072s (-12.3% 🟢) 0.513s 15 1.25x
💻 Local Nitro 1.896s (+1.6%) 2.391s (+2.2%) 0.495s 13 1.52x
Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.312s (-1.2%) 3.009s (~) 0.698s 10 1.00x
🐘 Postgres Express 2.366s (+1.1%) 3.010s (~) 0.643s 10 1.02x
🐘 Postgres Next.js (Turbopack) 2.450s 3.010s 0.560s 10 1.06x
💻 Local Next.js (Turbopack) 2.840s 3.564s 0.724s 9 1.23x
💻 Local Express 2.857s (-8.8% 🟢) 3.107s (-17.4% 🟢) 0.250s 10 1.24x
💻 Local Nitro 3.120s (+1.8%) 4.012s (+3.2%) 0.892s 8 1.35x
Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.464s (~) 4.010s (~) 0.546s 8 1.00x
🐘 Postgres Express 3.545s (+1.3%) 4.011s (~) 0.467s 8 1.02x
🐘 Postgres Next.js (Turbopack) 3.703s 4.012s 0.309s 8 1.07x
💻 Local Next.js (Turbopack) 8.102s 8.769s 0.667s 4 2.34x
💻 Local Express 8.290s (-5.8% 🟢) 8.770s (-5.4% 🟢) 0.480s 4 2.39x
💻 Local Nitro 9.097s (-0.5%) 9.773s (-2.5%) 0.677s 4 2.63x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.815s (-0.7%) 1.023s (+1.6%) 0.208s 59 1.00x
🐘 Postgres Express 0.819s (-2.4%) 1.006s (-1.7%) 0.187s 60 1.01x
🐘 Postgres Next.js (Turbopack) 0.826s 1.007s 0.181s 60 1.01x
💻 Local Next.js (Turbopack) 0.838s 1.004s 0.166s 60 1.03x
💻 Local Nitro 1.004s (+2.3%) 1.458s (+33.3% 🔺) 0.454s 42 1.23x
💻 Local Express 1.029s (+4.5%) 1.770s (+64.5% 🔺) 0.742s 34 1.26x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.919s (~) 2.123s (+1.1%) 0.205s 43 1.00x
🐘 Postgres Express 1.940s (-1.8%) 2.184s (-3.3%) 0.244s 42 1.01x
🐘 Postgres Next.js (Turbopack) 2.043s 2.767s 0.724s 33 1.06x
💻 Local Next.js (Turbopack) 2.674s 3.008s 0.334s 30 1.39x
💻 Local Nitro 3.031s (~) 3.801s (+1.1%) 0.770s 24 1.58x
💻 Local Express 3.040s (+0.8%) 3.884s (+8.3% 🔺) 0.844s 24 1.58x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.938s (-1.3%) 4.296s (-1.7%) 0.357s 28 1.00x
🐘 Postgres Next.js (Turbopack) 4.180s 5.013s 0.833s 24 1.06x
🐘 Postgres Nitro 4.361s (+6.3% 🔺) 4.852s (+5.4% 🔺) 0.491s 25 1.11x
💻 Local Next.js (Turbopack) 8.643s 9.017s 0.375s 14 2.19x
💻 Local Express 8.923s (-3.1%) 9.325s (-6.9% 🟢) 0.402s 13 2.27x
💻 Local Nitro 9.214s (-0.9%) 9.787s (-2.3%) 0.573s 13 2.34x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.262s 1.007s 0.746s 60 1.00x
🐘 Postgres Express 0.276s (-2.1%) 1.007s (~) 0.730s 60 1.06x
🐘 Postgres Nitro 0.316s (+11.6% 🔺) 1.009s (~) 0.693s 60 1.21x
💻 Local Express 0.545s (-2.7%) 1.004s (~) 0.459s 60 2.08x
💻 Local Next.js (Turbopack) 0.590s 1.039s 0.450s 58 2.25x
💻 Local Nitro 0.608s (+0.5%) 1.022s (~) 0.414s 59 2.32x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.495s (-2.9%) 1.007s (~) 0.512s 90 1.00x
🐘 Postgres Nitro 0.521s (+4.9%) 1.008s (~) 0.487s 90 1.05x
🐘 Postgres Next.js (Turbopack) 0.521s 1.007s 0.486s 90 1.05x
💻 Local Express 2.333s (-7.2% 🟢) 3.009s (~) 0.676s 30 4.71x
💻 Local Next.js (Turbopack) 2.499s 3.009s 0.510s 30 5.05x
💻 Local Nitro 2.546s (~) 3.009s (~) 0.462s 30 5.14x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.788s (-3.7%) 1.008s (-0.9%) 0.219s 120 1.00x
🐘 Postgres Nitro 0.863s (+9.1% 🔺) 1.055s (+4.7%) 0.192s 114 1.09x
🐘 Postgres Next.js (Turbopack) 0.912s 1.111s 0.199s 108 1.16x
💻 Local Express 10.240s (-8.5% 🟢) 10.936s (-8.4% 🟢) 0.696s 11 12.99x
💻 Local Next.js (Turbopack) 10.374s 11.028s 0.654s 11 13.16x
💻 Local Nitro 11.279s (+0.8%) 12.029s (+3.1%) 0.750s 10 14.30x
Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 0.169s 1.003s 0.012s 1.018s 0.849s 10 1.00x
🐘 Postgres Next.js (Turbopack) 0.206s 1.000s 0.002s 1.012s 0.806s 10 1.22x
💻 Local Nitro 0.206s (-3.5%) 1.004s (~) 0.012s (-1.6%) 1.019s (~) 0.812s 10 1.22x
🐘 Postgres Express 0.213s (+4.0%) 0.999s (~) 0.001s (-12.5% 🟢) 1.010s (~) 0.797s 10 1.26x
💻 Local Express 0.217s (+9.0% 🔺) 1.004s (~) 0.010s (-16.5% 🟢) 1.016s (~) 0.799s 10 1.29x
🐘 Postgres Nitro 0.225s (+9.6% 🔺) 0.995s (~) 0.001s (-40.0% 🟢) 1.009s (~) 0.784s 10 1.33x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.611s (-3.0%) 1.022s (+1.5%) 0.004s (+2.6%) 1.039s (+1.6%) 0.428s 58 1.00x
💻 Local Next.js (Turbopack) 0.647s 1.012s 0.010s 1.024s 0.377s 59 1.06x
🐘 Postgres Nitro 0.652s (+4.5%) 1.004s (~) 0.004s (-10.2% 🟢) 1.022s (~) 0.370s 59 1.07x
🐘 Postgres Next.js (Turbopack) 0.671s 1.009s 0.007s 1.029s 0.359s 59 1.10x
💻 Local Express 0.754s (~) 1.013s (-1.6%) 0.009s (-6.7% 🟢) 1.023s (-1.6%) 0.269s 59 1.23x
💻 Local Nitro 0.756s (-9.9% 🟢) 1.012s (~) 0.010s (+5.8% 🔺) 1.023s (-8.3% 🟢) 0.268s 59 1.24x
10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.894s (-7.7% 🟢) 1.108s (-11.2% 🟢) 0.000s (-100.0% 🟢) 1.119s (-11.0% 🟢) 0.225s 54 1.00x
🐘 Postgres Express 0.964s (~) 1.240s (-3.0%) 0.000s (-52.1% 🟢) 1.259s (-3.6%) 0.296s 48 1.08x
🐘 Postgres Next.js (Turbopack) 0.972s 1.272s 0.000s 1.280s 0.309s 48 1.09x
💻 Local Express 1.191s (-2.7%) 2.020s (~) 0.000s (+20.0% 🔺) 2.022s (~) 0.831s 30 1.33x
💻 Local Next.js (Turbopack) 1.245s 2.020s 0.000s 2.023s 0.779s 30 1.39x
💻 Local Nitro 1.427s (+16.7% 🔺) 2.022s (~) 0.000s (+257.1% 🔺) 2.203s (+9.0% 🔺) 0.776s 28 1.60x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.740s (-2.9%) 2.175s (+1.6%) 0.000s (-100.0% 🟢) 2.187s (+0.6%) 0.448s 28 1.00x
🐘 Postgres Express 1.811s (+2.2%) 2.175s (~) 0.000s (+Infinity% 🔺) 2.205s (~) 0.393s 28 1.04x
🐘 Postgres Next.js (Turbopack) 1.973s 2.262s 0.000s 2.270s 0.297s 27 1.13x
💻 Local Express 3.318s (-4.3%) 4.034s (~) 0.000s (-58.3% 🟢) 4.038s (~) 0.720s 15 1.91x
💻 Local Next.js (Turbopack) 3.441s 4.035s 0.000s 4.039s 0.597s 15 1.98x
💻 Local Nitro 3.531s (+4.2%) 4.100s (+1.7%) 0.000s (-12.5% 🟢) 4.102s (+1.6%) 0.572s 15 2.03x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Next.js (Turbopack) 12/21
🐘 Postgres Nitro 11/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 19/21
Next.js (Turbopack) 🐘 Postgres 15/21
Nitro 🐘 Postgres 18/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run


⚠️ Community world benchmarks failed (non-blocking):

  • Community Worlds: failure

Check the workflow run for details.

@socket-security
Copy link
Copy Markdown

socket-security Bot commented Apr 28, 2026

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addednpm/​@​types/​node@​22.19.171001008195100

View full report

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors the internal wait-for-vercel-project GitHub Action to discover and poll Vercel deployments via the GitHub Deployments API (rather than Vercel’s API), simplifying secrets management and reducing the action bundle/deps.

Changes:

  • Reworked the action implementation to list GitHub Deployments by (sha, environment) and poll deployment statuses + probe the environment URL.
  • Updated CI workflows to pass project-slug / bypass-secret instead of Vercel team/project IDs and Vercel API tokens.
  • Removed @vercel/sdk from the action package dependencies and updated the lockfile accordingly.

Reviewed changes

Copilot reviewed 7 out of 9 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
.github/workflows/tests.yml Updates action invocation to use project-slug and bypass secret.
.github/workflows/benchmarks.yml Updates action invocation to use project-slug and bypass secret.
.github/workflows/docs-checks.yml Updates action invocation and removes forwarding of the unused docs Vercel token env var.
.github/workflows/dispatch-front-workflow-release-pr.yml Updates docs deployment wait step to use the new action inputs.
.github/actions/wait-for-vercel-project/src/wait-for-deployment.ts Implements GitHub Deployments API polling, readiness probing, and deployment-id resolution from commit statuses.
.github/actions/wait-for-vercel-project/action.yml Updates inputs/outputs documentation for the new mechanism and parameters.
.github/actions/wait-for-vercel-project/package.json Drops @vercel/sdk, updates description, adds @types/node.
.github/actions/wait-for-vercel-project/pnpm-lock.yaml Reflects dependency removals/additions for the action package.
Files not reviewed (1)
  • .github/actions/wait-for-vercel-project/pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread .github/actions/wait-for-vercel-project/action.yml
Comment thread .github/actions/wait-for-vercel-project/src/wait-for-deployment.ts Outdated
Comment thread .github/workflows/dispatch-front-workflow-release-pr.yml
Comment thread .github/actions/wait-for-vercel-project/action.yml Outdated
The GitHub Deployment status transitions to `success` only after the
Vercel app finishes building and routing is live, so an extra HTTP
liveness probe of the deployment URL was redundant. Removing it lets
us also drop the bypass-secret input \u2014 protected deployments don't
need a workaround anymore because we never make the request.

Reduces the action surface area and eliminates a runtime fetch.
- Fail loudly when the dpl_xxx deployment ID can't be resolved instead
  of returning an empty string. Consumers wire this into
  VERCEL_DEPLOYMENT_ID, which world-target uses to pick between the
  vercel and local worlds (packages/utils/src/world-target.ts), so an
  empty value would silently flip execution mode.
- Pass the GitHub App token to wait-for-vercel-project in the dispatch
  release workflow. The job sets `permissions: contents: read`, which
  blocks the default GITHUB_TOKEN from reading the Deployments API.
  The App token (already generated for workflow,front) has the
  necessary scopes.
@TooTallNate TooTallNate enabled auto-merge (squash) April 28, 2026 20:10
@TooTallNate TooTallNate merged commit 3a08eaa into main Apr 28, 2026
154 of 165 checks passed
@TooTallNate TooTallNate deleted the ci/wait-for-vercel-via-github-api branch April 28, 2026 20:20
ijjk pushed a commit that referenced this pull request Apr 28, 2026
…1861)

* ci: refactor wait-for-vercel-project to use GitHub Deployments API

Replaces the Vercel SDK / Vercel API token-based implementation with one
that resolves the deployment URL via the GitHub Deployments API:

- Find the GitHub Deployment for (target SHA, environment) where
  environment matches the Vercel-app-created "Preview \u2013 <slug>" or
  "Production \u2013 <slug>" naming pattern.
- Wait for the latest deployment status to be `success` (or `inactive`
  when Vercel skips a duplicate build, in which case its environment_url
  still points at the live deployment).
- Probe the URL to confirm the edge can route to it (any non-5xx
  response counts as live, including 401/403 from Deployment Protection
  and 404/405 from the app). Manual redirect handling treats redirects
  to vercel.com as "still building".
- Resolve the dpl_xxx deployment ID from the matching commit status
  (Vercel posts `Vercel \u2013 <slug>` statuses where target_url's last
  path segment is the inspector ID == deployment ID without the prefix).

Inputs change: project-slug + bypass-secret + github-token (with
GITHUB_TOKEN default) replace team-id + project-id + vercel-token.

Removes the @vercel/sdk dependency, shrinking the bundled dist from
5.4MB to 829KB. The VERCEL_DOCS_TOKEN secret is no longer referenced
anywhere in the repo and can be deleted from GH after this lands.

* ci(wait-for-vercel-project): drop URL probe and bypass-secret input

The GitHub Deployment status transitions to `success` only after the
Vercel app finishes building and routing is live, so an extra HTTP
liveness probe of the deployment URL was redundant. Removing it lets
us also drop the bypass-secret input \u2014 protected deployments don't
need a workaround anymore because we never make the request.

Reduces the action surface area and eliminates a runtime fetch.

* ci(wait-for-vercel-project): address PR review

- Fail loudly when the dpl_xxx deployment ID can't be resolved instead
  of returning an empty string. Consumers wire this into
  VERCEL_DEPLOYMENT_ID, which world-target uses to pick between the
  vercel and local worlds (packages/utils/src/world-target.ts), so an
  empty value would silently flip execution mode.
- Pass the GitHub App token to wait-for-vercel-project in the dispatch
  release workflow. The job sets `permissions: contents: read`, which
  blocks the default GITHUB_TOKEN from reading the Deployments API.
  The App token (already generated for workflow,front) has the
  necessary scopes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants