Skip to content

web: configure vercelPreset() for Vercel deployments#1815

Merged
TooTallNate merged 5 commits into
mainfrom
web-vercel-preset
May 4, 2026
Merged

web: configure vercelPreset() for Vercel deployments#1815
TooTallNate merged 5 commits into
mainfrom
web-vercel-preset

Conversation

@TooTallNate
Copy link
Copy Markdown
Member

Summary

  • Adds @vercel/react-router and configures vercelPreset() in packages/web/react-router.config.ts to enhance the packages/web Vercel deployment with per-route bundle splitting, function-level configuration (memory, maxDuration, etc.), and an accurate "Deployment Summary".
  • Gates the preset on a new WORKFLOW_WEB_VERCEL_BUILD env var (set on the web Vercel project) so the standard build layout is still produced when packages/web is packed as a tarball by the docs deployment (which also sets VERCEL=1 via docs/scripts/pack.ts).
  • Migrates the existing process.env.VERCEL checks in packages/web/vite.config.ts to the same WORKFLOW_WEB_VERCEL_BUILD var, fixing a latent bug where packed tarballs from the docs deployment would have been missing build/server/index.js (breaking server.js / @workflow/web/server).

Why not just process.env.VERCEL?

The preset always enables React Router's serverBundles, which changes the server output from build/server/index.jsbuild/server/<runtime>_<hash>/index.js. That path is imported by packages/web/server.js, which is in turn consumed by packages/cli/src/lib/inspect/web.ts (await import('@workflow/web/server')) for the CLI's in-process UI server. Using VERCEL alone would break the npm tarball produced for every docs preview deployment.

Action taken

WORKFLOW_WEB_VERCEL_BUILD=1 has been set in the packages/web Vercel project's environment variables.

Verification

Scenario Env build/server/ server.js
Local / npm publish (none) index.js OK
docs tarball pack VERCEL=1 index.js OK
web Vercel deploy VERCEL=1 + WORKFLOW_WEB_VERCEL_BUILD=1 nodejs_<hash>/index.js + .vercel/react-router-build-result.json n/a (preset)

Enables per-route bundle splitting, function-level configuration, and an
accurate Deployment Summary for the packages/web Vercel deployment.

Gated on WORKFLOW_WEB_VERCEL_BUILD (rather than the ambient VERCEL var)
so that the standard build layout consumed by server.js (self-hosted
deployments and the CLI's in-process server via @workflow/web/server) is
still produced when the package is packed as a tarball by the docs
Vercel deployment. Existing VERCEL-based checks in vite.config.ts have
been migrated to this same variable for consistency.
Copilot AI review requested due to automatic review settings April 21, 2026 00:37
@TooTallNate TooTallNate requested a review from a team as a code owner April 21, 2026 00:37
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 21, 2026

🦋 Changeset detected

Latest commit: 211e16a

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 18 packages
Name Type
@workflow/web Patch
@workflow/cli Patch
tarballs Patch
workflow Patch
@workflow/world-testing Patch
@workflow/ai Patch
@workflow/core Patch
@workflow/web-shared Patch
@workflow/builders Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/astro Patch
@workflow/nest Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch
@workflow/nuxt Patch

Not sure what this means? Click here to learn what changesets are.

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

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Apr 21, 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 May 4, 2026 8:55am
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 4, 2026 8:55am
example-workflow Ready Ready Preview, Comment May 4, 2026 8:55am
workbench-astro-workflow Ready Ready Preview, Comment May 4, 2026 8:55am
workbench-express-workflow Ready Ready Preview, Comment May 4, 2026 8:55am
workbench-fastify-workflow Ready Ready Preview, Comment May 4, 2026 8:55am
workbench-hono-workflow Ready Ready Preview, Comment May 4, 2026 8:55am
workbench-nitro-workflow Ready Ready Preview, Comment May 4, 2026 8:55am
workbench-nuxt-workflow Ready Ready Preview, Comment May 4, 2026 8:55am
workbench-sveltekit-workflow Ready Ready Preview, Comment May 4, 2026 8:55am
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 4, 2026 8:55am
workbench-vite-workflow Ready Ready Preview, Comment May 4, 2026 8:55am
workflow-docs Ready Ready Preview, Comment, Open in v0 May 4, 2026 8:55am
workflow-swc-playground Ready Ready Preview, Comment May 4, 2026 8:55am
workflow-tarballs Ready Ready Preview, Comment May 4, 2026 8:55am
workflow-web Ready Ready Preview, Comment May 4, 2026 8:55am

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 21, 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.034s (-20.2% 🟢) 1.004s (~) 0.970s 10 1.00x
💻 Local Express 0.044s (~) 1.005s (~) 0.961s 10 1.28x
💻 Local Next.js (Turbopack) 0.048s 1.005s 0.958s 10 1.38x
🐘 Postgres Express 0.049s (-16.4% 🟢) 1.009s (~) 0.960s 10 1.41x
🐘 Postgres Next.js (Turbopack) 0.058s 1.010s 0.952s 10 1.69x
🐘 Postgres Nitro 0.062s (-34.6% 🟢) 1.010s (-3.1%) 0.948s 10 1.81x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.200s (-51.1% 🟢) 1.847s (-26.4% 🟢) 1.647s 10 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.107s (-2.2%) 2.005s (~) 0.898s 10 1.00x
🐘 Postgres Express 1.111s (-3.1%) 2.009s (~) 0.899s 10 1.00x
💻 Local Next.js (Turbopack) 1.111s 2.006s 0.895s 10 1.00x
💻 Local Express 1.134s (+0.8%) 2.006s (~) 0.872s 10 1.02x
🐘 Postgres Next.js (Turbopack) 1.139s 2.011s 0.872s 10 1.03x
🐘 Postgres Nitro 1.152s (+1.1%) 2.010s (~) 0.858s 10 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.921s (-50.7% 🟢) 3.304s (-44.1% 🟢) 1.383s 10 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 10.643s (-2.9%) 11.021s (~) 0.378s 3 1.00x
💻 Local Nitro 10.794s (-1.4%) 11.022s (~) 0.227s 3 1.01x
💻 Local Next.js (Turbopack) 10.803s 11.024s 0.220s 3 1.02x
🐘 Postgres Nitro 10.872s (~) 11.020s (~) 0.148s 3 1.02x
🐘 Postgres Next.js (Turbopack) 10.901s 11.017s 0.116s 3 1.02x
💻 Local Express 10.915s (~) 11.023s (~) 0.108s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 16.902s (-28.8% 🟢) 18.490s (-26.4% 🟢) 1.587s 2 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 13.982s (-4.1%) 14.221s (-5.3% 🟢) 0.239s 5 1.00x
💻 Local Nitro 14.480s (-3.9%) 15.027s (-6.3% 🟢) 0.547s 4 1.04x
🐘 Postgres Next.js (Turbopack) 14.486s 15.021s 0.535s 4 1.04x
🐘 Postgres Nitro 14.515s (-0.6%) 15.023s (~) 0.508s 4 1.04x
💻 Local Next.js (Turbopack) 14.594s 15.030s 0.436s 4 1.04x
💻 Local Express 15.026s (~) 15.279s (+1.7%) 0.253s 4 1.07x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 31.772s (-50.7% 🟢) 33.274s (-50.1% 🟢) 1.502s 2 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 12.889s (-8.0% 🟢) 13.019s (-10.8% 🟢) 0.130s 7 1.00x
🐘 Postgres Next.js (Turbopack) 13.806s 14.020s 0.214s 7 1.07x
🐘 Postgres Nitro 13.955s (~) 14.592s (+2.0%) 0.638s 7 1.08x
💻 Local Nitro 15.292s (-8.9% 🟢) 16.028s (-5.9% 🟢) 0.736s 6 1.19x
💻 Local Next.js (Turbopack) 15.938s 16.363s 0.425s 6 1.24x
💻 Local Express 16.638s (~) 17.030s (~) 0.392s 6 1.29x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 62.722s (-85.2% 🟢) 63.850s (-85.0% 🟢) 1.128s 2 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.184s (-6.1% 🟢) 2.008s (~) 0.825s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.219s 2.009s 0.790s 15 1.03x
🐘 Postgres Nitro 1.270s (~) 2.010s (~) 0.741s 15 1.07x
💻 Local Nitro 1.426s (-12.6% 🟢) 2.009s (-3.1%) 0.583s 15 1.20x
💻 Local Express 1.506s (+1.1%) 2.006s (~) 0.500s 15 1.27x
💻 Local Next.js (Turbopack) 1.517s 2.005s 0.488s 15 1.28x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.270s (-19.5% 🟢) 3.421s (-20.9% 🟢) 1.151s 9 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.291s (-2.9%) 3.009s (~) 0.718s 10 1.00x
🐘 Postgres Nitro 2.354s (~) 3.009s (~) 0.656s 10 1.03x
🐘 Postgres Next.js (Turbopack) 2.384s 3.009s 0.625s 10 1.04x
💻 Local Nitro 2.646s (-15.8% 🟢) 3.009s (-22.6% 🟢) 0.363s 10 1.15x
💻 Local Next.js (Turbopack) 2.854s 3.342s 0.488s 9 1.25x
💻 Local Express 2.914s (-1.3%) 3.564s (+3.2%) 0.650s 9 1.27x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.090s (-23.7% 🟢) 4.396s (-25.8% 🟢) 1.306s 7 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.381s (-3.0%) 4.008s (~) 0.628s 8 1.00x
🐘 Postgres Nitro 3.498s (+0.5%) 4.010s (~) 0.512s 8 1.03x
🐘 Postgres Next.js (Turbopack) 3.650s 4.010s 0.360s 8 1.08x
💻 Local Nitro 6.983s (-16.4% 🟢) 7.516s (-16.7% 🟢) 0.533s 4 2.07x
💻 Local Next.js (Turbopack) 7.522s 8.016s 0.494s 4 2.23x
💻 Local Express 7.968s (-4.4%) 8.522s (-5.6% 🟢) 0.554s 4 2.36x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.134s (-11.1% 🟢) 5.171s (-6.6% 🟢) 2.036s 7 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.199s (-4.6%) 2.007s (~) 0.808s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.213s 2.008s 0.795s 15 1.01x
🐘 Postgres Nitro 1.248s (-0.8%) 2.009s (~) 0.761s 15 1.04x
💻 Local Next.js (Turbopack) 1.496s 2.006s 0.510s 15 1.25x
💻 Local Express 1.537s (-18.8% 🟢) 2.005s (-15.2% 🟢) 0.468s 15 1.28x
💻 Local Nitro 1.793s (-3.9%) 2.390s (+2.1%) 0.597s 13 1.49x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.964s (-20.1% 🟢) 3.302s (-20.8% 🟢) 1.337s 10 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.260s (-3.5%) 3.007s (~) 0.748s 10 1.00x
🐘 Postgres Nitro 2.345s (~) 3.009s (~) 0.663s 10 1.04x
🐘 Postgres Next.js (Turbopack) 2.385s 3.009s 0.624s 10 1.06x
💻 Local Nitro 2.655s (-13.4% 🟢) 3.036s (-21.9% 🟢) 0.382s 10 1.17x
💻 Local Next.js (Turbopack) 2.894s 3.342s 0.448s 9 1.28x
💻 Local Express 3.089s (-1.4%) 3.760s (~) 0.671s 8 1.37x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.553s (-21.0% 🟢) 3.962s (-22.0% 🟢) 1.410s 8 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.397s (-2.9%) 4.009s (~) 0.612s 8 1.00x
🐘 Postgres Nitro 3.465s (~) 4.010s (~) 0.545s 8 1.02x
🐘 Postgres Next.js (Turbopack) 3.664s 4.013s 0.349s 8 1.08x
💻 Local Nitro 6.692s (-26.8% 🟢) 7.226s (-27.9% 🟢) 0.534s 5 1.97x
💻 Local Next.js (Turbopack) 8.074s 8.773s 0.700s 4 2.38x
💻 Local Express 8.659s (-1.6%) 9.023s (-2.7%) 0.364s 4 2.55x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.810s (-44.8% 🟢) 4.495s (-34.1% 🟢) 1.684s 7 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.592s (-29.4% 🟢) 1.005s (-1.7%) 0.413s 60 1.00x
🐘 Postgres Next.js (Turbopack) 0.780s 1.007s 0.226s 60 1.32x
🐘 Postgres Nitro 0.819s (~) 1.006s (~) 0.187s 60 1.38x
💻 Local Next.js (Turbopack) 0.858s 1.039s 0.181s 58 1.45x
💻 Local Nitro 0.870s (-11.3% 🟢) 1.095s (~) 0.225s 55 1.47x
💻 Local Express 0.988s (~) 1.181s (+9.8% 🔺) 0.193s 51 1.67x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 9.824s (-55.5% 🟢) 11.038s (-54.1% 🟢) 1.214s 6 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.404s (-29.0% 🟢) 2.007s (-11.1% 🟢) 0.604s 45 1.00x
🐘 Postgres Next.js (Turbopack) 1.953s 2.151s 0.198s 42 1.39x
🐘 Postgres Nitro 1.995s (+3.5%) 2.468s (+17.5% 🔺) 0.473s 37 1.42x
💻 Local Next.js (Turbopack) 2.665s 3.008s 0.343s 30 1.90x
💻 Local Nitro 2.723s (-10.3% 🟢) 3.074s (-18.2% 🟢) 0.351s 30 1.94x
💻 Local Express 3.237s (+7.3% 🔺) 3.884s (+8.3% 🔺) 0.647s 24 2.31x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 30.565s (-22.6% 🟢) 32.109s (-22.2% 🟢) 1.543s 3 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.999s (-24.9% 🟢) 3.305s (-24.4% 🟢) 0.307s 37 1.00x
🐘 Postgres Nitro 3.896s (-5.1% 🟢) 4.077s (-11.5% 🟢) 0.181s 30 1.30x
🐘 Postgres Next.js (Turbopack) 4.000s 4.331s 0.331s 28 1.33x
💻 Local Nitro 7.734s (-16.8% 🟢) 8.082s (-19.3% 🟢) 0.348s 15 2.58x
💻 Local Next.js (Turbopack) 8.487s 9.017s 0.530s 14 2.83x
💻 Local Express 9.143s (-0.7%) 9.787s (-2.3%) 0.644s 13 3.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 76.046s (-21.5% 🟢) 77.422s (-21.3% 🟢) 1.376s 2 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.253s (-10.4% 🟢) 1.024s (+1.6%) 0.770s 59 1.00x
🐘 Postgres Next.js (Turbopack) 0.257s 1.007s 0.750s 60 1.02x
🐘 Postgres Nitro 0.288s (+1.5%) 1.007s (~) 0.719s 60 1.14x
💻 Local Next.js (Turbopack) 0.534s 1.004s 0.470s 60 2.11x
💻 Local Express 0.562s (~) 1.004s (~) 0.442s 60 2.22x
💻 Local Nitro 0.606s (~) 1.028s (+0.7%) 0.422s 59 2.40x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.568s (-5.6% 🟢) 3.009s (-10.2% 🟢) 1.441s 20 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.375s (-26.5% 🟢) 1.005s (~) 0.631s 90 1.00x
🐘 Postgres Next.js (Turbopack) 0.503s 1.018s 0.515s 89 1.34x
🐘 Postgres Nitro 0.504s (+1.5%) 1.007s (~) 0.503s 90 1.34x
💻 Local Nitro 2.192s (-13.6% 🟢) 2.975s (-1.1%) 0.783s 31 5.85x
💻 Local Express 2.439s (-3.0%) 3.009s (~) 0.570s 30 6.51x
💻 Local Next.js (Turbopack) 2.539s 2.975s 0.436s 31 6.77x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.789s (-13.5% 🟢) 4.212s (-12.6% 🟢) 1.424s 22 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.560s (-31.6% 🟢) 1.006s (-1.1%) 0.446s 120 1.00x
🐘 Postgres Next.js (Turbopack) 0.769s 1.006s 0.238s 120 1.37x
🐘 Postgres Nitro 0.793s (~) 1.016s (+0.9%) 0.223s 119 1.42x
💻 Local Nitro 9.165s (-18.1% 🟢) 9.802s (-16.0% 🟢) 0.637s 13 16.35x
💻 Local Next.js (Turbopack) 10.621s 10.941s 0.320s 11 18.95x
💻 Local Express 10.804s (-3.5%) 11.304s (-5.3% 🟢) 0.500s 11 19.28x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 7.068s (-8.5% 🟢) 8.594s (-8.6% 🟢) 1.527s 16 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.147s (-28.5% 🟢) 1.001s (~) 0.001s (-31.3% 🟢) 1.009s (~) 0.863s 10 1.00x
💻 Local Next.js (Turbopack) 0.168s 1.003s 0.011s 1.017s 0.849s 10 1.15x
💻 Local Nitro 0.181s (-15.5% 🟢) 1.004s (~) 0.008s (-34.4% 🟢) 1.014s (-0.5%) 0.833s 10 1.23x
🐘 Postgres Next.js (Turbopack) 0.189s 1.001s 0.002s 1.011s 0.822s 10 1.29x
🐘 Postgres Nitro 0.205s (~) 0.996s (~) 0.001s (-13.3% 🟢) 1.010s (~) 0.805s 10 1.40x
💻 Local Express 0.207s (+4.1%) 1.004s (~) 0.012s (-2.5%) 1.018s (~) 0.811s 10 1.41x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.646s (-57.1% 🟢) 2.960s (-43.9% 🟢) 2.156s (+190.6% 🔺) 5.540s (-14.5% 🟢) 3.895s 10 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.509s (-19.1% 🟢) 1.006s (~) 0.003s (-11.1% 🟢) 1.021s (~) 0.511s 59 1.00x
🐘 Postgres Next.js (Turbopack) 0.608s 1.009s 0.004s 1.024s 0.416s 59 1.19x
🐘 Postgres Nitro 0.616s (-1.3%) 1.005s (~) 0.004s (-1.2%) 1.024s (~) 0.408s 59 1.21x
💻 Local Nitro 0.788s (-6.0% 🟢) 1.031s (+1.9%) 0.017s (+79.8% 🔺) 1.144s (+2.5%) 0.356s 53 1.55x
💻 Local Next.js (Turbopack) 0.843s 1.011s 0.010s 1.217s 0.374s 52 1.65x
💻 Local Express 0.953s (+25.8% 🔺) 1.012s (-1.7%) 0.010s (+1.0%) 1.228s (+18.1% 🔺) 0.275s 49 1.87x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.053s (-86.2% 🟢) 5.378s (-82.5% 🟢) 0.243s (+117.0% 🔺) 6.008s (-81.1% 🟢) 1.955s 10 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.921s (-4.1%) 1.090s (-14.7% 🟢) 0.000s (-100.0% 🟢) 1.098s (-16.0% 🟢) 0.176s 55 1.00x
🐘 Postgres Next.js (Turbopack) 0.931s 1.177s 0.000s 1.192s 0.261s 51 1.01x
🐘 Postgres Nitro 1.001s (+3.3%) 1.329s (+6.5% 🔺) 0.000s (+6.7% 🔺) 1.342s (+6.7% 🔺) 0.341s 45 1.09x
💻 Local Nitro 1.182s (-3.3%) 2.016s (~) 0.000s (+333.3% 🔺) 2.018s (~) 0.836s 30 1.28x
💻 Local Express 1.198s (-2.2%) 2.019s (~) 0.000s (-60.0% 🟢) 2.021s (~) 0.823s 30 1.30x
💻 Local Next.js (Turbopack) 1.228s 2.018s 0.000s 2.021s 0.793s 30 1.33x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.047s (~) 4.375s (~) 0.000s (-100.0% 🟢) 4.726s (-1.7%) 1.678s 13 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro

fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.662s (-6.2% 🟢) 2.144s (-1.5%) 0.000s (+Infinity% 🔺) 2.151s (-2.2%) 0.489s 28 1.00x
🐘 Postgres Nitro 1.728s (-3.5%) 2.106s (-1.6%) 0.000s (-3.4%) 2.123s (-2.4%) 0.395s 29 1.04x
🐘 Postgres Next.js (Turbopack) 1.824s 2.107s 0.000s 2.114s 0.290s 29 1.10x
💻 Local Nitro 2.606s (-23.1% 🟢) 3.028s (-24.9% 🟢) 0.001s (+21.9% 🔺) 3.030s (-24.9% 🟢) 0.424s 20 1.57x
💻 Local Express 2.854s (-17.7% 🟢) 3.083s (-23.6% 🟢) 0.000s (-62.5% 🟢) 3.085s (-23.6% 🟢) 0.230s 20 1.72x
💻 Local Next.js (Turbopack) 2.909s 3.243s 0.000s 3.247s 0.337s 19 1.75x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.007s (-2.1%) 5.370s (~) 0.000s (-66.7% 🟢) 5.744s (-0.9%) 1.738s 11 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Nitro 16/21
🐘 Postgres Express 21/21
▲ Vercel Nitro 21/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 20/21
Next.js (Turbopack) 🐘 Postgres 17/21
Nitro 🐘 Postgres 14/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


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 21, 2026

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1011 0 67 1078
✅ 💻 Local Development 1090 0 86 1176
✅ 📦 Local Production 1090 0 86 1176
✅ 🐘 Local Postgres 1090 0 86 1176
✅ 🪟 Windows 98 0 0 98
✅ 📋 Other 552 0 36 588
Total 4931 0 361 5292

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 91 0 7
✅ example 91 0 7
✅ express 91 0 7
✅ fastify 91 0 7
✅ hono 91 0 7
✅ nextjs-turbopack 96 0 2
✅ nextjs-webpack 96 0 2
✅ nitro 91 0 7
✅ nuxt 91 0 7
✅ sveltekit 91 0 7
✅ vite 91 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 92 0 6
✅ express-stable 92 0 6
✅ fastify-stable 92 0 6
✅ hono-stable 92 0 6
✅ nextjs-turbopack-canary 79 0 19
✅ nextjs-turbopack-stable 98 0 0
✅ nextjs-webpack-canary 79 0 19
✅ nextjs-webpack-stable 98 0 0
✅ nitro-stable 92 0 6
✅ nuxt-stable 92 0 6
✅ sveltekit-stable 92 0 6
✅ vite-stable 92 0 6
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 92 0 6
✅ express-stable 92 0 6
✅ fastify-stable 92 0 6
✅ hono-stable 92 0 6
✅ nextjs-turbopack-canary 79 0 19
✅ nextjs-turbopack-stable 98 0 0
✅ nextjs-webpack-canary 79 0 19
✅ nextjs-webpack-stable 98 0 0
✅ nitro-stable 92 0 6
✅ nuxt-stable 92 0 6
✅ sveltekit-stable 92 0 6
✅ vite-stable 92 0 6
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 92 0 6
✅ express-stable 92 0 6
✅ fastify-stable 92 0 6
✅ hono-stable 92 0 6
✅ nextjs-turbopack-canary 79 0 19
✅ nextjs-turbopack-stable 98 0 0
✅ nextjs-webpack-canary 79 0 19
✅ nextjs-webpack-stable 98 0 0
✅ nitro-stable 92 0 6
✅ nuxt-stable 92 0 6
✅ sveltekit-stable 92 0 6
✅ vite-stable 92 0 6
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 98 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 92 0 6
✅ e2e-local-dev-tanstack-start-stable 92 0 6
✅ e2e-local-postgres-nest-stable 92 0 6
✅ e2e-local-postgres-tanstack-start-stable 92 0 6
✅ e2e-local-prod-nest-stable 92 0 6
✅ e2e-local-prod-tanstack-start-stable 92 0 6

📋 View full workflow run

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

This PR updates @workflow/web’s build configuration to support Vercel deployments via React Router’s Vercel preset, while preserving the existing self-hosted/npm package build layout by gating the preset (and related Vite behavior) behind a new WORKFLOW_WEB_VERCEL_BUILD environment variable.

Changes:

  • Add @vercel/react-router and configure vercelPreset() in packages/web/react-router.config.ts, gated by WORKFLOW_WEB_VERCEL_BUILD.
  • Migrate packages/web/vite.config.ts Vercel checks to use WORKFLOW_WEB_VERCEL_BUILD instead of VERCEL.
  • Add a changeset and update the lockfile for the new dependency graph.

Reviewed changes

Copilot reviewed 4 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
pnpm-lock.yaml Locks new @vercel/react-router (and transitive deps) and updates some resolved versions.
packages/web/vite.config.ts Switches Vercel-specific build/external behavior to a dedicated env-gated flag.
packages/web/react-router.config.ts Adds Vercel preset configuration, gated to avoid breaking server.js self-hosted layout.
packages/web/package.json Adds @vercel/react-router to devDependencies.
.changeset/web-vercel-preset.md Documents the change and the new env flag for release notes.
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

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

Comment thread packages/web/vite.config.ts Outdated
Comment thread packages/web/react-router.config.ts Outdated
Comment thread .changeset/web-vercel-preset.md Outdated
Turborepo strips environment variables not declared in turbo.json, which
prevented WORKFLOW_WEB_VERCEL_BUILD (set on the Vercel project) from
reaching the build. Declare it in the env list and also include the
.vercel/ directory (where the preset writes react-router-build-result.json)
in the build outputs.
@socket-security
Copy link
Copy Markdown

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

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addednpm/​@​vercel/​react-router@​1.2.6981006789100

View full report

@TooTallNate TooTallNate merged commit 45d1eb2 into main May 4, 2026
349 of 368 checks passed
@TooTallNate TooTallNate deleted the web-vercel-preset branch May 4, 2026 10:04
@github-actions github-actions Bot mentioned this pull request May 4, 2026
pranaygp added a commit that referenced this pull request May 4, 2026
…ovements

* origin/main:
  web: configure vercelPreset() for Vercel deployments (#1815)
  [core] Combine flow+step bundle and process steps eagerly (#1338)
  [world-vercel] Revert stream close control framing (#1891)
  [tarballs] Use turbo to build workspace deps before packing (#1908)

# Conflicts:
#	tarballs/vercel.json
pranaygp added a commit that referenced this pull request May 5, 2026
…ignal

* origin/main:
  [core] Skip inline step execution when suspension also has a wait (#1924)
  [errors] Replace chalk import in @workfow/errors with inline ANSI shim (#1915)
  Fix compatibility with Zod 4.4.x (#1902)
  Serialize `run_failed`/`step_failed` errors through serialization pipeline (#1851)
  tarballs: redesign preview tarballs index page (#1911)
  Remove extra changeset (#1922)
  Add stable Next.js eager and lazy test coverage (#1747)
  Enforce per-(run, correlation) uniqueness for entity-creating events in world-postgres (#1878)
  fix(world-vercel): add default request timeout to workflow-server HTTP calls (#1807)
  Allow disabling step sourcemap with new `sourcemap` option in builders (#1842)
  [ci] Enable Vercel-prod e2e for tanstack-start (#1904)
  web: configure vercelPreset() for Vercel deployments (#1815)
  [core] Combine flow+step bundle and process steps eagerly (#1338)
  [world-vercel] Revert stream close control framing (#1891)
  [tarballs] Use turbo to build workspace deps before packing (#1908)

# Conflicts:
#	packages/core/src/runtime/step-handler.test.ts
#	packages/core/src/runtime/step-handler.ts
#	packages/core/src/runtime/suspension-handler.ts
#	packages/core/src/step.test.ts
#	packages/world-local/src/storage/events-storage.ts
#	packages/world-postgres/src/drizzle/migrations/meta/_journal.json
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