Skip to content

feat(next): add /_workflow web ui during dev#2111

Open
VaguelySerious wants to merge 1 commit into
mainfrom
peter/next-workflow-dashboard-route
Open

feat(next): add /_workflow web ui during dev#2111
VaguelySerious wants to merge 1 commit into
mainfrom
peter/next-workflow-dashboard-route

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

Adds a /_workflow redirect during next dev that boots the @workflow/web observability dashboard on a random port and redirects the browser to it.

Mirrors #2110 for the Next.js integration.

Test plan

  • pnpm build in packages/next succeeds
  • curl -i http://localhost:3000/_workflow from workbench/nextjs-turbopack returns 307 to http://localhost:<random-port>/
  • Dashboard root responds 200 with <title>Workflow Observability UI</title>

🤖 Generated with Claude Code

Adds a `/_workflow` redirect during `next dev` that boots the
`@workflow/web` observability dashboard on a random port and redirects
the browser to it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@VaguelySerious VaguelySerious requested review from a team and ijjk as code owners May 26, 2026 14:47
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 26, 2026

🦋 Changeset detected

Latest commit: cdfbc6e

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

This PR includes changesets to release 16 packages
Name Type
@workflow/next Minor
workflow Patch
@workflow/world-testing Patch
@workflow/core Patch
@workflow/builders Patch
@workflow/cli Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/web 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
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 2026

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 0.032s (-27.5% 🟢) 1.005s (~) 0.973s 10 1.00x
💻 Local Nitro 0.034s (-20.4% 🟢) 1.013s (+0.7%) 0.978s 10 1.07x
💻 Local Next.js (Turbopack) 0.051s 1.006s 0.955s 10 1.58x
🐘 Postgres Nitro 0.052s (-45.6% 🟢) 1.012s (-2.9%) 0.961s 10 1.61x
🐘 Postgres Express 0.053s (-9.1% 🟢) 1.012s (~) 0.959s 10 1.64x
🐘 Postgres Next.js (Turbopack) 0.059s 1.010s 0.952s 10 1.83x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.273s (-33.5% 🟢) 2.095s (-16.5% 🟢) 1.823s 10 1.00x
▲ Vercel Express 0.304s (+29.0% 🔺) 2.339s (+9.5% 🔺) 2.035s 10 1.11x
▲ Vercel Next.js (Turbopack) 0.414s (+64.5% 🔺) 2.263s (-3.0%) 1.850s 10 1.52x

🔍 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.060s (-6.3% 🟢) 2.005s (~) 0.946s 10 1.00x
💻 Local Express 1.073s (-4.6%) 2.006s (~) 0.933s 10 1.01x
🐘 Postgres Nitro 1.081s (-5.2% 🟢) 2.009s (~) 0.929s 10 1.02x
🐘 Postgres Express 1.086s (-5.3% 🟢) 2.008s (~) 0.922s 10 1.02x
💻 Local Next.js (Turbopack) 1.109s 2.006s 0.897s 10 1.05x
🐘 Postgres Next.js (Turbopack) 1.129s 2.009s 0.880s 10 1.07x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.558s (-60.0% 🟢) 3.420s (-42.1% 🟢) 1.863s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.601s (-21.3% 🟢) 3.610s (-5.8% 🟢) 2.009s 10 1.03x
▲ Vercel Express 1.632s (-13.0% 🟢) 3.486s (-8.4% 🟢) 1.854s 10 1.05x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.357s (-5.4% 🟢) 11.021s (~) 0.665s 3 1.00x
💻 Local Express 10.425s (-4.5%) 11.023s (~) 0.598s 3 1.01x
🐘 Postgres Nitro 10.432s (-4.0%) 11.017s (~) 0.585s 3 1.01x
🐘 Postgres Express 10.437s (-4.8%) 11.018s (~) 0.581s 3 1.01x
💻 Local Next.js (Turbopack) 10.652s 11.022s 0.370s 3 1.03x
🐘 Postgres Next.js (Turbopack) 10.721s 11.016s 0.295s 3 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.633s (-19.7% 🟢) 15.386s (-23.1% 🟢) 1.754s 2 1.00x
▲ Vercel Nitro 13.960s (-41.2% 🟢) 15.020s (-40.2% 🟢) 1.060s 2 1.02x
▲ Vercel Next.js (Turbopack) 15.831s (-8.6% 🟢) 17.890s (-7.8% 🟢) 2.059s 2 1.16x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 13.335s (-11.5% 🟢) 14.028s (-12.5% 🟢) 0.693s 5 1.00x
🐘 Postgres Nitro 13.457s (-7.8% 🟢) 14.017s (-6.7% 🟢) 0.560s 5 1.01x
💻 Local Express 13.496s (-9.8% 🟢) 14.028s (-6.7% 🟢) 0.532s 5 1.01x
🐘 Postgres Express 13.499s (-7.4% 🟢) 14.023s (-6.6% 🟢) 0.524s 5 1.01x
💻 Local Next.js (Turbopack) 14.043s 14.829s 0.786s 5 1.05x
🐘 Postgres Next.js (Turbopack) 14.181s 15.014s 0.833s 4 1.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 20.975s (-67.5% 🟢) 22.742s (-65.9% 🟢) 1.768s 3 1.00x
▲ Vercel Next.js (Turbopack) 22.553s (-57.1% 🟢) 24.688s (-54.8% 🟢) 2.134s 3 1.08x
▲ Vercel Express 22.652s (-55.0% 🟢) 24.524s (-53.3% 🟢) 1.872s 3 1.08x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 11.676s (-30.4% 🟢) 12.022s (-29.4% 🟢) 0.346s 8 1.00x
🐘 Postgres Nitro 11.934s (-14.6% 🟢) 12.269s (-14.3% 🟢) 0.335s 8 1.02x
🐘 Postgres Express 11.937s (-14.8% 🟢) 12.140s (-16.8% 🟢) 0.204s 8 1.02x
💻 Local Express 11.973s (-27.9% 🟢) 12.399s (-27.2% 🟢) 0.426s 8 1.03x
💻 Local Next.js (Turbopack) 13.012s 13.309s 0.298s 7 1.11x
🐘 Postgres Next.js (Turbopack) 13.223s 14.017s 0.793s 7 1.13x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 29.367s (-75.8% 🟢) 31.297s (-74.7% 🟢) 1.929s 3 1.00x
▲ Vercel Next.js (Turbopack) 31.493s (-92.0% 🟢) 33.479s (-91.5% 🟢) 1.986s 3 1.07x
▲ Vercel Nitro 33.290s (-92.1% 🟢) 34.889s (-91.8% 🟢) 1.599s 3 1.13x

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

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.143s (-29.9% 🟢) 2.005s (-3.3%) 0.862s 15 1.00x
🐘 Postgres Express 1.152s (-8.6% 🟢) 2.008s (~) 0.856s 15 1.01x
🐘 Postgres Nitro 1.157s (-9.2% 🟢) 2.007s (~) 0.850s 15 1.01x
💻 Local Express 1.173s (-21.2% 🟢) 2.007s (~) 0.834s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.192s 2.006s 0.814s 15 1.04x
💻 Local Next.js (Turbopack) 1.278s 2.006s 0.728s 15 1.12x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.812s (-17.2% 🟢) 4.642s (-5.9% 🟢) 1.830s 7 1.00x
▲ Vercel Nitro 3.061s (+8.6% 🔺) 4.632s (+7.2% 🔺) 1.572s 7 1.09x
▲ Vercel Express 3.229s (+12.9% 🔺) 5.144s (+11.3% 🔺) 1.915s 6 1.15x

🔍 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 🥇 Nitro 1.201s (-48.9% 🟢) 2.006s (-33.3% 🟢) 0.805s 15 1.00x
🐘 Postgres Express 1.206s (-48.9% 🟢) 2.006s (-33.3% 🟢) 0.801s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.346s 2.007s 0.661s 15 1.12x
💻 Local Nitro 1.597s (-49.2% 🟢) 2.005s (-48.4% 🟢) 0.408s 15 1.33x
💻 Local Next.js (Turbopack) 1.677s 2.006s 0.329s 15 1.40x
💻 Local Express 1.696s (-42.6% 🟢) 2.006s (-41.9% 🟢) 0.310s 15 1.41x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.356s (-17.2% 🟢) 4.852s (-18.0% 🟢) 1.497s 7 1.00x
▲ Vercel Express 3.560s (-1.6%) 5.148s (+0.7%) 1.588s 6 1.06x
▲ Vercel Next.js (Turbopack) 6.102s (-14.1% 🟢) 7.706s (-13.5% 🟢) 1.604s 4 1.82x

🔍 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.321s (-62.0% 🟢) 2.008s (-49.9% 🟢) 0.687s 15 1.00x
🐘 Postgres Express 1.321s (-62.1% 🟢) 2.008s (-49.9% 🟢) 0.687s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.593s 2.007s 0.414s 15 1.21x
💻 Local Nitro 3.840s (-54.0% 🟢) 4.438s (-50.8% 🟢) 0.599s 7 2.91x
💻 Local Next.js (Turbopack) 4.524s 5.155s 0.631s 7 3.42x
💻 Local Express 4.757s (-42.9% 🟢) 5.156s (-42.9% 🟢) 0.398s 7 3.60x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.215s (-30.3% 🟢) 8.063s (-26.4% 🟢) 1.848s 4 1.00x
▲ Vercel Express 6.350s (+49.8% 🔺) 7.891s (+28.8% 🔺) 1.541s 4 1.02x
▲ Vercel Nitro 6.366s (+80.6% 🔺) 8.038s (+45.3% 🔺) 1.672s 4 1.02x

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

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.150s (-8.5% 🟢) 2.009s (~) 0.859s 15 1.00x
🐘 Postgres Express 1.153s (-8.3% 🟢) 2.008s (~) 0.854s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.200s 2.008s 0.808s 15 1.04x
💻 Local Nitro 1.331s (-28.6% 🟢) 2.006s (-14.3% 🟢) 0.674s 15 1.16x
💻 Local Express 1.421s (-24.9% 🟢) 2.006s (-15.1% 🟢) 0.585s 15 1.24x
💻 Local Next.js (Turbopack) 1.700s 2.391s 0.692s 13 1.48x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.468s (-15.8% 🟢) 4.125s (-11.1% 🟢) 1.657s 8 1.00x
▲ Vercel Nitro 2.705s (+10.0% 🔺) 4.042s (-3.1%) 1.337s 8 1.10x
▲ Vercel Express 2.734s (+5.9% 🔺) 4.290s (-1.4%) 1.556s 7 1.11x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.196s (-48.9% 🟢) 2.008s (-33.3% 🟢) 0.812s 15 1.00x
🐘 Postgres Express 1.211s (-48.3% 🟢) 2.009s (-33.3% 🟢) 0.798s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.333s 2.007s 0.674s 15 1.11x
💻 Local Nitro 1.771s (-42.2% 🟢) 2.220s (-42.9% 🟢) 0.449s 14 1.48x
💻 Local Express 1.818s (-42.0% 🟢) 2.223s (-40.9% 🟢) 0.405s 14 1.52x
💻 Local Next.js (Turbopack) 2.000s 2.392s 0.392s 13 1.67x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.411s (+6.8% 🔺) 5.286s (+10.3% 🔺) 1.875s 6 1.00x
▲ Vercel Next.js (Turbopack) 3.471s (+10.5% 🔺) 5.247s (+16.0% 🔺) 1.776s 6 1.02x
▲ Vercel Nitro 3.798s (+17.5% 🔺) 5.378s (+5.9% 🔺) 1.580s 6 1.11x

🔍 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.316s (-62.2% 🟢) 2.009s (-49.9% 🟢) 0.693s 15 1.00x
🐘 Postgres Express 1.367s (-60.9% 🟢) 2.008s (-49.9% 🟢) 0.641s 15 1.04x
🐘 Postgres Next.js (Turbopack) 1.595s 2.009s 0.414s 15 1.21x
💻 Local Nitro 4.172s (-54.4% 🟢) 4.725s (-52.9% 🟢) 0.553s 7 3.17x
💻 Local Next.js (Turbopack) 4.705s 5.345s 0.640s 6 3.58x
💻 Local Express 5.741s (-34.8% 🟢) 6.214s (-33.0% 🟢) 0.473s 5 4.36x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.508s (-18.5% 🟢) 7.370s (-13.7% 🟢) 1.863s 5 1.00x
▲ Vercel Nitro 7.011s (+37.7% 🔺) 8.327s (+22.1% 🔺) 1.316s 4 1.27x
▲ Vercel Express 7.220s (+12.5% 🔺) 8.841s (+8.1% 🔺) 1.620s 4 1.31x

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

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.440s (-46.4% 🟢) 1.007s (~) 0.568s 60 1.00x
🐘 Postgres Express 0.454s (-45.9% 🟢) 1.007s (-1.6%) 0.553s 60 1.03x
💻 Local Express 0.473s (-51.9% 🟢) 1.004s (-6.7% 🟢) 0.531s 60 1.08x
💻 Local Nitro 0.528s (-46.2% 🟢) 1.004s (-8.2% 🟢) 0.476s 60 1.20x
🐘 Postgres Next.js (Turbopack) 0.672s 1.006s 0.334s 60 1.53x
💻 Local Next.js (Turbopack) 0.737s 1.004s 0.267s 60 1.68x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.173s (-76.5% 🟢) 6.724s (-72.0% 🟢) 1.550s 9 1.00x
▲ Vercel Next.js (Turbopack) 5.252s (-63.8% 🟢) 7.030s (-56.3% 🟢) 1.778s 9 1.02x
▲ Vercel Express 5.561s (-70.8% 🟢) 7.296s (-65.8% 🟢) 1.735s 9 1.07x

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

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.031s (-46.5% 🟢) 1.558s (-25.8% 🟢) 0.527s 58 1.00x
🐘 Postgres Express 1.137s (-42.5% 🟢) 1.964s (-13.0% 🟢) 0.826s 46 1.10x
💻 Local Express 1.248s (-58.6% 🟢) 2.006s (-44.1% 🟢) 0.757s 45 1.21x
💻 Local Nitro 1.351s (-55.5% 🟢) 1.984s (-47.2% 🟢) 0.632s 46 1.31x
🐘 Postgres Next.js (Turbopack) 1.598s 2.007s 0.409s 45 1.55x
💻 Local Next.js (Turbopack) 1.822s 2.028s 0.205s 45 1.77x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 12.653s (-68.0% 🟢) 14.422s (-65.1% 🟢) 1.769s 7 1.00x
▲ Vercel Express 13.780s (-60.1% 🟢) 15.985s (-56.6% 🟢) 2.205s 6 1.09x
▲ Vercel Next.js (Turbopack) 14.008s (-71.9% 🟢) 16.046s (-69.0% 🟢) 2.037s 6 1.11x

🔍 Observability: Nitro | Express | 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.072s (-49.5% 🟢) 2.477s (-46.2% 🟢) 0.405s 49 1.00x
🐘 Postgres Express 2.323s (-41.8% 🟢) 2.889s (-33.9% 🟢) 0.566s 42 1.12x
💻 Local Nitro 2.780s (-70.1% 🟢) 3.251s (-67.6% 🟢) 0.470s 37 1.34x
💻 Local Express 2.799s (-69.6% 🟢) 3.085s (-69.2% 🟢) 0.286s 39 1.35x
🐘 Postgres Next.js (Turbopack) 3.122s 4.009s 0.887s 30 1.51x
💻 Local Next.js (Turbopack) 3.862s 4.108s 0.246s 30 1.86x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 26.080s (-73.1% 🟢) 28.587s (-71.0% 🟢) 2.506s 5 1.00x
▲ Vercel Express 26.401s (-79.7% 🟢) 28.748s (-78.2% 🟢) 2.347s 5 1.01x
▲ Vercel Next.js (Turbopack) 28.192s (-73.7% 🟢) 30.409s (-72.1% 🟢) 2.216s 4 1.08x

🔍 Observability: Nitro | Express | 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.177s (-37.7% 🟢) 1.006s (~) 0.829s 60 1.00x
🐘 Postgres Express 0.189s (-32.9% 🟢) 1.006s (~) 0.816s 60 1.07x
🐘 Postgres Next.js (Turbopack) 0.223s 1.006s 0.783s 60 1.26x
💻 Local Nitro 0.371s (-38.7% 🟢) 1.004s (-1.7%) 0.633s 60 2.10x
💻 Local Express 0.408s (-27.2% 🟢) 1.004s (~) 0.597s 60 2.31x
💻 Local Next.js (Turbopack) 0.540s 1.004s 0.464s 60 3.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.165s (+10.8% 🔺) 3.900s (+7.2% 🔺) 1.736s 16 1.00x
▲ Vercel Next.js (Turbopack) 2.320s (+14.7% 🔺) 4.115s (+8.5% 🔺) 1.795s 15 1.07x
▲ Vercel Nitro 2.511s (+51.2% 🔺) 4.296s (+28.2% 🔺) 1.784s 16 1.16x

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

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.295s (-42.2% 🟢) 1.006s (~) 0.712s 90 1.00x
🐘 Postgres Nitro 0.302s (-39.1% 🟢) 1.006s (~) 0.704s 90 1.03x
🐘 Postgres Next.js (Turbopack) 0.427s 1.006s 0.579s 90 1.45x
💻 Local Nitro 1.921s (-24.3% 🟢) 2.316s (-23.0% 🟢) 0.395s 39 6.52x
💻 Local Express 2.158s (-14.1% 🟢) 2.767s (-8.0% 🟢) 0.609s 33 7.32x
💻 Local Next.js (Turbopack) 2.183s 2.945s 0.763s 31 7.41x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.100s (+67.4% 🔺) 7.006s (+45.7% 🔺) 1.906s 13 1.00x
▲ Vercel Next.js (Turbopack) 5.405s (+52.9% 🔺) 7.311s (+40.8% 🔺) 1.906s 13 1.06x
▲ Vercel Nitro 5.710s (+77.0% 🔺) 7.140s (+48.1% 🔺) 1.431s 13 1.12x

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

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.624s (-23.8% 🟢) 1.006s (-1.1%) 0.382s 120 1.00x
🐘 Postgres Nitro 0.636s (-19.5% 🟢) 1.007s (~) 0.371s 120 1.02x
🐘 Postgres Next.js (Turbopack) 0.879s 1.059s 0.180s 114 1.41x
💻 Local Nitro 9.006s (-19.5% 🟢) 9.411s (-19.3% 🟢) 0.405s 13 14.43x
💻 Local Express 10.137s (-9.4% 🟢) 10.781s (-9.7% 🟢) 0.644s 12 16.24x
💻 Local Next.js (Turbopack) 10.823s 11.303s 0.480s 11 17.34x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 14.111s (+90.2% 🔺) 15.859s (+71.6% 🔺) 1.747s 8 1.00x
▲ Vercel Nitro 15.799s (+104.6% 🔺) 17.663s (+87.9% 🔺) 1.864s 7 1.12x
▲ Vercel Next.js (Turbopack) 16.971s (+64.3% 🔺) 19.437s (+58.2% 🔺) 2.466s 7 1.20x

🔍 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.126s (+427.0% 🔺) 2.005s (+99.6% 🔺) 0.009s (-28.8% 🟢) 2.016s (+97.9% 🔺) 0.890s 10 1.00x
🐘 Postgres Nitro 1.139s (+455.5% 🔺) 2.001s (+100.2% 🔺) 0.001s (-26.7% 🟢) 2.010s (+98.7% 🔺) 0.871s 10 1.01x
💻 Local Express 1.147s (+476.0% 🔺) 2.005s (+99.6% 🔺) 0.011s (-12.4% 🟢) 2.018s (+98.2% 🔺) 0.871s 10 1.02x
🐘 Postgres Express 1.149s (+460.0% 🔺) 1.999s (+100.2% 🔺) 0.002s (-6.3% 🟢) 2.010s (+98.8% 🔺) 0.862s 10 1.02x
💻 Local Next.js (Turbopack) 1.177s 2.004s 0.010s 2.018s 0.840s 10 1.05x
🐘 Postgres Next.js (Turbopack) 1.194s 2.002s 0.001s 2.012s 0.818s 10 1.06x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.410s (-64.8% 🟢) 4.145s (-52.1% 🟢) 13.126s (+1977.2% 🔺) 17.774s (+81.6% 🔺) 15.364s 10 1.00x
▲ Vercel Express 2.477s (-1.1%) 3.666s (-10.4% 🟢) 2.090s (+117.6% 🔺) 6.208s (+11.0% 🔺) 3.731s 10 1.03x
▲ Vercel Nitro 2.974s (-22.4% 🟢) 4.026s (-23.7% 🟢) 2.060s (+177.6% 🔺) 6.483s (~) 3.509s 10 1.23x

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

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.472s (+75.6% 🔺) 2.010s (+98.6% 🔺) 0.009s (-4.0%) 2.021s (+81.1% 🔺) 0.548s 30 1.00x
🐘 Postgres Express 1.526s (+142.3% 🔺) 2.003s (+99.0% 🔺) 0.004s (+2.7%) 2.026s (+98.0% 🔺) 0.499s 30 1.04x
🐘 Postgres Nitro 1.538s (+146.4% 🔺) 2.003s (+99.0% 🔺) 0.004s (-4.1%) 2.031s (+98.6% 🔺) 0.493s 30 1.04x
💻 Local Express 1.542s (+103.6% 🔺) 2.013s (+95.6% 🔺) 0.010s (+8.4% 🔺) 2.025s (+94.8% 🔺) 0.484s 30 1.05x
🐘 Postgres Next.js (Turbopack) 1.663s 2.010s 0.004s 2.023s 0.361s 30 1.13x
💻 Local Next.js (Turbopack) 1.673s 2.010s 0.011s 2.024s 0.351s 30 1.14x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 6.048s (-79.5% 🟢) 7.020s (-77.2% 🟢) 0.215s (+92.1% 🔺) 7.684s (-75.8% 🟢) 1.635s 8 1.00x
▲ Vercel Express 6.205s (-4.6%) 7.594s (-5.2% 🟢) 0.252s (-38.3% 🟢) 8.318s (-5.8% 🟢) 2.113s 8 1.03x
▲ Vercel Next.js (Turbopack) 6.599s (-61.0% 🟢) 8.038s (-55.9% 🟢) 0.266s (+25.7% 🔺) 8.775s (-53.7% 🟢) 2.176s 7 1.09x

🔍 Observability: Nitro | Express | 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.668s (-31.0% 🟢) 1.030s (-17.4% 🟢) 0.000s (-100.0% 🟢) 1.050s (-16.5% 🟢) 0.382s 58 1.00x
🐘 Postgres Express 0.677s (-29.6% 🟢) 1.048s (-18.0% 🟢) 0.000s (+61.4% 🔺) 1.062s (-18.7% 🟢) 0.385s 57 1.01x
🐘 Postgres Next.js (Turbopack) 0.740s 1.054s 0.000s 1.061s 0.321s 57 1.11x
💻 Local Nitro 1.200s (-1.9%) 1.949s (-3.5%) 0.000s (-3.2%) 1.951s (-3.5%) 0.751s 31 1.80x
💻 Local Express 1.418s (+15.8% 🔺) 2.015s (~) 0.000s (-10.0% 🟢) 2.018s (~) 0.599s 30 2.12x
💻 Local Next.js (Turbopack) 1.466s 2.014s 0.000s 2.017s 0.551s 30 2.19x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.511s (-65.5% 🟢) 4.793s (-58.4% 🟢) 0.000s (+Infinity% 🔺) 5.254s (-56.4% 🟢) 1.743s 12 1.00x
▲ Vercel Express 3.737s (~) 5.237s (+2.6%) 0.000s (-100.0% 🟢) 5.748s (+3.9%) 2.010s 11 1.06x
▲ Vercel Nitro 3.863s (+26.6% 🔺) 4.866s (+10.8% 🔺) 0.000s (+8.3% 🔺) 5.270s (+9.6% 🔺) 1.407s 12 1.10x

🔍 Observability: Next.js (Turbopack) | 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 🥇 Express 1.263s (-28.7% 🟢) 2.030s (-6.8% 🟢) 0.000s (+Infinity% 🔺) 2.044s (-7.0% 🟢) 0.782s 30 1.00x
🐘 Postgres Nitro 1.291s (-27.9% 🟢) 1.996s (-6.8% 🟢) 0.000s (-6.7% 🟢) 2.009s (-7.6% 🟢) 0.718s 30 1.02x
🐘 Postgres Next.js (Turbopack) 1.537s 2.145s 0.000s 2.163s 0.626s 28 1.22x
💻 Local Nitro 2.712s (-19.9% 🟢) 3.177s (-21.2% 🟢) 0.001s (+12.5% 🔺) 3.180s (-21.2% 🟢) 0.469s 20 2.15x
💻 Local Next.js (Turbopack) 2.854s 3.360s 0.001s 3.369s 0.515s 18 2.26x
💻 Local Express 3.204s (-7.6% 🟢) 3.904s (-3.2%) 0.000s (-53.1% 🟢) 3.908s (-3.2%) 0.703s 16 2.54x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.529s (-1.6%) 7.214s (+3.3%) 0.000s (+100.0% 🔺) 7.685s (+1.9%) 2.156s 8 1.00x
▲ Vercel Nitro 5.684s (+38.8% 🔺) 6.718s (+25.0% 🔺) 0.000s (-100.0% 🟢) 7.140s (+23.2% 🔺) 1.457s 9 1.03x
▲ Vercel Express 5.959s (+29.9% 🔺) 7.576s (+25.8% 🔺) 0.000s (NaN%) 8.049s (+24.7% 🔺) 2.090s 8 1.08x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Nitro 18/21
🐘 Postgres Nitro 16/21
▲ Vercel Nitro 8/21
Fastest World by Framework

Winner determined by most benchmark wins

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

📋 View full workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 1221 1 219 1441
✅ 💻 Local Development 1615 0 219 1834
✅ 📦 Local Production 1615 0 219 1834
✅ 🐘 Local Postgres 1615 0 219 1834
✅ 🪟 Windows 131 0 0 131
✅ 📋 Other 741 0 176 917
Total 6938 1 1052 7991

❌ Failed Tests

▲ Vercel Production (1 failed)

nitro (1 failed):

  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step

Details by Category

❌ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 105 0 26
✅ example 105 0 26
✅ express 105 0 26
✅ fastify 105 0 26
✅ hono 105 0 26
✅ nextjs-turbopack 129 0 2
✅ nextjs-webpack 129 0 2
❌ nitro 104 1 26
✅ nuxt 105 0 26
✅ sveltekit 124 0 7
✅ vite 105 0 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 106 0 25
✅ express-stable 106 0 25
✅ fastify-stable 106 0 25
✅ hono-stable 106 0 25
✅ nextjs-turbopack-canary 112 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 131 0 0
✅ nextjs-webpack-canary 112 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 131 0 0
✅ nitro-stable 106 0 25
✅ nuxt-stable 106 0 25
✅ sveltekit-stable 125 0 6
✅ vite-stable 106 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 106 0 25
✅ express-stable 106 0 25
✅ fastify-stable 106 0 25
✅ hono-stable 106 0 25
✅ nextjs-turbopack-canary 112 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 131 0 0
✅ nextjs-webpack-canary 112 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 131 0 0
✅ nitro-stable 106 0 25
✅ nuxt-stable 106 0 25
✅ sveltekit-stable 125 0 6
✅ vite-stable 106 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 106 0 25
✅ express-stable 106 0 25
✅ fastify-stable 106 0 25
✅ hono-stable 106 0 25
✅ nextjs-turbopack-canary 112 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 131 0 0
✅ nextjs-webpack-canary 112 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 131 0 0
✅ nitro-stable 106 0 25
✅ nuxt-stable 106 0 25
✅ sveltekit-stable 125 0 6
✅ vite-stable 106 0 25
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 131 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 106 0 25
✅ e2e-local-dev-tanstack-start- 106 0 25
✅ e2e-local-postgres-nest-stable 106 0 25
✅ e2e-local-postgres-tanstack-start- 106 0 25
✅ e2e-local-prod-nest-stable 106 0 25
✅ e2e-local-prod-tanstack-start- 106 0 25
✅ e2e-vercel-prod-tanstack-start 105 0 26

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 26, 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 26, 2026 2:51pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 26, 2026 2:51pm
example-workflow Ready Ready Preview, Comment May 26, 2026 2:51pm
workbench-astro-workflow Ready Ready Preview, Comment May 26, 2026 2:51pm
workbench-express-workflow Ready Ready Preview, Comment May 26, 2026 2:51pm
workbench-fastify-workflow Ready Ready Preview, Comment May 26, 2026 2:51pm
workbench-hono-workflow Ready Ready Preview, Comment May 26, 2026 2:51pm
workbench-nitro-workflow Ready Ready Preview, Comment May 26, 2026 2:51pm
workbench-nuxt-workflow Ready Ready Preview, Comment May 26, 2026 2:51pm
workbench-sveltekit-workflow Ready Ready Preview, Comment May 26, 2026 2:51pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 26, 2026 2:51pm
workbench-vite-workflow Ready Ready Preview, Comment May 26, 2026 2:51pm
workflow-swc-playground Ready Ready Preview, Comment May 26, 2026 2:51pm
workflow-tarballs Ready Ready Preview, Comment May 26, 2026 2:51pm
workflow-web Ready Ready Preview, Comment May 26, 2026 2:51pm

}

if (phase === 'phase-development-server') {
const dashboardUrl = await ensureDashboardServer().catch(
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

next.config can be loaded multiple times so would be good to have an env check like the process.env.WORKFLOW_NEXT_PRIVATE_BUILT above to ensure we only start this server once.

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