Skip to content

[world-vercel] Send remoteRefBehavior=lazy on v4 metadata-only event listings#2415

Open
VaguelySerious wants to merge 1 commit into
mainfrom
peter/v4-list-lazy-refs
Open

[world-vercel] Send remoteRefBehavior=lazy on v4 metadata-only event listings#2415
VaguelySerious wants to merge 1 commit into
mainfrom
peter/v4-list-lazy-refs

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

What

getWorkflowRunEvents applied resolveData only client-side: on the v4 wire it always downloaded the resolved payload bytes for every event (step inputs/outputs, run input/output, hook payloads, errors), then discarded them in buildEventFromV4 when resolveData was 'none'. Pure wasted bandwidth for metadata-only consumers — and v4 has no per-event /refs path to opt out of.

The v4 list endpoints already accept remoteRefBehavior (resolve|lazy, default resolve). This maps resolveData: 'none'remoteRefBehavior: 'lazy' and sends it on both the runId and correlationId list queries, so the backend emits empty-body frames and skips the per-event blob read entirely. resolveData: 'all' sends resolve (the default), unchanged.

This is the SDK half of the metadata-only-listing optimization; it pairs with the backend change that honors remoteRefBehavior=lazy on the v4 list/stream.

Why it's safe

  • No new wire concept: reuses the existing remoteRefBehavior param — the same one v2/v3 use, which resolveData has always mapped to.
  • Backward compatible with an older backend: one that predates the flag simply ignores it and streams full bodies; buildEventFromV4 still strips them for resolveData: 'none'. So correctness holds regardless of backend version — it's purely a bandwidth optimization that kicks in once the backend supports it.
  • The frame meta is unchanged in lazy mode (the event entity + payload ref descriptor still ride in the frame); only the resolved bytes are withheld.

Test plan

  • getWorkflowRunEvents({ resolveData: 'none' }) sends ?remoteRefBehavior=lazy and strips any body the backend still returns (events.test.ts)
  • Default (resolveData: 'all') sends ?remoteRefBehavior=resolve and splices the body bytes into eventData
  • Both runId and correlationId list query builders send the param (appendListParams)
  • world-vercel unit suite (148 tests) + typecheck clean

getWorkflowRunEvents applied resolveData only client-side: it always
downloaded the resolved payload bytes for every event, then discarded them
when resolveData was 'none'. The v4 list endpoints accept remoteRefBehavior
(resolve|lazy, default resolve), so map resolveData 'none' → lazy and send
it on the runId and correlationId list queries — the backend then emits
empty-body frames and skips the per-event blob read.

Safe against a backend that predates the flag: it ignores the param and
streams full bodies, and buildEventFromV4 still strips them for
resolveData 'none', so this is a pure bandwidth optimization either way.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@VaguelySerious VaguelySerious requested a review from a team as a code owner June 14, 2026 11:24
@vercel

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

@changeset-bot

changeset-bot Bot commented Jun 14, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3d5ed93

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

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

@github-actions

github-actions Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1442 0 219 1661
✅ 💻 Local Development 1895 0 219 2114
✅ 📦 Local Production 1895 0 219 2114
✅ 🐘 Local Postgres 1881 0 233 2114
✅ 🪟 Windows 151 0 0 151
✅ 📋 Other 879 0 178 1057
Total 8143 0 1068 9211

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 125 0 26
✅ example 125 0 26
✅ express 125 0 26
✅ fastify 125 0 26
✅ hono 125 0 26
✅ nextjs-turbopack 149 0 2
✅ nextjs-webpack 149 0 2
✅ nitro 125 0 26
✅ nuxt 125 0 26
✅ sveltekit 144 0 7
✅ vite 125 0 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 126 0 25
✅ express-stable 126 0 25
✅ fastify-stable 126 0 25
✅ hono-stable 126 0 25
✅ nextjs-turbopack-canary 132 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 151 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 151 0 0
✅ nextjs-webpack-canary 132 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 151 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 151 0 0
✅ nitro-stable 126 0 25
✅ nuxt-stable 126 0 25
✅ sveltekit-stable 145 0 6
✅ vite-stable 126 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 126 0 25
✅ express-stable 126 0 25
✅ fastify-stable 126 0 25
✅ hono-stable 126 0 25
✅ nextjs-turbopack-canary 132 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 151 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 151 0 0
✅ nextjs-webpack-canary 132 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 151 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 151 0 0
✅ nitro-stable 126 0 25
✅ nuxt-stable 126 0 25
✅ sveltekit-stable 145 0 6
✅ vite-stable 126 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 125 0 26
✅ express-stable 125 0 26
✅ fastify-stable 125 0 26
✅ hono-stable 125 0 26
✅ nextjs-turbopack-canary 131 0 20
✅ nextjs-turbopack-stable-lazy-discovery-disabled 150 0 1
✅ nextjs-turbopack-stable-lazy-discovery-enabled 150 0 1
✅ nextjs-webpack-canary 131 0 20
✅ nextjs-webpack-stable-lazy-discovery-disabled 150 0 1
✅ nextjs-webpack-stable-lazy-discovery-enabled 150 0 1
✅ nitro-stable 125 0 26
✅ nuxt-stable 125 0 26
✅ sveltekit-stable 144 0 7
✅ vite-stable 125 0 26
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 151 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 126 0 25
✅ e2e-local-dev-tanstack-start- 126 0 25
✅ e2e-local-postgres-nest-stable 125 0 26
✅ e2e-local-postgres-tanstack-start- 125 0 26
✅ e2e-local-prod-nest-stable 126 0 25
✅ e2e-local-prod-tanstack-start- 126 0 25
✅ e2e-vercel-prod-tanstack-start 125 0 26

📋 View full workflow run

@github-actions

github-actions Bot commented Jun 14, 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 🥇 Nitro 0.041s (-14.9% 🟢) 1.005s (~) 0.965s 10 1.00x
💻 Local Express 0.046s (+9.2% 🔺) 1.007s (~) 0.960s 10 1.14x
🐘 Postgres Nitro 0.061s (-5.4% 🟢) 1.012s (~) 0.951s 10 1.50x
💻 Local Next.js (Turbopack) 0.063s (+1.8%) 1.005s (~) 0.943s 10 1.54x
🐘 Postgres Express 0.064s (+4.6%) 1.013s (~) 0.949s 10 1.56x
🐘 Postgres Next.js (Turbopack) 0.072s (+7.3% 🔺) 1.013s (~) 0.942s 10 1.76x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.291s (-9.1% 🟢) 2.297s (~) 2.006s 10 1.00x
▲ Vercel Nitro 0.320s (+21.9% 🔺) 2.514s (+6.6% 🔺) 2.194s 10 1.10x
▲ Vercel Next.js (Turbopack) 0.414s (+2.9%) 2.075s (-18.6% 🟢) 1.661s 10 1.42x

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

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.091s (-0.8%) 2.006s (~) 0.915s 10 1.00x
💻 Local Express 1.095s (-0.6%) 2.006s (~) 0.911s 10 1.00x
🐘 Postgres Nitro 1.107s (~) 2.009s (~) 0.902s 10 1.01x
🐘 Postgres Express 1.109s (~) 2.011s (~) 0.902s 10 1.02x
💻 Local Next.js (Turbopack) 1.150s (~) 2.006s (~) 0.856s 10 1.05x
🐘 Postgres Next.js (Turbopack) 1.163s (+0.6%) 2.010s (~) 0.848s 10 1.07x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 1.743s (+5.7% 🔺) 3.391s (-11.5% 🟢) 1.648s 10 1.00x
▲ Vercel Nitro 1.902s (+16.1% 🔺) 3.972s (+4.6%) 2.070s 10 1.09x
▲ Vercel Express 1.950s (+16.6% 🔺) 3.392s (-7.7% 🟢) 1.441s 10 1.12x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 10.527s (~) 11.014s (~) 0.487s 3 1.00x
🐘 Postgres Express 10.540s (~) 11.019s (~) 0.479s 3 1.00x
💻 Local Nitro 10.541s (~) 11.023s (~) 0.482s 3 1.00x
💻 Local Express 10.565s (~) 11.022s (~) 0.456s 3 1.00x
💻 Local Next.js (Turbopack) 10.772s (~) 11.023s (~) 0.251s 3 1.02x
🐘 Postgres Next.js (Turbopack) 10.813s (-1.2%) 11.017s (-3.0%) 0.204s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 14.232s (-42.6% 🟢) 16.180s (-38.1% 🟢) 1.948s 2 1.00x
▲ Vercel Next.js (Turbopack) 14.503s (-5.1% 🟢) 16.096s (-7.3% 🟢) 1.593s 2 1.02x
▲ Vercel Express 14.527s (+2.7%) 16.074s (+3.3%) 1.546s 2 1.02x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 13.757s (-0.9%) 14.015s (-1.4%) 0.258s 5 1.00x
💻 Local Express 13.802s (~) 14.027s (~) 0.225s 5 1.00x
🐘 Postgres Express 13.868s (+0.7%) 14.021s (~) 0.153s 5 1.01x
💻 Local Nitro 13.958s (+1.1%) 14.227s (+1.4%) 0.269s 5 1.01x
💻 Local Next.js (Turbopack) 14.357s (-1.2%) 15.029s (~) 0.672s 4 1.04x
🐘 Postgres Next.js (Turbopack) 14.454s (-2.1%) 15.015s (-1.7%) 0.561s 4 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 22.767s (+1.1%) 24.329s (~) 1.562s 3 1.00x
▲ Vercel Nitro 24.145s (+14.6% 🔺) 27.245s (+18.7% 🔺) 3.100s 3 1.06x
▲ Vercel Next.js (Turbopack) 24.745s (+18.6% 🔺) 26.625s (+17.0% 🔺) 1.880s 3 1.09x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 12.373s (-1.6%) 13.024s (~) 0.651s 7 1.00x
🐘 Postgres Express 12.458s (~) 13.019s (~) 0.561s 7 1.01x
💻 Local Express 12.470s (~) 13.024s (~) 0.554s 7 1.01x
🐘 Postgres Nitro 12.651s (+1.0%) 13.019s (~) 0.368s 7 1.02x
💻 Local Next.js (Turbopack) 13.702s (+0.7%) 14.027s (~) 0.325s 7 1.11x
🐘 Postgres Next.js (Turbopack) 13.852s (~) 14.163s (-1.0%) 0.311s 7 1.12x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 30.262s (-20.7% 🟢) 31.431s (-20.6% 🟢) 1.169s 3 1.00x
▲ Vercel Nitro 31.180s (+3.9%) 33.855s (+4.8%) 2.675s 3 1.03x
▲ Vercel Next.js (Turbopack) 31.962s (+5.1% 🔺) 33.209s (+2.0%) 1.247s 3 1.06x

🔍 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 🥇 Express 1.201s (~) 2.008s (~) 0.807s 15 1.00x
🐘 Postgres Nitro 1.211s (~) 2.007s (~) 0.796s 15 1.01x
💻 Local Nitro 1.228s (+3.2%) 2.006s (~) 0.778s 15 1.02x
🐘 Postgres Next.js (Turbopack) 1.281s (+0.7%) 2.007s (~) 0.725s 15 1.07x
💻 Local Express 1.296s (+5.2% 🔺) 2.006s (~) 0.710s 15 1.08x
💻 Local Next.js (Turbopack) 1.362s (+4.0%) 2.006s (~) 0.644s 15 1.13x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.325s (-4.5%) 4.165s (+3.0%) 1.840s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.339s (-12.0% 🟢) 4.243s (-3.1%) 1.905s 8 1.01x
▲ Vercel Express 2.828s (-38.0% 🟢) 4.781s (-20.5% 🟢) 1.953s 7 1.22x

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

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.385s (~) 2.316s (-3.3%) 0.930s 13 1.00x
🐘 Postgres Express 1.402s (+3.2%) 2.592s (+8.3% 🔺) 1.190s 12 1.01x
🐘 Postgres Next.js (Turbopack) 1.597s (+1.5%) 2.223s (-3.1%) 0.626s 14 1.15x
💻 Local Nitro 1.724s (-12.1% 🟢) 2.006s (-13.4% 🟢) 0.282s 15 1.24x
💻 Local Next.js (Turbopack) 1.857s (+4.9%) 2.150s (+7.2% 🔺) 0.293s 14 1.34x
💻 Local Express 1.989s (+22.5% 🔺) 2.393s (+19.3% 🔺) 0.404s 13 1.44x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.769s (-23.1% 🟢) 4.592s (-15.7% 🟢) 1.823s 7 1.00x
▲ Vercel Express 2.826s (-21.4% 🟢) 4.295s (-15.6% 🟢) 1.469s 8 1.02x
▲ Vercel Next.js (Turbopack) 3.558s (+14.6% 🔺) 5.236s (+1.1%) 1.677s 6 1.29x

🔍 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.617s (~) 3.887s (-6.2% 🟢) 2.270s 8 1.00x
🐘 Postgres Express 1.695s (+7.1% 🔺) 3.762s (-6.3% 🟢) 2.067s 8 1.05x
🐘 Postgres Next.js (Turbopack) 3.329s (+1.6%) 4.298s (+7.0% 🔺) 0.970s 7 2.06x
💻 Local Nitro 4.364s (-20.7% 🟢) 5.012s (-16.7% 🟢) 0.649s 7 2.70x
💻 Local Express 5.632s (+33.0% 🔺) 6.614s (+40.0% 🔺) 0.982s 5 3.48x
💻 Local Next.js (Turbopack) 5.752s (+18.7% 🔺) 6.216s (+16.2% 🔺) 0.463s 5 3.56x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.803s (-16.3% 🟢) 6.451s (+2.5%) 2.649s 6 1.00x
▲ Vercel Express 4.023s (-4.3%) 5.456s (-9.9% 🟢) 1.432s 6 1.06x
▲ Vercel Next.js (Turbopack) 4.377s (-15.8% 🟢) 6.113s (-12.6% 🟢) 1.736s 6 1.15x

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

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.208s (-0.7%) 2.007s (~) 0.799s 15 1.00x
🐘 Postgres Express 1.233s (+2.7%) 2.007s (~) 0.775s 15 1.02x
🐘 Postgres Next.js (Turbopack) 1.294s (+0.6%) 2.007s (~) 0.713s 15 1.07x
💻 Local Next.js (Turbopack) 1.344s (-2.7%) 2.007s (~) 0.662s 15 1.11x
💻 Local Nitro 1.523s (-8.1% 🟢) 2.006s (~) 0.483s 15 1.26x
💻 Local Express 1.608s (+6.4% 🔺) 2.007s (~) 0.399s 15 1.33x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.512s (-14.6% 🟢) 4.164s (-14.4% 🟢) 1.652s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.631s (-24.2% 🟢) 4.368s (-13.9% 🟢) 1.737s 7 1.05x
▲ Vercel Express 2.758s (+14.0% 🔺) 4.293s (+3.4%) 1.535s 7 1.10x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.334s (-1.3%) 2.222s (-14.3% 🟢) 0.887s 14 1.00x
🐘 Postgres Express 1.432s (+1.3%) 2.222s (-4.1%) 0.790s 14 1.07x
🐘 Postgres Next.js (Turbopack) 1.485s (-8.4% 🟢) 2.150s (-6.3% 🟢) 0.665s 14 1.11x
💻 Local Nitro 1.939s (-9.1% 🟢) 2.393s (-7.7% 🟢) 0.453s 13 1.45x
💻 Local Next.js (Turbopack) 2.003s (-3.3%) 2.591s (-8.3% 🟢) 0.587s 12 1.50x
💻 Local Express 2.153s (+23.3% 🔺) 2.675s (+24.4% 🔺) 0.522s 12 1.61x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.975s (-1.4%) 4.536s (+1.8%) 1.561s 7 1.00x
▲ Vercel Next.js (Turbopack) 3.147s (+20.0% 🔺) 4.548s (+5.5% 🔺) 1.401s 7 1.06x
▲ Vercel Nitro 3.711s (+41.3% 🔺) 5.266s (+30.0% 🔺) 1.555s 6 1.25x

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

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.552s (-3.7%) 3.761s (~) 2.209s 8 1.00x
🐘 Postgres Express 1.631s (+3.9%) 3.763s (-6.2% 🟢) 2.132s 8 1.05x
🐘 Postgres Next.js (Turbopack) 3.290s (+20.3% 🔺) 4.014s (+16.1% 🔺) 0.724s 8 2.12x
💻 Local Nitro 4.984s (-14.8% 🟢) 5.513s (-14.0% 🟢) 0.529s 6 3.21x
💻 Local Next.js (Turbopack) 5.788s (+17.8% 🔺) 6.351s (+22.5% 🔺) 0.562s 6 3.73x
💻 Local Express 5.942s (+26.8% 🔺) 6.216s (+20.0% 🔺) 0.273s 5 3.83x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.588s (-19.8% 🟢) 6.708s (+11.3% 🔺) 3.121s 5 1.00x
▲ Vercel Express 3.668s (+6.1% 🔺) 5.417s (+6.0% 🔺) 1.749s 6 1.02x
▲ Vercel Next.js (Turbopack) 3.918s (+10.9% 🔺) 5.652s (+4.0%) 1.734s 6 1.09x

🔍 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
🐘 Postgres 🥇 Express 0.558s (-0.8%) 1.023s (+1.7%) 0.464s 59 1.00x
🐘 Postgres Nitro 0.571s (-0.6%) 1.023s (~) 0.451s 59 1.02x
💻 Local Nitro 0.598s (-4.8%) 1.005s (~) 0.407s 60 1.07x
💻 Local Express 0.611s (-2.1%) 1.005s (-1.6%) 0.394s 60 1.10x
🐘 Postgres Next.js (Turbopack) 0.828s (-2.5%) 1.006s (-5.0%) 0.179s 60 1.48x
💻 Local Next.js (Turbopack) 0.872s (-0.9%) 1.004s (-3.3%) 0.133s 60 1.56x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 6.178s (+20.7% 🔺) 7.961s (+16.6% 🔺) 1.783s 8 1.00x
▲ Vercel Express 6.408s (+16.2% 🔺) 7.695s (+6.1% 🔺) 1.287s 8 1.04x
▲ Vercel Next.js (Turbopack) 6.769s (+10.4% 🔺) 8.378s (+7.5% 🔺) 1.609s 8 1.10x

🔍 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 🥇 Express 1.307s (-3.5%) 2.007s (-1.1%) 0.700s 45 1.00x
🐘 Postgres Nitro 1.379s (+1.8%) 2.029s (+1.1%) 0.651s 45 1.05x
💻 Local Nitro 1.465s (-6.1% 🟢) 2.006s (~) 0.541s 45 1.12x
💻 Local Express 1.516s (+1.5%) 2.006s (~) 0.490s 45 1.16x
🐘 Postgres Next.js (Turbopack) 1.978s (-0.8%) 2.316s (-3.6%) 0.338s 39 1.51x
💻 Local Next.js (Turbopack) 2.124s (-1.7%) 3.009s (+1.1%) 0.885s 30 1.62x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 17.320s (+13.2% 🔺) 18.621s (+7.7% 🔺) 1.302s 5 1.00x
▲ Vercel Nitro 17.731s (+21.9% 🔺) 20.108s (+22.4% 🔺) 2.377s 5 1.02x
▲ Vercel Next.js (Turbopack) 18.235s (+10.9% 🔺) 19.635s (+6.0% 🔺) 1.400s 5 1.05x

🔍 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 🥇 Express 2.616s (-3.9%) 3.033s (-2.5%) 0.417s 40 1.00x
🐘 Postgres Nitro 2.685s (-0.5%) 3.111s (+0.8%) 0.426s 39 1.03x
💻 Local Nitro 3.251s (-3.7%) 3.977s (-0.8%) 0.726s 31 1.24x
💻 Local Express 3.256s (+2.1%) 4.009s (+0.8%) 0.753s 30 1.24x
🐘 Postgres Next.js (Turbopack) 3.874s (~) 4.043s (~) 0.168s 30 1.48x
💻 Local Next.js (Turbopack) 4.415s (+2.4%) 5.010s (~) 0.595s 24 1.69x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 31.393s (+18.0% 🔺) 33.893s (+18.8% 🔺) 2.501s 4 1.00x
▲ Vercel Nitro 32.613s (+20.8% 🔺) 35.460s (+22.6% 🔺) 2.847s 4 1.04x
▲ Vercel Next.js (Turbopack) 33.987s (+14.1% 🔺) 36.089s (+12.9% 🔺) 2.102s 4 1.08x

🔍 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 🥇 Nitro 0.237s (-2.1%) 1.006s (~) 0.769s 60 1.00x
🐘 Postgres Express 0.238s (-2.3%) 1.006s (~) 0.769s 60 1.00x
🐘 Postgres Next.js (Turbopack) 0.298s (+1.1%) 1.006s (~) 0.708s 60 1.26x
💻 Local Express 0.406s (+2.2%) 1.005s (~) 0.599s 60 1.71x
💻 Local Nitro 0.442s (+6.4% 🔺) 1.005s (~) 0.562s 60 1.86x
💻 Local Next.js (Turbopack) 0.598s (+0.9%) 1.040s (~) 0.442s 58 2.52x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.825s (-10.9% 🟢) 3.577s (-6.1% 🟢) 1.752s 17 1.00x
▲ Vercel Nitro 1.948s (+3.8%) 3.957s (+8.6% 🔺) 2.009s 16 1.07x
▲ Vercel Next.js (Turbopack) 1.987s (-2.2%) 3.578s (-8.6% 🟢) 1.591s 17 1.09x

🔍 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 🥇 Nitro 0.390s (-3.3%) 1.006s (-1.1%) 0.616s 90 1.00x
🐘 Postgres Express 0.403s (+1.2%) 1.006s (-1.1%) 0.603s 90 1.03x
🐘 Postgres Next.js (Turbopack) 0.583s (-12.3% 🟢) 1.041s (-17.0% 🟢) 0.458s 87 1.50x
💻 Local Express 2.123s (+3.5%) 2.687s (+3.0%) 0.564s 34 5.45x
💻 Local Nitro 2.141s (-2.3%) 2.686s (-5.9% 🟢) 0.545s 34 5.49x
💻 Local Next.js (Turbopack) 2.663s (+15.1% 🔺) 3.296s (+4.7%) 0.633s 28 6.83x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.976s (+14.4% 🔺) 5.040s (+22.1% 🔺) 2.064s 18 1.00x
▲ Vercel Nitro 3.261s (+14.3% 🔺) 5.899s (+18.3% 🔺) 2.638s 16 1.10x
▲ Vercel Next.js (Turbopack) 4.020s (+22.4% 🔺) 6.152s (+16.2% 🔺) 2.133s 15 1.35x

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

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.774s (-1.4%) 1.453s (+3.1%) 0.679s 83 1.00x
🐘 Postgres Express 0.810s (+6.7% 🔺) 1.356s (-3.3%) 0.545s 89 1.05x
🐘 Postgres Next.js (Turbopack) 2.840s (-8.9% 🟢) 3.766s (-6.2% 🟢) 0.926s 32 3.67x
💻 Local Nitro 9.665s (-2.6%) 10.196s (-2.4%) 0.531s 12 12.49x
💻 Local Express 9.777s (+10.0% 🔺) 10.364s (+9.3% 🔺) 0.586s 12 12.63x
💻 Local Next.js (Turbopack) 11.096s (+5.6% 🔺) 12.029s (+5.6% 🔺) 0.933s 11 14.34x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.848s (-25.5% 🟢) 8.008s (-15.7% 🟢) 2.161s 15 1.00x
▲ Vercel Nitro 5.867s (-4.6%) 8.271s (+4.8%) 2.404s 15 1.00x
▲ Vercel Next.js (Turbopack) 7.408s (-19.3% 🟢) 10.243s (-9.6% 🟢) 2.835s 12 1.27x

🔍 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
🐘 Postgres 🥇 Express 1.160s (~) 2.000s (~) 0.001s (+33.3% 🔺) 2.010s (~) 0.850s 10 1.00x
💻 Local Express 1.167s (+1.2%) 2.005s (~) 0.012s (+25.3% 🔺) 2.019s (~) 0.853s 10 1.01x
💻 Local Nitro 1.167s (-0.5%) 2.005s (~) 0.010s (-17.6% 🟢) 2.017s (~) 0.850s 10 1.01x
🐘 Postgres Nitro 1.171s (~) 1.999s (~) 0.001s (+10.0% 🔺) 2.010s (~) 0.838s 10 1.01x
💻 Local Next.js (Turbopack) 1.211s (-0.5%) 2.003s (~) 0.013s (+21.9% 🔺) 2.020s (~) 0.809s 10 1.04x
🐘 Postgres Next.js (Turbopack) 1.264s (+2.5%) 2.002s (~) 0.001s (-15.4% 🟢) 2.011s (~) 0.747s 10 1.09x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.471s (+2.8%) 3.776s (+7.5% 🔺) 0.642s (-52.2% 🟢) 4.913s (-7.5% 🟢) 2.442s 10 1.00x
▲ Vercel Express 2.507s (+11.0% 🔺) 3.490s (~) 1.022s (-1.4%) 4.889s (-1.0%) 2.381s 10 1.01x
▲ Vercel Next.js (Turbopack) 2.534s (+11.8% 🔺) 3.365s (-7.4% 🟢) 0.943s (+4.8%) 4.671s (-7.7% 🟢) 2.137s 10 1.03x

🔍 Observability: Nitro | Express | 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.562s (-2.3%) 2.009s (~) 0.013s (+4.8%) 2.025s (~) 0.463s 30 1.00x
🐘 Postgres Nitro 1.575s (~) 2.003s (~) 0.005s (~) 2.026s (~) 0.451s 30 1.01x
💻 Local Express 1.593s (+1.0%) 2.010s (~) 0.012s (+2.5%) 2.024s (~) 0.431s 30 1.02x
🐘 Postgres Express 1.615s (+2.9%) 2.004s (~) 0.005s (~) 2.027s (~) 0.413s 30 1.03x
💻 Local Next.js (Turbopack) 1.744s (+1.1%) 2.009s (~) 0.012s (+11.1% 🔺) 2.025s (~) 0.280s 30 1.12x
🐘 Postgres Next.js (Turbopack) 1.847s (+3.4%) 2.010s (~) 0.005s (-1.8%) 2.027s (~) 0.180s 30 1.18x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.608s (-16.8% 🟢) 7.872s (-15.8% 🟢) 0.179s (-48.3% 🟢) 8.498s (-17.9% 🟢) 1.890s 8 1.00x
▲ Vercel Nitro 6.611s (+9.8% 🔺) 8.425s (+15.3% 🔺) 0.178s (-33.5% 🟢) 9.099s (+11.4% 🔺) 2.488s 7 1.00x
▲ Vercel Express 6.869s (+8.5% 🔺) 8.328s (+11.4% 🔺) 0.217s (-59.3% 🟢) 9.003s (+5.9% 🔺) 2.134s 7 1.04x

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

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.772s (+0.7%) 1.066s (+1.6%) 0.000s (~) 1.078s (+1.7%) 0.306s 57 1.00x
🐘 Postgres Nitro 0.794s (+6.6% 🔺) 1.081s (+3.4%) 0.000s (-100.0% 🟢) 1.101s (+3.0%) 0.307s 55 1.03x
🐘 Postgres Next.js (Turbopack) 1.055s (+0.8%) 1.563s (+2.5%) 0.000s (+Infinity% 🔺) 1.573s (+2.6%) 0.518s 39 1.37x
💻 Local Nitro 1.388s (-2.3%) 2.014s (~) 0.000s (-7.1% 🟢) 2.016s (~) 0.628s 30 1.80x
💻 Local Express 1.450s (+4.7%) 2.014s (~) 0.001s (+142.9% 🔺) 2.017s (~) 0.567s 30 1.88x
💻 Local Next.js (Turbopack) 1.496s (+3.5%) 2.013s (~) 0.000s (+66.7% 🔺) 2.017s (~) 0.521s 30 1.94x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.074s (~) 4.173s (~) 0.000s (NaN%) 4.602s (-0.6%) 1.529s 14 1.00x
▲ Vercel Next.js (Turbopack) 3.321s (-23.3% 🟢) 4.630s (-20.1% 🟢) 0.000s (NaN%) 5.068s (-19.8% 🟢) 1.747s 12 1.08x
▲ Vercel Nitro 3.355s (+1.5%) 4.642s (-4.6%) 0.000s (-100.0% 🟢) 5.221s (-2.9%) 1.866s 12 1.09x

🔍 Observability: Express | Next.js (Turbopack) | 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.570s (-9.0% 🟢) 2.177s (-3.5%) 0.000s (NaN%) 2.201s (-3.0%) 0.630s 28 1.00x
🐘 Postgres Express 1.643s (~) 2.253s (+5.2% 🔺) 0.000s (+Infinity% 🔺) 2.268s (+3.4%) 0.626s 27 1.05x
🐘 Postgres Next.js (Turbopack) 2.294s (+5.3% 🔺) 2.657s (+1.7%) 0.000s (-100.0% 🟢) 2.664s (+1.3%) 0.371s 23 1.46x
💻 Local Nitro 3.013s (-4.7%) 3.666s (-4.5%) 0.000s (-31.6% 🟢) 3.676s (-4.4%) 0.663s 17 1.92x
💻 Local Next.js (Turbopack) 3.042s (+4.0%) 3.608s (+1.5%) 0.001s (-30.8% 🟢) 3.617s (+1.6%) 0.574s 17 1.94x
💻 Local Express 3.176s (+4.4%) 3.838s (+2.9%) 0.001s (-13.7% 🟢) 3.841s (+2.9%) 0.665s 16 2.02x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.492s (-18.3% 🟢) 6.518s (-8.1% 🟢) 0.000s (-100.0% 🟢) 7.097s (-6.3% 🟢) 2.605s 9 1.00x
▲ Vercel Next.js (Turbopack) 5.259s (-20.2% 🟢) 6.935s (-16.7% 🟢) 0.000s (NaN%) 7.417s (-16.3% 🟢) 2.158s 9 1.17x
▲ Vercel Express 5.283s (-18.4% 🟢) 6.753s (-11.9% 🟢) 0.000s (-100.0% 🟢) 7.314s (-10.9% 🟢) 2.032s 9 1.18x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

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

📋 View full workflow run

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