Skip to content

[tarballs] Build workspace deps before packing#1908

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/fix-tarballs-build
May 4, 2026
Merged

[tarballs] Build workspace deps before packing#1908
VaguelySerious merged 1 commit into
mainfrom
peter/fix-tarballs-build

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

Summary

The tarballs Vercel project's vercel.json sets

"buildCommand": "pnpm --filter tarballs build"

which only runs the tarballs package's build script (node scripts/pack.ts) and does not trigger turbo's dependsOn: ["^build"] chain. As a result every preview tarball gets packed with an empty dist/ directory — only bin/, package.json, README.md, and docs/ make it in. Downstream installs then fail with errors like:

Cannot find module '/.../node_modules/workflow/dist/next.cjs'

The old docs-based pipeline did not hit this because Vercel detected docs as a Next.js framework, ran turbo for it (which fans out via ^build), and pack.ts was wired as a prebuild step that ran after workspace deps were already built. Splitting tarballs out of docs in #1893 dropped that side-effect.

The fix is one line: switch the build command to

"buildCommand": "pnpm turbo build --filter=tarballs"

so turbo evaluates the build task for tarballs, fans out via ^build to compile every workspace dependency first, and only then runs tarballs#build (pack.ts) against the populated dist/ directories.

Test plan

  • pnpm turbo build --filter=tarballs locally — output tarballs contain the full dist/ tree (verified package/dist/next.cjs is present in tarballs/public/workflow.tgz).
  • Preview deployment for this branch produces tarballs that resolve workflow/next correctly when installed in a downstream Next.js app.
  • CI checks pass.

🤖 Generated with Claude Code

The standalone tarballs project's vercel.json sets
"buildCommand": "pnpm --filter tarballs build", which only runs the
tarballs package's build script (node scripts/pack.ts) and does not
trigger turbo's `dependsOn: ["^build"]` chain. Every workspace package
gets packed with an empty dist/ directory, so downstream installs fail
with errors like "Cannot find module '<pkg>/dist/next.cjs'".

The previous docs-based pipeline didn't hit this because Vercel
detected docs as a Next.js framework, ran turbo for it, and pack.ts
was wired as a prebuild step that ran after deps were already built.

Switch the buildCommand to `pnpm turbo build --filter=tarballs` so
turbo evaluates the build task for tarballs, fans out via ^build to
compile every workspace dependency first, and only then runs
tarballs#build (pack.ts) against the populated dist/ directories.

Verified locally: a fresh build now produces tarballs containing the
full dist/ tree (including dist/next.cjs).

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

vercel Bot commented May 4, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment May 4, 2026 5:16am
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 4, 2026 5:16am
example-workflow Ready Ready Preview, Comment May 4, 2026 5:16am
workbench-astro-workflow Ready Ready Preview, Comment May 4, 2026 5:16am
workbench-express-workflow Ready Ready Preview, Comment May 4, 2026 5:16am
workbench-fastify-workflow Ready Ready Preview, Comment May 4, 2026 5:16am
workbench-hono-workflow Ready Ready Preview, Comment May 4, 2026 5:16am
workbench-nitro-workflow Ready Ready Preview, Comment May 4, 2026 5:16am
workbench-nuxt-workflow Ready Ready Preview, Comment May 4, 2026 5:16am
workbench-sveltekit-workflow Ready Ready Preview, Comment May 4, 2026 5:16am
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 4, 2026 5:16am
workbench-vite-workflow Ready Ready Preview, Comment May 4, 2026 5:16am
workflow-docs Ready Ready Preview, Comment, Open in v0 May 4, 2026 5:16am
workflow-swc-playground Ready Ready Preview, Comment May 4, 2026 5:16am
workflow-tarballs Ready Ready Preview, Comment May 4, 2026 5:16am
workflow-web Ready Ready Preview, Comment May 4, 2026 5:16am

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 4, 2026

🦋 Changeset detected

Latest commit: 881c6f9

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 552 0 36 588
Total 4931 0 361 5292

Details by Category

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

📋 View full workflow run

@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 🥇 Nitro 0.041s (-4.4%) 1.006s (~) 0.965s 10 1.00x
💻 Local Express 0.045s (+1.6%) 1.005s (~) 0.960s 10 1.09x
🐘 Postgres Nitro 0.058s (-38.8% 🟢) 1.010s (-3.2%) 0.952s 10 1.42x
🐘 Postgres Express 0.063s (+9.3% 🔺) 1.009s (~) 0.946s 10 1.54x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.265s (-35.4% 🟢) 2.640s (+5.2% 🔺) 2.375s 10 1.00x
▲ Vercel Express 0.292s (+24.0% 🔺) 2.562s (+20.0% 🔺) 2.270s 10 1.10x

🔍 Observability: Nitro | Express

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.129s (~) 2.006s (~) 0.877s 10 1.00x
💻 Local Express 1.139s (+1.2%) 2.006s (~) 0.867s 10 1.01x
🐘 Postgres Express 1.139s (-0.6%) 2.008s (~) 0.869s 10 1.01x
🐘 Postgres Nitro 1.143s (~) 2.010s (~) 0.866s 10 1.01x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.923s (-50.6% 🟢) 3.880s (-34.3% 🟢) 1.957s 10 1.00x
▲ Vercel Express 1.950s (+4.0%) 3.611s (-5.2% 🟢) 1.661s 10 1.01x

🔍 Observability: Nitro | Express

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 10.902s (-0.6%) 11.022s (~) 0.120s 3 1.00x
🐘 Postgres Nitro 10.924s (~) 11.023s (~) 0.099s 3 1.00x
💻 Local Nitro 10.938s (~) 11.024s (~) 0.086s 3 1.00x
💻 Local Express 10.971s (~) 11.358s (+3.0%) 0.388s 3 1.01x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 17.794s (-25.0% 🟢) 19.925s (-20.7% 🟢) 2.132s 2 1.00x
▲ Vercel Express 20.665s (+21.7% 🔺) 22.483s (+12.3% 🔺) 1.818s 2 1.16x

🔍 Observability: Nitro | Express

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 14.543s (~) 15.023s (~) 0.480s 4 1.00x
🐘 Postgres Nitro 14.614s (~) 15.022s (~) 0.409s 4 1.00x
💻 Local Nitro 15.052s (~) 15.780s (-1.6%) 0.728s 4 1.04x
💻 Local Express 15.053s (+0.5%) 15.781s (+5.0%) 0.728s 4 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 34.782s (-46.0% 🟢) 36.761s (-44.8% 🟢) 1.980s 2 1.00x
▲ Vercel Express 37.878s (-24.7% 🟢) 40.056s (-23.8% 🟢) 2.178s 2 1.09x

🔍 Observability: Nitro | Express

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 13.905s (-0.7%) 14.165s (-2.9%) 0.260s 7 1.00x
🐘 Postgres Nitro 14.197s (+1.6%) 15.024s (+5.0%) 0.828s 6 1.02x
💻 Local Nitro 16.877s (+0.6%) 17.198s (+1.0%) 0.321s 6 1.21x
💻 Local Express 16.948s (+2.1%) 17.030s (~) 0.082s 6 1.22x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 54.672s (-54.9% 🟢) 56.262s (-54.5% 🟢) 1.590s 2 1.00x
▲ Vercel Nitro 57.739s (-86.3% 🟢) 59.801s (-85.9% 🟢) 2.063s 2 1.06x

🔍 Observability: Express | Nitro

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.252s (-1.7%) 2.008s (~) 0.755s 15 1.00x
🐘 Postgres Express 1.267s (~) 2.009s (~) 0.743s 15 1.01x
💻 Local Express 1.511s (+1.5%) 2.005s (~) 0.494s 15 1.21x
💻 Local Nitro 1.530s (-6.2% 🟢) 2.006s (-3.3%) 0.476s 15 1.22x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.831s (-1.0%) 4.302s (-7.0% 🟢) 1.470s 7 1.00x
▲ Vercel Nitro 3.266s (+15.9% 🔺) 4.773s (+10.4% 🔺) 1.507s 7 1.15x

🔍 Observability: Express | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.331s (-1.3%) 3.009s (~) 0.678s 10 1.00x
🐘 Postgres Nitro 2.356s (~) 3.010s (~) 0.654s 10 1.01x
💻 Local Nitro 3.070s (-2.4%) 3.885s (~) 0.815s 8 1.32x
💻 Local Express 3.072s (+4.0%) 3.889s (+12.6% 🔺) 0.817s 8 1.32x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.526s (-30.2% 🟢) 4.140s (-19.0% 🟢) 1.614s 8 1.00x
▲ Vercel Nitro 3.790s (-6.5% 🟢) 5.260s (-11.2% 🟢) 1.470s 6 1.50x

🔍 Observability: Express | Nitro

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.473s (~) 4.008s (~) 0.535s 8 1.00x
🐘 Postgres Express 3.520s (+1.0%) 4.012s (~) 0.492s 8 1.01x
💻 Local Express 8.370s (~) 9.022s (~) 0.652s 4 2.41x
💻 Local Nitro 8.495s (+1.7%) 9.026s (~) 0.531s 4 2.45x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.833s (-19.6% 🟢) 4.761s (-14.0% 🟢) 1.928s 7 1.00x
▲ Vercel Express 3.479s (-18.0% 🟢) 5.061s (-17.4% 🟢) 1.583s 6 1.23x

🔍 Observability: Nitro | Express

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.258s (~) 2.010s (~) 0.751s 15 1.00x
🐘 Postgres Express 1.281s (+1.9%) 2.008s (~) 0.727s 15 1.02x
💻 Local Express 1.548s (-18.3% 🟢) 2.007s (-15.1% 🟢) 0.459s 15 1.23x
💻 Local Nitro 1.569s (-15.9% 🟢) 2.007s (-14.3% 🟢) 0.437s 15 1.25x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.983s (-23.2% 🟢) 3.597s (-17.3% 🟢) 1.614s 9 1.00x
▲ Vercel Nitro 2.025s (-17.7% 🟢) 3.788s (-9.2% 🟢) 1.763s 8 1.02x

🔍 Observability: Express | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.327s (-0.5%) 3.009s (~) 0.682s 10 1.00x
🐘 Postgres Express 2.331s (~) 3.010s (~) 0.679s 10 1.00x
💻 Local Nitro 3.050s (~) 3.885s (~) 0.835s 8 1.31x
💻 Local Express 3.241s (+3.5%) 3.884s (+3.2%) 0.643s 8 1.39x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.370s (-26.7% 🟢) 4.172s (-17.8% 🟢) 1.801s 8 1.00x
▲ Vercel Express 2.377s (-25.6% 🟢) 3.815s (-20.4% 🟢) 1.439s 8 1.00x

🔍 Observability: Nitro | Express

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.466s (-0.9%) 4.011s (~) 0.545s 8 1.00x
🐘 Postgres Nitro 3.470s (~) 4.011s (~) 0.541s 8 1.00x
💻 Local Nitro 9.426s (+3.1%) 9.772s (-2.5%) 0.346s 4 2.72x
💻 Local Express 9.546s (+8.5% 🔺) 10.021s (+8.1% 🔺) 0.475s 3 2.75x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.719s (-57.6% 🟢) 4.485s (-45.2% 🟢) 1.766s 7 1.00x
▲ Vercel Nitro 2.729s (-46.4% 🟢) 4.372s (-35.9% 🟢) 1.643s 7 1.00x

🔍 Observability: Express | Nitro

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.828s (+0.9%) 1.006s (~) 0.179s 60 1.00x
🐘 Postgres Express 0.828s (-1.3%) 1.006s (-1.7%) 0.178s 60 1.00x
💻 Local Nitro 1.015s (+3.5%) 1.700s (+55.4% 🔺) 0.685s 36 1.23x
💻 Local Express 1.139s (+15.7% 🔺) 1.584s (+47.3% 🔺) 0.446s 38 1.38x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 9.922s (-55.0% 🟢) 11.725s (-51.2% 🟢) 1.803s 6 1.00x
▲ Vercel Express 10.164s (-46.6% 🟢) 11.834s (-44.5% 🟢) 1.671s 6 1.02x

🔍 Observability: Nitro | Express

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.966s (-0.5%) 2.227s (-1.4%) 0.261s 41 1.00x
🐘 Postgres Nitro 1.999s (+3.7%) 2.494s (+18.7% 🔺) 0.495s 37 1.02x
💻 Local Nitro 3.118s (+2.7%) 4.010s (+6.7% 🔺) 0.892s 23 1.59x
💻 Local Express 3.120s (+3.4%) 3.966s (+10.6% 🔺) 0.846s 23 1.59x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 28.179s (-28.6% 🟢) 30.159s (-27.0% 🟢) 1.980s 3 1.00x
▲ Vercel Express 29.648s (-14.1% 🟢) 31.610s (-14.1% 🟢) 1.962s 3 1.05x

🔍 Observability: Nitro | Express

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 4.042s (-1.5%) 4.566s (-0.8%) 0.524s 27 1.00x
🐘 Postgres Express 4.045s (+1.4%) 4.703s (+7.6% 🔺) 0.658s 26 1.00x
💻 Local Express 9.340s (+1.4%) 10.019s (~) 0.678s 12 2.31x
💻 Local Nitro 9.427s (+1.4%) 10.019s (~) 0.592s 12 2.33x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 85.866s (-34.0% 🟢) 88.100s (-33.3% 🟢) 2.234s 2 1.00x
▲ Vercel Nitro 86.845s (-10.4% 🟢) 88.977s (-9.6% 🟢) 2.132s 2 1.01x

🔍 Observability: Express | Nitro

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.275s (-3.0%) 1.007s (~) 0.732s 60 1.00x
🐘 Postgres Express 0.283s (~) 1.007s (~) 0.724s 60 1.03x
💻 Local Express 0.611s (+9.0% 🔺) 1.005s (~) 0.394s 60 2.22x
💻 Local Nitro 0.643s (+6.4% 🔺) 1.005s (-1.6%) 0.362s 60 2.34x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.416s (-14.8% 🟢) 3.025s (-9.7% 🟢) 1.610s 20 1.00x
▲ Vercel Express 1.589s (-18.7% 🟢) 3.252s (-10.6% 🟢) 1.664s 19 1.12x

🔍 Observability: Nitro | Express

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.484s (-2.6%) 1.007s (~) 0.523s 90 1.00x
🐘 Postgres Express 0.491s (-3.8%) 1.006s (~) 0.516s 90 1.01x
💻 Local Express 2.545s (+1.3%) 3.009s (~) 0.464s 30 5.26x
💻 Local Nitro 2.600s (+2.4%) 3.009s (~) 0.409s 30 5.38x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.744s (-14.9% 🟢) 4.352s (-9.7% 🟢) 1.608s 21 1.00x
▲ Vercel Express 3.035s (~) 4.735s (-1.5%) 1.700s 20 1.11x

🔍 Observability: Nitro | Express

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.790s (~) 1.007s (~) 0.217s 120 1.00x
🐘 Postgres Express 0.814s (-0.6%) 1.009s (-0.8%) 0.196s 119 1.03x
💻 Local Express 11.272s (+0.7%) 11.937s (~) 0.665s 11 14.26x
💻 Local Nitro 11.480s (+2.6%) 12.028s (+3.1%) 0.548s 10 14.52x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 6.569s (-11.5% 🟢) 8.049s (-12.9% 🟢) 1.481s 15 1.00x
▲ Vercel Nitro 6.888s (-10.8% 🟢) 8.727s (-7.2% 🟢) 1.839s 14 1.05x

🔍 Observability: Express | Nitro

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.204s (-0.7%) 1.002s (~) 0.001s (-6.7% 🟢) 1.010s (~) 0.806s 10 1.00x
💻 Local Nitro 0.207s (-3.1%) 1.004s (~) 0.012s (-4.0%) 1.019s (~) 0.812s 10 1.02x
💻 Local Express 0.209s (+5.0% 🔺) 1.004s (~) 0.012s (+0.8%) 1.019s (~) 0.809s 10 1.03x
🐘 Postgres Express 0.211s (+3.0%) 0.993s (-0.6%) 0.002s (-6.3% 🟢) 1.009s (~) 0.798s 10 1.04x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.468s (-61.7% 🟢) 2.820s (-46.6% 🟢) 1.891s (+154.8% 🔺) 5.170s (-20.3% 🟢) 3.703s 10 1.00x
▲ Vercel Express 1.540s (-38.5% 🟢) 3.100s (-24.2% 🟢) 1.519s (+58.1% 🔺) 5.100s (-8.8% 🟢) 3.560s 10 1.05x

🔍 Observability: Nitro | Express

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.606s (-2.8%) 1.004s (~) 0.004s (-3.7%) 1.022s (~) 0.415s 59 1.00x
🐘 Postgres Express 0.635s (+0.8%) 1.005s (~) 0.004s (+6.6% 🔺) 1.023s (~) 0.388s 59 1.05x
💻 Local Nitro 0.775s (-7.6% 🟢) 1.012s (~) 0.011s (+13.1% 🔺) 1.025s (-8.2% 🟢) 0.249s 59 1.28x
💻 Local Express 0.861s (+13.7% 🔺) 1.014s (-1.5%) 0.010s (+4.7%) 1.118s (+7.5% 🔺) 0.257s 54 1.42x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.106s (-36.9% 🟢) 5.531s (-31.0% 🟢) 0.226s (-44.7% 🟢) 6.155s (-30.3% 🟢) 2.049s 10 1.00x
▲ Vercel Nitro 4.401s (-85.1% 🟢) 6.039s (-80.4% 🟢) 0.233s (+108.0% 🔺) 6.716s (-78.9% 🟢) 2.315s 10 1.07x

🔍 Observability: Express | Nitro

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.922s (-4.8%) 1.104s (-11.5% 🟢) 0.000s (+77.8% 🔺) 1.132s (-10.0% 🟢) 0.210s 54 1.00x
🐘 Postgres Express 0.973s (+1.3%) 1.328s (+3.9%) 0.000s (-100.0% 🟢) 1.358s (+3.9%) 0.385s 45 1.06x
💻 Local Express 1.247s (+1.8%) 2.023s (~) 0.000s (+20.0% 🔺) 2.025s (~) 0.778s 30 1.35x
💻 Local Nitro 1.266s (+3.6%) 2.023s (~) 0.000s (+100.0% 🔺) 2.025s (~) 0.758s 30 1.37x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.102s (-17.1% 🟢) 4.665s (-8.6% 🟢) 0.000s (-54.2% 🟢) 5.097s (-7.8% 🟢) 1.995s 12 1.00x
▲ Vercel Nitro 3.496s (+14.6% 🔺) 5.240s (+19.3% 🔺) 0.000s (+18.2% 🔺) 5.691s (+18.3% 🔺) 2.194s 11 1.13x

🔍 Observability: Express | 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.726s (-3.6%) 2.067s (-3.5%) 0.000s (-100.0% 🟢) 2.094s (-3.7%) 0.367s 29 1.00x
🐘 Postgres Express 1.769s (~) 2.100s (-3.6%) 0.000s (+Infinity% 🔺) 2.114s (-3.8%) 0.345s 29 1.02x
💻 Local Express 2.971s (-14.3% 🟢) 3.422s (-15.2% 🟢) 0.000s (-65.3% 🟢) 3.424s (-15.2% 🟢) 0.453s 18 1.72x
💻 Local Nitro 3.021s (-10.8% 🟢) 3.533s (-12.4% 🟢) 0.000s (-16.7% 🟢) 3.536s (-12.4% 🟢) 0.515s 18 1.75x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.775s (+16.6% 🔺) 6.453s (+20.1% 🔺) 0.000s (-100.0% 🟢) 6.877s (+18.7% 🔺) 2.102s 9 1.00x
▲ Vercel Express 48.263s (+952.1% 🔺) 49.393s (+720.2% 🔺) 0.000s (+Infinity% 🔺) 49.959s (+673.7% 🔺) 1.696s 7 10.11x

🔍 Observability: Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

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

@VaguelySerious VaguelySerious marked this pull request as ready for review May 4, 2026 05:13
@VaguelySerious VaguelySerious enabled auto-merge (squash) May 4, 2026 05:19
@VaguelySerious VaguelySerious merged commit ff336a0 into main May 4, 2026
228 of 237 checks passed
@VaguelySerious VaguelySerious deleted the peter/fix-tarballs-build branch May 4, 2026 06:12
ziyak97 pushed a commit to ziyak97/workflow that referenced this pull request May 4, 2026
pranaygp added a commit that referenced this pull request May 4, 2026
…ovements

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

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

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

# Conflicts:
#	packages/core/src/runtime/step-handler.test.ts
#	packages/core/src/runtime/step-handler.ts
#	packages/core/src/runtime/suspension-handler.ts
#	packages/core/src/step.test.ts
#	packages/world-local/src/storage/events-storage.ts
#	packages/world-postgres/src/drizzle/migrations/meta/_journal.json
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants