Skip to content

fix(web-shared): type Tailwind trace viewer duration utility#2006

Open
tomdale wants to merge 1 commit into
mainfrom
tomdale/web-shared-tailwind-duration
Open

fix(web-shared): type Tailwind trace viewer duration utility#2006
tomdale wants to merge 1 commit into
mainfrom
tomdale/web-shared-tailwind-duration

Conversation

@tomdale
Copy link
Copy Markdown
Contributor

@tomdale tomdale commented May 15, 2026

Summary

@workflow/web-shared ships the trace viewer controls that downstream apps may include in their Tailwind content scan. The zoom controls used duration-[120ms], which Tailwind v3 can treat as an ambiguous arbitrary utility when scanning the package.

This PR changes those controls to duration-[time:120ms], preserving the same transition duration while giving Tailwind an explicit type hint. It also adds a patch changeset for @workflow/web-shared.

Verification

  • rg -n "duration-\[(?!time:)|ease-\[(?!easing-function:)" --pcre2 packages/web-shared/src
  • git diff --check
  • pnpm --filter @workflow/web-shared lint (blocked by existing unrelated Biome diagnostics in web-shared)
  • pnpm --filter @workflow/web-shared typecheck (blocked by existing unrelated attribute-panel.tsx type error)

Use Tailwind's typed arbitrary duration syntax for trace viewer zoom controls so Tailwind v3 consumers do not emit ambiguous utility warnings when scanning the package.
@tomdale tomdale requested a review from a team as a code owner May 15, 2026 19:26
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 15, 2026

🦋 Changeset detected

Latest commit: 4354482

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

This PR includes changesets to release 18 packages
Name Type
@workflow/web-shared Patch
@workflow/web Patch
tarballs Patch
@workflow/cli Patch
workflow Patch
@workflow/world-testing Patch
@workflow/ai Patch
@workflow/core Patch
@workflow/builders Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest 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 May 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 May 15, 2026 7:29pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 15, 2026 7:29pm
example-workflow Ready Ready Preview, Comment May 15, 2026 7:29pm
workbench-astro-workflow Ready Ready Preview, Comment May 15, 2026 7:29pm
workbench-express-workflow Ready Ready Preview, Comment May 15, 2026 7:29pm
workbench-fastify-workflow Ready Ready Preview, Comment May 15, 2026 7:29pm
workbench-hono-workflow Ready Ready Preview, Comment May 15, 2026 7:29pm
workbench-nitro-workflow Ready Ready Preview, Comment May 15, 2026 7:29pm
workbench-nuxt-workflow Ready Ready Preview, Comment May 15, 2026 7:29pm
workbench-sveltekit-workflow Ready Ready Preview, Comment May 15, 2026 7:29pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 15, 2026 7:29pm
workbench-vite-workflow Ready Ready Preview, Comment May 15, 2026 7:29pm
workflow-docs Ready Ready Preview, Comment, Open in v0 May 15, 2026 7:29pm
workflow-swc-playground Ready Ready Preview, Comment May 15, 2026 7:29pm
workflow-tarballs Ready Ready Preview, Comment May 15, 2026 7:29pm
workflow-web Ready Ready Preview, Comment May 15, 2026 7:29pm

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 15, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 1199 1 219 1419
✅ 💻 Local Development 1587 0 219 1806
✅ 📦 Local Production 1587 0 219 1806
❌ 🐘 Local Postgres 1585 2 219 1806
✅ 🪟 Windows 129 0 0 129
✅ 📋 Other 727 0 176 903
Total 6814 3 1052 7869

❌ Failed Tests

▲ Vercel Production (1 failed)

nextjs-webpack (1 failed):

  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
🐘 Local Postgres (2 failed)

nextjs-turbopack-stable-lazy-discovery-enabled (1 failed):

  • addTenWorkflow | wrun_01KRPHQY61S9329ZS9KEW1ESKY

nextjs-webpack-stable-lazy-discovery-enabled (1 failed):

  • addTenWorkflow | wrun_01KRPHQY61S9329ZS9KEW1ESKY

Details by Category

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

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 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.031s (-30.0% 🟢) 1.005s (~) 0.974s 10 1.00x
💻 Local Nitro 0.034s (-21.1% 🟢) 1.005s (~) 0.971s 10 1.10x
💻 Local Next.js (Turbopack) 0.048s 1.005s 0.958s 10 1.54x
🐘 Postgres Express 0.050s (-13.4% 🟢) 1.011s (~) 0.961s 10 1.62x
🐘 Postgres Nitro 0.055s (-42.3% 🟢) 1.013s (-2.9%) 0.958s 10 1.77x
🐘 Postgres Next.js (Turbopack) 0.057s 1.012s 0.956s 10 1.82x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.404s (-1.4%) 2.498s (~) 2.095s 10 1.00x
▲ Vercel Next.js (Turbopack) 0.404s (+60.6% 🔺) 2.533s (+8.6% 🔺) 2.129s 10 1.00x
▲ Vercel Express 0.623s (+164.5% 🔺) 2.544s (+19.1% 🔺) 1.922s 10 1.54x

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

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.068s (-5.6% 🟢) 2.006s (~) 0.937s 10 1.00x
💻 Local Express 1.071s (-4.9%) 2.006s (~) 0.935s 10 1.00x
🐘 Postgres Express 1.081s (-5.7% 🟢) 2.009s (~) 0.928s 10 1.01x
🐘 Postgres Nitro 1.088s (-4.5%) 2.010s (~) 0.921s 10 1.02x
🐘 Postgres Next.js (Turbopack) 1.120s 2.009s 0.889s 10 1.05x
💻 Local Next.js (Turbopack) 1.125s 2.005s 0.880s 10 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.620s (-13.6% 🟢) 3.870s (+1.6%) 2.250s 10 1.00x
▲ Vercel Nitro 1.625s (-58.2% 🟢) 3.552s (-39.9% 🟢) 1.926s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.693s (-16.8% 🟢) 3.595s (-6.1% 🟢) 1.902s 10 1.05x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.386s (-5.1% 🟢) 11.021s (~) 0.635s 3 1.00x
🐘 Postgres Express 10.404s (-5.1% 🟢) 11.015s (~) 0.611s 3 1.00x
💻 Local Express 10.424s (-4.6%) 11.021s (~) 0.597s 3 1.00x
🐘 Postgres Nitro 10.444s (-3.9%) 11.020s (~) 0.576s 3 1.01x
💻 Local Next.js (Turbopack) 10.674s 11.021s 0.348s 3 1.03x
🐘 Postgres Next.js (Turbopack) 10.736s 11.018s 0.282s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 13.409s (-22.6% 🟢) 15.234s (-21.5% 🟢) 1.825s 2 1.00x
▲ Vercel Nitro 13.621s (-42.6% 🟢) 15.280s (-39.2% 🟢) 1.659s 2 1.02x
▲ Vercel Express 14.008s (-17.5% 🟢) 16.185s (-19.2% 🟢) 2.177s 2 1.04x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 13.433s (-10.8% 🟢) 14.026s (-12.5% 🟢) 0.593s 5 1.00x
🐘 Postgres Express 13.441s (-7.8% 🟢) 14.019s (-6.7% 🟢) 0.578s 5 1.00x
💻 Local Express 13.453s (-10.1% 🟢) 14.026s (-6.7% 🟢) 0.572s 5 1.00x
🐘 Postgres Nitro 13.621s (-6.7% 🟢) 14.020s (-6.7% 🟢) 0.400s 5 1.01x
💻 Local Next.js (Turbopack) 14.086s 15.029s 0.943s 4 1.05x
🐘 Postgres Next.js (Turbopack) 14.117s 15.015s 0.898s 4 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 21.309s (-59.5% 🟢) 23.408s (-57.1% 🟢) 2.099s 3 1.00x
▲ Vercel Nitro 21.682s (-66.4% 🟢) 23.667s (-64.5% 🟢) 1.985s 3 1.02x
▲ Vercel Express 21.813s (-56.6% 🟢) 24.174s (-54.0% 🟢) 2.361s 3 1.02x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 11.872s (-29.3% 🟢) 12.021s (-29.4% 🟢) 0.150s 8 1.00x
💻 Local Express 11.917s (-28.2% 🟢) 12.149s (-28.7% 🟢) 0.232s 8 1.00x
🐘 Postgres Express 11.935s (-14.8% 🟢) 12.393s (-15.1% 🟢) 0.458s 8 1.01x
🐘 Postgres Nitro 12.093s (-13.4% 🟢) 12.518s (-12.5% 🟢) 0.426s 8 1.02x
💻 Local Next.js (Turbopack) 13.088s 13.739s 0.651s 7 1.10x
🐘 Postgres Next.js (Turbopack) 13.107s 14.013s 0.907s 7 1.10x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 33.601s (-91.5% 🟢) 35.213s (-91.1% 🟢) 1.612s 3 1.00x
▲ Vercel Express 34.848s (-71.3% 🟢) 37.215s (-69.9% 🟢) 2.368s 3 1.04x
▲ Vercel Nitro 35.151s (-91.7% 🟢) 37.422s (-91.2% 🟢) 2.271s 3 1.05x

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

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.150s (-9.8% 🟢) 2.008s (~) 0.858s 15 1.00x
🐘 Postgres Express 1.150s (-8.7% 🟢) 2.009s (~) 0.859s 15 1.00x
💻 Local Nitro 1.178s (-27.8% 🟢) 2.006s (-3.3%) 0.828s 15 1.02x
💻 Local Express 1.181s (-20.7% 🟢) 2.006s (~) 0.825s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.211s 2.007s 0.796s 15 1.05x
💻 Local Next.js (Turbopack) 1.280s 2.005s 0.726s 15 1.11x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.819s (-1.4%) 4.585s (-0.8%) 1.765s 7 1.00x
▲ Vercel Next.js (Turbopack) 2.841s (-16.4% 🟢) 4.451s (-9.8% 🟢) 1.610s 7 1.01x
▲ Vercel Nitro 2.882s (+2.3%) 4.668s (+8.0% 🔺) 1.786s 7 1.02x

🔍 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 1.212s (-48.6% 🟢) 2.007s (-33.3% 🟢) 0.794s 15 1.00x
🐘 Postgres Nitro 1.225s (-47.9% 🟢) 2.007s (-33.3% 🟢) 0.781s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.330s 2.007s 0.676s 15 1.10x
💻 Local Next.js (Turbopack) 1.674s 2.072s 0.398s 15 1.38x
💻 Local Nitro 1.722s (-45.2% 🟢) 2.005s (-48.4% 🟢) 0.283s 15 1.42x
💻 Local Express 1.760s (-40.4% 🟢) 2.005s (-41.9% 🟢) 0.245s 15 1.45x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.780s (-46.8% 🟢) 5.407s (-39.3% 🟢) 1.628s 6 1.00x
▲ Vercel Express 5.055s (+39.7% 🔺) 6.605s (+29.2% 🔺) 1.550s 5 1.34x
▲ Vercel Nitro 5.319s (+31.3% 🔺) 7.388s (+24.8% 🔺) 2.069s 5 1.41x

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

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.317s (-62.2% 🟢) 2.007s (-50.0% 🟢) 0.690s 15 1.00x
🐘 Postgres Nitro 1.361s (-60.9% 🟢) 2.008s (-49.9% 🟢) 0.648s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.581s 2.007s 0.426s 15 1.20x
💻 Local Nitro 4.429s (-47.0% 🟢) 5.011s (-44.4% 🟢) 0.582s 6 3.36x
💻 Local Next.js (Turbopack) 4.759s 5.179s 0.420s 6 3.61x
💻 Local Express 5.152s (-38.2% 🟢) 5.346s (-40.8% 🟢) 0.194s 6 3.91x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 6.536s (+85.4% 🔺) 8.776s (+58.6% 🔺) 2.241s 4 1.00x
▲ Vercel Express 6.609s (+55.9% 🔺) 8.866s (+44.7% 🔺) 2.257s 4 1.01x
▲ Vercel Next.js (Turbopack) 7.450s (-16.4% 🟢) 9.326s (-14.9% 🟢) 1.876s 4 1.14x

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

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.140s (-9.3% 🟢) 2.008s (~) 0.868s 15 1.00x
🐘 Postgres Nitro 1.155s (-8.1% 🟢) 2.009s (~) 0.855s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.199s 2.007s 0.808s 15 1.05x
💻 Local Next.js (Turbopack) 1.304s 2.006s 0.702s 15 1.14x
💻 Local Express 1.414s (-25.3% 🟢) 2.006s (-15.1% 🟢) 0.591s 15 1.24x
💻 Local Nitro 1.420s (-23.9% 🟢) 2.006s (-14.3% 🟢) 0.586s 15 1.25x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.588s (+5.3% 🔺) 4.464s (+7.1% 🔺) 1.875s 7 1.00x
▲ Vercel Express 2.604s (+0.9%) 4.339s (~) 1.734s 8 1.01x
▲ Vercel Next.js (Turbopack) 2.657s (-9.4% 🟢) 4.157s (-10.4% 🟢) 1.500s 8 1.03x

🔍 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 1.211s (-48.3% 🟢) 2.008s (-33.3% 🟢) 0.797s 15 1.00x
🐘 Postgres Nitro 1.233s (-47.3% 🟢) 2.008s (-33.3% 🟢) 0.775s 15 1.02x
🐘 Postgres Next.js (Turbopack) 1.331s 2.008s 0.677s 15 1.10x
💻 Local Nitro 1.941s (-36.7% 🟢) 2.392s (-38.4% 🟢) 0.452s 13 1.60x
💻 Local Next.js (Turbopack) 2.004s 2.392s 0.388s 13 1.65x
💻 Local Express 2.109s (-32.7% 🟢) 2.591s (-31.1% 🟢) 0.482s 12 1.74x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.989s (+23.4% 🔺) 5.723s (+12.7% 🔺) 1.734s 6 1.00x
▲ Vercel Next.js (Turbopack) 4.081s (+29.9% 🔺) 5.712s (+26.3% 🔺) 1.631s 6 1.02x
▲ Vercel Express 4.615s (+44.6% 🔺) 6.541s (+36.5% 🔺) 1.926s 5 1.16x

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

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.329s (-62.0% 🟢) 2.008s (-49.9% 🟢) 0.679s 15 1.00x
🐘 Postgres Nitro 1.381s (-60.3% 🟢) 2.008s (-49.9% 🟢) 0.626s 15 1.04x
🐘 Postgres Next.js (Turbopack) 1.615s 2.007s 0.392s 15 1.21x
💻 Local Next.js (Turbopack) 5.180s 5.680s 0.500s 6 3.90x
💻 Local Nitro 5.497s (-39.9% 🟢) 6.014s (-40.0% 🟢) 0.517s 5 4.14x
💻 Local Express 5.541s (-37.0% 🟢) 6.016s (-35.1% 🟢) 0.475s 5 4.17x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.181s (-19.3% 🟢) 7.271s (-11.1% 🟢) 2.090s 5 1.00x
▲ Vercel Nitro 5.672s (+11.4% 🔺) 7.511s (+10.2% 🔺) 1.839s 4 1.09x
▲ Vercel Next.js (Turbopack) 6.487s (-4.0%) 8.127s (-4.9%) 1.640s 4 1.25x

🔍 Observability: Express | Nitro | 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.425s (-49.4% 🟢) 1.023s (~) 0.599s 59 1.00x
💻 Local Nitro 0.457s (-53.4% 🟢) 1.003s (-8.3% 🟢) 0.547s 60 1.08x
💻 Local Express 0.471s (-52.1% 🟢) 1.004s (-6.7% 🟢) 0.532s 60 1.11x
🐘 Postgres Nitro 0.493s (-39.9% 🟢) 1.007s (~) 0.514s 60 1.16x
🐘 Postgres Next.js (Turbopack) 0.664s 1.006s 0.342s 60 1.57x
💻 Local Next.js (Turbopack) 0.731s 1.004s 0.273s 60 1.72x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.912s (-74.2% 🟢) 6.528s (-69.4% 🟢) 1.615s 10 1.00x
▲ Vercel Nitro 5.024s (-77.2% 🟢) 6.507s (-72.9% 🟢) 1.482s 10 1.02x
▲ Vercel Next.js (Turbopack) 5.033s (-65.3% 🟢) 6.530s (-59.4% 🟢) 1.497s 10 1.02x

🔍 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.087s (-45.0% 🟢) 1.632s (-27.7% 🟢) 0.544s 56 1.00x
🐘 Postgres Nitro 1.143s (-40.7% 🟢) 1.986s (-5.5% 🟢) 0.843s 46 1.05x
💻 Local Nitro 1.152s (-62.0% 🟢) 2.005s (-46.7% 🟢) 0.853s 45 1.06x
💻 Local Express 1.179s (-60.9% 🟢) 2.006s (-44.1% 🟢) 0.827s 45 1.08x
🐘 Postgres Next.js (Turbopack) 1.570s 2.007s 0.438s 45 1.44x
💻 Local Next.js (Turbopack) 1.796s 2.006s 0.210s 45 1.65x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 13.770s (-72.3% 🟢) 15.438s (-70.1% 🟢) 1.668s 6 1.00x
▲ Vercel Express 13.813s (-60.0% 🟢) 16.069s (-56.3% 🟢) 2.256s 6 1.00x
▲ Vercel Nitro 13.843s (-64.9% 🟢) 15.974s (-61.3% 🟢) 2.131s 6 1.01x

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

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.010s (-49.6% 🟢) 2.354s (-46.1% 🟢) 0.344s 52 1.00x
🐘 Postgres Nitro 2.172s (-47.1% 🟢) 2.960s (-35.7% 🟢) 0.788s 41 1.08x
💻 Local Nitro 2.611s (-71.9% 🟢) 3.007s (-70.0% 🟢) 0.396s 40 1.30x
💻 Local Express 2.693s (-70.8% 🟢) 3.007s (-70.0% 🟢) 0.314s 40 1.34x
🐘 Postgres Next.js (Turbopack) 3.071s 4.009s 0.938s 30 1.53x
💻 Local Next.js (Turbopack) 3.834s 4.108s 0.274s 30 1.91x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 41.178s (-61.6% 🟢) 43.462s (-60.1% 🟢) 2.283s 3 1.00x
▲ Vercel Nitro 42.570s (-56.1% 🟢) 45.118s (-54.2% 🟢) 2.548s 3 1.03x
▲ Vercel Express 190.625s (+46.6% 🔺) 193.152s (+46.1% 🔺) 2.527s 2 4.63x

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

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.177s (-37.3% 🟢) 1.006s (~) 0.829s 60 1.00x
🐘 Postgres Nitro 0.192s (-32.3% 🟢) 1.006s (~) 0.815s 60 1.08x
🐘 Postgres Next.js (Turbopack) 0.221s 1.006s 0.785s 60 1.25x
💻 Local Nitro 0.422s (-30.3% 🟢) 1.004s (-1.7%) 0.583s 60 2.38x
💻 Local Express 0.426s (-24.0% 🟢) 1.004s (~) 0.578s 60 2.41x
💻 Local Next.js (Turbopack) 0.593s 1.004s 0.412s 60 3.34x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.463s (+26.0% 🔺) 4.040s (+11.1% 🔺) 1.577s 16 1.00x
▲ Vercel Nitro 2.845s (+71.3% 🔺) 4.618s (+37.8% 🔺) 1.772s 14 1.16x
▲ Vercel Next.js (Turbopack) 22.756s (+1025.1% 🔺) 24.523s (+546.4% 🔺) 1.767s 15 9.24x

🔍 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.293s (-42.5% 🟢) 1.006s (~) 0.713s 90 1.00x
🐘 Postgres Nitro 0.320s (-35.5% 🟢) 1.007s (~) 0.687s 90 1.09x
🐘 Postgres Next.js (Turbopack) 0.424s 1.006s 0.582s 90 1.45x
💻 Local Express 2.185s (-13.1% 🟢) 2.884s (-4.2%) 0.699s 32 7.46x
💻 Local Nitro 2.214s (-12.8% 🟢) 2.820s (-6.3% 🟢) 0.607s 32 7.56x
💻 Local Next.js (Turbopack) 2.233s 2.944s 0.712s 31 7.62x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 7.194s (+136.2% 🔺) 8.948s (+86.1% 🔺) 1.753s 11 1.00x
▲ Vercel Next.js (Turbopack) 8.309s (+135.0% 🔺) 9.977s (+92.1% 🔺) 1.668s 10 1.15x
▲ Vercel Nitro 8.525s (+164.3% 🔺) 10.497s (+117.7% 🔺) 1.972s 9 1.18x

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

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.604s (-26.3% 🟢) 1.006s (-1.1%) 0.402s 120 1.00x
🐘 Postgres Nitro 0.643s (-18.6% 🟢) 1.006s (~) 0.363s 120 1.07x
🐘 Postgres Next.js (Turbopack) 0.870s 1.031s 0.161s 117 1.44x
💻 Local Nitro 9.570s (-14.5% 🟢) 10.108s (-13.3% 🟢) 0.538s 12 15.86x
💻 Local Express 10.140s (-9.4% 🟢) 10.693s (-10.4% 🟢) 0.553s 12 16.80x
💻 Local Next.js (Turbopack) 10.712s 11.389s 0.677s 11 17.75x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 22.795s (+195.2% 🔺) 24.614s (+161.8% 🔺) 1.819s 5 1.00x
▲ Vercel Express 23.569s (+217.6% 🔺) 25.177s (+172.4% 🔺) 1.608s 5 1.03x
▲ Vercel Next.js (Turbopack) 27.699s (+168.2% 🔺) 29.581s (+140.8% 🔺) 1.882s 5 1.22x

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

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.132s (+429.6% 🔺) 2.005s (+99.6% 🔺) 0.012s (-7.2% 🟢) 2.018s (+98.1% 🔺) 0.887s 10 1.00x
💻 Local Express 1.133s (+469.3% 🔺) 2.005s (+99.6% 🔺) 0.012s (+0.8%) 2.019s (+98.3% 🔺) 0.886s 10 1.00x
🐘 Postgres Express 1.141s (+456.5% 🔺) 1.997s (+100.0% 🔺) 0.001s (-25.0% 🟢) 2.011s (+98.8% 🔺) 0.869s 10 1.01x
🐘 Postgres Nitro 1.145s (+458.5% 🔺) 2.001s (+100.2% 🔺) 0.002s (+33.3% 🔺) 2.012s (+99.0% 🔺) 0.867s 10 1.01x
💻 Local Next.js (Turbopack) 1.170s 2.003s 0.010s 2.017s 0.847s 10 1.03x
🐘 Postgres Next.js (Turbopack) 1.204s 2.002s 0.002s 2.011s 0.807s 10 1.06x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.263s (-9.7% 🟢) 3.314s (-19.0% 🟢) 1.975s (+105.5% 🔺) 5.794s (+3.6%) 3.531s 10 1.00x
▲ Vercel Nitro 2.266s (-40.9% 🟢) 3.230s (-38.8% 🟢) 2.380s (+220.8% 🔺) 6.134s (-5.4% 🟢) 3.868s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.284s (-66.7% 🟢) 3.131s (-63.8% 🟢) 2.301s (+264.1% 🔺) 5.942s (-39.3% 🟢) 3.658s 10 1.01x

🔍 Observability: Express | Nitro | 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 1.515s (+140.4% 🔺) 2.002s (+99.0% 🔺) 0.004s (+0.9%) 2.024s (+97.9% 🔺) 0.510s 30 1.00x
💻 Local Express 1.534s (+102.6% 🔺) 2.011s (+95.4% 🔺) 0.009s (-4.0%) 2.022s (+94.4% 🔺) 0.488s 30 1.01x
🐘 Postgres Nitro 1.568s (+151.3% 🔺) 2.006s (+99.3% 🔺) 0.004s (-4.9%) 2.025s (+98.1% 🔺) 0.457s 30 1.04x
🐘 Postgres Next.js (Turbopack) 1.650s 2.011s 0.004s 2.025s 0.375s 30 1.09x
💻 Local Next.js (Turbopack) 1.661s 2.010s 0.009s 2.022s 0.362s 30 1.10x
💻 Local Nitro 1.697s (+102.4% 🔺) 2.011s (+98.7% 🔺) 0.009s (-2.8%) 2.201s (+97.3% 🔺) 0.504s 28 1.12x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.826s (-10.4% 🟢) 7.109s (-11.3% 🟢) 0.241s (-40.9% 🟢) 7.834s (-11.3% 🟢) 2.008s 8 1.00x
▲ Vercel Nitro 6.164s (-79.1% 🟢) 8.148s (-73.6% 🟢) 0.219s (+95.4% 🔺) 8.855s (-72.1% 🟢) 2.690s 7 1.06x
▲ Vercel Next.js (Turbopack) 6.254s (-63.0% 🟢) 7.572s (-58.5% 🟢) 0.237s (+12.1% 🔺) 8.292s (-56.2% 🟢) 2.038s 8 1.07x

🔍 Observability: Express | Nitro | 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.645s (-32.9% 🟢) 1.009s (-21.1% 🟢) 0.000s (-20.7% 🟢) 1.044s (-20.0% 🟢) 0.399s 58 1.00x
🐘 Postgres Nitro 0.705s (-27.2% 🟢) 1.050s (-15.8% 🟢) 0.000s (-15.8% 🟢) 1.061s (-15.7% 🟢) 0.355s 57 1.09x
🐘 Postgres Next.js (Turbopack) 0.761s 1.053s 0.000s 1.060s 0.299s 57 1.18x
💻 Local Nitro 1.297s (+6.1% 🔺) 2.015s (~) 0.001s (+500.0% 🔺) 2.017s (~) 0.720s 30 2.01x
💻 Local Express 1.345s (+9.8% 🔺) 2.015s (~) 0.001s (+50.0% 🔺) 2.017s (~) 0.672s 30 2.09x
💻 Local Next.js (Turbopack) 1.406s 2.013s 0.000s 2.016s 0.610s 30 2.18x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.702s (-1.0%) 4.919s (-3.6%) 0.000s (-100.0% 🟢) 5.414s (-2.1%) 1.711s 12 1.00x
▲ Vercel Next.js (Turbopack) 4.092s (-59.8% 🟢) 5.490s (-52.3% 🟢) 0.000s (NaN%) 5.965s (-50.5% 🟢) 1.873s 11 1.11x
▲ Vercel Nitro 4.153s (+36.1% 🔺) 5.746s (+30.8% 🔺) 0.001s (+940.0% 🔺) 6.214s (+29.2% 🔺) 2.061s 10 1.12x

🔍 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.302s (-26.5% 🟢) 2.025s (-7.0% 🟢) 0.000s (+Infinity% 🔺) 2.063s (-6.2% 🟢) 0.762s 30 1.00x
🐘 Postgres Nitro 1.369s (-23.6% 🟢) 2.100s (-1.9%) 0.000s (-100.0% 🟢) 2.114s (-2.8%) 0.744s 29 1.05x
🐘 Postgres Next.js (Turbopack) 1.521s 2.183s 0.000s 2.190s 0.669s 28 1.17x
💻 Local Next.js (Turbopack) 3.033s 3.264s 0.000s 3.562s 0.529s 17 2.33x
💻 Local Nitro 3.035s (-10.4% 🟢) 3.550s (-11.9% 🟢) 0.000s (-22.8% 🟢) 3.562s (-11.7% 🟢) 0.527s 17 2.33x
💻 Local Express 3.105s (-10.5% 🟢) 3.904s (-3.2%) 0.001s (-29.7% 🟢) 3.907s (-3.2%) 0.802s 16 2.39x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.879s (+43.6% 🔺) 7.378s (+37.3% 🔺) 0.000s (-54.2% 🟢) 7.921s (+36.7% 🔺) 2.042s 8 1.00x
▲ Vercel Express 6.443s (+40.4% 🔺) 7.801s (+29.5% 🔺) 0.000s (NaN%) 8.353s (+29.4% 🔺) 1.910s 8 1.10x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 17/21
Next.js (Turbopack) 🐘 Postgres 16/21
Nitro 🐘 Postgres 14/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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants