Skip to content

Version Packages (beta) - #2495

Merged
pranaygp merged 1 commit into
mainfrom
changeset-release/main
Jun 19, 2026
Merged

Version Packages (beta)#2495
pranaygp merged 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

main is currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, run changeset pre exit on main.

⚠️⚠️⚠️⚠️⚠️⚠️

Releases

@workflow/builders@5.0.0-beta.20

Minor Changes

  • #252937312ed Thanks @pranaygp! - Default source maps to 'inline' in development and off in production builds (smaller function bundles); override with the sourcemap option or the WORKFLOW_SOURCEMAP environment variable in either environment.

Patch Changes

@workflow/core@5.0.0-beta.20

Minor Changes

  • #25257aee0d4 Thanks @TooTallNate! - Derive the workflow VM's deterministic RNG seed from runId:workflowName:deploymentId (instead of including the run's startedAt) and its initial fixed clock from the ULID timestamp embedded in runId. These inputs are all available the moment a queue message arrives, decoupling VM setup from the run_started round-trip. Note: this changes the seed-derived value sequence (step/hook correlation IDs, nanoids, random values) for a given run, so runs started before this change must not be replayed across the upgrade.

  • #251684ccd40 Thanks @VaguelySerious! - Inline execution now runs up to WORKFLOW_MAX_INLINE_STEPS (default 3) steps in parallel per suspension, each lazily created. An opt-in WORKFLOW_OPTIMISTIC_INLINE_START (default off) additionally starts step bodies before step_started is confirmed, reconciling the in-flight start before the terminal write so a lost create-claim is discarded; it is off by default because under contention a step body can run more than once (e.g. two runs writing to the workflow stream can corrupt it), so only enable it for idempotent steps.

Patch Changes

  • #247316b3670 Thanks @pranaygp! - Drain consecutively consumable replay events in a single synchronous pass instead of one process.nextTick per event, removing O(N) macrotask hops from replay.

  • #24752074f91 Thanks @pranaygp! - Skip the per-step incremental events.list round-trip in the inline sequential loop by consuming an event-log delta returned from the step's terminal write (gated to the single-step case with no open hooks or waits).

    Add the opt-in CreateEventParams.sinceCursor contract so a step-terminal events.create can return the event-log delta since that cursor (via EventResult.events/cursor/hasMore).

    Return the inline delta from a step-terminal write when sinceCursor is supplied, computed identically to events.list so the consumed prefix cannot skew from the server log.

    Forward sinceCursor over the v4 wire in @workflow/world-vercel so the server can return the delta on a step-terminal response; older servers ignore it and the runtime falls back to events.list.

  • #2478e7ef9d8 Thanks @pranaygp! - Lazy inline step start: the owned-inline runtime path now sends a single step_started carrying the step input, letting the world create the step on the fly and saving one round-trip per inline step.

    @workflow/world: step_started event data accepts an optional input, and EventResult gains a stepCreated ownership signal.

    @workflow/world-local: step_started with input atomically creates the step plus a synthetic step_created event; a lazy step_started for an already-existing step throws EntityConflictError so concurrent losers skip (exactly-once).

    @workflow/world-postgres: same lazy-create + exactly-once create-claim for the Postgres backend.

    @workflow/world-vercel: sends the step input on step_started over the v4 wire and threads the server's stepCreated signal into EventResult.

  • #2522722bb7c Thanks @VaguelySerious! - Cache the local dev server port per process so workflow replays no longer re-run OS port discovery (which spawns lsof on macOS, ~60ms) on every replay.

  • #2527de91f20 Thanks @karthikscale3! - Refine WORKFLOW_TRACE_MODE=linked (the default) so each queue-delivered workflow.execute / step.execute span nests under its local delivery context instead of starting a new trace root.

  • #2511ab2e9b8 Thanks @VaguelySerious! - Emit workflowName on per-step events (step_created, step_completed, and lazy-start step_started) so Worlds can access it without additional queries

  • #2471939890d Thanks @pranaygp! - Cache the compiled workflow-bundle vm.Script per process so replays reuse the compiled bundle instead of re-parsing it on every iteration.

  • #2490a92c16d Thanks @pranaygp! - Reject an explicit empty-string token in createHook(). Omit the option (or pass undefined) to get a randomly generated token, or pass a non-empty string.

  • #252937312ed Thanks @pranaygp! - Speed up workflow stack-trace remapping when source maps are absent (production default): skip bundle scanning when no frame references the workflow file and memoize parsed source maps per bundle.

  • Updated dependencies [b563126, 2074f91, e7ef9d8, ab2e9b8, 1332da3, fb5abbb, 90efb96]:

    • @workflow/world-local@5.0.0-beta.20
    • @workflow/world-vercel@5.0.0-beta.19
    • @workflow/world@5.0.0-beta.12
    • @workflow/errors@5.0.0-beta.8

workflow@5.0.0-beta.20

Minor Changes

  • #251684ccd40 Thanks @VaguelySerious! - Inline execution now runs up to WORKFLOW_MAX_INLINE_STEPS (default 3) steps in parallel per suspension, each lazily created. An opt-in WORKFLOW_OPTIMISTIC_INLINE_START (default off) additionally starts step bodies before step_started is confirmed, reconciling the in-flight start before the terminal write so a lost create-claim is discarded; it is off by default because under contention a step body can run more than once (e.g. two runs writing to the workflow stream can corrupt it), so only enable it for idempotent steps.

Patch Changes

  • #24752074f91 Thanks @pranaygp! - Skip the per-step incremental events.list round-trip in the inline sequential loop by consuming an event-log delta returned from the step's terminal write (gated to the single-step case with no open hooks or waits).

    Add the opt-in CreateEventParams.sinceCursor contract so a step-terminal events.create can return the event-log delta since that cursor (via EventResult.events/cursor/hasMore).

    Return the inline delta from a step-terminal write when sinceCursor is supplied, computed identically to events.list so the consumed prefix cannot skew from the server log.

    Forward sinceCursor over the v4 wire in @workflow/world-vercel so the server can return the delta on a step-terminal response; older servers ignore it and the runtime falls back to events.list.

  • #2478e7ef9d8 Thanks @pranaygp! - Lazy inline step start: the owned-inline runtime path now sends a single step_started carrying the step input, letting the world create the step on the fly and saving one round-trip per inline step.

    @workflow/world: step_started event data accepts an optional input, and EventResult gains a stepCreated ownership signal.

    @workflow/world-local: step_started with input atomically creates the step plus a synthetic step_created event; a lazy step_started for an already-existing step throws EntityConflictError so concurrent losers skip (exactly-once).

    @workflow/world-postgres: same lazy-create + exactly-once create-claim for the Postgres backend.

    @workflow/world-vercel: sends the step input on step_started over the v4 wire and threads the server's stepCreated signal into EventResult.

  • Updated dependencies [7aee0d4, 16b3670, 2074f91, e7ef9d8, 722bb7c, de91f20, ab2e9b8, 84ccd40, 939890d, a92c16d, 37312ed]:

    • @workflow/core@5.0.0-beta.20
    • @workflow/cli@5.0.0-beta.20
    • @workflow/next@5.0.0-beta.20
    • @workflow/nitro@5.0.0-beta.20
    • @workflow/typescript-plugin@5.0.0-beta.4
    • @workflow/errors@5.0.0-beta.8
    • @workflow/astro@5.0.0-beta.20
    • @workflow/nest@5.0.0-beta.20
    • @workflow/rollup@5.0.0-beta.20
    • @workflow/sveltekit@5.0.0-beta.20
    • @workflow/nuxt@5.0.0-beta.20

@workflow/astro@5.0.0-beta.20

Patch Changes

  • Updated dependencies [37312ed]:
    • @workflow/builders@5.0.0-beta.20
    • @workflow/rollup@5.0.0-beta.20
    • @workflow/vite@5.0.0-beta.20

@workflow/cli@5.0.0-beta.20

Patch Changes

@workflow/nest@5.0.0-beta.20

Patch Changes

  • Updated dependencies [37312ed]:
    • @workflow/builders@5.0.0-beta.20

@workflow/next@5.0.0-beta.20

Patch Changes

@workflow/nitro@5.0.0-beta.20

Patch Changes

@workflow/nuxt@5.0.0-beta.20

Patch Changes

  • Updated dependencies []:
    • @workflow/nitro@5.0.0-beta.20

@workflow/rollup@5.0.0-beta.20

Patch Changes

  • Updated dependencies [37312ed]:
    • @workflow/builders@5.0.0-beta.20

@workflow/sveltekit@5.0.0-beta.20

Patch Changes

  • Updated dependencies [37312ed]:
    • @workflow/builders@5.0.0-beta.20
    • @workflow/rollup@5.0.0-beta.20
    • @workflow/vite@5.0.0-beta.20

@workflow/vite@5.0.0-beta.20

Patch Changes

  • Updated dependencies [37312ed]:
    • @workflow/builders@5.0.0-beta.20

@workflow/vitest@5.0.0-beta.20

Patch Changes

@workflow/web-shared@5.0.0-beta.20

Patch Changes

@workflow/world@5.0.0-beta.12

Patch Changes

  • #24752074f91 Thanks @pranaygp! - Skip the per-step incremental events.list round-trip in the inline sequential loop by consuming an event-log delta returned from the step's terminal write (gated to the single-step case with no open hooks or waits).

    Add the opt-in CreateEventParams.sinceCursor contract so a step-terminal events.create can return the event-log delta since that cursor (via EventResult.events/cursor/hasMore).

    Return the inline delta from a step-terminal write when sinceCursor is supplied, computed identically to events.list so the consumed prefix cannot skew from the server log.

    Forward sinceCursor over the v4 wire in @workflow/world-vercel so the server can return the delta on a step-terminal response; older servers ignore it and the runtime falls back to events.list.

  • #2478e7ef9d8 Thanks @pranaygp! - Lazy inline step start: the owned-inline runtime path now sends a single step_started carrying the step input, letting the world create the step on the fly and saving one round-trip per inline step.

    @workflow/world: step_started event data accepts an optional input, and EventResult gains a stepCreated ownership signal.

    @workflow/world-local: step_started with input atomically creates the step plus a synthetic step_created event; a lazy step_started for an already-existing step throws EntityConflictError so concurrent losers skip (exactly-once).

    @workflow/world-postgres: same lazy-create + exactly-once create-claim for the Postgres backend.

    @workflow/world-vercel: sends the step input on step_started over the v4 wire and threads the server's stepCreated signal into EventResult.

  • #2511ab2e9b8 Thanks @VaguelySerious! - Emit workflowName on per-step events (step_created, step_completed, and lazy-start step_started) so Worlds can access it without additional queries

@workflow/world-local@5.0.0-beta.20

Patch Changes

  • #2534b563126 Thanks @NathanColosimo! - Update undici to 7.28.0.

  • #24752074f91 Thanks @pranaygp! - Skip the per-step incremental events.list round-trip in the inline sequential loop by consuming an event-log delta returned from the step's terminal write (gated to the single-step case with no open hooks or waits).

    Add the opt-in CreateEventParams.sinceCursor contract so a step-terminal events.create can return the event-log delta since that cursor (via EventResult.events/cursor/hasMore).

    Return the inline delta from a step-terminal write when sinceCursor is supplied, computed identically to events.list so the consumed prefix cannot skew from the server log.

    Forward sinceCursor over the v4 wire in @workflow/world-vercel so the server can return the delta on a step-terminal response; older servers ignore it and the runtime falls back to events.list.

  • #2478e7ef9d8 Thanks @pranaygp! - Lazy inline step start: the owned-inline runtime path now sends a single step_started carrying the step input, letting the world create the step on the fly and saving one round-trip per inline step.

    @workflow/world: step_started event data accepts an optional input, and EventResult gains a stepCreated ownership signal.

    @workflow/world-local: step_started with input atomically creates the step plus a synthetic step_created event; a lazy step_started for an already-existing step throws EntityConflictError so concurrent losers skip (exactly-once).

    @workflow/world-postgres: same lazy-create + exactly-once create-claim for the Postgres backend.

    @workflow/world-vercel: sends the step input on step_started over the v4 wire and threads the server's stepCreated signal into EventResult.

  • #25081332da3 Thanks @karthikscale3! - Add run IDs on world storage telemetry spans.

  • Updated dependencies [2074f91, e7ef9d8, ab2e9b8]:

    • @workflow/world@5.0.0-beta.12
    • @workflow/errors@5.0.0-beta.8

@workflow/world-postgres@5.0.0-beta.18

Patch Changes

  • #2478e7ef9d8 Thanks @pranaygp! - Lazy inline step start: the owned-inline runtime path now sends a single step_started carrying the step input, letting the world create the step on the fly and saving one round-trip per inline step.

    @workflow/world: step_started event data accepts an optional input, and EventResult gains a stepCreated ownership signal.

    @workflow/world-local: step_started with input atomically creates the step plus a synthetic step_created event; a lazy step_started for an already-existing step throws EntityConflictError so concurrent losers skip (exactly-once).

    @workflow/world-postgres: same lazy-create + exactly-once create-claim for the Postgres backend.

    @workflow/world-vercel: sends the step input on step_started over the v4 wire and threads the server's stepCreated signal into EventResult.

  • Updated dependencies [b563126, 2074f91, e7ef9d8, ab2e9b8, 1332da3]:

    • @workflow/world-local@5.0.0-beta.20
    • @workflow/world@5.0.0-beta.12
    • @workflow/errors@5.0.0-beta.8

@workflow/world-testing@5.0.0-beta.20

Patch Changes

@workflow/world-vercel@5.0.0-beta.19

Patch Changes

  • #2534b563126 Thanks @NathanColosimo! - Update undici to 7.28.0.

  • #24752074f91 Thanks @pranaygp! - Skip the per-step incremental events.list round-trip in the inline sequential loop by consuming an event-log delta returned from the step's terminal write (gated to the single-step case with no open hooks or waits).

    Add the opt-in CreateEventParams.sinceCursor contract so a step-terminal events.create can return the event-log delta since that cursor (via EventResult.events/cursor/hasMore).

    Return the inline delta from a step-terminal write when sinceCursor is supplied, computed identically to events.list so the consumed prefix cannot skew from the server log.

    Forward sinceCursor over the v4 wire in @workflow/world-vercel so the server can return the delta on a step-terminal response; older servers ignore it and the runtime falls back to events.list.

  • #2478e7ef9d8 Thanks @pranaygp! - Lazy inline step start: the owned-inline runtime path now sends a single step_started carrying the step input, letting the world create the step on the fly and saving one round-trip per inline step.

    @workflow/world: step_started event data accepts an optional input, and EventResult gains a stepCreated ownership signal.

    @workflow/world-local: step_started with input atomically creates the step plus a synthetic step_created event; a lazy step_started for an already-existing step throws EntityConflictError so concurrent losers skip (exactly-once).

    @workflow/world-postgres: same lazy-create + exactly-once create-claim for the Postgres backend.

    @workflow/world-vercel: sends the step input on step_started over the v4 wire and threads the server's stepCreated signal into EventResult.

  • #25081332da3 Thanks @karthikscale3! - Add run IDs on world storage telemetry spans.

  • #2514fb5abbb Thanks @VaguelySerious! - Route v4 event requests through the global fetch so they appear in the Vercel observability log viewer's outgoing-requests view again.

  • #253390efb96 Thanks @karthikscale3! - Inject W3C trace context (traceparent/tracestate/baggage) on v4 event requests, which previously bypassed it via fetchV4 — restoring workflow-server span correlation for traffic from the flow route. No-op when no OpenTelemetry SDK is registered.

  • Updated dependencies [2074f91, e7ef9d8, ab2e9b8]:

    • @workflow/world@5.0.0-beta.12
    • @workflow/errors@5.0.0-beta.8

@workflow/web@5.0.0-beta.20

@github-actions
github-actionsBot requested a review from a team as a code ownerJune 18, 2026 01:30
@vercel

vercelBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

@github-actions
github-actionsBotforce-pushed the changeset-release/main branch from ebcd394 to e7ef9d8CompareJune 18, 2026 05:52
@github-actionsgithub-actionsBot reopened this Jun 18, 2026
@github-actions
github-actionsBotforce-pushed the changeset-release/main branch from 182e3ec to 939890dCompareJune 18, 2026 06:38
@github-actionsgithub-actionsBot reopened this Jun 18, 2026
@github-actions

github-actionsBot commented Jun 18, 2026

Copy link
Copy Markdown
ContributorAuthor

🧪 E2E Test Results

All tests passed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production144202301672
✅ 💻 Local Development190902192128
✅ 📦 Local Production190902192128
✅ 🐘 Local Postgres189502332128
✅ 🪟 Windows15200152
✅ 📋 Other88501791064
Total8192010809272

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro125027
✅ example125027
✅ express125027
✅ fastify125027
✅ hono125027
✅ nextjs-turbopack14903
✅ nextjs-webpack14903
✅ nitro125027
✅ nuxt125027
✅ sveltekit14408
✅ vite125027
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable127025
✅ express-stable127025
✅ fastify-stable127025
✅ hono-stable127025
✅ nextjs-turbopack-canary133019
✅ nextjs-turbopack-stable-lazy-discovery-disabled15200
✅ nextjs-turbopack-stable-lazy-discovery-enabled15200
✅ nextjs-webpack-canary133019
✅ nextjs-webpack-stable-lazy-discovery-disabled15200
✅ nextjs-webpack-stable-lazy-discovery-enabled15200
✅ nitro-stable127025
✅ nuxt-stable127025
✅ sveltekit-stable14606
✅ vite-stable127025
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable127025
✅ express-stable127025
✅ fastify-stable127025
✅ hono-stable127025
✅ nextjs-turbopack-canary133019
✅ nextjs-turbopack-stable-lazy-discovery-disabled15200
✅ nextjs-turbopack-stable-lazy-discovery-enabled15200
✅ nextjs-webpack-canary133019
✅ nextjs-webpack-stable-lazy-discovery-disabled15200
✅ nextjs-webpack-stable-lazy-discovery-enabled15200
✅ nitro-stable127025
✅ nuxt-stable127025
✅ sveltekit-stable14606
✅ vite-stable127025
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable126026
✅ express-stable126026
✅ fastify-stable126026
✅ hono-stable126026
✅ nextjs-turbopack-canary132020
✅ nextjs-turbopack-stable-lazy-discovery-disabled15101
✅ nextjs-turbopack-stable-lazy-discovery-enabled15101
✅ nextjs-webpack-canary132020
✅ nextjs-webpack-stable-lazy-discovery-disabled15101
✅ nextjs-webpack-stable-lazy-discovery-enabled15101
✅ nitro-stable126026
✅ nuxt-stable126026
✅ sveltekit-stable14507
✅ vite-stable126026
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack15200
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable127025
✅ e2e-local-dev-tanstack-start-127025
✅ e2e-local-postgres-nest-stable126026
✅ e2e-local-postgres-tanstack-start-126026
✅ e2e-local-prod-nest-stable127025
✅ e2e-local-prod-tanstack-start-127025
✅ e2e-vercel-prod-tanstack-start125027

📋 View full workflow run

@github-actions

github-actionsBot commented Jun 18, 2026

Copy link
Copy Markdown
ContributorAuthor

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.042s (-2.3%)1.006s (~)0.964s101.00x
💻 LocalNitro0.044s (+7.4% 🔺)1.006s (~)0.963s101.03x
💻 LocalNext.js (Turbopack)0.058s (-11.5% 🟢)1.006s (~)0.948s101.38x
🐘 PostgresExpress0.060s (-17.5% 🟢)1.010s (~)0.951s101.41x
🐘 PostgresNitro0.064s (+2.2%)1.012s (~)0.948s101.51x
🐘 PostgresNext.js (Turbopack)0.068s (-3.3%)1.012s (~)0.944s101.60x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro0.297s (-20.9% 🟢)2.506s (+11.5% 🔺)2.209s101.00x
▲ VercelExpress0.312s (-17.4% 🟢)2.070s (-9.8% 🟢)1.758s101.05x
▲ VercelNext.js (Turbopack)0.399s (+37.1% 🔺)2.125s (+12.4% 🔺)1.726s101.35x

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

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express1.095s (-0.5%)2.007s (~)0.912s101.00x
💻 LocalNitro1.096s (+1.0%)2.007s (~)0.911s101.00x
🐘 PostgresNitro1.111s (-0.8%)2.011s (~)0.900s101.01x
🐘 PostgresExpress1.113s (+0.6%)2.012s (~)0.899s101.02x
💻 LocalNext.js (Turbopack)1.124s (-2.1%)2.007s (~)0.883s101.03x
🐘 PostgresNext.js (Turbopack)1.143s (~)2.011s (~)0.867s101.04x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express1.713s (-11.5% 🟢)3.484s (-5.2% 🟢)1.771s101.00x
▲ VercelNitro1.859s (-19.8% 🟢)3.955s (-0.9%)2.096s101.09x
▲ VercelNext.js (Turbopack)1.942s (+10.1% 🔺)3.639s (-2.0%)1.697s101.13x

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

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express10.519s (~)11.023s (~)0.504s31.00x
💻 LocalNitro10.521s (~)11.024s (~)0.503s31.00x
🐘 PostgresExpress10.534s (~)11.019s (~)0.485s31.00x
🐘 PostgresNitro10.552s (~)11.021s (~)0.470s31.00x
💻 LocalNext.js (Turbopack)10.760s (~)11.023s (~)0.263s31.02x
🐘 PostgresNext.js (Turbopack)10.801s (-0.5%)11.021s (~)0.220s31.03x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)12.692s (-11.3% 🟢)14.009s (-14.0% 🟢)1.317s31.00x
▲ VercelNitro12.730s (-32.9% 🟢)14.546s (-31.7% 🟢)1.816s31.00x
▲ VercelExpress13.096s (-27.5% 🟢)14.834s (-25.7% 🟢)1.738s31.03x

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

workflow with 25 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express13.779s (~)14.027s (~)0.249s51.00x
🐘 PostgresExpress13.828s (~)14.020s (~)0.193s51.00x
🐘 PostgresNitro13.843s (~)14.021s (~)0.178s51.00x
💻 LocalNitro13.852s (+1.6%)14.027s (~)0.174s51.01x
💻 LocalNext.js (Turbopack)14.277s (-0.6%)15.028s (~)0.751s41.04x
🐘 PostgresNext.js (Turbopack)14.403s (~)15.015s (~)0.612s41.05x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)20.790s (-41.3% 🟢)22.650s (-38.5% 🟢)1.861s31.00x
▲ VercelNitro21.587s (-30.7% 🟢)23.540s (-27.7% 🟢)1.953s31.04x
▲ VercelExpress21.683s (-10.5% 🟢)23.503s (-10.2% 🟢)1.820s31.04x

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

workflow with 50 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express12.438s (-0.9%)13.024s (~)0.587s71.00x
💻 LocalNitro12.497s (+3.5%)13.027s (+1.1%)0.530s71.00x
🐘 PostgresExpress12.534s (+0.7%)13.022s (~)0.488s71.01x
🐘 PostgresNitro12.542s (~)13.019s (~)0.477s71.01x
💻 LocalNext.js (Turbopack)13.581s (-0.5%)14.026s (~)0.445s71.09x
🐘 PostgresNext.js (Turbopack)13.869s (~)14.447s (+2.0%)0.577s71.12x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express26.629s (-24.1% 🟢)28.747s (-22.1% 🟢)2.118s41.00x
▲ VercelNitro27.425s (-29.6% 🟢)29.713s (-27.4% 🟢)2.288s41.03x
▲ VercelNext.js (Turbopack)27.433s (-22.1% 🟢)29.850s (-19.2% 🟢)2.417s41.03x

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

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.203s (-0.8%)2.008s (~)0.805s151.00x
💻 LocalExpress1.225s (+5.1% 🔺)2.007s (~)0.781s151.02x
🐘 PostgresNext.js (Turbopack)1.239s (-3.7%)2.007s (~)0.768s151.03x
🐘 PostgresNitro1.252s (+4.5%)2.009s (~)0.756s151.04x
💻 LocalNitro1.291s (+10.4% 🔺)2.007s (~)0.716s151.07x
💻 LocalNext.js (Turbopack)1.374s (+6.0% 🔺)2.006s (~)0.632s151.14x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.263s (-15.2% 🟢)3.454s (-15.7% 🟢)1.191s91.00x
▲ VercelNitro2.463s (-15.4% 🟢)4.073s (-7.6% 🟢)1.610s81.09x
▲ VercelExpress2.649s (+19.4% 🔺)4.099s (+5.5% 🔺)1.450s81.17x

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

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.312s (-3.9%)2.007s (-20.0% 🟢)0.696s151.00x
🐘 PostgresExpress1.312s (-7.9% 🟢)2.009s (-16.1% 🟢)0.697s151.00x
🐘 PostgresNext.js (Turbopack)1.425s (-13.0% 🟢)2.008s (-16.1% 🟢)0.583s151.09x
💻 LocalExpress2.027s (+24.6% 🔺)2.735s (+36.3% 🔺)0.708s111.55x
💻 LocalNitro2.171s (+39.9% 🔺)2.919s (+45.2% 🔺)0.748s111.66x
💻 LocalNext.js (Turbopack)2.213s (+15.8% 🔺)3.008s (+31.2% 🔺)0.796s101.69x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.044s (-23.1% 🟢)4.646s (-18.1% 🟢)1.601s71.00x
▲ VercelNitro3.727s (-7.9% 🟢)5.666s (-0.6%)1.940s61.22x
▲ VercelNext.js (Turbopack)3.754s (-16.4% 🟢)5.494s (-15.2% 🟢)1.740s61.23x

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

Promise.all with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.475s (-7.5% 🟢)3.761s (-6.2% 🟢)2.286s81.00x
🐘 PostgresExpress1.538s (-12.8% 🟢)3.454s (-11.1% 🟢)1.916s91.04x
🐘 PostgresNext.js (Turbopack)2.530s (-19.9% 🟢)3.349s (-22.2% 🟢)0.818s91.72x
💻 LocalExpress5.601s (+28.1% 🔺)6.014s (+23.6% 🔺)0.413s63.80x
💻 LocalNitro6.239s (+82.3% 🔺)7.014s (+74.9% 🔺)0.776s54.23x
💻 LocalNext.js (Turbopack)6.501s (+12.6% 🔺)7.015s (+12.8% 🔺)0.514s54.41x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro4.092s (-33.2% 🟢)6.422s (-23.0% 🟢)2.330s51.00x
▲ VercelNext.js (Turbopack)5.697s (+1.3%)8.128s (+5.3% 🔺)2.431s41.39x
▲ VercelExpress9.267s (+68.4% 🔺)11.081s (+39.8% 🔺)1.814s32.26x

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

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.211s (~)2.008s (~)0.797s151.00x
🐘 PostgresExpress1.211s (-0.6%)2.008s (~)0.797s151.00x
💻 LocalExpress1.241s (-21.3% 🟢)2.007s (~)0.766s151.02x
🐘 PostgresNext.js (Turbopack)1.278s (~)2.008s (~)0.730s151.06x
💻 LocalNitro1.287s (+7.2% 🔺)2.006s (~)0.719s151.06x
💻 LocalNext.js (Turbopack)1.406s (+0.5%)2.006s (~)0.601s151.16x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.433s (-31.8% 🟢)4.071s (-23.0% 🟢)1.639s81.00x
▲ VercelExpress2.530s (+8.9% 🔺)3.853s (+1.3%)1.322s81.04x
▲ VercelNext.js (Turbopack)2.596s (-30.2% 🟢)3.872s (-26.0% 🟢)1.276s81.07x

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

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.289s (-5.7% 🟢)2.008s (-13.3% 🟢)0.719s151.00x
🐘 PostgresNitro1.295s (-10.2% 🟢)2.007s (-16.2% 🟢)0.712s151.01x
🐘 PostgresNext.js (Turbopack)1.416s (-8.2% 🟢)2.006s (-9.7% 🟢)0.590s151.10x
💻 LocalExpress2.041s (+7.6% 🔺)2.507s (+16.7% 🔺)0.466s121.58x
💻 LocalNitro2.128s (+25.6% 🔺)2.918s (+45.3% 🔺)0.791s111.65x
💻 LocalNext.js (Turbopack)2.320s (+7.0% 🔺)3.007s (~)0.688s101.80x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.841s (-36.4% 🟢)4.539s (-26.3% 🟢)1.697s71.00x
▲ VercelExpress2.930s (+7.5% 🔺)4.493s (-1.7%)1.563s71.03x
▲ VercelNitro3.172s (+13.3% 🔺)4.920s (+17.6% 🔺)1.748s71.12x

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

Promise.race with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.465s (-18.8% 🟢)3.761s (-12.5% 🟢)2.296s81.00x
🐘 PostgresExpress1.477s (-17.9% 🟢)4.011s (~)2.534s81.01x
🐘 PostgresNext.js (Turbopack)2.300s (-43.4% 🟢)3.213s (-27.7% 🟢)0.913s101.57x
💻 LocalExpress5.509s (+20.0% 🔺)6.214s (+23.9% 🔺)0.704s53.76x
💻 LocalNitro6.266s (+39.5% 🔺)6.818s (+36.0% 🔺)0.552s54.28x
💻 LocalNext.js (Turbopack)6.765s (+16.5% 🔺)7.216s (+12.5% 🔺)0.451s54.62x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.406s (-75.4% 🟢)5.713s (-63.5% 🟢)2.307s61.00x
▲ VercelExpress3.546s (-57.9% 🟢)5.411s (-47.2% 🟢)1.864s61.04x
▲ VercelNext.js (Turbopack)4.059s (+7.3% 🔺)6.018s (+15.0% 🔺)1.959s51.19x

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

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.589s (+3.2%)1.023s (+1.8%)0.434s591.00x
🐘 PostgresNitro0.596s (~)1.023s (-1.7%)0.427s591.01x
💻 LocalNitro0.600s (+19.9% 🔺)1.005s (~)0.405s601.02x
💻 LocalExpress0.623s (~)1.023s (~)0.400s591.06x
🐘 PostgresNext.js (Turbopack)0.759s (-9.1% 🟢)1.007s (-1.6%)0.248s601.29x
💻 LocalNext.js (Turbopack)0.860s (-3.1%)1.039s (~)0.179s581.46x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.609s (-45.4% 🟢)5.526s (-33.7% 🟢)1.917s111.00x
▲ VercelExpress3.673s (-19.2% 🟢)5.121s (-21.0% 🟢)1.448s121.02x
▲ VercelNext.js (Turbopack)3.772s (-40.2% 🟢)5.075s (-37.7% 🟢)1.302s121.05x

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

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.340s (-3.5%)2.029s (~)0.689s451.00x
🐘 PostgresExpress1.359s (~)2.030s (~)0.670s451.01x
💻 LocalExpress1.451s (-2.5%)2.006s (~)0.555s451.08x
💻 LocalNitro1.525s (+28.4% 🔺)2.029s (+0.9%)0.504s451.14x
🐘 PostgresNext.js (Turbopack)1.833s (-5.6% 🟢)2.030s (-2.2%)0.196s451.37x
💻 LocalNext.js (Turbopack)2.018s (-4.0%)2.607s (-13.3% 🟢)0.588s351.51x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)8.063s (-40.7% 🟢)9.622s (-37.2% 🟢)1.560s101.00x
▲ VercelExpress8.275s (-52.7% 🟢)10.113s (-47.2% 🟢)1.838s91.03x
▲ VercelNitro9.262s (-21.6% 🟢)11.171s (-21.2% 🟢)1.909s91.15x

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

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.725s (-2.6%)3.111s (-1.7%)0.386s391.00x
🐘 PostgresExpress2.737s (+1.0%)3.111s (~)0.374s391.00x
💻 LocalNitro3.219s (+17.9% 🔺)4.009s (+24.4% 🔺)0.791s301.18x
💻 LocalExpress3.264s (+2.1%)3.977s (-0.8%)0.713s311.20x
🐘 PostgresNext.js (Turbopack)3.612s (-6.6% 🟢)4.010s (-1.6%)0.398s301.33x
💻 LocalNext.js (Turbopack)4.173s (-3.9%)5.011s (~)0.838s241.53x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express15.692s (-39.8% 🟢)18.022s (-35.7% 🟢)2.330s71.00x
▲ VercelNitro16.108s (-38.8% 🟢)18.369s (-34.7% 🟢)2.261s71.03x
▲ VercelNext.js (Turbopack)17.095s (-31.6% 🟢)19.249s (-28.1% 🟢)2.154s71.09x

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

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.221s (-6.0% 🟢)1.006s (~)0.785s601.00x
🐘 PostgresExpress0.242s (+4.5%)1.006s (~)0.765s601.09x
🐘 PostgresNext.js (Turbopack)0.254s (-13.5% 🟢)1.006s (~)0.752s601.15x
💻 LocalNitro0.417s (+11.8% 🔺)1.005s (~)0.588s601.88x
💻 LocalExpress0.428s (-2.8%)1.005s (~)0.577s601.93x
💻 LocalNext.js (Turbopack)0.607s (+4.4%)1.005s (~)0.397s602.75x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express1.427s (-8.0% 🟢)2.758s (-3.9%)1.331s221.00x
▲ VercelNext.js (Turbopack)1.608s (-14.1% 🟢)3.204s (-17.6% 🟢)1.597s191.13x
▲ VercelNitro1.844s (+42.9% 🔺)3.620s (+26.0% 🔺)1.776s171.29x

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

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.331s (-3.2%)1.006s (-1.1%)0.675s901.00x
🐘 PostgresExpress0.354s (-0.5%)1.018s (-2.2%)0.664s891.07x
🐘 PostgresNext.js (Turbopack)0.479s (-11.2% 🟢)1.053s (-5.8% 🟢)0.574s861.44x
💻 LocalExpress2.152s (+3.0%)2.656s (~)0.505s346.50x
💻 LocalNitro2.321s (+52.3% 🔺)2.915s (+35.4% 🔺)0.594s317.01x
💻 LocalNext.js (Turbopack)2.581s (+10.7% 🔺)3.261s (+6.0% 🔺)0.680s287.79x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express2.571s (-12.1% 🟢)4.204s (-12.4% 🟢)1.633s221.00x
▲ VercelNext.js (Turbopack)3.076s (+1.1%)4.738s (-1.1%)1.662s201.20x
▲ VercelNitro3.150s (+14.7% 🔺)5.030s (+5.2% 🔺)1.881s181.23x

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

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.533s (-6.3% 🟢)1.032s (-15.1% 🟢)0.500s1171.00x
🐘 PostgresNitro0.546s (-3.9%)1.078s (-12.5% 🟢)0.532s1121.02x
🐘 PostgresNext.js (Turbopack)1.795s (-31.4% 🟢)2.553s (-26.5% 🟢)0.757s483.37x
💻 LocalNext.js (Turbopack)10.185s (-5.3% 🟢)11.393s (-1.6%)1.208s1119.12x
💻 LocalNitro10.379s (+64.4% 🔺)11.027s (+63.5% 🔺)0.648s1119.48x
💻 LocalExpress10.501s (+26.4% 🔺)11.209s (+26.2% 🔺)0.708s1119.71x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro3.379s (-35.9% 🟢)5.583s (-20.4% 🟢)2.204s221.00x
▲ VercelExpress3.553s (-35.0% 🟢)5.341s (-24.6% 🟢)1.788s231.05x
▲ VercelNext.js (Turbopack)5.024s (+3.8%)7.011s (+7.3% 🔺)1.987s181.49x

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

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.163s (~)1.998s (~)0.001s (+30.0% 🔺)2.010s (~)0.847s101.00x
💻 LocalExpress1.166s (+1.4%)2.005s (~)0.012s (+20.8% 🔺)2.020s (~)0.854s101.00x
🐘 PostgresExpress1.177s (~)1.998s (~)0.001s (+9.1% 🔺)2.011s (~)0.834s101.01x
💻 LocalNitro1.177s (+5.4% 🔺)2.006s (~)0.013s (-51.8% 🟢)2.022s (-0.8%)0.844s101.01x
💻 LocalNext.js (Turbopack)1.210s (~)2.003s (~)0.013s (~)2.020s (~)0.810s101.04x
🐘 PostgresNext.js (Turbopack)1.226s (~)2.001s (~)0.001s (-15.4% 🟢)2.011s (~)0.784s101.05x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.394s (-9.3% 🟢)3.441s (-9.6% 🟢)2.300s (+189.9% 🔺)6.230s (+23.2% 🔺)3.837s101.00x
▲ VercelNext.js (Turbopack)2.431s (-3.6%)3.410s (-10.7% 🟢)2.748s (+240.3% 🔺)6.544s (+28.7% 🔺)4.112s101.02x
▲ VercelExpress2.528s (+5.2% 🔺)3.361s (-8.6% 🟢)3.019s (+307.4% 🔺)6.804s (+39.6% 🔺)4.276s101.06x

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

stream pipeline with 5 transform steps (1MB)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express1.573s (~)2.010s (~)0.014s (+5.7% 🔺)2.025s (~)0.452s301.00x
💻 LocalNitro1.584s (+10.2% 🔺)2.010s (~)0.013s (-28.3% 🟢)2.025s (~)0.441s301.01x
🐘 PostgresNitro1.605s (+1.7%)2.005s (~)0.005s (-6.2% 🟢)2.028s (~)0.423s301.02x
🐘 PostgresExpress1.634s (+3.1%)2.004s (~)0.005s (+7.9% 🔺)2.028s (~)0.394s301.04x
💻 LocalNext.js (Turbopack)1.711s (-2.2%)2.008s (~)0.012s (-2.4%)2.023s (~)0.312s301.09x
🐘 PostgresNext.js (Turbopack)1.817s (+1.8%)2.010s (~)0.005s (+2.6%)2.027s (~)0.210s301.16x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro6.435s (-10.2% 🟢)7.874s (-9.1% 🟢)0.172s (-27.3% 🟢)8.588s (-8.8% 🟢)2.153s71.00x
▲ VercelNext.js (Turbopack)7.013s (-17.4% 🟢)8.197s (-16.5% 🟢)0.330s (+25.3% 🔺)8.942s (-15.4% 🟢)1.930s71.09x
▲ VercelExpress⚠️missing-----

🔍 Observability: Nitro | Next.js (Turbopack)

10 parallel streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.782s (+1.2%)1.068s (+1.8%)0.000s (+300.0% 🔺)1.105s (+1.0%)0.323s551.00x
🐘 PostgresExpress0.806s (+5.5% 🔺)1.145s (+11.7% 🔺)0.000s (-45.2% 🟢)1.161s (+10.1% 🔺)0.355s521.03x
🐘 PostgresNext.js (Turbopack)0.941s (-7.7% 🟢)1.356s (-7.4% 🟢)0.000s (-54.4% 🟢)1.363s (-7.4% 🟢)0.422s451.20x
💻 LocalExpress1.478s (+8.5% 🔺)2.014s (~)0.001s (+200.0% 🔺)2.017s (~)0.539s301.89x
💻 LocalNitro1.544s (+43.6% 🔺)2.014s (+9.6% 🔺)0.000s (-56.8% 🟢)2.016s (+9.6% 🔺)0.472s301.97x
💻 LocalNext.js (Turbopack)1.806s (+19.4% 🔺)2.118s (+5.2% 🔺)0.001s (+141.4% 🔺)2.121s (+5.2% 🔺)0.315s292.31x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)4.025s (+16.7% 🔺)5.108s (+7.1% 🔺)0.000s (-100.0% 🟢)5.540s (+5.3% 🔺)1.515s111.00x
▲ VercelNitro4.343s (+15.6% 🔺)5.513s (+2.4%)0.000s (-100.0% 🟢)6.011s (+2.6%)1.668s101.08x
▲ VercelExpress4.347s (+43.4% 🔺)5.401s (+18.3% 🔺)0.007s (+Infinity% 🔺)5.886s (+16.8% 🔺)1.538s111.08x

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

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

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.739s (+12.1% 🔺)2.218s (+3.9%)0.000s (-100.0% 🟢)2.231s (+4.0%)0.492s271.00x
🐘 PostgresExpress1.755s (+8.7% 🔺)2.342s (+13.5% 🔺)0.000s (NaN%)2.362s (+13.1% 🔺)0.608s261.01x
🐘 PostgresNext.js (Turbopack)2.161s (+2.4%)2.610s (+0.9%)0.000s (+108.7% 🔺)2.619s (+0.9%)0.458s231.24x
💻 LocalExpress3.243s (+10.7% 🔺)3.893s (+6.1% 🔺)0.001s (+91.3% 🔺)3.913s (+6.5% 🔺)0.670s161.87x
💻 LocalNitro4.382s (+98.6% 🔺)4.949s (+80.5% 🔺)0.001s (-19.4% 🟢)4.960s (+80.1% 🔺)0.578s132.52x
💻 LocalNext.js (Turbopack)5.075s (+75.0% 🔺)5.756s (+71.4% 🔺)0.001s (+27.3% 🔺)5.761s (+71.3% 🔺)0.686s112.92x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro5.921s (+12.8% 🔺)7.612s (+17.9% 🔺)0.000s (+Infinity% 🔺)8.135s (+17.5% 🔺)2.214s81.00x
▲ VercelExpress6.265s (+10.1% 🔺)7.675s (+6.2% 🔺)0.000s (+Infinity% 🔺)8.106s (+5.4% 🔺)1.841s81.06x
▲ VercelNext.js (Turbopack)6.285s (-13.3% 🟢)7.376s (-12.2% 🟢)0.000s (-100.0% 🟢)7.781s (-12.0% 🟢)1.497s81.06x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalExpress17/21
🐘 PostgresNitro13/21
▲ VercelNitro9/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express🐘 Postgres14/21
Next.js (Turbopack)🐘 Postgres14/21
Nitro🐘 Postgres16/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
ContributorAuthor

No backport to stable for a12b32c (AI decision).

This is a Changesets-generated "Version Packages (beta)" commit that only bumps package versions and writes generated CHANGELOG entries (plus consuming pre-release changesets). It is pure release plumbing, which is explicitly excluded from backporting; the stable branch manages its own versioning via its own changesets flow.

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

a12b32cd0ffb93a8acf5f04a1a3a0a0ff19d41d5

Sign up for freeto 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

@karthikscale3@pranaygp