Skip to content

fix(next,builders): resolve next build failures from stale socket and…#1748

Draft
ijjk wants to merge 24 commits intomainfrom
ijjk/verify-eager-fix
Draft

fix(next,builders): resolve next build failures from stale socket and…#1748
ijjk wants to merge 24 commits intomainfrom
ijjk/verify-eager-fix

Conversation

@ijjk
Copy link
Copy Markdown
Member

@ijjk ijjk commented Apr 15, 2026

… dynamic imports

Verifying: #1702

TooTallNate and others added 24 commits April 11, 2026 12:16
… dynamic imports

- Guard socket-info filesystem fallback behind WORKFLOW_NEXT_LAZY_DISCOVERY
  to prevent ECONNREFUSED when a stale workflow-socket.json exists from a
  previous dev session
- Post-process step bundles to add webpackIgnore comments to dynamic
  import() calls with non-literal arguments, preventing Turbopack
  'Module not found' errors for runtime-resolved paths
…sition (#1694)

The global `scroll-smooth` CSS class on <html> caused Next.js navigation
scroll-to-top to animate instead of jumping instantly, making cross-page
links appear stuck at the previous scroll position.

Signed-off-by: christopherkindl <[email protected]>
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
* Add cookbook section with 50 workflow pattern recipes

Migrate the "Workflow API Explorer" decision tree concept from
workflow-campaign-demos into useworkflow.dev docs as a Cookbook.

Infrastructure:
- docs/lib/cookbook-tree.ts: decision tree data, 50 recipe metadata entries, slug-to-category mapping
- docs/components/geistdocs/cookbook-explorer.tsx: interactive "I want to..." decision tree UI with breadcrumb navigation
- docs/content/docs/cookbook/index.mdx: landing page rendering CookbookExplorer component
- docs/content/docs/cookbook/meta.json + 8 category meta.json files for sidebar nav
- docs/content/docs/meta.json: added cookbook to docs nav between foundations and how-it-works
- docs/app/[lang]/docs/[[...slug]]/page.tsx: registered CookbookExplorer component

50 recipe MDX files across 8 categories (payments, approvals, resilience,
notifications, webhooks, data-processing, routing, observability), each with:
- Frontmatter (title, description, type: guide, summary with use-case scenario)
- Simplified code snippet (core pattern only, stripped of demo UI concerns)
- Full implementation code snippet (exact source from campaign demos)
- Key APIs section with links to API reference docs

* ploop: iteration 1 checkpoint

Automated checkpoint commit.

Ploop-Iter: 1

* fix: polish cookbook public routing

Keep the cookbook surface canonical at /cookbooks so docs navigation, sitemap output, and AI/chat entry points stop leaking the legacy /docs/cookbook paths.

Correct the approval-chain example so the docs teach the intended sequential approval semantics instead of implying the workflow approves after the first successful level. This keeps the cookbook aligned with the docs quality bar and avoids misleading readers with inconsistent behavior.

Ploop-Iter: 2

* docs: canonicalize cookbook doc routes

Align cookbook-facing docs outputs with the new public route so
redirects, sitemap entries, and LLM-facing exports stay consistent.
This keeps the polished cookbook section discoverable at its canonical
location while trimming the last demo-heavy recipe examples toward the
same concise style as the rest of the docs.

Ploop-Iter: 3

* ploop: iteration 4 checkpoint

Automated checkpoint commit.

Ploop-Iter: 4

* fix(docs): finalize cookbook route split

Keep cookbook content discoverable after moving it to a first-class /cookbooks surface so navigation, canonical metadata, and markdown consumers resolve the new public URLs consistently.

Avoid serving the legacy /docs/cookbook tree as if it were still part of the docs section, which reduces duplicate navigation paths and prevents stale static output from competing with the new route structure.

Ploop-Iter: 5

* docs: improve cookbook discovery

The cookbook landing page needs to work for both exploratory users and users who already know the pattern they want. This keeps the guided decision tree while adding shared category metadata and a searchable browse mode so recipe discovery feels faster and more consistent with the rest of the docs experience.

Ploop-Iter: 6

* docs: refine cookbook pattern examples

Tighten the simplified cookbook recipes so the examples teach the intended workflow semantics clearly and consistently. The changes keep the documentation focused on the core control-flow patterns reviewers called out, while removing ambiguity around partial arrivals, deadlines, and first-success behavior.

Ploop-Iter: 7

* docs: decouple cookbook sidebar tree

Separate cookbook navigation from the docs page tree so the standalone /cookbooks experience stays stable after the route move and the main docs sidebar no longer leaks cookbook entries.\n\nThis keeps cookbook navigation driven by explicit recipe metadata, which avoids duplicated section titles and makes the docs and cookbook surfaces easier to evolve independently.\n\nPloop-Iter: 8

* fix(docs): align cookbook public nav

Keep cookbook pages on their public /cookbooks surface so metadata and copied markdown do not leak legacy /docs/cookbook paths.\n\nSimplify sidebar rendering to trust the injected page tree, which avoids route-specific filtering and keeps cookbook navigation consistent with the active layout tree.\n\nPloop-Iter: 9

* refactor(docs): decouple cookbook routing

Move cookbook rendering off the shared docs route so cookbook pages can behave like a first-class docs surface without leaking cookbook-specific UI into the main docs experience.

Centralizing cookbook tree filtering keeps sidebar behavior consistent in one place and avoids duplicate cookbook navigation state across layouts.

Ploop-Iter: 10

* docs: improve cookbook explorer accessibility

Improve the cookbooks entrypoint so loading and keyboard navigation
are usable without visual cues, and keep guided and browse modes
resilient while the route hydrates.

Ploop-Iter: 11

* ploop: iteration 12 checkpoint

Automated checkpoint commit.

Ploop-Iter: 12

* docs: rename cookbooks route to cookbook (singular)

* docs: add 5 cookbook overview design variations

Add getRecipeHref, getRecipesByCategory, and collectSlugs helpers to
cookbook-tree.ts, then create 5 distinct overview page variations at
/cookbook/v1 through /cookbook/v5 for side-by-side comparison:

- v1: Category Grid (zero-JS scannable overview)
- v2: Search-First (real-time filtering with category pills)
- v3: Accordion Catalog (expandable category sections)
- v4: Decision Wizard (step-by-step guided questions)
- v5: Problem-Solution Table (master-detail by scenario)

Also adds .impeccable.md with project design context.

* docs: remove unrelated package.json bumps and generated artifacts

* docs: restructure cookbook from 50 recipes into 27 consolidated pages

Restructure the cookbook based on team meeting feedback, toolbar comments,
mux-ai pattern analysis, and Vercel org code search. Consolidates duplicates,
adds missing patterns, ensures all examples have proper directives and
type-check against the real workflow SDK.

New structure:
- common-patterns/ (9): saga, batching, rate-limiting, fan-out,
  scheduling, idempotency, webhooks, content-router, child-workflows
- agent-patterns/ (5): durable-agent, tool-streaming,
  human-in-the-loop, tool-orchestration, stop-workflow
- integrations/ (3): ai-sdk, sandbox, chat-sdk
- advanced/ (6): serializable-steps, durable-objects,
  isomorphic-packages, secure-credentials, custom-serialization,
  publishing-libraries

All 92 code snippets pass docs-typecheck against real workflow SDK types.
Deleted 8 old category folders. Updated cookbook-tree.ts, explorer, nav.

* docs: add workflow migration guides

Help teams evaluating the GA launch translate existing durable workflow systems into Vercel Workflow without reverse-engineering concept parity from product docs alone.

The guides focus on real migration decisions and concrete TypeScript examples so adoption can be driven by implementation clarity rather than platform marketing.

Ploop-Iter: 1

* ploop: iteration 2 checkpoint

Automated checkpoint commit.

Ploop-Iter: 2

* docs: refine workflow migration guides

Clarify the migration narrative for GA so teams evaluating a move from Temporal, Inngest, or Step Functions get examples that are realistic enough to trust and pricing guidance that matches the current platform model.

The Inngest guide needed a complete order-saga flow so the durable orchestration, compensation, and streaming patterns read as a credible migration target instead of a partial sketch. The pricing language across all three guides also needed to be aligned with current Workflow and Vercel compute billing semantics to avoid creating the wrong cost expectations during evaluation.

Ploop-Iter: 3

* ploop: iteration 1 checkpoint

Automated checkpoint commit.

Ploop-Iter: 1

* docs(skill): refine workflow migration guidance

Clarify migration rules so agents choose the correct resume primitive, keep streaming guidance aligned with runtime behavior, and avoid implying Vercel-managed execution for self-hosted targets.

This reduces avoidable migration mistakes in generated guidance and keeps the skill consistent with the acceptance criteria used to evaluate it.

Ploop-Iter: 2

* ploop: iteration 3 checkpoint

Automated checkpoint commit.

Ploop-Iter: 3

* docs(skills): refine workflow migration guidance

Reduce the migration skill entry point to the decision surface agents need\nso they can select the correct resume pattern without carrying duplicate\nexamples in the initial context.\n\nClarify framework precedence so prompts that explicitly ask for\nframework-agnostic boundaries do not get Hono- or Next-specific route\nshapes, while preserving framework-specific examples when requested.\n\nCentralize canonical resume examples in the shared patterns reference to\nkeep the guidance consistent across migration paths and reduce drift.\n\nPloop-Iter: 4

* docs: add workflow deep-dive references

Add a cohesive set of deep-dive reference articles so the GA launch
has architecture-level documentation grounded in the current SDK
implementation. This gives readers verified explanations of runtime,
replay, streaming, compiler, and cost-model behavior while linking the
series together for easier navigation.

Ploop-Iter: 1

* ploop: iteration 5 checkpoint

Automated checkpoint commit.

Ploop-Iter: 5

* docs: normalize deep-dive related links

Keep the new deep-dive reference pages cross-linked so readers can move between adjacent runtime concepts without depending on older how-it-works pages alone.

This preserves navigational consistency across the GA launch docs set and reduces the chance that architectural explanations drift into isolated pages that are harder to discover and maintain.

Ploop-Iter: 2

* docs(skill): refine workflow migration routing

Tighten the migration guidance so agents choose the correct resume surface and runtime boundary earlier, reducing incorrect mixed patterns in generated migrations.

Add explicit fast paths for self-hosted targets and Step Functions task-token callbacks so the skill stays consistent on callback URL vs deterministic resume decisions.

Ploop-Iter: 6

* docs: refine workflow migration skill guidance

Clarify route selection so the migration skill composes resume, runtime, and app-boundary concerns deterministically. Add a canonical Step Functions self-hosted Hono callback recipe so migrations produce the correct callback-url pattern without mixing incompatible hook surfaces.\n\nPloop-Iter: 7

* docs: checkpoint deep-dive drafts

Preserve the verified GA launch deep-dive drafts in git so the campaign work can continue from a stable checkpoint.

Capture the reviewed documentation progress now to reduce risk of drift between source-backed research and the publishable drafts.

Ploop-Iter: 3

* docs(skills): tighten workflow migration routing

Clarify the migration skill's route-selection rules so generated guidance stays consistent across resume surfaces, runtime targets, and named framework boundaries.

This reduces ambiguous outputs where agents might mix framework syntaxes or invent callback routes for webhook-based flows, which leads to migration guidance that does not match the user's runtime model.

Ploop-Iter: 8

* docs: finalize workflow deep dives

Clarify the runtime mechanics behind the GA deep-dive series so launch content stays aligned with the implementation and existing docs. Tightening these explanations reduces the risk of readers internalizing inaccurate mental models about replay, compilation, and workflow execution.\n\nPloop-Iter: 4

* docs(skills): refine workflow migration routing

Clarify route selection so migrations choose the correct resume surface and app boundary patterns for the target runtime and framework. Strengthen verification guidance to reject invented callback routes in URL-based flows and keep examples aligned with the documented migration rules.

Ploop-Iter: 9

* docs: sync compiler deep-dive runtime details

Align the compiler deep-dive trio with the actual Workflow runtime so launch materials describe the same execution model users rely on. This keeps the GA narrative accurate around deterministic replay, step queue triggers, and runtime bundle responsibilities, reducing the risk of docs teaching an architecture the SDK does not implement.

Ploop-Iter: 5

* docs(skill): tighten workflow migration guidance

Reduce hot-path skill context so migration routing stays easier to select and
verify during activation.

Trimmed examples and converted long invalid samples into concise failure rules
so the skill points agents to on-demand references instead of loading bulky
worked code by default.

Ploop-Iter: 10

* docs: tighten workflow migration guidance

Clarify route-key planning and resume-surface defaults so migration outputs
stay deterministic when prompts underspecify callback behavior.

Strengthen the deep-dive docs to trace runtime handoffs more directly,
which reduces ambiguity about how the compiler split maps to durable
execution behavior.

Ploop-Iter: 11

* docs: refine streaming and cost deep dives

Clarify the operational model behind durable streaming and zero-cost suspension so launch materials stay source-accurate for readers comparing workflow runtimes.

The updates make the workflow-step boundary, persistence path, and queue-driven cost story more explicit, reducing ambiguity around where stream I/O is allowed and why long waits do not consume compute.

Ploop-Iter: 6

* ploop: iteration 12 checkpoint

Automated checkpoint commit.

Ploop-Iter: 12

* docs: tighten deep-dive streaming accuracy

Align the launch deep dives with the current runtime so campaign content does not misstate suspension behavior or streaming backend capabilities.

These edits clarify the distinct resume paths for step suspension versus timed waits and document the backend-specific streaming guarantees now available across local, Vercel, and Postgres worlds, reducing the risk that readers build incorrect mental models from launch materials.

Ploop-Iter: 7

* docs(skills): refine callback resume taxonomy

Clarify when migrations should use deterministic internal resume versus generated callback URLs so skill outputs stay consistent across frameworks and hosting targets. Distinguish default webhook responses from manual-response flows to prevent ambiguous guidance and keep the shared callback references directly inspectable.\n\nPloop-Iter: 13

* docs: refine deep-dive runtime wording

Clarify the runtime semantics behind suspension and durable streaming so the GA launch materials stay aligned with the source of truth.

These edits tighten descriptions around wake-up paths, backend behavior, and stream lifecycle details to reduce ambiguity for readers comparing the docs to the implementation.

Ploop-Iter: 8

* docs: clarify webhook response mode defaults

Clarify when migrations should use the default webhook behavior versus
manual responses so agents make the same callback choice across the
skill entrypoint, shared patterns, and API reference.

This reduces avoidable ambiguity for callback-url prompts and makes the
default 202 behavior explicit unless a prompt requires custom response
semantics.

Ploop-Iter: 14

* docs: align cost model wake-up semantics

Prevent the GA launch materials from teaching an incorrect mental model about how suspended runs wake back up. The updated wording keeps the blog, social, and reference variants anchored to the real runtime paths so readers understand which transitions are queue-delayed, which are step-driven re-enqueues, and why that distinction matters for the cost story.

Ploop-Iter: 9

* ploop: iteration 10 checkpoint

Automated checkpoint commit.

Ploop-Iter: 10

* docs: clarify webhook resume choices

Explain the resume-surface decision points so migration and API guidance steer authors toward the correct webhook or hook pattern for the prompt.

Reduce common callback-routing mistakes early in the docs and skill so agents make fewer wrong assumptions during workflow migrations.

Ploop-Iter: 15

* docs: tighten cost model deep dives

Clarify the cost-model narrative so launch materials make source-verifiable
claims about suspension, wake-up paths, and polling behavior.

This keeps the GA messaging aligned with the runtime's actual control
flow and avoids overclaiming where the implementation has narrower
semantics than the original copy suggested.

Ploop-Iter: 11

* docs(skills): tighten resume routing guidance

Keep the migration skill entrypoint small so agents load the routing contract only when the source actually pauses for external resume. Clarify the public webhook docs around the default callback flow to reduce accidental use of lower-level runtime APIs.\n\nPloop-Iter: 16

* docs: tighten deep-dive runtime claims

Align the launch materials with the current runtime semantics so the
cost-model and execution-model narrative stays defensible against the
actual implementation.

This keeps the GA campaign focused on claims we can support directly from
source, especially around suspension, re-enqueue behavior, and the
difference between orchestration compute and client-side polling helpers.

Ploop-Iter: 12

* docs: correct cost model deep dive claims

Align the cost-model launch content with the runtime's actual suspension and re-entry mechanics so GA messaging does not overstate identical-cost waits or imply residency that the queue-based engine does not have.

This keeps the public explanation consistent with source-backed behavior around timed wake-ups, explicit workflow re-queue after step completion, and the distinction between idle worker residency and boundary I/O.

Ploop-Iter: 13

* chore: remove non-cookbook files from cookbook branch

Remove deep-dive articles, migration guides/skill, vercel-toolbar skill,
workflow-skills test fixtures, and misc artifacts that belong in separate
branches (deep-dives, migration-guides). Revert create-webhook.mdx,
getting-started/meta.json, and code-transform.mdx to main versions.

* docs: address toolbar feedback on cookbook pages

Address Vercel toolbar comments from Nathan Rajlich, Peter Wielander, Pranay Prakash, and Karthik Kalyanaraman on the cookbook branch.

In saga.mdx, remove the unnecessary `if (!(error instanceof FatalError)) throw error;` guard in the catch block — compensations should always unwind regardless of error type. Replace the `while/pop()!()` loop with a cleaner `for...of reverse()` to avoid the non-null assertion.

In ai-sdk.mdx, split the "Using Different Providers" section into two subsections: "Vercel Gateway (string model IDs)" clarifying that all string model IDs route through Gateway, and "Direct Provider Access" showing how to import from provider packages like `@workflow/ai/openai` to bypass Gateway. Change the "Tool Functions as Steps" section to "Tool Functions with Steps" and reword to explain that tool execute functions can optionally include steps via "use step" but don't have to — when they aren't steps, they run in workflow context and can modify workflow state directly.

In sandbox.mdx, rewrite the page to reflect that `@vercel/sandbox` now has first-class Workflow SDK support. Replace all `declare function` stubs and `// TODO` placeholders with real `import { Sandbox } from "@vercel/sandbox"`. Remove the four separate "use step" wrapper functions (provisionSandbox, runCommand, teardownSandbox, saveSandboxSnapshot) and show direct `Sandbox.create()`, `sandbox.runCommand()`, and `sandbox.destroy()` calls in the workflow function since these implicitly run as steps. Simplify the agent tool example to use inline execute functions that call Sandbox methods directly with an `activeSandbox` variable for workflow state.

Across all cookbook files, replace "Workflow DevKit" with "Workflow SDK" (8 instances in 5 files: publishing-libraries.mdx, secure-credentials.mdx, ai-sdk.mdx, chat-sdk.mdx, sandbox.mdx).

* docs: simplify cookbook index to plain MDX listing

Replace the interactive CookbookExplorer (726-line decision tree + browse
component) with a simple MDX page that lists recipes grouped by category
with linked titles and descriptions. Remove v1-v5 design variations and
trim cookbook-tree.ts to sidebar-only metadata.

* fix type checks

---------

Co-authored-by: Karthik Kalyanaraman <[email protected]>
* docs: add workflow migration guides and migration skill

Create migration guides for AWS Step Functions, Inngest, and Temporal under
docs/content/docs/getting-started/. Each guide provides side-by-side code
comparisons and a realistic order-processing saga example.

Add skills/migrating-to-vercel-workflow/ with SKILL.md, reference docs for
each source platform (aws-step-functions, inngest, temporal), shared patterns,
resume routing, runtime targets, and 5 eval scenarios.

Update create-webhook API reference with webhook resume choice clarifications.
Update getting-started meta.json to include migration guide navigation entries.

* In PR #1584 (migration-guides branch), make two changes to the migration guides:

1. Move migration guides to a top-level "Migration Guides" nav section:
   - Create docs/content/docs/migration-guides/ directory
   - Move the 3 migrating-from-*.mdx files from getting-started/ into migration-guides/
   - Create migration-guides/meta.json with title "Migration Guides" listing temporal, inngest, aws-step-functions
   - Add "migration-guides" between "errors" and "api-reference" in docs/content/docs/meta.json
   - Remove the 3 migration entries from getting-started/meta.json

2. Replace all "Vercel Workflow" language with "Workflow SDK" across docs and skills:
   - In all 3 MDX migration guides: replace "Vercel Workflow" with "the Workflow SDK" or "Workflow SDK" in frontmatter, headings, table headers, and body text
   - Replace "shipping on Vercel" with neutral phrasing, "Vercel-managed execution" with "managed execution", "Vercel's infrastructure" with neutral phrasing
   - Replace Vercel-specific pricing paragraphs with generic "Efficient resource usage" bullet
   - Replace "Deploy to Vercel first..." checklist items with neutral deployment guidance
   - Keep vercel-world prerequisite links (real package name)
   - Rename skills/migrating-to-vercel-workflow/ to skills/migrating-to-workflow-sdk/
   - Update all skill SKILL.md, evals/, and references/ files to replace "Vercel Workflow" with "Workflow SDK"
   - Update runtime-targets.md section headers from "Non-Vercel" to "Self-hosted"

* fix type checks

---------

Co-authored-by: Karthik Kalyanaraman <[email protected]>
)

* fix(next): resolve next/package.json from working directory first

In npm workspaces monorepos, `@workflow/next` can be hoisted to the root
`node_modules/` while `next` stays in a workspace's local `node_modules/`.
The eager `require('next/package.json')` on the fallback path resolved
relative to `@workflow/next`'s own location, failing before the correct
working-directory-relative resolution could run.

Restructure `resolveNextVersion()` to try the working directory path first,
fall back to the package-relative path second, and wrap both in separate
try/catch blocks so neither can crash the process.

Closes #1680

* fix(next): capture resolution errors and include workingDir in error message

Address review feedback: capture caught errors from both resolution
attempts and attach them via `cause` on the final thrown error. Include
the working directory in the error message to aid debugging in monorepo
and CI environments.
Move `workflow/runtime` resolution from `createStepsBundle` into
`discoverEntries` so callers pass the original `inputFiles` array
reference. This restores the WeakMap cache hit when
`createWorkflowsBundle` and `createStepsBundle` are called with
the same inputFiles, avoiding a redundant second esbuild discovery
pass per build that was causing E2E Local Dev Tests to flake on CI.
* move swc-playground-wasm into workbench/swc-playground

Move the Rust/WASM source from packages/swc-playground-wasm into
workbench/swc-playground/wasm/ so it is no longer built as part of
the packages/* turbo filter in CI. The WASM build now runs as part
of the playground's own prebuild/dev scripts, avoiding Rust toolchain
failures in unrelated CI jobs.

* fix: ensure default rustup toolchain in wasm build

The Vercel build environment has rustup installed but no default
toolchain configured. Add a check for this and install stable
if needed. Also check for VERCEL env var in addition to CI.

* fix: ensure cargo bin dir is in PATH on Vercel

After cargo install wasm-pack, the binary lives in $CARGO_HOME/bin
which may not be in PATH on the Vercel build environment. Always
add the cargo bin directory to PATH after ensuring the toolchain.
* update tweet wall

* update tweet wall
* Add AI-powered conflict resolution to backport workflow

Signed-off-by: Nathan Rajlich <[email protected]>

* Use anthropic/claude-opus-4.6 model identifier

Signed-off-by: Nathan Rajlich <[email protected]>

* Address review feedback on AI conflict resolution

Signed-off-by: Nathan Rajlich <[email protected]>

* Update .github/workflows/backport.yml

Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Signed-off-by: Nathan Rajlich <[email protected]>

* Fix script injection in gh pr create --title

Signed-off-by: Nathan Rajlich <[email protected]>

---------

Signed-off-by: Nathan Rajlich <[email protected]>
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
…ncryption before span selection (#1716)

* Make encrypted markers clickable to trigger decryption and detect encryption at run level before span selection

* Make encrypted markers clickable to trigger decryption and detect encryption at run level before span selection

* Make encrypted markers clickable to trigger decryption and detect encryption at run level before span selection

* Make encrypted markers clickable to trigger decryption and detect encryption at run level before span selection

* Make encrypted markers clickable to trigger decryption and detect encryption at run level before span selection
…1705)

The 'Pattern: Workflow-level deduplication' section documented a
start({ id }) API that does not exist. Run IDs are auto-generated
ULIDs and there is no option to specify a custom ID. Remove the
section and related references.
* fix(docs): correct API usage in cookbook examples

Fix 9 issues across 6 cookbook files found during API audit:

- ai-sdk, chat-sdk: return start() returned Run not Response;
  use createUIMessageStreamResponse with run.readable instead
- tool-orchestration: getWritable() is available at workflow level
  (table was wrong); remove invalid generic on createWebhook()
- stop-workflow: replace non-existent { stop: true } prepareStep
  return with { toolChoice: "none" }; move maxSteps from
  DurableAgent constructor to stream() options
- durable-objects: remove erroneous "use step" from API route
- child-workflows: fix comment referencing non-existent statuses
  (queued/starting -> pending/running)

* fix(docs): correct serialization claims, imports, and patterns in cookbook

- Fix @workflow/ai import path: providers/anthropic -> anthropic
  (serializable-steps, durable-objects)
- Remove 'Bundle optimization with dynamic imports' section from
  serializable-steps — SWC plugin dead-code-eliminates unused
  imports from the workflow bundle automatically
- Fix serialization claims in publishing-libraries: workflow supports
  Date, Map, Set, RegExp, BigInt, Uint8Array, URL, Error, and custom
  serde classes — not just JSON. Link to serialization reference.
- Rewrite secrets guidance: encryption protects the event log, so
  this is a best practice not a hard requirement
- Fix custom-serialization: class instances throw a serialization
  error (not silently lose prototype chain); remove incorrect
  'Manual Registration for Library Authors' section (the build
  process discovers classes in node_modules); fix return new this
  -> return new WorkflowStorageClient; reorder Decision Guide to
  recommend custom serde as the default approach

* fix(docs): add code highlights, remove serde shorthand, fix credential guidance

- Add [!code highlight] markers to key lines across all 23 cookbook
  files to emphasize important API calls and patterns
- Remove step-as-factory comparison section from custom-serialization
  page — the page should focus solely on custom class serialization
- Replace 'serde' shorthand with explicit 'custom class serialization'
  throughout for clarity
- Rewrite credential guidance in publishing-libraries to present
  both patterns (env vars and passing explicitly) as equally valid
  when workflow encryption is enabled
* fix: migrate to new facelift

* add: max-w- for footer

* update

* DCO Remediation Commit for christopherkindl <[email protected]>

I, christopherkindl <[email protected]>, hereby add my Signed-off-by to this commit: ba7353f
I, christopherkindl <[email protected]>, hereby add my Signed-off-by to this commit: e83ca81
I, christopherkindl <[email protected]>, hereby add my Signed-off-by to this commit: 8e69ff0

Signed-off-by: christopherkindl <[email protected]>

* Fix: Mobile menu's "close on route change" useEffect has empty dependency array [], making it a no-op that never fires on actual route changes.


This commit fixes the issue reported at docs/components/geistdocs/mobile-menu.tsx:80

## Bug Analysis

The `MobileMenu` component at `docs/components/geistdocs/mobile-menu.tsx` line 80 has a useEffect intended to close the menu on route changes:

```js
useEffect(() => {
  setShow(false);
}, []);
```

The empty dependency array `[]` means this effect runs exactly once — on initial mount — when `show` is already `false` (its initial state). This is a complete no-op. It never detects or responds to route changes.

**When this manifests:** If a user opens the mobile menu and then navigates via browser back/forward buttons, the menu remains open and `document.body.style.overflow` stays set to `'hidden'`, completely locking page scroll. While clicking the `NavLink` items within the menu closes it via their `onClick={close}` handlers, programmatic/browser-level navigation bypasses those handlers.

**Impact:** Users on mobile who use browser navigation while the menu is open will have a broken experience — the menu stays open overlaying the page and body scroll is locked.

## Fix

Replaced the empty-dependency useEffect with the correct pattern already demonstrated in the sibling `sidebar.tsx` component:

1.  Added `usePathname()` from `next/navigation` to track the current route.
2.  Added a `useRef` to store the previous pathname.
3.  Updated the useEffect to depend on `pathname`, comparing it to the previous value and closing the menu when a change is detected.

This ensures the menu closes on any route change, whether triggered by clicking a link, browser back/forward, or programmatic navigation.


Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: christopherkindl <[email protected]>

* fix(docs): use ds-gray-900 token for muted-foreground color

Replace hardcoded oklch values with var(--ds-gray-900) for both light
and dark mode to stay in sync with the design system.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): update world component colors to use 900-level tokens

Align icon and badge colors with design system by switching from 500/600
shades to 900-level variants across WorldDetailHero and
WorldTestingPerformance components.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): update world page colors and align hero layout with TOC grid

- Align hero quick links with TOC sidebar using matching grid layout
- Add shrink-0 to hero icons for consistent vertical alignment
- Update benchmark bar colors (green for fastest, blue for others)
- Remove extra px-4 padding from hero section

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* polish: /worlds page

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* feat(docs): add filterable world cards with section grouping

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): use radix checkbox with SSR placeholder to prevent layout shift

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): use badge tabs for world filters instead of checkboxes

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* revert: restore .husky/pre-commit from main

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): improve benchmark history chart UI and API performance

Benchmark history dialog:
- Fix DialogContent accessibility warning (use DialogDescription)
- Fix 2MB unstable_cache error by using in-memory cache for snapshot map
- Add Geist-style underline variant to Tabs component
- Add skeleton loading state matching stat cards + chart layout
- Add Geist shimmer effect to Skeleton component (--ds-gray-100/200 gradient)
- Add --ds-shadow-tooltip token and apply to chart tooltip
- Use design tokens for all chart colors (--ds-blue-800, --ds-green-800, --ds-purple-900)
- Use linear interpolation, solid gridlines (--ds-gray-400), no animations
- Add 10% fill area under single-line charts, hide for multi-line
- Add white ring to chart dots, equidistant x-axis labels
- Stale-while-revalidate client cache for instant mode switching
- Stat cards refactored to use .map() over a data array
- Lock dialog height with min-h to prevent layout shift

API performance:
- Early exit on gh-pages pagination (cap at MAX_ITEMS * 3)
- Use snapshot timestamp for releases (eliminates 30 serial API calls)
- Increase fetch batch size from 10 to 30
- Remove unstable_cache, rely on in-memory + fetch-level caching

Other:
- Add recharts.d.ts type augmentation for React 19 compatibility

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): add missing geist tokens and utilities from homepage-visuals

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* [DO NOT MERGE][home] Adds vercel-com workflow visuals (#1674)

* add: visualizations

* DCO Remediation Commit for christopherkindl <[email protected]>

I, christopherkindl <[email protected]>, hereby add my Signed-off-by to this commit: eefbc97

Signed-off-by: christopherkindl <[email protected]>

* fix: adjust bar border radius and add @container to feature cards

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix: use rounded-lg for bar border radius, add @container to wide card

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* revert: restore geistdocs.css from main

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

---------

Signed-off-by: christopherkindl <[email protected]>
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>

* fix(docs): add mobile docs bar to cookbook pages

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): add mobile docs bar to cookbook pages

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): increase hero section vertical spacing

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* chore(docs): remove recharts React 19 type shim

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): hoist useTransform calls to top level of components

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): add optional chaining for world.features access

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): log warning when benchmark pagination cap is hit

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): make filter badges keyboard accessible

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): clean up setTimeout on unmount in globe path components

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* feat(docs): add full-width frameworks section to homepage

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* feat(docs): update navbar logo and add framework logos from geist symbols

- Replace LogoWorkflowSdk with Geist symbols wordmark (LogoWorkflow)
- Add currentColor framework logo icons from geistcn-assets
- Add full-width frameworks section to homepage with colored logos
- TanStack shown as "Coming soon" with analytics tracking

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* docs: add comment noting timestamp semantic change in benchmark API

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

* fix(docs): move frameworks section after effortless setup on homepage

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: christopherkindl <[email protected]>

---------

Signed-off-by: christopherkindl <[email protected]>
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
…anel (#1722)

* decryption flow for detail panel data inspector

* decryption flow for detail panel data inspector

* update spinner
…ts (#1729)

@workflow/web-shared is a devDependency of @workflow/web because it is
bundled into web's build output. This means changesets does not bump
web's version when only web-shared has changes, causing version drift.

Adding both packages to a fixed group ensures they always receive the
same version bump. See changesets/changesets#944
)

* Use pull_request_target for backport workflow to support fork PRs

Signed-off-by: Nathan Rajlich <[email protected]>

* Reduce GITHUB_TOKEN permissions to read-only

Signed-off-by: Nathan Rajlich <[email protected]>

---------

Signed-off-by: Nathan Rajlich <[email protected]>
* feat: add clickable Run reference rendering in observability UI

When a serialized Run object appears in step input/output data, it is
now rendered as a clickable purple badge showing the runId. Clicking
navigates to the target run's detail page.

Changes:
- serialization-format.ts: Add RunRef type, isRunRef(), serializedRunToRunRef(),
  and 'Run' entry in observabilityRevivers
- data-inspector.tsx: Add RunRefInline component (purple badge), RunClickContext,
  collapseRefs() to make refs non-expandable in ObjectInspector
- attribute-panel.tsx: Thread onRunClick prop, wrap in RunClickContext.Provider
- entity-detail-panel.tsx: Thread onRunClick prop
- run-trace-view.tsx: Thread onRunClick prop
- workflow-trace-view.tsx: Thread onRunClick prop, reset selected span on run change
- trace-span-construction.ts: Show step name for builtin steps instead of empty string
- hydration.ts: Re-export RunRef types
- run-detail-view.tsx: Add handleRunRefClick that navigates to /run/{targetRunId}

* fix: guard collapseRefs against class instances and memoize result

Only recurse into plain objects (prototype is Object.prototype or null)
to avoid stripping class instances like Date, Error, Map, etc. that
have their own rendering in NodeRenderer. Also memoize the collapsed
result to avoid recomputing on every render.

* fix: detect Run instances in Instance reviver instead of fake Run serde key

The Run class goes through the standard Instance serialization pipeline
(WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE), not a dedicated 'Run' key.
Move the RunRef detection into serializedInstanceToRef() which checks
if the className is 'Run' and the data contains a runId string, then
returns a RunRef instead of a generic ClassInstanceRef.

* fix: use serializedInstanceToRef in web and CLI Instance revivers

Both the web and CLI hydration layers override the observabilityRevivers
Instance handler with their own implementation (for react-inspector
named constructors and CLI inspect.custom respectively), bypassing the
RunRef detection in serializedInstanceToRef. Fix by calling
serializedInstanceToRef first and returning a RunRef when detected.
…1736)

* fix cli expiredAt check

* fix cli expiredAt check

* fix cli expiredAt check
* [docs] Add command-prompt component

Port the command-prompt compound component from vercel-marketing for use on the workflow docs/landing page. Replaces geist icon imports with hard-copied SVG fallbacks and uses the local cn() utility.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* [docs] Replace hero CTA with command-prompt component

Swap the "Get Started" button and inline `npm i workflow` copy block for the
CommandPrompt compound component, matching the vercel.com/workflow hero. Shows
"For humans" / "For agents" tabs with animated copy-to-clipboard.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* [docs] Fix icon alignment and add missing font utilities

- Remove conflicting p-3.5 on copy button (was larger than w-6 h-6 container)
- Use size-8 for the copy button hit target with flex centering
- Remove geist-specific -mt-0.5 hack on check icon
- Add text-label-14-mono and text-label-16-mono utility classes to match
  geist DS typography tokens used by the command-prompt component

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* [docs] Fix copy button alignment in command-prompt

- Use size-8 instead of size-6 + p-3.5 for proper icon centering
- Both icon spans use absolute + flex centering
- Remove -mt-0.5 geist-specific hack on check icon
- Nudge copy button 2px right for optical alignment

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* DCO Remediation Commit for christopherkindl <[email protected]>

I, christopherkindl <[email protected]>, hereby add my Signed-off-by to this commit: 0b74a79
I, christopherkindl <[email protected]>, hereby add my Signed-off-by to this commit: 020900e
I, christopherkindl <[email protected]>, hereby add my Signed-off-by to this commit: f81c2a6
I, christopherkindl <[email protected]>, hereby add my Signed-off-by to this commit: 07b771e

Signed-off-by: christopherkindl <[email protected]>

---------

Signed-off-by: christopherkindl <[email protected]>
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Apr 15, 2026

🦋 Changeset detected

Latest commit: ba47c83

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

This PR includes changesets to release 17 packages
Name Type
@workflow/web Patch
@workflow/core Patch
@workflow/web-shared Patch
@workflow/builders Patch
@workflow/ai Patch
@workflow/next Patch
@workflow/cli Patch
@workflow/nitro Patch
@workflow/vitest Patch
workflow Patch
@workflow/world-testing 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

@vercel
Copy link
Copy Markdown
Contributor

vercel bot commented Apr 15, 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 Apr 15, 2026 7:23pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Apr 15, 2026 7:23pm
example-workflow Ready Ready Preview, Comment Apr 15, 2026 7:23pm
workbench-astro-workflow Ready Ready Preview, Comment Apr 15, 2026 7:23pm
workbench-express-workflow Ready Ready Preview, Comment Apr 15, 2026 7:23pm
workbench-fastify-workflow Ready Ready Preview, Comment Apr 15, 2026 7:23pm
workbench-hono-workflow Ready Ready Preview, Comment Apr 15, 2026 7:23pm
workbench-nitro-workflow Ready Ready Preview, Comment Apr 15, 2026 7:23pm
workbench-nuxt-workflow Ready Ready Preview, Comment Apr 15, 2026 7:23pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Apr 15, 2026 7:23pm
workbench-vite-workflow Ready Ready Preview, Comment Apr 15, 2026 7:23pm
workflow-docs Ready Ready Preview, Comment, Open in v0 Apr 15, 2026 7:23pm
workflow-swc-playground Ready Ready Preview, Comment Apr 15, 2026 7:23pm
workflow-web Ready Ready Preview, Comment Apr 15, 2026 7:23pm

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 15, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 923 0 67 990
✅ 💻 Local Development 904 0 176 1080
✅ 📦 Local Production 980 0 190 1170
✅ 🐘 Local Postgres 980 0 190 1170
✅ 🪟 Windows 82 0 8 90
❌ 🌍 Community Worlds 133 74 24 231
✅ 📋 Other 228 0 42 270
Total 4230 74 697 5001

❌ Failed Tests

🌍 Community Worlds (74 failed)

mongodb (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KP99HTB0495CEG9P25XVRRY1
  • webhookWorkflow | wrun_01KP99J3ES5B7H7EVRZZWRAEY0
  • fetchWorkflow | wrun_01KP99NK3ENEDGNG1DH4P5H48R
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KP99SKZY2S6FQBSWVAW57WQ3
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KP9A0AJPT6GCEVVMQ1F38TTB

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KP99HTB0495CEG9P25XVRRY1
  • webhookWorkflow | wrun_01KP99J3ES5B7H7EVRZZWRAEY0
  • fetchWorkflow | wrun_01KP99NK3ENEDGNG1DH4P5H48R
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KP99SKZY2S6FQBSWVAW57WQ3
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KP9A0AJPT6GCEVVMQ1F38TTB

turso (60 failed):

  • addTenWorkflow | wrun_01KP99GNXZ0TKYBNT5WZC50YR3
  • addTenWorkflow | wrun_01KP99GNXZ0TKYBNT5WZC50YR3
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KP99HAKJ5GVDPQF8V6WXRV63
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KP99GW0WYQAMYF4T2PTADQSK
  • promiseRaceWorkflow | wrun_01KP99H1K14WY17KY600RAFS4R
  • promiseAnyWorkflow | wrun_01KP99H3MHDB37TTAYPXP1BPKA
  • importedStepOnlyWorkflow | wrun_01KP99HNJ3K8REP2GTQ8JGA6MA
  • hookWorkflow | wrun_01KP99HFEF3Y831DJKG0SN7QHP
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KP99HTB0495CEG9P25XVRRY1
  • webhookWorkflow | wrun_01KP99J3ES5B7H7EVRZZWRAEY0
  • sleepingWorkflow | wrun_01KP99JB1PENT3Z3BV3F360RZQ
  • parallelSleepWorkflow | wrun_01KP99JPWMMNPPSVQNGHN7M01X
  • nullByteWorkflow | wrun_01KP99JSZYQZFMSZFNH9PCN85E
  • workflowAndStepMetadataWorkflow | wrun_01KP99JW27C99XQWKFS562P9PE
  • fetchWorkflow | wrun_01KP99NK3ENEDGNG1DH4P5H48R
  • promiseRaceStressTestWorkflow | wrun_01KP99NP6GWAXT248YRB78W59R
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KP99S0QN66AYP86T7KYV83A7
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KP99SKZY2S6FQBSWVAW57WQ3
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KP99T89Y1TYXSDK7PVRNK9WR
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KP99TV4F0GYG4V8H2K79Q24G
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KP99V44HM5J7SWGMSCD2P9FX
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KP99V93NY8GJ591BQS9CNM3T
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KP99VC5AQZMN0E8JGPVKJT42
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KP99VPRGDT23EJJZ8SM6NMGF
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KP99W54R0TSNYZ9A89NJMJMK
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KP99WAATRC6W2SNWNCZWG0X4
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KP99WGENWZ7YRJR1BTEENC44
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KP99WPSKE0D5W93JJTQEQZV4
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KP99WX7METG2JBV1TYKXK7J7
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KP99X3ATC23P4TJPQFM2SXHH
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KP99XAM1M9FHWF4Q46DEXVCX
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KP99XN10WYEVDJZR54C52KBS
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KP99Y5JM0CN9KKRM7EJAYA9A
  • cancelRun - cancelling a running workflow | wrun_01KP99YBS68MX3QQ6PPRW8ZF4Q
  • cancelRun via CLI - cancelling a running workflow | wrun_01KP99YMHMV4P34GDMKF0NJ82M
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KP99Z06CHGYM77437Q86SF0N
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KP99ZN30XF5G95KVG82RS0HZ
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KP9A0033JTB0SZ4K596CWAAZ
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KP9A06C5P2FTRQVB9G6P4E82
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KP9A08KZ0G6TD15GAKK04Y9H
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KP9A0AJPT6GCEVVMQ1F38TTB
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KP9A0ER3DA23F9NJYP382VBN

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 83 0 7
✅ example 83 0 7
✅ express 83 0 7
✅ fastify 83 0 7
✅ hono 83 0 7
✅ nextjs-turbopack 88 0 2
✅ nextjs-webpack 88 0 2
✅ nitro 83 0 7
✅ nuxt 83 0 7
✅ sveltekit 83 0 7
✅ vite 83 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 76 0 14
✅ express-stable 76 0 14
✅ fastify-stable 76 0 14
✅ nextjs-turbopack-canary 63 0 27
✅ nextjs-turbopack-stable-lazy-discovery-disabled 82 0 8
✅ nextjs-turbopack-stable-lazy-discovery-enabled 82 0 8
✅ nextjs-webpack-canary 63 0 27
✅ nextjs-webpack-stable-lazy-discovery-enabled 82 0 8
✅ nitro-stable 76 0 14
✅ nuxt-stable 76 0 14
✅ sveltekit-stable 76 0 14
✅ vite-stable 76 0 14
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 76 0 14
✅ express-stable 76 0 14
✅ fastify-stable 76 0 14
✅ hono-stable 76 0 14
✅ nextjs-turbopack-canary 63 0 27
✅ nextjs-turbopack-stable-lazy-discovery-disabled 82 0 8
✅ nextjs-turbopack-stable-lazy-discovery-enabled 82 0 8
✅ nextjs-webpack-canary 63 0 27
✅ nextjs-webpack-stable-lazy-discovery-enabled 82 0 8
✅ nitro-stable 76 0 14
✅ nuxt-stable 76 0 14
✅ sveltekit-stable 76 0 14
✅ vite-stable 76 0 14
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 76 0 14
✅ express-stable 76 0 14
✅ fastify-stable 76 0 14
✅ hono-stable 76 0 14
✅ nextjs-turbopack-canary 63 0 27
✅ nextjs-turbopack-stable-lazy-discovery-disabled 82 0 8
✅ nextjs-turbopack-stable-lazy-discovery-enabled 82 0 8
✅ nextjs-webpack-canary 63 0 27
✅ nextjs-webpack-stable-lazy-discovery-enabled 82 0 8
✅ nitro-stable 76 0 14
✅ nuxt-stable 76 0 14
✅ sveltekit-stable 76 0 14
✅ vite-stable 76 0 14
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 82 0 8
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 6 0 0
❌ mongodb 56 7 8
✅ redis-dev 6 0 0
❌ redis 56 7 8
✅ turso-dev 6 0 0
❌ turso 3 60 8
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 76 0 14
✅ e2e-local-postgres-nest-stable 76 0 14
✅ e2e-local-prod-nest-stable 76 0 14

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 15, 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.034s (-2.3%) 1.004s (~) 0.970s 10 1.00x
💻 Local Nitro 0.045s (+11.2% 🔺) 1.005s (~) 0.961s 10 1.30x
🐘 Postgres Express 0.046s (-27.5% 🟢) 1.010s (~) 0.963s 10 1.35x
🐘 Postgres Next.js (Turbopack) 0.058s 1.010s 0.952s 10 1.69x
🐘 Postgres Nitro 0.063s (+5.9% 🔺) 1.010s (~) 0.947s 10 1.83x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.237s (-2.9%) 1.855s (-13.1% 🟢) 1.618s 10 1.00x
▲ Vercel Nitro 0.267s (-8.5% 🟢) 2.014s (-18.7% 🟢) 1.747s 10 1.13x
▲ Vercel Next.js (Turbopack) 0.329s (+23.0% 🔺) 2.291s (-15.3% 🟢) 1.962s 10 1.39x

🔍 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.106s (+0.7%) 2.005s (~) 0.899s 10 1.00x
🐘 Postgres Express 1.115s (-2.7%) 2.010s (~) 0.895s 10 1.01x
💻 Local Nitro 1.133s (+3.2%) 2.006s (~) 0.872s 10 1.02x
🐘 Postgres Next.js (Turbopack) 1.147s 2.011s 0.864s 10 1.04x
🐘 Postgres Nitro 1.153s (~) 2.009s (~) 0.857s 10 1.04x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.904s (-2.2%) 3.198s (-9.2% 🟢) 1.294s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.004s (-18.0% 🟢) 3.543s (-16.6% 🟢) 1.539s 10 1.05x
▲ Vercel Express 2.087s (+6.0% 🔺) 3.772s (+9.3% 🔺) 1.685s 10 1.10x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 10.662s (-1.6%) 11.021s (~) 0.359s 3 1.00x
💻 Local Express 10.734s (+1.0%) 11.021s (~) 0.287s 3 1.01x
🐘 Postgres Nitro 10.874s (-0.7%) 11.025s (~) 0.151s 3 1.02x
🐘 Postgres Next.js (Turbopack) 10.916s 11.018s 0.103s 3 1.02x
💻 Local Nitro 10.955s (+2.7%) 11.024s (~) 0.069s 3 1.03x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 16.682s (-7.5% 🟢) 18.093s (-8.2% 🟢) 1.411s 2 1.00x
▲ Vercel Express 17.284s (-15.1% 🟢) 18.958s (-14.5% 🟢) 1.674s 2 1.04x
▲ Vercel Next.js (Turbopack) 17.366s (-0.7%) 19.702s (+1.3%) 2.337s 2 1.04x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 13.979s (-3.4%) 14.220s (-5.3% 🟢) 0.241s 5 1.00x
🐘 Postgres Next.js (Turbopack) 14.508s 15.024s 0.516s 4 1.04x
💻 Local Express 14.553s (+2.4%) 15.027s (~) 0.474s 4 1.04x
🐘 Postgres Nitro 14.619s (~) 15.023s (~) 0.405s 4 1.05x
💻 Local Nitro 15.044s (+5.3% 🔺) 15.531s (+3.3%) 0.487s 4 1.08x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 33.111s (-3.5%) 34.139s (-6.9% 🟢) 1.027s 2 1.00x
▲ Vercel Express 33.528s (+5.3% 🔺) 35.556s (+8.6% 🔺) 2.029s 2 1.01x
▲ Vercel Next.js (Turbopack) 35.676s (-2.0%) 37.282s (-3.0%) 1.606s 2 1.08x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 12.922s (-6.9% 🟢) 13.161s (-6.1% 🟢) 0.239s 7 1.00x
🐘 Postgres Next.js (Turbopack) 13.867s 14.022s 0.155s 7 1.07x
🐘 Postgres Nitro 14.278s (+1.0%) 15.024s (+1.0%) 0.746s 6 1.10x
💻 Local Express 15.008s (+0.9%) 15.193s (+1.1%) 0.185s 6 1.16x
💻 Local Nitro 16.397s (+8.9% 🔺) 17.033s (+8.5% 🔺) 0.636s 6 1.27x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 56.667s (-1.3%) 58.865s (~) 2.198s 2 1.00x
▲ Vercel Next.js (Turbopack) 58.843s (+3.4%) 60.520s (+2.9%) 1.678s 2 1.04x
▲ Vercel Nitro 59.641s (+1.5%) 61.456s (+1.6%) 1.815s 2 1.05x

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

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.211s (-5.3% 🟢) 2.009s (~) 0.798s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.236s 2.009s 0.773s 15 1.02x
🐘 Postgres Nitro 1.262s (-3.6%) 2.009s (~) 0.747s 15 1.04x
💻 Local Express 1.390s (-5.2% 🟢) 2.004s (~) 0.614s 15 1.15x
💻 Local Nitro 1.508s (+2.8%) 2.005s (~) 0.497s 15 1.25x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.571s (-24.7% 🟢) 4.045s (-12.3% 🟢) 1.474s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.663s (+14.8% 🔺) 4.048s (+0.9%) 1.385s 8 1.04x
▲ Vercel Nitro 2.933s (+14.3% 🔺) 4.420s (+2.2%) 1.487s 7 1.14x

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

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.273s (-2.5%) 3.008s (~) 0.735s 10 1.00x
🐘 Postgres Nitro 2.331s (-1.5%) 3.010s (~) 0.679s 10 1.03x
🐘 Postgres Next.js (Turbopack) 2.415s 3.011s 0.596s 10 1.06x
💻 Local Express 2.482s (-10.0% 🟢) 3.007s (-3.3%) 0.524s 10 1.09x
💻 Local Nitro 2.817s (-1.3%) 3.008s (-3.2%) 0.191s 10 1.24x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.503s (+2.1%) 4.100s (+13.9% 🔺) 1.597s 8 1.00x
▲ Vercel Nitro 2.911s (+10.9% 🔺) 4.348s (+4.6%) 1.437s 7 1.16x
▲ Vercel Next.js (Turbopack) 2.964s (-8.3% 🟢) 4.497s (-4.5%) 1.532s 7 1.18x

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

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.392s (-2.1%) 4.011s (~) 0.619s 8 1.00x
🐘 Postgres Nitro 3.484s (~) 4.011s (~) 0.527s 8 1.03x
🐘 Postgres Next.js (Turbopack) 3.682s 4.012s 0.331s 8 1.09x
💻 Local Express 6.430s (-7.8% 🟢) 7.015s (-5.5% 🟢) 0.586s 5 1.90x
💻 Local Nitro 7.571s (+4.9%) 8.018s (~) 0.447s 4 2.23x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.882s (-31.2% 🟢) 4.653s (-25.9% 🟢) 1.771s 7 1.00x
▲ Vercel Nitro 3.166s (-21.5% 🟢) 4.672s (-16.1% 🟢) 1.507s 7 1.10x
▲ Vercel Next.js (Turbopack) 3.605s (-6.7% 🟢) 5.252s (-6.3% 🟢) 1.647s 6 1.25x

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

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.194s (-5.2% 🟢) 2.008s (~) 0.814s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.238s 2.009s 0.771s 15 1.04x
🐘 Postgres Nitro 1.263s (+0.9%) 2.008s (~) 0.745s 15 1.06x
💻 Local Express 1.415s (-5.0% 🟢) 2.005s (~) 0.589s 15 1.19x
💻 Local Nitro 1.537s (+4.0%) 2.006s (~) 0.469s 15 1.29x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.125s (-9.7% 🟢) 3.514s (-13.8% 🟢) 1.389s 9 1.00x
▲ Vercel Express 2.273s (+9.7% 🔺) 3.957s (+15.8% 🔺) 1.684s 8 1.07x
▲ Vercel Next.js (Turbopack) 2.386s (+2.3%) 3.990s (-1.4%) 1.604s 8 1.12x

🔍 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 🥇 Express 2.275s (-2.8%) 3.009s (~) 0.735s 10 1.00x
🐘 Postgres Nitro 2.352s (+1.4%) 3.010s (~) 0.658s 10 1.03x
🐘 Postgres Next.js (Turbopack) 2.406s 3.009s 0.604s 10 1.06x
💻 Local Express 2.553s (-3.5%) 3.130s (+4.0%) 0.576s 10 1.12x
💻 Local Nitro 3.033s (+11.8% 🔺) 3.886s (+29.2% 🔺) 0.853s 8 1.33x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.546s (-1.8%) 4.074s (+0.5%) 1.528s 8 1.00x
▲ Vercel Express 3.034s (-2.6%) 4.722s (+8.0% 🔺) 1.688s 7 1.19x
▲ Vercel Next.js (Turbopack) 3.282s (-37.0% 🟢) 4.937s (-30.3% 🟢) 1.655s 7 1.29x

🔍 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 🥇 Express 3.397s (-2.2%) 4.011s (~) 0.613s 8 1.00x
🐘 Postgres Nitro 3.497s (+1.8%) 4.012s (~) 0.515s 8 1.03x
🐘 Postgres Next.js (Turbopack) 3.683s 4.013s 0.330s 8 1.08x
💻 Local Express 6.923s (-5.5% 🟢) 7.513s (-6.3% 🟢) 0.590s 4 2.04x
💻 Local Nitro 8.149s (+3.5%) 9.026s (+9.2% 🔺) 0.876s 4 2.40x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.301s (-43.5% 🟢) 4.966s (-32.3% 🟢) 1.665s 7 1.00x
▲ Vercel Express 3.353s (-68.8% 🟢) 5.264s (-57.9% 🟢) 1.912s 6 1.02x
▲ Vercel Next.js (Turbopack) 4.703s (-41.9% 🟢) 6.381s (-41.5% 🟢) 1.678s 5 1.42x

🔍 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 🥇 Express 0.605s (-27.8% 🟢) 1.006s (-1.7%) 0.401s 60 1.00x
🐘 Postgres Nitro 0.834s (+2.7%) 1.041s (+3.4%) 0.207s 58 1.38x
🐘 Postgres Next.js (Turbopack) 0.835s 1.023s 0.188s 59 1.38x
💻 Local Express 0.888s (+28.7% 🔺) 1.093s (+8.8% 🔺) 0.205s 56 1.47x
💻 Local Nitro 1.046s (+45.3% 🔺) 2.006s (+99.8% 🔺) 0.960s 30 1.73x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 9.670s (+2.6%) 11.649s (+6.7% 🔺) 1.979s 6 1.00x
▲ Vercel Nitro 9.737s (-4.9%) 11.135s (-7.7% 🟢) 1.398s 6 1.01x
▲ Vercel Next.js (Turbopack) 10.017s (-6.9% 🟢) 11.664s (-8.5% 🟢) 1.647s 6 1.04x

🔍 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 🥇 Express 1.430s (-26.7% 🟢) 2.007s (-6.7% 🟢) 0.577s 45 1.00x
🐘 Postgres Next.js (Turbopack) 1.934s 2.075s 0.141s 44 1.35x
🐘 Postgres Nitro 1.946s (+0.8%) 2.258s (+6.3% 🔺) 0.313s 40 1.36x
💻 Local Express 2.847s (+27.6% 🔺) 3.294s (+9.5% 🔺) 0.447s 28 1.99x
💻 Local Nitro 3.037s (+33.8% 🔺) 3.730s (+24.0% 🔺) 0.693s 25 2.12x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 28.396s (-5.1% 🟢) 30.089s (-4.5%) 1.693s 4 1.00x
▲ Vercel Nitro 30.828s (-0.6%) 32.360s (-2.4%) 1.532s 3 1.09x
▲ Vercel Next.js (Turbopack) 31.368s (-8.0% 🟢) 33.256s (-7.8% 🟢) 1.888s 3 1.10x

🔍 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 🥇 Express 2.931s (-25.4% 🟢) 3.166s (-24.9% 🟢) 0.235s 38 1.00x
🐘 Postgres Nitro 4.009s (+1.4%) 4.295s (+1.1%) 0.286s 28 1.37x
🐘 Postgres Next.js (Turbopack) 4.052s 4.492s 0.440s 27 1.38x
💻 Local Express 7.506s (+2.8%) 8.148s (+1.7%) 0.642s 15 2.56x
💻 Local Nitro 8.972s (+21.7% 🔺) 9.633s (+20.2% 🔺) 0.661s 13 3.06x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 76.607s (-12.1% 🟢) 78.677s (-11.2% 🟢) 2.070s 2 1.00x
▲ Vercel Nitro 81.164s (-5.6% 🟢) 82.378s (-6.3% 🟢) 1.214s 2 1.06x
▲ Vercel Next.js (Turbopack) 81.490s (-6.4% 🟢) 83.224s (-6.2% 🟢) 1.734s 2 1.06x

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

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.225s (-19.1% 🟢) 1.006s (~) 0.781s 60 1.00x
🐘 Postgres Next.js (Turbopack) 0.260s 1.007s 0.747s 60 1.16x
🐘 Postgres Nitro 0.285s (+2.3%) 1.007s (~) 0.722s 60 1.27x
💻 Local Express 0.498s (-9.6% 🟢) 1.004s (~) 0.505s 60 2.21x
💻 Local Nitro 0.579s (-5.0%) 1.005s (-1.6%) 0.426s 60 2.57x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.743s (-9.2% 🟢) 3.402s (-4.1%) 1.659s 18 1.00x
▲ Vercel Nitro 2.016s (+30.1% 🔺) 3.474s (+5.5% 🔺) 1.459s 18 1.16x
▲ Vercel Next.js (Turbopack) 21.007s (+1180.1% 🔺) 22.622s (+563.3% 🔺) 1.614s 16 12.05x

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

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.354s (-28.2% 🟢) 1.006s (~) 0.652s 90 1.00x
🐘 Postgres Next.js (Turbopack) 0.497s 1.007s 0.510s 90 1.41x
🐘 Postgres Nitro 0.500s (+3.7%) 1.007s (~) 0.507s 90 1.41x
💻 Local Express 2.010s (-15.6% 🟢) 2.550s (-15.2% 🟢) 0.540s 36 5.68x
💻 Local Nitro 2.602s (+7.5% 🔺) 3.181s (+5.8% 🔺) 0.579s 29 7.36x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.829s (-10.7% 🟢) 4.502s (-1.9%) 1.673s 21 1.00x
▲ Vercel Nitro 2.925s (+3.1%) 4.341s (-4.0%) 1.416s 22 1.03x
▲ Vercel Next.js (Turbopack) 4.358s (+32.3% 🔺) 5.800s (+14.9% 🔺) 1.442s 16 1.54x

🔍 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 🥇 Express 0.566s (-27.5% 🟢) 1.006s (~) 0.440s 120 1.00x
🐘 Postgres Next.js (Turbopack) 0.792s 1.007s 0.215s 120 1.40x
🐘 Postgres Nitro 0.825s (+2.8%) 1.010s (~) 0.185s 119 1.46x
💻 Local Express 8.719s (-14.4% 🟢) 9.200s (-13.9% 🟢) 0.481s 14 15.41x
💻 Local Nitro 10.662s (+3.3%) 11.119s (+2.4%) 0.457s 11 18.85x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.587s (-59.7% 🟢) 8.269s (-54.6% 🟢) 1.682s 15 1.00x
▲ Vercel Express 7.299s (-3.1%) 9.000s (-1.4%) 1.701s 14 1.11x
▲ Vercel Nitro 8.249s (+15.5% 🔺) 9.780s (+13.2% 🔺) 1.531s 13 1.25x

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

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.155s (-27.6% 🟢) 1.000s (+0.8%) 0.001s (-33.3% 🟢) 1.009s (~) 0.854s 10 1.00x
💻 Local Express 0.193s (+39.5% 🔺) 1.003s (~) 0.008s (-21.4% 🟢) 1.013s (~) 0.819s 10 1.25x
🐘 Postgres Next.js (Turbopack) 0.201s 1.001s 0.001s 1.012s 0.811s 10 1.30x
💻 Local Nitro 0.208s (+44.0% 🔺) 1.004s (~) 0.010s (+4.1%) 1.017s (~) 0.808s 10 1.35x
🐘 Postgres Nitro 0.210s (+1.1%) 0.998s (~) 0.001s (+62.5% 🔺) 1.011s (~) 0.801s 10 1.36x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.622s (+3.4%) 2.800s (-10.5% 🟢) 1.225s (+49.7% 🔺) 4.469s (-0.5%) 2.846s 10 1.00x
▲ Vercel Express 1.648s (+6.3% 🔺) 3.171s (+9.1% 🔺) 0.851s (-19.1% 🟢) 4.525s (+4.7%) 2.877s 10 1.02x
▲ Vercel Next.js (Turbopack) 1.700s (+9.8% 🔺) 3.203s (+5.0%) 0.898s (+1.4%) 4.548s (+2.9%) 2.848s 10 1.05x

🔍 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 🥇 Express 0.488s (-20.4% 🟢) 1.007s (-1.2%) 0.004s (+16.6% 🔺) 1.020s (-1.6%) 0.532s 59 1.00x
💻 Local Express 0.619s (-20.3% 🟢) 1.010s (~) 0.007s (-26.0% 🟢) 1.018s (-17.0% 🟢) 0.399s 59 1.27x
🐘 Postgres Next.js (Turbopack) 0.632s 1.009s 0.006s 1.025s 0.393s 59 1.29x
🐘 Postgres Nitro 0.637s (+3.7%) 1.004s (~) 0.004s (+5.3% 🔺) 1.024s (~) 0.387s 59 1.30x
💻 Local Nitro 0.761s (-2.6%) 1.012s (~) 0.009s (+4.7%) 1.023s (-16.5% 🟢) 0.262s 59 1.56x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.277s (+2.2%) 5.450s (-2.0%) 0.301s (+35.3% 🔺) 6.120s (-1.3%) 1.842s 10 1.00x
▲ Vercel Express 4.538s (+6.0% 🔺) 6.074s (+11.9% 🔺) 0.203s (+9.5% 🔺) 6.703s (+11.4% 🔺) 2.164s 9 1.06x
▲ Vercel Next.js (Turbopack) 4.900s (+4.1%) 6.441s (+7.2% 🔺) 0.217s (-26.1% 🟢) 7.090s (+5.0% 🔺) 2.191s 9 1.15x

🔍 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 🥇 Express 0.903s (-4.8%) 1.070s (-4.7%) 0.000s (+183.9% 🔺) 1.078s (-6.2% 🟢) 0.175s 56 1.00x
🐘 Postgres Next.js (Turbopack) 0.956s 1.205s 0.000s 1.229s 0.273s 49 1.06x
🐘 Postgres Nitro 0.991s (+4.2%) 1.367s (+21.9% 🔺) 0.000s (+Infinity% 🔺) 1.397s (+23.0% 🔺) 0.406s 43 1.10x
💻 Local Express 1.055s (-7.6% 🟢) 1.683s (-16.6% 🟢) 0.000s (-27.1% 🟢) 1.685s (-16.6% 🟢) 0.630s 36 1.17x
💻 Local Nitro 1.248s (+5.5% 🔺) 2.022s (~) 0.000s (+100.0% 🔺) 2.024s (~) 0.776s 30 1.38x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.281s (+8.4% 🔺) 4.925s (+18.2% 🔺) 0.000s (-100.0% 🟢) 5.344s (+18.1% 🔺) 2.063s 12 1.00x
▲ Vercel Next.js (Turbopack) 3.580s (-13.4% 🟢) 5.028s (-9.4% 🟢) 0.016s (+Infinity% 🔺) 5.502s (-8.7% 🟢) 1.922s 12 1.09x
▲ Vercel Nitro 53.752s (+1715.2% 🔺) 54.990s (+1159.1% 🔺) 0.000s (-100.0% 🟢) 55.328s (+1058.0% 🔺) 1.575s 6 16.38x

🔍 Observability: Express | Next.js (Turbopack) | 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.643s (-6.1% 🟢) 2.069s (-1.5%) 0.000s (-50.0% 🟢) 2.077s (-1.7%) 0.433s 29 1.00x
🐘 Postgres Nitro 1.794s (+4.9%) 2.103s (+1.6%) 0.000s (-50.0% 🟢) 2.118s (~) 0.323s 29 1.09x
🐘 Postgres Next.js (Turbopack) 1.889s 2.173s 0.000s 2.189s 0.300s 28 1.15x
💻 Local Express 2.987s (-12.9% 🟢) 3.363s (-13.9% 🟢) 0.000s (-36.5% 🟢) 3.366s (-13.9% 🟢) 0.379s 18 1.82x
💻 Local Nitro 3.507s (+1.3%) 4.099s (~) 0.001s (+25.0% 🔺) 4.102s (~) 0.595s 15 2.13x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.589s (+5.4% 🔺) 6.087s (+14.3% 🔺) 0.000s (-96.4% 🟢) 6.529s (+14.3% 🔺) 1.940s 10 1.00x
▲ Vercel Next.js (Turbopack) 4.768s (-3.1%) 6.189s (-0.6%) 0.000s (-95.5% 🟢) 6.736s (+0.6%) 1.968s 9 1.04x
▲ Vercel Nitro 5.218s (+23.8% 🔺) 6.184s (+14.8% 🔺) 0.001s (+10.0% 🔺) 6.565s (+13.7% 🔺) 1.347s 10 1.14x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

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

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

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.

7 participants