Skip to content

Add experimental idempotent start hooks#2684

Draft
NathanColosimo wants to merge 2 commits into
mainfrom
codex/idempotent-start-hooks
Draft

Add experimental idempotent start hooks#2684
NathanColosimo wants to merge 2 commits into
mainfrom
codex/idempotent-start-hooks

Conversation

@NathanColosimo

Copy link
Copy Markdown
Contributor

Refs #2376 (gaps 1 and 2). Adds experimental start-hook idempotency for opt-in worlds; local and Postgres support are enabled, Vercel world remains capability-gated pending recoverable backend admission plus queue enqueue. Paired server PR: https://github.com/vercel/workflow-server/pull/561.

@changeset-bot

changeset-bot Bot commented Jun 27, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f7cede7

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

This PR includes changesets to release 20 packages
Name Type
@workflow/core Minor
@workflow/world Minor
@workflow/world-local Minor
@workflow/world-postgres Minor
@workflow/world-vercel Patch
@workflow/builders Patch
@workflow/cli Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/web Patch
workflow Minor
@workflow/world-testing 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

vercel Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

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 Jun 27, 2026 7:49pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Jun 27, 2026 7:49pm
example-workflow Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workbench-astro-workflow Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workbench-express-workflow Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workbench-fastify-workflow Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workbench-hono-workflow Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workbench-nitro-workflow Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workbench-nuxt-workflow Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workbench-vite-workflow Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workflow-swc-playground Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workflow-tarballs Ready Ready Preview, Comment Jun 27, 2026 7:49pm
workflow-web Ready Ready Preview, Comment Jun 27, 2026 7:49pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
workflow-docs Skipped Skipped Jun 27, 2026 7:49pm

@github-actions

github-actions Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1442 0 241 1683
✅ 💻 Local Development 1617 0 219 1836
✅ 📦 Local Production 1617 0 219 1836
✅ 🐘 Local Postgres 1605 0 231 1836
✅ 🪟 Windows 153 0 0 153
✅ 📋 Other 891 0 180 1071
Total 7325 0 1090 8415

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 125 0 28
✅ example 125 0 28
✅ express 125 0 28
✅ fastify 125 0 28
✅ hono 125 0 28
✅ nextjs-turbopack 149 0 4
✅ nextjs-webpack 149 0 4
✅ nitro 125 0 28
✅ nuxt 125 0 28
✅ sveltekit 144 0 9
✅ vite 125 0 28
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 128 0 25
✅ express-stable 128 0 25
✅ fastify-stable 128 0 25
✅ hono-stable 128 0 25
✅ nextjs-turbopack-canary 134 0 19
✅ nextjs-turbopack-stable 153 0 0
✅ nextjs-webpack-canary 134 0 19
✅ nextjs-webpack-stable 153 0 0
✅ nitro-stable 128 0 25
✅ nuxt-stable 128 0 25
✅ sveltekit-stable 147 0 6
✅ vite-stable 128 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 128 0 25
✅ express-stable 128 0 25
✅ fastify-stable 128 0 25
✅ hono-stable 128 0 25
✅ nextjs-turbopack-canary 134 0 19
✅ nextjs-turbopack-stable 153 0 0
✅ nextjs-webpack-canary 134 0 19
✅ nextjs-webpack-stable 153 0 0
✅ nitro-stable 128 0 25
✅ nuxt-stable 128 0 25
✅ sveltekit-stable 147 0 6
✅ vite-stable 128 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 127 0 26
✅ express-stable 127 0 26
✅ fastify-stable 127 0 26
✅ hono-stable 127 0 26
✅ nextjs-turbopack-canary 133 0 20
✅ nextjs-turbopack-stable 152 0 1
✅ nextjs-webpack-canary 133 0 20
✅ nextjs-webpack-stable 152 0 1
✅ nitro-stable 127 0 26
✅ nuxt-stable 127 0 26
✅ sveltekit-stable 146 0 7
✅ vite-stable 127 0 26
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 153 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 128 0 25
✅ e2e-local-dev-tanstack-start- 128 0 25
✅ e2e-local-postgres-nest-stable 127 0 26
✅ e2e-local-postgres-tanstack-start- 127 0 26
✅ e2e-local-prod-nest-stable 128 0 25
✅ e2e-local-prod-tanstack-start- 128 0 25
✅ e2e-vercel-prod-tanstack-start 125 0 28

📋 View full workflow run

@github-actions

github-actions Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

📊 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.047s (+1.5%) 1.007s (~) 0.959s 10 1.00x
💻 Local Nitro 0.049s (+6.4% 🔺) 1.012s (+0.6%) 0.963s 10 1.02x
💻 Local Next.js (Turbopack) 0.053s (+12.1% 🔺) 1.006s (~) 0.954s 10 1.11x
🐘 Postgres Next.js (Turbopack) 0.062s (~) 1.014s (~) 0.952s 10 1.30x
🐘 Postgres Nitro 0.066s (+10.3% 🔺) 1.014s (~) 0.948s 10 1.40x
🐘 Postgres Express 0.071s (+9.2% 🔺) 1.012s (~) 0.941s 10 1.50x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.208s (-11.0% 🟢) 1.703s (-17.5% 🟢) 1.495s 10 1.00x
▲ Vercel Express 0.217s (+4.2%) 1.820s (+16.3% 🔺) 1.602s 10 1.04x
▲ Vercel Next.js (Turbopack) 0.719s (+178.4% 🔺) 2.625s (+28.6% 🔺) 1.907s 10 3.45x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.069s (-1.4%) 2.006s (~) 0.937s 10 1.00x
💻 Local Express 1.084s (+0.6%) 2.007s (~) 0.923s 10 1.01x
💻 Local Next.js (Turbopack) 1.087s (~) 2.007s (~) 0.920s 10 1.02x
🐘 Postgres Nitro 1.095s (~) 2.010s (~) 0.915s 10 1.02x
🐘 Postgres Express 1.101s (~) 2.010s (~) 0.909s 10 1.03x
🐘 Postgres Next.js (Turbopack) 1.101s (+0.8%) 2.010s (~) 0.909s 10 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.512s (+8.9% 🔺) 3.450s (+15.4% 🔺) 1.938s 10 1.00x
▲ Vercel Express 1.627s (+18.0% 🔺) 3.632s (+21.3% 🔺) 2.006s 10 1.08x
▲ Vercel Next.js (Turbopack) 2.227s (-1.8%) 3.974s (+16.8% 🔺) 1.747s 10 1.47x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.373s (-0.8%) 11.021s (~) 0.648s 3 1.00x
💻 Local Express 10.459s (~) 11.022s (~) 0.563s 3 1.01x
💻 Local Next.js (Turbopack) 10.484s (~) 11.021s (~) 0.537s 3 1.01x
🐘 Postgres Next.js (Turbopack) 10.485s (~) 11.019s (~) 0.534s 3 1.01x
🐘 Postgres Nitro 10.525s (~) 11.022s (~) 0.497s 3 1.01x
🐘 Postgres Express 10.544s (+0.6%) 11.016s (~) 0.472s 3 1.02x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 12.555s (+8.3% 🔺) 14.466s (+14.8% 🔺) 1.910s 3 1.00x
▲ Vercel Express 12.686s (+8.4% 🔺) 14.840s (+8.9% 🔺) 2.155s 3 1.01x
▲ Vercel Next.js (Turbopack) 12.712s (~) 14.412s (+2.7%) 1.700s 3 1.01x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 13.440s (-1.4%) 14.026s (~) 0.586s 5 1.00x
🐘 Postgres Next.js (Turbopack) 13.603s (-0.8%) 14.022s (~) 0.419s 5 1.01x
🐘 Postgres Nitro 13.615s (+0.5%) 14.017s (~) 0.402s 5 1.01x
💻 Local Express 13.658s (~) 14.027s (~) 0.369s 5 1.02x
💻 Local Next.js (Turbopack) 13.767s (+0.9%) 14.027s (~) 0.260s 5 1.02x
🐘 Postgres Express 13.831s (+1.7%) 14.019s (~) 0.188s 5 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 17.628s (+9.4% 🔺) 19.740s (+14.6% 🔺) 2.112s 4 1.00x
▲ Vercel Express 17.932s (+7.7% 🔺) 20.200s (+7.7% 🔺) 2.268s 3 1.02x
▲ Vercel Next.js (Turbopack) 19.555s (+10.6% 🔺) 21.347s (+11.2% 🔺) 1.792s 3 1.11x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 11.776s (-3.0%) 12.022s (-7.7% 🟢) 0.245s 8 1.00x
🐘 Postgres Nitro 12.219s (-1.2%) 13.020s (~) 0.801s 7 1.04x
🐘 Postgres Express 12.276s (+1.1%) 13.017s (~) 0.741s 7 1.04x
💻 Local Next.js (Turbopack) 12.281s (~) 13.027s (~) 0.747s 7 1.04x
🐘 Postgres Next.js (Turbopack) 12.289s (~) 13.018s (~) 0.729s 7 1.04x
💻 Local Express 12.405s (+0.6%) 13.026s (~) 0.621s 7 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 20.378s (+17.7% 🔺) 23.591s (+22.6% 🔺) 3.213s 4 1.00x
▲ Vercel Nitro 20.855s (+21.5% 🔺) 22.976s (+25.7% 🔺) 2.120s 4 1.02x
▲ Vercel Next.js (Turbopack) 23.148s (+18.0% 🔺) 25.042s (+18.7% 🔺) 1.894s 4 1.14x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.177s (~) 2.008s (~) 0.831s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.185s (-2.2%) 2.008s (~) 0.823s 15 1.01x
🐘 Postgres Express 1.198s (+1.9%) 2.008s (~) 0.810s 15 1.02x
💻 Local Nitro 1.358s (-6.6% 🟢) 2.006s (~) 0.648s 15 1.15x
💻 Local Next.js (Turbopack) 1.423s (-3.2%) 2.006s (~) 0.584s 15 1.21x
💻 Local Express 1.430s (-9.7% 🟢) 2.007s (-3.2%) 0.577s 15 1.22x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.328s (+8.1% 🔺) 4.060s (+5.1% 🔺) 1.732s 8 1.00x
▲ Vercel Nitro 2.589s (+30.4% 🔺) 4.405s (+36.4% 🔺) 1.816s 7 1.11x
▲ Vercel Next.js (Turbopack) 3.358s (+6.0% 🔺) 4.815s (+6.4% 🔺) 1.457s 7 1.44x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.311s (+1.1%) 3.009s (~) 1.698s 10 1.00x
🐘 Postgres Nitro 1.336s (+0.6%) 2.508s (+8.2% 🔺) 1.172s 12 1.02x
🐘 Postgres Express 1.364s (+2.3%) 2.509s (+4.9%) 1.145s 12 1.04x
💻 Local Express 2.501s (~) 2.918s (-3.0%) 0.417s 11 1.91x
💻 Local Nitro 2.623s (+6.9% 🔺) 3.008s (+6.4% 🔺) 0.386s 10 2.00x
💻 Local Next.js (Turbopack) 2.795s (+8.8% 🔺) 3.209s (+3.2%) 0.414s 10 2.13x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.760s (+7.9% 🔺) 4.456s (+15.7% 🔺) 1.696s 7 1.00x
▲ Vercel Express 2.835s (+11.5% 🔺) 4.838s (+20.4% 🔺) 2.003s 7 1.03x
▲ Vercel Next.js (Turbopack) 4.676s (+34.8% 🔺) 6.392s (+33.8% 🔺) 1.716s 5 1.69x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.603s (-3.9%) 4.136s (~) 2.534s 8 1.00x
🐘 Postgres Express 1.613s (~) 4.012s (~) 2.399s 8 1.01x
🐘 Postgres Next.js (Turbopack) 2.911s (-8.3% 🟢) 5.847s (-5.9% 🟢) 2.936s 6 1.82x
💻 Local Nitro 4.656s (-25.7% 🟢) 5.347s (-25.9% 🟢) 0.691s 6 2.91x
💻 Local Express 6.095s (+14.1% 🔺) 6.817s (+16.6% 🔺) 0.722s 5 3.80x
💻 Local Next.js (Turbopack) 7.155s (+22.6% 🔺) 8.517s (+13.3% 🔺) 1.362s 4 4.46x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.388s (+23.0% 🔺) 5.330s (+27.3% 🔺) 1.942s 6 1.00x
▲ Vercel Nitro 4.076s (+42.7% 🔺) 6.276s (+48.5% 🔺) 2.200s 5 1.20x
▲ Vercel Next.js (Turbopack) 4.838s (+25.4% 🔺) 6.682s (+22.6% 🔺) 1.844s 5 1.43x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.178s (-0.5%) 2.007s (~) 0.829s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.194s (-2.2%) 2.007s (~) 0.813s 15 1.01x
🐘 Postgres Express 1.197s (+1.6%) 2.007s (~) 0.810s 15 1.02x
💻 Local Nitro 1.361s (-5.4% 🟢) 2.006s (~) 0.645s 15 1.16x
💻 Local Express 1.444s (+4.0%) 2.007s (~) 0.563s 15 1.23x
💻 Local Next.js (Turbopack) 1.487s (+6.9% 🔺) 2.007s (~) 0.521s 15 1.26x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.314s (+18.7% 🔺) 4.117s (+27.7% 🔺) 1.802s 8 1.00x
▲ Vercel Express 2.506s (+33.4% 🔺) 4.248s (+15.0% 🔺) 1.742s 8 1.08x
▲ Vercel Next.js (Turbopack) 3.736s (+21.9% 🔺) 5.372s (+14.2% 🔺) 1.636s 6 1.61x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.317s (~) 3.008s (~) 1.690s 10 1.00x
🐘 Postgres Express 1.325s (+2.7%) 2.919s (+16.4% 🔺) 1.594s 11 1.01x
🐘 Postgres Nitro 1.352s (+3.8%) 2.510s (~) 1.158s 12 1.03x
💻 Local Express 2.439s (~) 3.008s (-3.2%) 0.570s 10 1.85x
💻 Local Nitro 2.516s (+5.1% 🔺) 3.008s (~) 0.491s 10 1.91x
💻 Local Next.js (Turbopack) 2.713s (+12.3% 🔺) 3.209s (+13.5% 🔺) 0.496s 10 2.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.736s (+22.8% 🔺) 4.596s (+24.4% 🔺) 1.860s 7 1.00x
▲ Vercel Nitro 2.924s (+31.1% 🔺) 4.782s (+49.2% 🔺) 1.858s 7 1.07x
▲ Vercel Next.js (Turbopack) 4.397s (+35.5% 🔺) 6.265s (+38.1% 🔺) 1.868s 5 1.61x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.598s (~) 4.017s (-5.7% 🟢) 2.419s 8 1.00x
🐘 Postgres Nitro 1.611s (-3.4%) 4.011s (-9.8% 🟢) 2.399s 8 1.01x
🐘 Postgres Next.js (Turbopack) 3.052s (+1.8%) 6.019s (-16.6% 🟢) 2.968s 5 1.91x
💻 Local Nitro 5.471s (-25.8% 🟢) 6.013s (-25.0% 🟢) 0.542s 6 3.42x
💻 Local Next.js (Turbopack) 6.826s (+48.6% 🔺) 7.416s (+38.7% 🔺) 0.590s 5 4.27x
💻 Local Express 6.841s (+6.9% 🔺) 7.515s (+7.1% 🔺) 0.674s 4 4.28x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.039s (+16.0% 🔺) 5.118s (+16.5% 🔺) 2.079s 6 1.00x
▲ Vercel Express 3.297s (+3.5%) 4.915s (+3.0%) 1.618s 7 1.09x
▲ Vercel Next.js (Turbopack) 4.587s (+14.6% 🔺) 6.049s (+9.8% 🔺) 1.462s 5 1.51x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 0.507s (-11.4% 🟢) 1.004s (~) 0.497s 60 1.00x
🐘 Postgres Nitro 0.536s (-0.7%) 1.023s (~) 0.488s 59 1.06x
🐘 Postgres Express 0.546s (~) 1.007s (~) 0.461s 60 1.08x
🐘 Postgres Next.js (Turbopack) 0.565s (-6.0% 🟢) 1.006s (~) 0.442s 60 1.12x
💻 Local Express 0.581s (-3.6%) 1.006s (~) 0.425s 60 1.15x
💻 Local Next.js (Turbopack) 0.627s (+7.1% 🔺) 1.005s (~) 0.379s 60 1.24x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.024s (+24.0% 🔺) 5.015s (+40.6% 🔺) 1.992s 12 1.00x
▲ Vercel Express 3.193s (+28.2% 🔺) 4.899s (+21.1% 🔺) 1.706s 13 1.06x
▲ Vercel Next.js (Turbopack) 4.290s (+18.7% 🔺) 5.666s (+12.9% 🔺) 1.376s 11 1.42x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.254s (-1.8%) 2.007s (~) 0.753s 45 1.00x
💻 Local Nitro 1.268s (-15.1% 🟢) 2.006s (-2.2%) 0.737s 45 1.01x
🐘 Postgres Next.js (Turbopack) 1.317s (-2.5%) 2.007s (~) 0.690s 45 1.05x
🐘 Postgres Express 1.326s (+4.4%) 2.031s (+1.2%) 0.706s 45 1.06x
💻 Local Express 1.522s (-3.5%) 2.006s (-1.1%) 0.484s 45 1.21x
💻 Local Next.js (Turbopack) 1.575s (+3.6%) 2.006s (~) 0.432s 45 1.26x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 7.253s (+23.9% 🔺) 9.055s (+19.9% 🔺) 1.801s 11 1.00x
▲ Vercel Nitro 7.458s (+29.9% 🔺) 9.395s (+35.6% 🔺) 1.936s 10 1.03x
▲ Vercel Next.js (Turbopack) 10.200s (+24.0% 🔺) 11.680s (+24.1% 🔺) 1.480s 8 1.41x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.456s (-2.9%) 3.058s (~) 0.602s 40 1.00x
🐘 Postgres Next.js (Turbopack) 2.679s (-7.1% 🟢) 3.112s (-3.4%) 0.433s 39 1.09x
🐘 Postgres Express 2.738s (+6.4% 🔺) 3.137s (+2.6%) 0.399s 39 1.11x
💻 Local Nitro 2.785s (-11.0% 🟢) 3.083s (-20.0% 🟢) 0.297s 40 1.13x
💻 Local Express 3.232s (-4.1%) 4.009s (~) 0.777s 30 1.32x
💻 Local Next.js (Turbopack) 3.510s (+8.1% 🔺) 4.044s (+0.9%) 0.534s 30 1.43x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 14.098s (+19.6% 🔺) 16.121s (+16.9% 🔺) 2.023s 8 1.00x
▲ Vercel Nitro 16.189s (+36.8% 🔺) 18.511s (+39.6% 🔺) 2.323s 7 1.15x
▲ Vercel Next.js (Turbopack) 19.888s (+20.5% 🔺) 21.753s (+20.2% 🔺) 1.865s 6 1.41x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

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.194s (-11.8% 🟢) 1.006s (~) 0.813s 60 1.00x
🐘 Postgres Express 0.213s (-0.8%) 1.006s (~) 0.793s 60 1.10x
🐘 Postgres Nitro 0.266s (+27.6% 🔺) 1.041s (+3.4%) 0.775s 58 1.37x
💻 Local Express 0.431s (-16.1% 🟢) 1.005s (~) 0.573s 60 2.22x
💻 Local Nitro 0.474s (+8.0% 🔺) 1.005s (~) 0.530s 60 2.45x
💻 Local Next.js (Turbopack) 0.669s (+9.5% 🔺) 1.005s (-1.6%) 0.336s 60 3.45x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.271s (+20.1% 🔺) 2.937s (+10.3% 🔺) 1.666s 21 1.00x
▲ Vercel Nitro 1.330s (+33.4% 🔺) 3.050s (+39.9% 🔺) 1.720s 20 1.05x
▲ Vercel Next.js (Turbopack) 2.627s (+32.3% 🔺) 4.223s (+27.8% 🔺) 1.596s 15 2.07x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.296s (-5.9% 🟢) 1.018s (+1.1%) 0.721s 89 1.00x
🐘 Postgres Nitro 0.323s (-2.2%) 1.006s (-1.1%) 0.683s 90 1.09x
🐘 Postgres Express 0.333s (-3.8%) 1.018s (~) 0.684s 89 1.12x
💻 Local Nitro 1.985s (-7.2% 🟢) 2.509s (-5.9% 🟢) 0.524s 36 6.70x
💻 Local Express 2.183s (-2.3%) 2.738s (-6.0% 🟢) 0.555s 33 7.36x
💻 Local Next.js (Turbopack) 3.023s (+16.2% 🔺) 3.885s (+23.5% 🔺) 0.863s 24 10.20x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.788s (+37.9% 🔺) 3.796s (+51.3% 🔺) 2.008s 24 1.00x
▲ Vercel Express 1.907s (+36.1% 🔺) 3.906s (+35.6% 🔺) 1.999s 24 1.07x
▲ Vercel Next.js (Turbopack) 3.528s (+34.0% 🔺) 5.139s (+22.6% 🔺) 1.611s 18 1.97x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.521s (-7.5% 🟢) 3.060s (-2.5%) 2.539s 40 1.00x
🐘 Postgres Nitro 0.544s (+4.3%) 1.107s (+3.7%) 0.563s 109 1.04x
🐘 Postgres Express 0.551s (+10.5% 🔺) 1.078s (+6.3% 🔺) 0.527s 112 1.06x
💻 Local Nitro 9.192s (-9.4% 🟢) 10.219s (-5.9% 🟢) 1.027s 12 17.63x
💻 Local Express 10.274s (-1.2%) 11.300s (-3.1%) 1.026s 11 19.71x
💻 Local Next.js (Turbopack) 11.768s (+17.4% 🔺) 12.730s (+15.4% 🔺) 0.962s 10 22.58x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.748s (+49.5% 🔺) 4.684s (+26.1% 🔺) 1.936s 26 1.00x
▲ Vercel Nitro 2.911s (+56.7% 🔺) 4.825s (+41.2% 🔺) 1.913s 25 1.06x
▲ Vercel Next.js (Turbopack) 5.055s (+35.0% 🔺) 7.004s (+33.4% 🔺) 1.949s 18 1.84x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.134s (-2.9%) 2.004s (~) 0.008s (-30.6% 🟢) 2.015s (~) 0.880s 10 1.00x
💻 Local Next.js (Turbopack) 1.144s (~) 1.967s (~) 0.012s (+20.4% 🔺) 2.020s (~) 0.875s 10 1.01x
🐘 Postgres Express 1.156s (~) 1.997s (~) 0.002s (+25.0% 🔺) 2.011s (~) 0.854s 10 1.02x
🐘 Postgres Nitro 1.157s (-1.9%) 1.997s (~) 0.001s (+30.0% 🔺) 2.011s (~) 0.854s 10 1.02x
💻 Local Express 1.162s (-0.9%) 2.005s (~) 0.012s (+12.1% 🔺) 2.020s (~) 0.858s 10 1.02x
🐘 Postgres Next.js (Turbopack) 1.169s (-1.1%) 2.000s (~) 0.001s (-26.7% 🟢) 2.010s (~) 0.841s 10 1.03x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.144s (+14.7% 🔺) 3.390s (+3.0%) 2.715s (+121.7% 🔺) 6.636s (+32.3% 🔺) 4.492s 10 1.00x
▲ Vercel Nitro 2.166s (+15.3% 🔺) 3.563s (+23.3% 🔺) 1.718s (-1.0%) 5.787s (+15.8% 🔺) 3.621s 10 1.01x
▲ Vercel Next.js (Turbopack) 3.967s (+19.8% 🔺) 3.917s (+9.9% 🔺) 1.751s (+27.8% 🔺) 7.166s (+13.7% 🔺) 3.198s 10 1.85x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.492s (-4.1%) 2.009s (~) 0.011s (-14.4% 🟢) 2.024s (~) 0.532s 30 1.00x
🐘 Postgres Nitro 1.561s (-1.6%) 2.002s (~) 0.005s (~) 2.026s (~) 0.465s 30 1.05x
🐘 Postgres Express 1.573s (-1.4%) 2.004s (-1.5%) 0.005s (-1.4%) 2.025s (-1.6%) 0.453s 30 1.05x
💻 Local Express 1.574s (-0.9%) 2.010s (~) 0.013s (~) 2.026s (~) 0.453s 30 1.06x
💻 Local Next.js (Turbopack) 1.619s (+3.7%) 1.970s (~) 0.013s (+13.3% 🔺) 2.027s (~) 0.408s 30 1.09x
🐘 Postgres Next.js (Turbopack) 1.634s (+2.8%) 2.011s (~) 0.005s (+8.1% 🔺) 2.028s (~) 0.394s 30 1.10x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 6.040s (+11.4% 🔺) 7.635s (+7.7% 🔺) 0.283s (+52.8% 🔺) 8.435s (+9.2% 🔺) 2.395s 8 1.00x
▲ Vercel Nitro 6.729s (+21.2% 🔺) 8.320s (+29.9% 🔺) 0.216s (-73.7% 🟢) 9.048s (+18.6% 🔺) 2.319s 7 1.11x
▲ Vercel Next.js (Turbopack) 10.682s (+17.5% 🔺) 11.576s (+15.7% 🔺) 0.165s (+17.6% 🔺) 12.399s (+12.7% 🔺) 1.717s 5 1.77x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.783s (-3.0%) 1.022s (-4.2%) 0.000s (+Infinity% 🔺) 1.044s (-3.4%) 0.261s 58 1.00x
🐘 Postgres Express 0.839s (+8.5% 🔺) 1.120s (+8.9% 🔺) 0.000s (-47.2% 🟢) 1.138s (+7.5% 🔺) 0.299s 54 1.07x
🐘 Postgres Next.js (Turbopack) 1.045s (+2.7%) 1.363s (-6.1% 🟢) 0.000s (+Infinity% 🔺) 1.372s (-6.1% 🟢) 0.327s 44 1.34x
💻 Local Nitro 1.170s (-5.3% 🟢) 1.947s (-3.3%) 0.000s (+39.8% 🔺) 1.950s (-3.2%) 0.780s 31 1.49x
💻 Local Express 1.313s (-3.8%) 1.981s (-1.7%) 0.000s (-40.4% 🟢) 1.984s (-1.7%) 0.671s 31 1.68x
💻 Local Next.js (Turbopack) 1.436s (+7.6% 🔺) 1.977s (~) 0.000s (-13.3% 🟢) 2.017s (~) 0.581s 30 1.83x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.348s (+5.3% 🔺) 4.757s (+11.6% 🔺) 0.000s (NaN%) 5.328s (+14.2% 🔺) 1.980s 12 1.00x
▲ Vercel Express 3.451s (+25.3% 🔺) 4.852s (+11.2% 🔺) 0.000s (+8.3% 🔺) 5.363s (+10.7% 🔺) 1.912s 12 1.03x
▲ Vercel Next.js (Turbopack) 4.981s (+5.6% 🔺) 5.812s (+6.7% 🔺) 0.000s (+Infinity% 🔺) 6.556s (+2.3%) 1.575s 10 1.49x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

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.598s (-11.9% 🟢) 2.173s (-9.2% 🟢) 0.000s (-100.0% 🟢) 2.227s (-7.6% 🟢) 0.630s 28 1.00x
🐘 Postgres Express 1.793s (-2.8%) 2.394s (+0.7%) 0.000s (-100.0% 🟢) 2.410s (+0.6%) 0.617s 25 1.12x
🐘 Postgres Next.js (Turbopack) 2.576s (-15.7% 🟢) 3.212s (-10.6% 🟢) 0.000s (-100.0% 🟢) 3.223s (-10.5% 🟢) 0.648s 19 1.61x
💻 Local Nitro 3.284s (~) 3.832s (-3.3%) 0.001s (+57.1% 🔺) 3.840s (-3.2%) 0.555s 16 2.06x
💻 Local Express 3.488s (-13.9% 🟢) 4.026s (-11.2% 🟢) 0.001s (+44.2% 🔺) 4.031s (-11.1% 🟢) 0.543s 15 2.18x
💻 Local Next.js (Turbopack) 3.670s (-2.7%) 4.185s (-1.8%) 0.001s (+120.0% 🔺) 4.240s (-1.4%) 0.571s 15 2.30x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.755s (+12.5% 🔺) 6.069s (+4.4%) 0.004s (+Infinity% 🔺) 6.597s (+5.2% 🔺) 1.842s 10 1.00x
▲ Vercel Nitro 5.107s (+24.8% 🔺) 6.623s (+28.5% 🔺) 0.000s (+22.2% 🔺) 7.138s (+28.7% 🔺) 2.031s 9 1.07x
▲ Vercel Next.js (Turbopack) 7.447s (+11.6% 🔺) 8.345s (+16.4% 🔺) 0.006s (+4700.0% 🔺) 9.304s (+14.7% 🔺) 1.857s 7 1.57x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 17/21
Next.js (Turbopack) 🐘 Postgres 15/21
Nitro 🐘 Postgres 13/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)
  • 🌐 Redis: Community world (local development)
  • 🌐 Redis + BullMQ: Community world (local development)
  • 🌐 Cloudflare: Community world (local development)
  • 🌐 MySQL: Community world (local development)
  • 🌐 Azure: Community world (local development)
  • 🌐 NATS JetStream: Community world (local development)
  • 🌐 Upstash: Community world (local development)
  • 🌐 Platformatic: Community world (local development)

📋 View full workflow run

@NathanColosimo NathanColosimo force-pushed the codex/idempotent-start-hooks branch from 0c1320a to de1af62 Compare June 27, 2026 19:33
@vercel vercel Bot temporarily deployed to Preview – workflow-docs June 27, 2026 19:45 Inactive
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.

1 participant