Skip to content

cli: restore dynamic world loading for community backends#2806

Merged
karthikscale3 merged 3 commits into
mainfrom
karthik/cli-generic-world-backends
Jul 7, 2026
Merged

cli: restore dynamic world loading for community backends#2806
karthikscale3 merged 3 commits into
mainfrom
karthik/cli-generic-world-backends

Conversation

@karthikscale3

Copy link
Copy Markdown
Contributor

What changed

Follow-up to #2804, fixing the same class of #2752 regression on the CLI side.

Since #2752 moved world selection to static injection, setupCliWorld (packages/cli/src/lib/inspect/setup.ts) only constructs the vercel, local, and postgres worlds explicitly and throws for anything else:

Unsupported workflow backend for CLI world initialization: @workflow-worlds/turso

Before #2752, any non-vercel backend fell through to the dynamic createWorld() loader in @workflow/core/runtime, so community worlds (@workflow-worlds/turso, @workflow-worlds/mongodb, @workflow-worlds/redis, workflow-world-jazz, …) worked with workflow inspect / workflow web. The --backend flag help still advertises <your-package-name>, and @workflow/web ships an env allowlist for these worlds — they're a supported configuration.

Fix

Generalize the postgres-only dynamic path (createPostgresCliWorld) into createDynamicCliWorld(backendId): any backend other than vercel/local is resolved from the user's project directory via createRequire().resolve() and loaded through its createWorld() export — the same construction @workflow/web uses after #2804 — with clear errors when the package isn't installed or doesn't export createWorld().

The vercel, local, and postgres (@workflow/world-postgres resolves through the identical code it used before) paths are behaviorally unchanged.

Validation

  • tsc --noEmit on @workflow/cli — clean
  • biome check on the changed file — only the pre-existing setupCliWorld complexity warning, present on main
  • Smoke test against a fixture project: a fake @workflow-worlds/fakeworld package exporting createWorld() is resolved from the project's node_modules and constructed; a missing package produces Could not resolve workflow backend package …; a package without the export produces … does not export createWorld()

Follow-up

This helper is now line-for-line the shape of createWorldForBackend in @workflow/web (#2804). Once both land, extracting a shared resolver (e.g. into @workflow/utils, guarded for Node-only usage) would keep them from drifting.

🤖 Generated with Claude Code

Since #2752 moved world selection to static injection, setupCliWorld only
constructed the vercel, local, and postgres worlds explicitly and threw
'Unsupported workflow backend' for anything else — breaking community
worlds (e.g. @workflow-worlds/turso) that previously loaded through the
dynamic createWorld() in @workflow/core/runtime.

Generalize the postgres-only dynamic path: any backend other than
vercel/local is now resolved from the user's project directory and loaded
via its createWorld() export, matching @workflow/web's world construction
(#2804), with clear errors when the package is missing or does not export
createWorld().

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@karthikscale3 karthikscale3 requested review from a team and ijjk as code owners July 7, 2026 21:08
@changeset-bot

changeset-bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0a0cc4d

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

This PR includes changesets to release 16 packages
Name Type
@workflow/cli Patch
workflow Patch
@workflow/world-testing Patch
@workflow/core Patch
@workflow/builders Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/web Patch
@workflow/astro Patch
@workflow/nest Patch
@workflow/nuxt Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

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

@github-actions

github-actions Bot commented Jul 7, 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.048s (+3.7%) 1.006s (~) 0.957s 10 1.00x
💻 Local Express 0.049s (+9.8% 🔺) 1.006s (~) 0.957s 10 1.02x
💻 Local Next.js (Turbopack) 0.055s (+4.1%) 1.005s (~) 0.950s 10 1.15x
🐘 Postgres Nitro 0.072s (+10.4% 🔺) 1.012s (~) 0.940s 10 1.50x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.295s (+30.9% 🔺) 2.157s (+5.4% 🔺) 1.862s 10 1.00x
▲ Vercel Nitro 0.399s (+111.9% 🔺) 1.659s (-18.2% 🟢) 1.260s 10 1.35x
▲ Vercel Next.js (Turbopack) 0.900s (+270.3% 🔺) 2.665s (+12.0% 🔺) 1.765s 10 3.06x

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

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.083s (~) 2.007s (~) 0.923s 10 1.00x
💻 Local Nitro 1.086s (+0.8%) 2.006s (~) 0.920s 10 1.00x
💻 Local Next.js (Turbopack) 1.094s (~) 2.006s (~) 0.912s 10 1.01x
🐘 Postgres Nitro 1.099s (~) 2.010s (~) 0.911s 10 1.01x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.441s (+1.7%) 3.192s (+13.1% 🔺) 1.751s 10 1.00x
▲ Vercel Nitro 1.451s (+6.6% 🔺) 3.122s (+3.5%) 1.671s 10 1.01x
▲ Vercel Next.js (Turbopack) 2.442s (+4.1%) 3.896s (+8.5% 🔺) 1.454s 10 1.69x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 10.474s (~) 11.024s (~) 0.550s 3 1.00x
💻 Local Nitro 10.481s (~) 11.022s (~) 0.542s 3 1.00x
💻 Local Next.js (Turbopack) 10.484s (~) 11.024s (~) 0.539s 3 1.00x
🐘 Postgres Nitro 10.534s (~) 11.019s (~) 0.485s 3 1.01x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 11.796s (+0.9%) 13.703s (+7.9% 🔺) 1.907s 3 1.00x
▲ Vercel Express 11.934s (+2.2%) 13.378s (-4.1%) 1.445s 3 1.01x
▲ Vercel Next.js (Turbopack) 13.011s (+0.7%) 14.658s (+3.4%) 1.646s 3 1.10x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 13.589s (-0.8%) 14.019s (~) 0.430s 5 1.00x
💻 Local Next.js (Turbopack) 13.649s (~) 14.028s (~) 0.379s 5 1.00x
💻 Local Express 13.663s (~) 14.029s (~) 0.366s 5 1.01x
💻 Local Nitro 13.744s (~) 14.028s (~) 0.285s 5 1.01x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 16.829s (+4.0%) 18.459s (+5.9% 🔺) 1.630s 4 1.00x
▲ Vercel Express 16.990s (+1.9%) 18.547s (-2.1%) 1.556s 4 1.01x
▲ Vercel Next.js (Turbopack) 17.844s (-0.7%) 20.019s (+1.3%) 2.175s 3 1.06x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 12.133s (-1.6%) 13.017s (~) 0.884s 7 1.00x
💻 Local Nitro 12.312s (+0.7%) 13.026s (~) 0.714s 7 1.01x
💻 Local Next.js (Turbopack) 12.366s (+1.0%) 13.025s (~) 0.659s 7 1.02x
💻 Local Express 12.437s (+1.8%) 13.025s (~) 0.589s 7 1.03x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 18.079s (+4.5%) 19.607s (+2.2%) 1.528s 5 1.00x
▲ Vercel Nitro 18.392s (+7.7% 🔺) 20.496s (+9.2% 🔺) 2.104s 5 1.02x
▲ Vercel Next.js (Turbopack) 21.018s (+6.7% 🔺) 22.897s (+5.6% 🔺) 1.879s 4 1.16x

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

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.170s (-1.4%) 2.008s (~) 0.838s 15 1.00x
💻 Local Express 1.399s (-3.1%) 2.006s (~) 0.607s 15 1.20x
💻 Local Nitro 1.415s (+0.5%) 2.006s (~) 0.592s 15 1.21x
💻 Local Next.js (Turbopack) 1.476s (+4.9%) 2.073s (+3.3%) 0.597s 15 1.26x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.068s (-9.6% 🟢) 4.062s (+12.7% 🔺) 1.994s 8 1.00x
▲ Vercel Express 2.162s (-4.9%) 3.478s (-10.9% 🟢) 1.315s 9 1.05x
▲ Vercel Next.js (Turbopack) 3.710s (+26.3% 🔺) 5.391s (+16.2% 🔺) 1.681s 6 1.79x

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

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.418s (+1.4%) 2.393s (-3.2%) 0.974s 13 1.00x
💻 Local Express 2.326s (-12.4% 🟢) 3.009s (-3.2%) 0.683s 10 1.64x
💻 Local Next.js (Turbopack) 2.390s (-3.9%) 3.008s (-3.2%) 0.618s 10 1.68x
💻 Local Nitro 2.536s (+9.3% 🔺) 3.009s (~) 0.473s 10 1.79x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.589s (+2.4%) 4.090s (+14.9% 🔺) 1.502s 8 1.00x
▲ Vercel Express 2.724s (+4.5%) 4.070s (-1.2%) 1.347s 8 1.05x
▲ Vercel Next.js (Turbopack) 3.946s (+18.5% 🔺) 5.806s (+18.3% 🔺) 1.861s 6 1.52x

🔍 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.625s (~) 4.013s (-3.0%) 2.389s 8 1.00x
💻 Local Nitro 4.234s (-1.4%) 5.014s (+2.9%) 0.780s 6 2.61x
💻 Local Express 4.504s (+2.0%) 5.012s (-3.2%) 0.507s 6 2.77x
💻 Local Next.js (Turbopack) 4.844s (+3.1%) 5.347s (-3.0%) 0.503s 6 2.98x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.843s (~) 4.589s (+1.8%) 1.746s 7 1.00x
▲ Vercel Express 3.383s (+15.9% 🔺) 5.036s (+14.6% 🔺) 1.652s 6 1.19x
▲ Vercel Next.js (Turbopack) 4.814s (+21.8% 🔺) 6.673s (+15.6% 🔺) 1.859s 5 1.69x

🔍 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.188s (-0.7%) 2.006s (~) 0.818s 15 1.00x
💻 Local Express 1.390s (-4.3%) 2.006s (~) 0.617s 15 1.17x
💻 Local Next.js (Turbopack) 1.450s (-3.4%) 2.007s (~) 0.557s 15 1.22x
💻 Local Nitro 1.465s (+3.6%) 2.007s (~) 0.542s 15 1.23x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.068s (+8.9% 🔺) 3.855s (+15.2% 🔺) 1.787s 8 1.00x
▲ Vercel Express 2.070s (+7.1% 🔺) 3.401s (-6.9% 🟢) 1.332s 9 1.00x
▲ Vercel Next.js (Turbopack) 4.029s (+35.5% 🔺) 5.736s (+21.9% 🔺) 1.706s 6 1.95x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.354s (+2.6%) 2.223s (+10.7% 🔺) 0.870s 14 1.00x
💻 Local Next.js (Turbopack) 2.479s (-11.8% 🟢) 3.009s (-10.0% 🟢) 0.530s 10 1.83x
💻 Local Express 2.490s (~) 3.009s (~) 0.519s 10 1.84x
💻 Local Nitro 2.728s (+11.7% 🔺) 3.109s (+3.3%) 0.381s 10 2.01x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.256s (+2.7%) 3.811s (+8.7% 🔺) 1.555s 8 1.00x
▲ Vercel Express 2.493s (-19.6% 🟢) 3.793s (-17.1% 🟢) 1.300s 8 1.11x
▲ Vercel Next.js (Turbopack) 3.703s (+17.4% 🔺) 5.347s (+17.8% 🔺) 1.644s 6 1.64x

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

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.786s (+9.2% 🔺) 4.439s (+3.2%) 2.653s 7 1.00x
💻 Local Next.js (Turbopack) 3.790s (-29.9% 🟢) 5.682s (-5.5% 🟢) 1.892s 6 2.12x
💻 Local Express 5.057s (+41.8% 🔺) 5.846s (+16.6% 🔺) 0.789s 6 2.83x
💻 Local Nitro 5.794s (+4.9%) 6.215s (+3.3%) 0.421s 5 3.24x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.085s (+21.1% 🔺) 5.219s (+37.1% 🔺) 2.134s 6 1.00x
▲ Vercel Express 3.547s (+33.2% 🔺) 5.230s (+17.9% 🔺) 1.683s 6 1.15x
▲ Vercel Next.js (Turbopack) 4.214s (-6.6% 🟢) 6.033s (-1.8%) 1.819s 5 1.37x

🔍 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 🥇 Nitro 0.528s (-12.2% 🟢) 1.006s (-1.7%) 0.477s 60 1.00x
💻 Local Express 0.586s (-3.2%) 1.005s (~) 0.419s 60 1.11x
💻 Local Nitro 0.605s (+3.6%) 1.005s (~) 0.399s 60 1.15x
💻 Local Next.js (Turbopack) 0.641s (+7.1% 🔺) 1.022s (+1.7%) 0.381s 59 1.21x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.608s (+4.8%) 4.017s (+1.2%) 1.409s 15 1.00x
▲ Vercel Nitro 2.768s (+6.2% 🔺) 4.378s (+9.1% 🔺) 1.610s 14 1.06x
▲ Vercel Next.js (Turbopack) 3.650s (-9.9% 🟢) 5.554s (-1.9%) 1.904s 11 1.40x

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

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.258s (-9.8% 🟢) 2.030s (~) 0.772s 45 1.00x
💻 Local Express 1.491s (~) 2.006s (~) 0.515s 45 1.19x
💻 Local Nitro 1.521s (+5.1% 🔺) 2.006s (~) 0.486s 45 1.21x
💻 Local Next.js (Turbopack) 1.573s (~) 2.006s (~) 0.434s 45 1.25x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 6.204s (+6.5% 🔺) 7.705s (+3.0%) 1.501s 12 1.00x
▲ Vercel Nitro 6.798s (+16.4% 🔺) 8.333s (+12.9% 🔺) 1.535s 11 1.10x
▲ Vercel Next.js (Turbopack) 8.792s (+6.6% 🔺) 10.758s (+12.2% 🔺) 1.965s 9 1.42x

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

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.565s (-9.9% 🟢) 3.112s (-3.4%) 0.546s 39 1.00x
💻 Local Express 3.219s (-3.4%) 4.009s (~) 0.790s 30 1.25x
💻 Local Nitro 3.305s (+4.0%) 4.009s (+1.6%) 0.704s 30 1.29x
💻 Local Next.js (Turbopack) 3.418s (~) 4.009s (~) 0.591s 30 1.33x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 12.018s (+4.6%) 13.798s (+6.7% 🔺) 1.779s 9 1.00x
▲ Vercel Express 12.133s (+3.8%) 13.555s (-2.0%) 1.423s 9 1.01x
▲ Vercel Next.js (Turbopack) 17.751s (+3.6%) 19.668s (+5.1% 🔺) 1.917s 7 1.48x

🔍 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.216s (-2.4%) 1.006s (~) 0.791s 60 1.00x
💻 Local Express 0.513s (-0.7%) 1.005s (~) 0.492s 60 2.38x
💻 Local Nitro 0.534s (+4.2%) 1.022s (+1.7%) 0.488s 59 2.47x
💻 Local Next.js (Turbopack) 0.637s (-0.9%) 1.022s (~) 0.385s 59 2.95x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.080s (-1.5%) 2.609s (+8.7% 🔺) 1.529s 23 1.00x
▲ Vercel Express 1.138s (+1.1%) 2.346s (-10.7% 🟢) 1.208s 26 1.05x
▲ Vercel Next.js (Turbopack) 2.431s (+24.1% 🔺) 4.107s (+22.3% 🔺) 1.676s 15 2.25x

🔍 Observability: Nitro | Express | 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.333s (-5.0%) 1.017s (+1.1%) 0.685s 89 1.00x
💻 Local Nitro 2.451s (-3.0%) 3.009s (~) 0.558s 30 7.37x
💻 Local Express 2.483s (-1.9%) 3.010s (-1.1%) 0.526s 30 7.46x
💻 Local Next.js (Turbopack) 2.563s (-6.7% 🟢) 3.008s (-4.4%) 0.446s 30 7.70x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.414s (-0.8%) 2.716s (-11.0% 🟢) 1.302s 34 1.00x
▲ Vercel Nitro 1.485s (+12.2% 🔺) 2.965s (+19.1% 🔺) 1.481s 31 1.05x
▲ Vercel Next.js (Turbopack) 2.738s (+5.7% 🔺) 4.538s (+11.8% 🔺) 1.800s 20 1.94x

🔍 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.539s (-6.0% 🟢) 1.097s (+1.8%) 0.558s 110 1.00x
💻 Local Express 5.583s (-6.6% 🟢) 8.426s (-0.7%) 2.843s 15 10.36x
💻 Local Nitro 5.668s (-3.1%) 8.090s (-6.9% 🟢) 2.421s 15 10.52x
💻 Local Next.js (Turbopack) 6.055s (-5.8% 🟢) 8.814s (-4.6%) 2.759s 14 11.24x
🐘 Postgres Express ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.761s (+5.7% 🔺) 3.777s (+6.7% 🔺) 2.016s 32 1.00x
▲ Vercel Express 1.937s (+20.7% 🔺) 3.551s (-2.4%) 1.613s 34 1.10x
▲ Vercel Next.js (Turbopack) 4.091s (-2.6%) 6.049s (+5.6% 🔺) 1.958s 20 2.32x

🔍 Observability: Nitro | Express | 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 🥇 Next.js (Turbopack) 1.143s (~) 1.966s (~) 0.012s (+16.5% 🔺) 2.020s (~) 0.877s 10 1.00x
🐘 Postgres Nitro 1.146s (-1.4%) 2.000s (~) 0.001s (~) 2.010s (~) 0.864s 10 1.00x
💻 Local Express 1.159s (~) 2.004s (~) 0.012s (+7.0% 🔺) 2.019s (~) 0.860s 10 1.01x
💻 Local Nitro 1.169s (+1.2%) 2.004s (~) 0.012s (+16.2% 🔺) 2.020s (~) 0.851s 10 1.02x
🐘 Postgres Express ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.985s (+4.1%) 3.879s (+31.0% 🔺) 5.374s (+192.2% 🔺) 9.873s (+89.1% 🔺) 7.888s 10 1.00x
▲ Vercel Express 2.066s (+9.3% 🔺) 3.591s (+10.9% 🔺) 5.322s (+224.9% 🔺) 9.327s (+74.5% 🔺) 7.261s 10 1.04x
▲ Vercel Next.js (Turbopack) 3.465s (+8.8% 🔺) 4.780s (+36.6% 🔺) 5.354s (+267.7% 🔺) 11.157s (+73.3% 🔺) 7.691s 10 1.75x

🔍 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
🐘 Postgres 🥇 Nitro 1.534s (-5.9% 🟢) 2.008s (~) 0.005s (-1.3%) 2.030s (~) 0.496s 30 1.00x
💻 Local Nitro 1.573s (-0.6%) 2.011s (-1.4%) 0.012s (-8.2% 🟢) 2.027s (-1.5%) 0.455s 30 1.03x
💻 Local Express 1.573s (~) 2.010s (~) 0.013s (+13.2% 🔺) 2.026s (~) 0.453s 30 1.03x
💻 Local Next.js (Turbopack) 1.600s (~) 1.968s (~) 0.014s (+10.6% 🔺) 2.027s (~) 0.427s 30 1.04x
🐘 Postgres Express ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.435s (-4.5%) 7.415s (+12.5% 🔺) 0.147s (-37.1% 🟢) 8.036s (+8.4% 🔺) 2.601s 8 1.00x
▲ Vercel Express 5.687s (+4.8%) 6.935s (-1.7%) 0.678s (+204.3% 🔺) 8.051s (+3.5%) 2.364s 8 1.05x
▲ Vercel Next.js (Turbopack) 9.644s (+1.4%) 11.332s (+7.5% 🔺) 0.215s (-1.7%) 12.096s (+4.7%) 2.452s 5 1.77x

🔍 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.778s (-8.2% 🟢) 1.064s (-5.2% 🟢) 0.000s (+89.3% 🔺) 1.079s (-5.5% 🟢) 0.301s 56 1.00x
💻 Local Next.js (Turbopack) 1.300s (-7.2% 🟢) 1.976s (~) 0.000s (-57.9% 🟢) 2.016s (~) 0.715s 30 1.67x
💻 Local Nitro 1.346s (~) 1.982s (+1.7%) 0.001s (+183.3% 🔺) 1.984s (+1.7%) 0.639s 31 1.73x
💻 Local Express 1.350s (~) 1.950s (+1.6%) 0.000s (+67.7% 🔺) 1.953s (+1.6%) 0.603s 31 1.73x
🐘 Postgres Express ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.008s (-42.4% 🟢) 4.355s (-34.2% 🟢) 0.000s (-76.9% 🟢) 4.758s (-33.4% 🟢) 1.749s 13 1.00x
▲ Vercel Nitro 3.093s (-24.7% 🟢) 4.668s (-11.1% 🟢) 0.000s (+Infinity% 🔺) 5.122s (-10.5% 🟢) 2.030s 12 1.03x
▲ Vercel Next.js (Turbopack) 4.968s (+10.4% 🔺) 6.268s (+16.0% 🔺) 0.000s (NaN%) 7.270s (+17.8% 🔺) 2.302s 9 1.65x

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

fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.712s (-3.9%) 2.255s (-6.7% 🟢) 0.000s (NaN%) 2.278s (-6.3% 🟢) 0.567s 27 1.00x
💻 Local Nitro 3.180s (-1.9%) 3.777s (-3.2%) 0.001s (-10.0% 🟢) 3.780s (-3.2%) 0.600s 16 1.86x
💻 Local Next.js (Turbopack) 3.266s (-5.6% 🟢) 3.925s (-1.7%) 0.001s (-44.9% 🟢) 3.966s (-1.6%) 0.700s 16 1.91x
💻 Local Express 3.414s (+2.8%) 4.027s (+3.1%) 0.001s (+326.7% 🔺) 4.030s (+3.2%) 0.617s 15 1.99x
🐘 Postgres Express ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.569s (+1.8%) 5.815s (+2.1%) 0.000s (NaN%) 6.220s (+0.9%) 1.651s 10 1.00x
▲ Vercel Nitro 4.599s (+5.7% 🔺) 6.043s (+15.1% 🔺) 0.001s (+Infinity% 🔺) 6.514s (+15.0% 🔺) 1.914s 10 1.01x
▲ Vercel Next.js (Turbopack) 7.584s (+3.0%) 8.287s (+6.2% 🔺) 0.000s (NaN%) 9.393s (+5.0% 🔺) 1.810s 7 1.66x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 💻 Local 17/21
Next.js (Turbopack) 💻 Local 19/21
Nitro 🐘 Postgres 18/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Redis + BullMQ: Community world (local development)
  • 🌐 Cloudflare: Community world (local development)
  • 🌐 MySQL: Community world (local development)
  • 🌐 Azure: Community world (local development)
  • 🌐 NATS JetStream: Community world (local development)
  • 🌐 Upstash: Community world (local development)
  • 🌐 Platformatic: Community world (local development)

📋 View full workflow run

@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1442 0 230 1672
✅ 💻 Local Development 1472 0 200 1672
✅ 📦 Local Production 1605 0 219 1824
✅ 🐘 Local Postgres 1605 0 219 1824
✅ 🪟 Windows 152 0 0 152
✅ 📋 Other 887 0 177 1064
Total 7163 0 1045 8208

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 125 0 27
✅ example 125 0 27
✅ express 125 0 27
✅ fastify 125 0 27
✅ hono 125 0 27
✅ nextjs-turbopack 149 0 3
✅ nextjs-webpack 149 0 3
✅ nitro 125 0 27
✅ nuxt 125 0 27
✅ sveltekit 144 0 8
✅ vite 125 0 27
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 127 0 25
✅ express-stable 127 0 25
✅ fastify-stable 127 0 25
✅ hono-stable 127 0 25
✅ nextjs-turbopack-canary 133 0 19
✅ nextjs-turbopack-stable 152 0 0
✅ nextjs-webpack-stable 152 0 0
✅ nitro-stable 127 0 25
✅ nuxt-stable 127 0 25
✅ sveltekit-stable 146 0 6
✅ vite-stable 127 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 127 0 25
✅ express-stable 127 0 25
✅ fastify-stable 127 0 25
✅ hono-stable 127 0 25
✅ nextjs-turbopack-canary 133 0 19
✅ nextjs-turbopack-stable 152 0 0
✅ nextjs-webpack-canary 133 0 19
✅ nextjs-webpack-stable 152 0 0
✅ nitro-stable 127 0 25
✅ nuxt-stable 127 0 25
✅ sveltekit-stable 146 0 6
✅ vite-stable 127 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 127 0 25
✅ express-stable 127 0 25
✅ fastify-stable 127 0 25
✅ hono-stable 127 0 25
✅ nextjs-turbopack-canary 133 0 19
✅ nextjs-turbopack-stable 152 0 0
✅ nextjs-webpack-canary 133 0 19
✅ nextjs-webpack-stable 152 0 0
✅ nitro-stable 127 0 25
✅ nuxt-stable 127 0 25
✅ sveltekit-stable 146 0 6
✅ vite-stable 127 0 25
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 152 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 127 0 25
✅ e2e-local-dev-tanstack-start- 127 0 25
✅ e2e-local-postgres-nest-stable 127 0 25
✅ e2e-local-postgres-tanstack-start- 127 0 25
✅ e2e-local-prod-nest-stable 127 0 25
✅ e2e-local-prod-tanstack-start- 127 0 25
✅ e2e-vercel-prod-tanstack-start 125 0 27

📋 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.

Review feedback on #2804: import() of a require-resolved CJS entry relies
on cjs-module-lexer to surface named exports; fall back to
mod.default.createWorld when detection fails.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@VaguelySerious VaguelySerious left a comment

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.

LGTM but

Comment thread .changeset/cli-generic-world-backends.md Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
karthikscale3 added a commit that referenced this pull request Jul 7, 2026
…#2804)

* web: construct worlds explicitly instead of via static-injection stub

Since #2752, createWorld() from @workflow/core/runtime is a stub that
throws unless a framework build plugin aliases it to a world package.
The CLI was migrated to construct worlds directly, but @workflow/web
still called the stub, so 'workflow web' crashed with 'Workflow target
world was not statically injected' for local and postgres backends
(the vercel path was unaffected since it constructs the world directly).

Mirror the CLI: import the local world statically and resolve any other
configured world package from the inspected project's directory.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* web: fall back to default.createWorld for CJS world packages

Review feedback: import() of a require-resolved CJS entry relies on
cjs-module-lexer to surface named exports; fall back to
mod.default.createWorld when detection fails. Mirrored in the CLI in #2806.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@karthikscale3 karthikscale3 merged commit 54f46f9 into main Jul 7, 2026
109 of 113 checks passed
@karthikscale3 karthikscale3 deleted the karthik/cli-generic-world-backends branch July 7, 2026 22:48
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

No backport to stable for 54f46f9 (AI decision).

This commit fixes a regression introduced by #2752 (static world injection), which is a main-only change. On stable, setupCliWorld still uses the pre-#2752 dynamic createWorld() loader with no createPostgresCliWorld helper or "Unsupported workflow backend" throw, so community backends already work there and the bug being fixed does not exist.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

54f46f976da8d8d5a646bceab60cfab7f0ae47e9

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