Skip to content

[ci] Enable Vercel-prod e2e for tanstack-start#1904

Merged
VaguelySerious merged 12 commits into
mainfrom
peter/enable-tanstack-start-vercel-e2e
May 4, 2026
Merged

[ci] Enable Vercel-prod e2e for tanstack-start#1904
VaguelySerious merged 12 commits into
mainfrom
peter/enable-tanstack-start-vercel-e2e

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious commented May 4, 2026

Summary

Two changes:

  1. Re-enable the tanstack-start matrix entry in the e2e-vercel-prod job, which was commented out when the workbench app landed in [workbench] Add TanStack Start workbench #1875 because the Vercel project wasn't connected yet. The project is now set up.

  2. Fix the @types/react mismatch breaking nextjs-turbopack/nextjs-webpack preview builds. When [workbench] Add TanStack Start workbench #1875 added the tanstack-start workbench, its package.json pinned @types/react@19.2.3 / @types/react-dom@19.2.3 while every other workbench used ^19 (resolved to 19.1.13). With two @types/react copies in the workspace, framer-motion's MotionStyle (computed from CSSProperties) was built against one copy while the consuming code referenced another, surfacing on Vercel CI as:

    Type 'CSSProperties' is not assignable to type 'MotionStyle'.
      Types of property 'alignmentBaseline' are incompatible.
    

    This started failing on example-nextjs-workflow-turbopack and example-nextjs-workflow-webpack exactly at the SHA where [workbench] Add TanStack Start workbench #1875 landed. Pinning tanstack-start to the same versions nextjs-turbopack uses (react@19.2.4, @types/react@19.1.13, @types/react-dom@19.1.9) makes pnpm dedupe to a single copy across the workspace.

Test plan

  • Locally: cd workbench/nextjs-turbopack && pnpm build succeeds.
  • Locally: cd workbench/tanstack-start && pnpm build succeeds.
  • After fresh pnpm install, grep "@types/react@" pnpm-lock.yaml shows only one version (19.1.13).
  • CI: Vercel – example-nextjs-workflow-turbopack and Vercel – example-nextjs-workflow-webpack deployments succeed.
  • CI: E2E Vercel Prod Tests (tanstack-start) runs against the new project and passes.

🤖 Generated with Claude Code

The workbench-tanstack-start-workflow Vercel project is now connected, so
re-enable the matrix entry that was commented out when the workbench landed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 4, 2026

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 4, 2026

🦋 Changeset detected

Latest commit: 746ca11

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

This PR includes changesets to release 0 packages

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

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 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 643 0 43 686
Total 5022 0 368 5390

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
✅ e2e-vercel-prod-tanstack-start 91 0 7

📋 View full workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 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 🥇 Express 0.041s (-6.5% 🟢) 1.006s (~) 0.964s 10 1.00x
💻 Local Nitro 0.043s (+0.7%) 1.006s (~) 0.962s 10 1.05x
🐘 Postgres Nitro 0.060s (-37.3% 🟢) 1.012s (-3.0%) 0.952s 10 1.44x
🐘 Postgres Express 0.142s (+144.8% 🔺) 1.090s (+7.9% 🔺) 0.948s 10 3.43x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.207s (-49.4% 🟢) 1.525s (-39.2% 🟢) 1.318s 10 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.127s (~) 2.005s (~) 0.878s 10 1.00x
💻 Local Nitro 1.132s (~) 2.007s (~) 0.875s 10 1.00x
🐘 Postgres Nitro 1.155s (+1.3%) 2.010s (~) 0.855s 10 1.02x
🐘 Postgres Express 1.193s (+4.1%) 2.061s (+2.5%) 0.868s 10 1.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.009s (-48.4% 🟢) 3.800s (-35.7% 🟢) 1.791s 10 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 10.933s (+0.6%) 11.025s (~) 0.092s 3 1.00x
💻 Local Nitro 10.958s (~) 11.024s (~) 0.066s 3 1.00x
💻 Local Express 10.969s (~) 11.024s (~) 0.055s 3 1.00x
🐘 Postgres Express 10.990s (~) 11.381s (+3.2%) 0.392s 3 1.01x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 17.256s (-27.3% 🟢) 19.484s (-22.4% 🟢) 2.228s 2 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 14.624s (~) 15.027s (~) 0.403s 4 1.00x
💻 Local Express 15.055s (+0.6%) 15.530s (+3.3%) 0.475s 4 1.03x
💻 Local Nitro 15.062s (~) 16.031s (~) 0.970s 4 1.03x
🐘 Postgres Express 15.709s (+7.7% 🔺) 16.042s (+6.8% 🔺) 0.334s 4 1.07x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 33.505s (-48.0% 🟢) 35.808s (-46.3% 🟢) 2.303s 2 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 14.284s (+2.3%) 15.025s (+5.0% 🔺) 0.741s 6 1.00x
🐘 Postgres Express 15.866s (+13.3% 🔺) 16.354s (+12.1% 🔺) 0.489s 6 1.11x
💻 Local Express 16.630s (~) 17.032s (~) 0.401s 6 1.16x
💻 Local Nitro 16.907s (+0.7%) 17.030s (~) 0.122s 6 1.18x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 57.093s (-86.5% 🟢) 58.814s (-86.1% 🟢) 1.720s 2 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.302s (+2.1%) 2.008s (~) 0.707s 15 1.00x
🐘 Postgres Express 1.389s (+10.2% 🔺) 2.022s (+0.6%) 0.632s 15 1.07x
💻 Local Express 1.501s (+0.8%) 2.006s (~) 0.504s 15 1.15x
💻 Local Nitro 1.564s (-4.2%) 2.007s (-3.2%) 0.443s 15 1.20x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.167s (-23.1% 🟢) 4.363s (+0.9%) 2.196s 8 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.322s (-1.6%) 3.007s (~) 0.685s 10 1.00x
🐘 Postgres Nitro 2.360s (~) 3.012s (~) 0.652s 10 1.02x
💻 Local Express 2.839s (-3.9%) 3.207s (-7.1% 🟢) 0.368s 10 1.22x
💻 Local Nitro 3.015s (-4.1%) 3.760s (-3.2%) 0.744s 8 1.30x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.471s (-39.0% 🟢) 4.088s (-31.0% 🟢) 1.616s 8 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.483s (~) 4.011s (~) 0.528s 8 1.00x
🐘 Postgres Express 3.790s (+8.7% 🔺) 4.274s (+6.6% 🔺) 0.484s 8 1.09x
💻 Local Express 7.449s (-10.7% 🟢) 8.020s (-11.1% 🟢) 0.571s 4 2.14x
💻 Local Nitro 8.796s (+5.4% 🔺) 9.273s (+2.8%) 0.477s 4 2.53x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.823s (-19.9% 🟢) 4.374s (-21.0% 🟢) 1.552s 7 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.265s (+0.6%) 2.008s (~) 0.743s 15 1.00x
🐘 Postgres Express 1.288s (+2.5%) 2.023s (+0.7%) 0.735s 15 1.02x
💻 Local Nitro 1.522s (-18.4% 🟢) 2.006s (-14.3% 🟢) 0.484s 15 1.20x
💻 Local Express 1.925s (+1.7%) 2.392s (+1.2%) 0.466s 13 1.52x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.328s (-5.3% 🟢) 4.301s (+3.1%) 1.972s 7 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.361s (+0.9%) 3.009s (~) 0.648s 10 1.00x
🐘 Postgres Express 2.412s (+3.0%) 3.108s (+3.2%) 0.696s 10 1.02x
💻 Local Express 2.862s (-8.6% 🟢) 3.454s (-8.2% 🟢) 0.592s 9 1.21x
💻 Local Nitro 3.055s (~) 4.010s (+3.2%) 0.955s 8 1.29x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.656s (-17.8% 🟢) 4.440s (-12.6% 🟢) 1.784s 7 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.506s (+0.7%) 4.012s (~) 0.506s 8 1.00x
🐘 Postgres Express 3.872s (+10.6% 🔺) 4.304s (+7.3% 🔺) 0.433s 7 1.10x
💻 Local Express 8.551s (-2.8%) 9.023s (-2.7%) 0.471s 4 2.44x
💻 Local Nitro 8.928s (-2.4%) 9.771s (-2.5%) 0.843s 4 2.55x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.009s (-40.9% 🟢) 4.841s (-29.0% 🟢) 1.831s 7 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.838s (+2.1%) 1.006s (~) 0.168s 60 1.00x
🐘 Postgres Express 0.988s (+17.8% 🔺) 1.391s (+35.9% 🔺) 0.403s 44 1.18x
💻 Local Nitro 1.004s (+2.4%) 1.469s (+34.3% 🔺) 0.464s 41 1.20x
💻 Local Express 1.024s (+4.1%) 1.800s (+67.3% 🔺) 0.775s 34 1.22x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 10.018s (-54.6% 🟢) 12.072s (-49.8% 🟢) 2.054s 5 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.078s (+7.8% 🔺) 2.853s (+35.8% 🔺) 0.775s 32 1.00x
🐘 Postgres Express 2.616s (+32.4% 🔺) 3.133s (+38.8% 🔺) 0.517s 29 1.26x
💻 Local Express 3.021s (~) 3.586s (~) 0.564s 26 1.45x
💻 Local Nitro 3.127s (+3.0%) 4.010s (+6.7% 🔺) 0.883s 23 1.50x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 31.867s (-19.3% 🟢) 34.138s (-17.3% 🟢) 2.272s 3 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 4.097s (~) 4.811s (+4.5%) 0.714s 25 1.00x
🐘 Postgres Express 4.285s (+7.4% 🔺) 4.709s (+7.8% 🔺) 0.423s 26 1.05x
💻 Local Express 8.957s (-2.7%) 9.403s (-6.1% 🟢) 0.445s 13 2.19x
💻 Local Nitro 9.364s (+0.7%) 10.020s (~) 0.656s 12 2.29x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 76.642s (-20.9% 🟢) 79.071s (-19.7% 🟢) 2.429s 2 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.297s (+4.9%) 1.007s (~) 0.710s 60 1.00x
🐘 Postgres Express 0.346s (+22.4% 🔺) 1.024s (+1.7%) 0.679s 59 1.16x
💻 Local Nitro 0.620s (+2.5%) 1.022s (~) 0.402s 59 2.09x
💻 Local Express 0.626s (+11.7% 🔺) 1.005s (~) 0.378s 60 2.11x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.561s (-6.0% 🟢) 3.466s (+3.4%) 1.906s 18 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.514s (+3.5%) 1.007s (~) 0.494s 90 1.00x
🐘 Postgres Express 0.612s (+20.1% 🔺) 1.146s (+13.9% 🔺) 0.534s 79 1.19x
💻 Local Express 2.360s (-6.1% 🟢) 3.009s (~) 0.649s 30 4.59x
💻 Local Nitro 2.571s (+1.3%) 3.009s (~) 0.438s 30 5.01x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.924s (-9.4% 🟢) 4.814s (~) 1.890s 19 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.844s (+6.8% 🔺) 1.019s (+1.2%) 0.175s 118 1.00x
🐘 Postgres Express 0.895s (+9.3% 🔺) 1.266s (+24.5% 🔺) 0.372s 95 1.06x
💻 Local Express 10.252s (-8.4% 🟢) 10.938s (-8.4% 🟢) 0.686s 11 12.14x
💻 Local Nitro 11.293s (+0.9%) 11.937s (+2.3%) 0.644s 11 13.38x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 7.064s (-8.5% 🟢) 8.764s (-6.8% 🟢) 1.700s 14 1.00x
▲ Vercel Express ⚠️ 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
💻 Local 🥇 Express 0.210s (+5.7% 🔺) 1.004s (~) 0.011s (-13.2% 🟢) 1.016s (~) 0.806s 10 1.00x
💻 Local Nitro 0.211s (-1.5%) 1.005s (~) 0.013s (+0.8%) 1.019s (~) 0.809s 10 1.00x
🐘 Postgres Nitro 0.222s (+8.4% 🔺) 0.996s (~) 0.002s (+6.7% 🔺) 1.011s (~) 0.789s 10 1.06x
🐘 Postgres Express 0.229s (+11.6% 🔺) 0.998s (~) 0.001s (-37.5% 🟢) 1.034s (+2.2%) 0.805s 10 1.09x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.648s (-57.0% 🟢) 3.104s (-41.2% 🟢) 1.944s (+161.9% 🔺) 5.606s (-13.5% 🟢) 3.958s 10 1.00x
▲ Vercel Express ⚠️ 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 🥇 Nitro 0.644s (+3.2%) 1.003s (~) 0.006s (+41.0% 🔺) 1.024s (~) 0.380s 59 1.00x
💻 Local Nitro 0.764s (-8.9% 🟢) 1.013s (~) 0.009s (-7.8% 🟢) 1.023s (-8.3% 🟢) 0.260s 59 1.19x
💻 Local Express 0.856s (+13.0% 🔺) 1.012s (-1.6%) 0.010s (+1.9%) 1.117s (+7.4% 🔺) 0.261s 54 1.33x
🐘 Postgres Express 1.021s (+62.1% 🔺) 1.468s (+45.8% 🔺) 0.079s (+1956.2% 🔺) 1.582s (+54.6% 🔺) 0.560s 38 1.59x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.237s (-85.6% 🟢) 6.001s (-80.5% 🟢) 0.237s (+111.4% 🔺) 6.714s (-78.9% 🟢) 2.476s 9 1.00x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.941s (-2.9%) 1.220s (-2.2%) 0.000s (+46.9% 🔺) 1.234s (-1.9%) 0.293s 49 1.00x
🐘 Postgres Express 1.130s (+17.6% 🔺) 1.511s (+18.2% 🔺) 0.000s (-41.0% 🟢) 1.543s (+18.1% 🔺) 0.413s 39 1.20x
💻 Local Nitro 1.250s (+2.2%) 2.022s (~) 0.000s (+366.7% 🔺) 2.024s (~) 0.774s 30 1.33x
💻 Local Express 1.387s (+13.3% 🔺) 2.020s (~) 0.000s (-35.7% 🟢) 2.201s (+8.8% 🔺) 0.814s 28 1.47x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.057s (~) 4.660s (+6.1% 🔺) 0.000s (-100.0% 🟢) 5.161s (+7.3% 🔺) 2.104s 12 1.00x
▲ Vercel Express ⚠️ 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 🥇 Nitro 1.802s (+0.6%) 2.141s (~) 0.000s (+100.0% 🔺) 2.153s (-1.0%) 0.351s 28 1.00x
🐘 Postgres Express 2.095s (+18.2% 🔺) 2.609s (+19.8% 🔺) 0.000s (+Infinity% 🔺) 2.635s (+19.8% 🔺) 0.540s 23 1.16x
💻 Local Express 2.879s (-17.0% 🟢) 3.132s (-22.3% 🟢) 0.001s (-25.0% 🟢) 3.135s (-22.3% 🟢) 0.255s 20 1.60x
💻 Local Nitro 2.969s (-12.4% 🟢) 3.297s (-18.2% 🟢) 0.000s (-40.8% 🟢) 3.299s (-18.3% 🟢) 0.331s 19 1.65x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.762s (+16.3% 🔺) 6.154s (+14.5% 🔺) 0.000s (-100.0% 🟢) 6.940s (+19.8% 🔺) 2.178s 9 1.00x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 15/21
Nitro 🐘 Postgres 16/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.

Comment on lines +41 to +59
TanStack Start runs on Vite, so the Workflow SDK is wired in via the same `workflow/vite` plugin. Add `workflow()` to your Vite config to enable usage of the `"use workflow"` and `"use step"` directives.
TanStack Start runs on Vite, so the Workflow SDK is wired in via the same `workflow/vite` plugin. Add `workflow()` to the existing `plugins` array in your Vite config — don't replace the other plugins the scaffold sets up.

```typescript title="vite.config.ts" lineNumbers
import { devtools } from "@tanstack/devtools-vite";
import { tanstackStart } from "@tanstack/react-start/plugin/vite";
import viteReact from "@vitejs/plugin-react";
import tailwindcss from "@tailwindcss/vite";
import { nitro } from "nitro/vite";
import { defineConfig } from "vite";
import { workflow } from "workflow/vite";

export default defineConfig({
plugins: [
workflow(), // [!code highlight]
devtools(),
tanstackStart(),
viteReact(),
nitro(),
tailwindcss(),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this might get outdated quickly as the tanstack start bootstrap code changes, and it make the guide look longer like we need all these things..

perhaps simpligy the guide to just show the detlas and use ... in place for existing stuff. my understanding is we just need workflow, nitro and tanstackStart are the minimal plugins needed here for this code sample

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Done — collapsed to just the workflow() delta with // ... for the rest of the scaffold plugins.

```

<Callout>
Plugin order between `workflow()` and the rest of the TanStack/Vite plugins doesn't matter for this integration; we list `workflow()` first so the `"use workflow"` and `"use step"` transforms run before anything else processes the file.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

seems right from my 1 off agentbut does this sound right to you? 🤔 am kinda surprised by this

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

On reflection, no — vite plugins do run in order for transforms, so it is safer to put workflow() first. Dropped the contradictory callout and folded the rationale into the prose.


```typescript title="src/workflows/user-signup.ts" lineNumbers
import { sleep } from "workflow";
import { FatalError, sleep } from "workflow";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

actually sorry let's revert this back to how it was (fatalerror being imported in the next example). that's what all the other code samples do and it incrementally builds up only importing FatalError when needed for next step

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Reverted — FatalError is back in the second snippet so the guide builds up imports incrementally like the others.

npm run dev
```

The dev server listens on `http://localhost:3000`. If something else is already on `3000`, Vite silently falls through to the next free port (`3001`, `3002`, …) — adjust the URLs below to match. Pin the port by passing `--port 3000` to the dev script if that matters for you.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

honestly unnecessary and self-evident I think. can skip this

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Removed.

Copy link
Copy Markdown
Contributor

@pranaygp pranaygp left a comment

Choose a reason for hiding this comment

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

left some comments to simplify docs guide :)

…rbo.json

Without this declaration, Turbo strips WORKFLOW_PUBLIC_MANIFEST from the env
at build time on Vercel even though it is set on the project (and vercel.json#env
provides it). The result is that the workflow nitro module sees the env var
unset during \`vite build\` and skips registering the manifest handler, so
\`/.well-known/workflow/v1/manifest.json\` 404s in prod and every e2e test
that calls \`fetchManifest()\` fails before it can reach the workflow under
test.

Other workbench apps inherit \`env: ["WORKFLOW_PUBLIC_MANIFEST"]\` from the
root turbo.json's build task, but that inheritance evidently doesn't satisfy
Turbo's per-package env filter when the package's own turbo.json overrides
the build task (which all the workbenches do, to set framework-specific
\`outputs\`). Declaring env explicitly at the package level fixes the
production build and silences the related warning at the same time.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
VaguelySerious and others added 5 commits May 4, 2026 10:44
- Show only the workflow() delta in the vite.config.ts snippet (with
  ellipses for the existing scaffold plugins) so the guide doesn't drift
  every time TanStack changes its bootstrap.
- Drop the plugin-order Callout and fold its rationale into the prose; the
  callout was self-contradictory ("doesn't matter, but we put it first").
- Move the FatalError import back into the second code sample so the guide
  still incrementally builds up imports as readers go, matching the other
  framework guides.
- Drop the dev-server port-3000 paragraph; it's self-evident.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Copy link
Copy Markdown
Member

@TooTallNate TooTallNate left a comment

Choose a reason for hiding this comment

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

Verified each piece of what's actually in the current diff:

CI matrix re-enable. The project ID being uncommented (prj_643jeVugTMq5ivsOFQHcbLG1qcnu) matches the comment-block above; the original "TODO: re-enable" rationale was specifically waiting on the Vercel project connection. Tanstack-start is already covered by the local-dev/local-prod/local-postgres matrices via scripts/create-test-matrix.mjs, so this is purely adding the prod e2e leg. ✓

Docs scaffold command update. Verified that @tanstack/cli is the canonical replacement — pulled the latest (v0.66.0) from npm and npx @tanstack/cli create --help returns the expected tanstack create [options] [project-name] interface. The old @tanstack/create-start package is still on npm at v0.59.29 but is at a much lower version stream than @tanstack/cli, so the new command is clearly the canonical scaffold path. ✓

Vite config snippet rework. Scaffolded a fresh app via the new CLI to verify the rationale: the generated vite.config.ts now has four plugins (devtools(), tailwindcss(), tanstackStart(), viteReact()), not just tanstackStart() like the old docs example showed. Switching to an additive snippet ("the existing tanstackStart(), nitro(), and any other plugins") is more accurate than the old complete-but-incomplete example. ✓

"List it first" advice. Verified against workbench/tanstack-start/vite.config.ts — the workbench's own config has [workflow(), tanstackStart(), nitro(), viteReact()] with workflow first, matching the docs guidance. ✓

Observability port hint. :3456 is the right port for npx workflow web. Trivial improvement. ✓

One thing worth fixing before merge

The PR description still describes a @types/react dedupe fix as one of the two changes, but those package.json/lockfile changes aren't in the current diff — they landed earlier (the workspace already has react@19.2.4 and @types/react@19.1.13 on main). Worth trimming the description so reviewers don't search for a phantom fix.

Tiny nit (non-blocking)

In the new vite.config snippet, // ... after the imports is a little terse — // ... your other imports would make it clearer that the user is supposed to merge their own imports there. Easy to do later, not worth a re-review.

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