Skip to content

fix(builders): catch node builtin usage when entry fields diverge#1455

Open
ijjk wants to merge 2 commits intomainfrom
ijjk/fix-node-esbuild-plugin-case
Open

fix(builders): catch node builtin usage when entry fields diverge#1455
ijjk wants to merge 2 commits intomainfrom
ijjk/fix-node-esbuild-plugin-case

Conversation

@ijjk
Copy link
Member

@ijjk ijjk commented Mar 19, 2026

Brief summary:

  • Fixed createNodeModuleErrorPlugin to correctly trace transitive Node builtin usage when esbuild and enhanced-resolve pick different package entry files (for example module vs main).
  • Added package-specifier and resolved-package parent-edge tracking so cases like postgres importing os are attributed to the top-level package import instead of being missed.
  • Added a regression test (should detect packages when esbuild and resolver choose different entry fields) that reproduces this mismatch and verifies we now fail at build time with a package-level violation.

x-ref: slack thread

@vercel
Copy link
Contributor

vercel bot commented Mar 19, 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 Mar 19, 2026 9:30pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Mar 19, 2026 9:30pm
example-workflow Ready Ready Preview, Comment Mar 19, 2026 9:30pm
workbench-astro-workflow Ready Ready Preview, Comment Mar 19, 2026 9:30pm
workbench-express-workflow Ready Ready Preview, Comment Mar 19, 2026 9:30pm
workbench-fastify-workflow Ready Ready Preview, Comment Mar 19, 2026 9:30pm
workbench-hono-workflow Ready Ready Preview, Comment Mar 19, 2026 9:30pm
workbench-nitro-workflow Ready Ready Preview, Comment Mar 19, 2026 9:30pm
workbench-nuxt-workflow Ready Ready Preview, Comment Mar 19, 2026 9:30pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Mar 19, 2026 9:30pm
workbench-vite-workflow Ready Ready Preview, Comment Mar 19, 2026 9:30pm
workflow-docs Ready Ready Preview, Comment, Open in v0 Mar 19, 2026 9:30pm
workflow-nest Ready Ready Preview, Comment Mar 19, 2026 9:30pm
workflow-swc-playground Ready Ready Preview, Comment Mar 19, 2026 9:30pm
@changeset-bot
Copy link

changeset-bot bot commented Mar 19, 2026

🦋 Changeset detected

Latest commit: c5f24b2

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

This PR includes changesets to release 16 packages
Name Type
@workflow/builders Patch
@workflow/astro Patch
@workflow/cli Patch
@workflow/nest Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch
@workflow/vitest Patch
workflow Patch
@workflow/world-testing Patch
@workflow/nuxt Patch
@workflow/ai Patch
@workflow/core Patch
@workflow/web-shared 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
Copy link
Contributor

github-actions bot commented Mar 19, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 758 0 67 825
✅ 💻 Local Development 727 0 98 825
✅ 📦 Local Production 782 0 118 900
✅ 🐘 Local Postgres 782 0 118 900
✅ 🪟 Windows 72 0 3 75
❌ 🌍 Community Worlds 118 56 15 189
✅ 📋 Other 198 0 27 225
Total 3437 56 446 3939

❌ Failed Tests

🌍 Community Worlds (56 failed)

mongodb (3 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KM403R8H6NTD8Q7291683Q3R
  • webhookWorkflow | wrun_01KM40414FR0BR416A9G3A6501
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KM409C6AR0JVHY8WQPFQR0WC

redis (2 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KM403R8H6NTD8Q7291683Q3R
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KM409C6AR0JVHY8WQPFQR0WC

turso (51 failed):

  • addTenWorkflow | wrun_01KM402FDD89T140E81ZC01X9Z
  • addTenWorkflow | wrun_01KM402FDD89T140E81ZC01X9Z
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KM4045GDMTH8JACZ1XCSEJGR
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KM402P591AQ2V4R6ZAVQ78VD
  • promiseRaceWorkflow | wrun_01KM402VV9GZXNE08WR9QD5X2Y
  • promiseAnyWorkflow | wrun_01KM4030AJNVPRTW55QJXMQM26
  • importedStepOnlyWorkflow | wrun_01KM404G883B25WT0Q9YT4VNMK
  • hookWorkflow | wrun_01KM403CAVAZARNB8PWFXC1NG6
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KM403R8H6NTD8Q7291683Q3R
  • webhookWorkflow | wrun_01KM40414FR0BR416A9G3A6501
  • sleepingWorkflow | wrun_01KM4046R9EWHM51Y03RY8SXXP
  • parallelSleepWorkflow | wrun_01KM404MDD3X55XFKH1FP0Y1RC
  • nullByteWorkflow | wrun_01KM404QRYBTY7RVA7REHEPNWW
  • workflowAndStepMetadataWorkflow | wrun_01KM404SWF6MCZR8YZ00RGQPK9
  • fetchWorkflow | wrun_01KM405QNA5YQ45CA23XAXYV1R
  • promiseRaceStressTestWorkflow | wrun_01KM405V1NQZP6HA0T2HTSQHPF
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KM408RKMV391KV2AQB4V8YEV
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KM409C6AR0JVHY8WQPFQR0WC
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KM40A29ZTFPA0V25029A6SXY
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KM40AP4ZCPKDFAF2ZN2XHJ1X
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KM40B2WSHR22ZGQCX2VQPRA5
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KM40B8VTP0ZAVESPDFGRKZ9T
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KM40BB6B2MB06FTM5E4W5X2E
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KM40BV4502GSNSZ3FEJ49XGY
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KM40C2ACPWD1ZF7943C7PFWV
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KM40C92AVJ1YZBBK4DBSMGXS
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KM40CEQWZE462NQSD7D7EK08
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KM40CQT5JJ76NNEFNTHYRN08
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KM40D0E6KM6Q0SS5HF25E7V2
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KM40D743KMXPD0QZJZ1A5P3F
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KM40DPTQZRJB68EGQGGCF95V
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KM40DYQP2KSXDNZ5HAZYENJ3
  • cancelRun - cancelling a running workflow | wrun_01KM40E5Y0WYKZNVBSF03HV4YC
  • cancelRun via CLI - cancelling a running workflow | wrun_01KM40EFDBH3NEE9SXR83KQ9R8
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KM40EVSPGPD5GSYFKYG6DZ6F
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KM40FFQ1G0NGTN9PT349KXDN
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KM40FT1DEDB96PZ5392DN8B3

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 68 0 7
✅ example 68 0 7
✅ express 68 0 7
✅ fastify 68 0 7
✅ hono 68 0 7
✅ nextjs-turbopack 73 0 2
✅ nextjs-webpack 73 0 2
✅ nitro 68 0 7
✅ nuxt 68 0 7
✅ sveltekit 68 0 7
✅ vite 68 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 66 0 9
✅ express-stable 66 0 9
✅ fastify-stable 66 0 9
✅ hono-stable 66 0 9
✅ nextjs-turbopack-stable 72 0 3
✅ nextjs-webpack-canary 55 0 20
✅ nextjs-webpack-stable 72 0 3
✅ nitro-stable 66 0 9
✅ nuxt-stable 66 0 9
✅ sveltekit-stable 66 0 9
✅ vite-stable 66 0 9
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 66 0 9
✅ express-stable 66 0 9
✅ fastify-stable 66 0 9
✅ hono-stable 66 0 9
✅ nextjs-turbopack-canary 55 0 20
✅ nextjs-turbopack-stable 72 0 3
✅ nextjs-webpack-canary 55 0 20
✅ nextjs-webpack-stable 72 0 3
✅ nitro-stable 66 0 9
✅ nuxt-stable 66 0 9
✅ sveltekit-stable 66 0 9
✅ vite-stable 66 0 9
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 66 0 9
✅ express-stable 66 0 9
✅ fastify-stable 66 0 9
✅ hono-stable 66 0 9
✅ nextjs-turbopack-canary 55 0 20
✅ nextjs-turbopack-stable 72 0 3
✅ nextjs-webpack-canary 55 0 20
✅ nextjs-webpack-stable 72 0 3
✅ nitro-stable 66 0 9
✅ nuxt-stable 66 0 9
✅ sveltekit-stable 66 0 9
✅ vite-stable 66 0 9
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 72 0 3
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 3 0 2
❌ mongodb 52 3 3
✅ redis-dev 3 0 2
❌ redis 53 2 3
✅ turso-dev 3 0 2
❌ turso 4 51 3
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 66 0 9
✅ e2e-local-postgres-nest-stable 66 0 9
✅ e2e-local-prod-nest-stable 66 0 9

📋 View full workflow run


Some E2E test jobs failed:

  • Vercel Prod: success
  • Local Dev: failure
  • Local Prod: success
  • Local Postgres: success
  • Windows: success

Check the workflow run for details.

@github-actions
Copy link
Contributor

github-actions bot commented Mar 19, 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.043s (+10.1% 🔺) 1.006s (~) 0.963s 10 1.00x
💻 Local Express 0.043s (-10.8% 🟢) 1.006s (~) 0.963s 10 1.01x
💻 Local Next.js (Turbopack) 0.049s 1.005s 0.956s 10 1.15x
🌐 Redis Next.js (Turbopack) 0.053s 1.005s 0.952s 10 1.25x
🐘 Postgres Next.js (Turbopack) 0.060s 1.011s 0.951s 10 1.42x
🐘 Postgres Nitro 0.066s (-5.1% 🟢) 1.012s (-0.7%) 0.946s 10 1.55x
🐘 Postgres Express 0.069s (-14.1% 🟢) 1.013s (~) 0.944s 10 1.62x
🌐 MongoDB Next.js (Turbopack) 0.105s 1.008s 0.903s 10 2.48x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 0.439s (-24.0% 🟢) 1.878s (-25.4% 🟢) 1.439s 10 1.00x
▲ Vercel Nitro 0.462s (-10.8% 🟢) 2.345s (-4.8%) 1.883s 10 1.05x
▲ Vercel Express 0.486s (-6.5% 🟢) 2.324s (-4.2%) 1.838s 10 1.11x

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

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 1.117s 2.006s 0.889s 10 1.00x
🌐 Redis Next.js (Turbopack) 1.122s 2.006s 0.885s 10 1.00x
💻 Local Nitro 1.125s (+3.0%) 2.005s (~) 0.880s 10 1.01x
💻 Local Express 1.128s (~) 2.006s (~) 0.878s 10 1.01x
🐘 Postgres Next.js (Turbopack) 1.142s 2.011s 0.870s 10 1.02x
🐘 Postgres Express 1.146s (~) 2.012s (~) 0.866s 10 1.03x
🐘 Postgres Nitro 1.158s (+0.8%) 2.013s (~) 0.855s 10 1.04x
🌐 MongoDB Next.js (Turbopack) 1.325s 2.008s 0.684s 10 1.19x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.026s (-8.0% 🟢) 3.841s (~) 1.815s 10 1.00x
▲ Vercel Express 2.026s (~) 3.623s (-1.0%) 1.597s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.057s (-4.0%) 3.119s (-14.9% 🟢) 1.063s 10 1.02x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 10.768s 11.022s 0.254s 3 1.00x
💻 Local Next.js (Turbopack) 10.818s 11.022s 0.205s 3 1.00x
🐘 Postgres Next.js (Turbopack) 10.869s 11.037s 0.168s 3 1.01x
💻 Local Nitro 10.873s (+2.4%) 11.022s (~) 0.149s 3 1.01x
🐘 Postgres Express 10.909s (~) 11.040s (~) 0.131s 3 1.01x
💻 Local Express 10.932s (~) 11.023s (~) 0.091s 3 1.02x
🐘 Postgres Nitro 11.001s (~) 11.046s (-5.7% 🟢) 0.046s 3 1.02x
🌐 MongoDB Next.js (Turbopack) 12.253s 13.022s 0.768s 3 1.14x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 16.719s (-0.9%) 18.331s (-2.1%) 1.612s 2 1.00x
▲ Vercel Express 16.735s (~) 19.144s (+4.6%) 2.408s 2 1.00x
▲ Vercel Next.js (Turbopack) 18.697s (+9.8% 🔺) 19.916s (+8.8% 🔺) 1.219s 2 1.12x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 26.860s 27.050s 0.191s 3 1.00x
🐘 Postgres Express 27.106s (~) 27.723s (-1.2%) 0.618s 3 1.01x
💻 Local Next.js (Turbopack) 27.110s 28.050s 0.941s 3 1.01x
🐘 Postgres Next.js (Turbopack) 27.114s 27.733s 0.619s 3 1.01x
🐘 Postgres Nitro 27.283s (~) 28.067s (~) 0.784s 3 1.02x
💻 Local Nitro 27.448s (+2.6%) 28.051s (+3.7%) 0.603s 3 1.02x
💻 Local Express 27.523s (~) 28.054s (~) 0.531s 3 1.02x
🌐 MongoDB Next.js (Turbopack) 30.473s 31.039s 0.566s 2 1.13x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 48.108s (+2.2%) 49.992s (+2.3%) 1.884s 2 1.00x
▲ Vercel Express 63.814s (+40.7% 🔺) 65.764s (+41.1% 🔺) 1.950s 1 1.33x
▲ Vercel Nitro 67.442s (+50.2% 🔺) 69.529s (+48.0% 🔺) 2.087s 1 1.40x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 53.427s 54.095s 0.668s 2 1.00x
🐘 Postgres Express 54.202s (~) 55.093s (~) 0.891s 2 1.01x
🐘 Postgres Next.js (Turbopack) 54.212s 55.106s 0.895s 2 1.01x
🐘 Postgres Nitro 54.613s (~) 55.110s (~) 0.497s 2 1.02x
💻 Local Next.js (Turbopack) 55.749s 56.102s 0.353s 2 1.04x
💻 Local Nitro 56.456s (+2.8%) 57.098s (+3.6%) 0.641s 2 1.06x
💻 Local Express 56.786s (~) 57.104s (~) 0.318s 2 1.06x
🌐 MongoDB Next.js (Turbopack) 60.850s 61.071s 0.220s 2 1.14x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 95.157s (~) 95.863s (-1.6%) 0.706s 1 1.00x
▲ Vercel Express 95.186s (~) 96.343s (-0.8%) 1.157s 1 1.00x
▲ Vercel Nitro 96.773s (-4.8%) 98.641s (-4.6%) 1.868s 1 1.02x

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

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.256s 2.012s 0.756s 15 1.00x
🐘 Postgres Express 1.266s (-0.7%) 2.011s (~) 0.745s 15 1.01x
🐘 Postgres Nitro 1.295s (~) 2.013s (~) 0.718s 15 1.03x
🌐 Redis Next.js (Turbopack) 1.303s 2.006s 0.703s 15 1.04x
💻 Local Nitro 1.496s (+1.5%) 2.005s (~) 0.509s 15 1.19x
💻 Local Express 1.513s (-0.7%) 2.005s (~) 0.493s 15 1.20x
💻 Local Next.js (Turbopack) 1.528s 2.006s 0.478s 15 1.22x
🌐 MongoDB Next.js (Turbopack) 2.193s 3.008s 0.815s 10 1.75x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.427s (-3.3%) 3.307s (-13.3% 🟢) 0.880s 10 1.00x
▲ Vercel Nitro 2.465s (-0.6%) 3.772s (-3.1%) 1.307s 8 1.02x
▲ Vercel Express 2.518s (+8.6% 🔺) 3.959s (+4.9%) 1.441s 8 1.04x

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

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.452s (~) 3.012s (~) 0.560s 10 1.00x
🐘 Postgres Nitro 2.498s (+1.2%) 3.014s (~) 0.516s 10 1.02x
🐘 Postgres Next.js (Turbopack) 2.502s 3.012s 0.510s 10 1.02x
🌐 Redis Next.js (Turbopack) 2.576s 3.008s 0.432s 10 1.05x
💻 Local Next.js (Turbopack) 2.684s 3.008s 0.324s 10 1.09x
💻 Local Nitro 2.898s (+13.0% 🔺) 3.207s (+6.7% 🔺) 0.309s 10 1.18x
💻 Local Express 2.916s (-4.2%) 3.452s (~) 0.536s 9 1.19x
🌐 MongoDB Next.js (Turbopack) 4.668s 5.177s 0.509s 6 1.90x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.641s (-3.0%) 3.969s (-2.8%) 1.328s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.963s (+6.9% 🔺) 4.014s (-1.4%) 1.051s 8 1.12x
▲ Vercel Express 5.859s (+107.5% 🔺) 7.271s (+66.6% 🔺) 1.412s 6 2.22x

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

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.576s (~) 4.013s (~) 0.437s 8 1.00x
🐘 Postgres Nitro 3.623s (+0.6%) 4.013s (~) 0.391s 8 1.01x
🐘 Postgres Next.js (Turbopack) 3.779s 4.016s 0.237s 8 1.06x
🌐 Redis Next.js (Turbopack) 4.156s 5.011s 0.855s 6 1.16x
💻 Local Next.js (Turbopack) 7.240s 7.768s 0.528s 4 2.02x
💻 Local Nitro 7.823s (+3.1%) 8.019s (-3.0%) 0.196s 4 2.19x
💻 Local Express 8.141s (-4.8%) 8.771s (-5.4% 🟢) 0.630s 4 2.28x
🌐 MongoDB Next.js (Turbopack) 9.903s 10.682s 0.779s 3 2.77x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.720s (+69.7% 🔺) 6.306s (+45.7% 🔺) 1.585s 5 1.00x
▲ Vercel Next.js (Turbopack) 4.914s (+22.6% 🔺) 6.670s (+26.9% 🔺) 1.756s 5 1.04x
▲ Vercel Nitro 8.647s (+178.7% 🔺) 10.366s (+139.8% 🔺) 1.719s 3 1.83x

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

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.255s 2.010s 0.756s 15 1.00x
🐘 Postgres Express 1.277s (+1.2%) 2.011s (~) 0.734s 15 1.02x
🐘 Postgres Nitro 1.280s (~) 2.012s (~) 0.732s 15 1.02x
🌐 Redis Next.js (Turbopack) 1.335s 2.006s 0.671s 15 1.06x
💻 Local Nitro 1.501s (~) 2.006s (~) 0.505s 15 1.20x
💻 Local Next.js (Turbopack) 1.503s 2.006s 0.503s 15 1.20x
💻 Local Express 1.538s (-1.2%) 2.006s (~) 0.467s 15 1.23x
🌐 MongoDB Next.js (Turbopack) 2.202s 3.008s 0.806s 10 1.76x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.285s (-30.5% 🟢) 3.865s (-18.0% 🟢) 1.580s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.388s (-26.1% 🟢) 3.438s (-28.0% 🟢) 1.051s 9 1.04x
▲ Vercel Nitro 2.436s (+5.6% 🔺) 4.795s (+27.4% 🔺) 2.359s 7 1.07x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.431s (-0.7%) 3.011s (~) 0.580s 10 1.00x
🐘 Postgres Nitro 2.451s (-1.1%) 3.012s (~) 0.561s 10 1.01x
🐘 Postgres Next.js (Turbopack) 2.454s 3.011s 0.557s 10 1.01x
🌐 Redis Next.js (Turbopack) 2.558s 3.008s 0.450s 10 1.05x
💻 Local Next.js (Turbopack) 2.825s 3.453s 0.628s 9 1.16x
💻 Local Nitro 3.014s (+14.0% 🔺) 3.760s (+25.1% 🔺) 0.746s 8 1.24x
💻 Local Express 3.078s (-7.1% 🟢) 3.884s (-6.1% 🟢) 0.806s 8 1.27x
🌐 MongoDB Next.js (Turbopack) 4.689s 5.177s 0.488s 6 1.93x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.242s (-14.4% 🟢) 3.719s (-8.5% 🟢) 1.477s 9 1.00x
▲ Vercel Next.js (Turbopack) 2.513s (-19.2% 🟢) 3.705s (-16.9% 🟢) 1.191s 9 1.12x
▲ Vercel Express 2.655s (-0.6%) 4.030s (+0.8%) 1.376s 8 1.18x

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

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.584s (-0.6%) 4.014s (~) 0.429s 8 1.00x
🐘 Postgres Nitro 3.605s (~) 4.015s (~) 0.410s 8 1.01x
🐘 Postgres Next.js (Turbopack) 3.769s 4.137s 0.368s 8 1.05x
🌐 Redis Next.js (Turbopack) 4.177s 5.011s 0.834s 6 1.17x
💻 Local Nitro 8.248s (+7.3% 🔺) 9.024s (+12.6% 🔺) 0.776s 4 2.30x
💻 Local Next.js (Turbopack) 8.565s 9.018s 0.453s 4 2.39x
💻 Local Express 8.892s (~) 9.273s (~) 0.381s 4 2.48x
🌐 MongoDB Next.js (Turbopack) 9.980s 10.681s 0.701s 3 2.78x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.909s (-7.7% 🟢) 4.146s (-14.0% 🟢) 1.237s 8 1.00x
▲ Vercel Nitro 2.937s (+1.1%) 4.377s (+4.4%) 1.440s 7 1.01x
▲ Vercel Next.js (Turbopack) 3.425s (-2.4%) 4.745s (-6.5% 🟢) 1.319s 7 1.18x

🔍 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
🌐 Redis 🥇 Next.js (Turbopack) 0.177s 1.000s 0.002s 1.007s 0.830s 10 1.00x
💻 Local Next.js (Turbopack) 0.192s 1.002s 0.011s 1.017s 0.825s 10 1.08x
💻 Local Nitro 0.199s (+44.1% 🔺) 1.003s (~) 0.011s (+16.8% 🔺) 1.017s (~) 0.818s 10 1.12x
💻 Local Express 0.206s (+1.4%) 1.003s (~) 0.012s (+4.3%) 1.018s (~) 0.812s 10 1.16x
🐘 Postgres Express 0.215s (+5.3% 🔺) 0.996s (~) 0.002s (-15.8% 🟢) 1.014s (~) 0.799s 10 1.21x
🐘 Postgres Next.js (Turbopack) 0.224s 1.001s 0.002s 1.012s 0.788s 10 1.26x
🐘 Postgres Nitro 0.228s (-2.8%) 0.995s (~) 0.001s (+7.7% 🔺) 1.013s (~) 0.785s 10 1.28x
🌐 MongoDB Next.js (Turbopack) 0.490s 0.962s 0.002s 1.009s 0.518s 10 2.76x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.644s (-1.5%) 2.704s (+11.6% 🔺) 0.010s (-97.6% 🟢) 3.299s (-3.6%) 1.655s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.652s (+2.2%) 2.704s (+11.4% 🔺) 0.005s (+35.1% 🔺) 3.126s (+4.0%) 1.474s 10 1.00x
▲ Vercel Express 1.655s (+4.6%) 2.721s (+10.5% 🔺) 0.007s (+22.4% 🔺) 3.331s (+10.1% 🔺) 1.676s 10 1.01x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Next.js (Turbopack) 8/12
🐘 Postgres Express 7/12
▲ Vercel Nitro 5/12
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 8/12
Next.js (Turbopack) 🐘 Postgres 5/12
Nitro 🐘 Postgres 6/12
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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant