Skip to content

Split tarball hosting out of docs into its own project#1893

Merged
VaguelySerious merged 5 commits into
mainfrom
peter/split-tarballs-from-docs
May 4, 2026
Merged

Split tarball hosting out of docs into its own project#1893
VaguelySerious merged 5 commits into
mainfrom
peter/split-tarballs-from-docs

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious commented May 2, 2026

Summary

The docs project was incidentally hosting preview tarballs because of a prebuild step that ran scripts/pack.ts and dumped *.tgz into docs/public/. This PR moves all of that into a new top-level tarballs/ workspace package that deploys as its own static Vercel project.

Follow-up (manual, not in this PR)

  • Create the workflow-tarballs Vercel project linked to tarballs/ (no framework preset; outputDirectory: public; install command runs at the repo root for the workspace). The new CI workflow's project-slug: workflow-tarballs depends on this.
  • Once the new deployment URL is live, update the pre-release-testing snippet that points at https://workflow-docs-…vercel.sh/<pkg>.tgz to use the new host.

The docs project was incidentally hosting preview tarballs because of a
prebuild step that ran scripts/pack.ts and dumped *.tgz into
docs/public/. Move all of that — pack script, smoke checks, gitignore
entries, the .tgz proxy matcher exception — into a new top-level
`tarballs/` workspace package that deploys as its own static Vercel
project (framework: null, outputDirectory: public).

Also fix a long-standing oddity in pack.ts where restoring the
package.json after `pnpm pack` dropped the trailing newline because
the original was rebuilt with JSON.stringify rather than the source
bytes. The new version stores the raw original content and writes it
back verbatim.

Adds .github/workflows/tarballs-checks.yml that waits for the
workflow-tarballs Vercel project and runs the new smoke script.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 2, 2026

🦋 Changeset detected

Latest commit: 76406b5

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

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

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 2, 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 3, 2026 7:06am
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 3, 2026 7:06am
example-workflow Ready Ready Preview, Comment May 3, 2026 7:06am
workbench-astro-workflow Ready Ready Preview, Comment May 3, 2026 7:06am
workbench-express-workflow Ready Ready Preview, Comment May 3, 2026 7:06am
workbench-fastify-workflow Ready Ready Preview, Comment May 3, 2026 7:06am
workbench-hono-workflow Ready Ready Preview, Comment May 3, 2026 7:06am
workbench-nitro-workflow Ready Ready Preview, Comment May 3, 2026 7:06am
workbench-nuxt-workflow Ready Ready Preview, Comment May 3, 2026 7:06am
workbench-sveltekit-workflow Ready Ready Preview, Comment May 3, 2026 7:06am
workbench-vite-workflow Ready Ready Preview, Comment May 3, 2026 7:06am
workflow-docs Ready Ready Preview, Comment, Open in v0 May 3, 2026 7:06am
workflow-swc-playground Ready Ready Preview, Comment May 3, 2026 7:06am
workflow-web Ready Ready Preview, Comment May 3, 2026 7:06am

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 2, 2026

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1011 0 67 1078
✅ 💻 Local Development 1090 0 86 1176
✅ 📦 Local Production 1090 0 86 1176
✅ 🐘 Local Postgres 1090 0 86 1176
✅ 🪟 Windows 98 0 0 98
✅ 📋 Other 276 0 18 294
Total 4655 0 343 4998

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 91 0 7
✅ example 91 0 7
✅ express 91 0 7
✅ fastify 91 0 7
✅ hono 91 0 7
✅ nextjs-turbopack 96 0 2
✅ nextjs-webpack 96 0 2
✅ nitro 91 0 7
✅ nuxt 91 0 7
✅ sveltekit 91 0 7
✅ vite 91 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 92 0 6
✅ express-stable 92 0 6
✅ fastify-stable 92 0 6
✅ hono-stable 92 0 6
✅ nextjs-turbopack-canary 79 0 19
✅ nextjs-turbopack-stable 98 0 0
✅ nextjs-webpack-canary 79 0 19
✅ nextjs-webpack-stable 98 0 0
✅ nitro-stable 92 0 6
✅ nuxt-stable 92 0 6
✅ sveltekit-stable 92 0 6
✅ vite-stable 92 0 6
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 92 0 6
✅ express-stable 92 0 6
✅ fastify-stable 92 0 6
✅ hono-stable 92 0 6
✅ nextjs-turbopack-canary 79 0 19
✅ nextjs-turbopack-stable 98 0 0
✅ nextjs-webpack-canary 79 0 19
✅ nextjs-webpack-stable 98 0 0
✅ nitro-stable 92 0 6
✅ nuxt-stable 92 0 6
✅ sveltekit-stable 92 0 6
✅ vite-stable 92 0 6
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 92 0 6
✅ express-stable 92 0 6
✅ fastify-stable 92 0 6
✅ hono-stable 92 0 6
✅ nextjs-turbopack-canary 79 0 19
✅ nextjs-turbopack-stable 98 0 0
✅ nextjs-webpack-canary 79 0 19
✅ nextjs-webpack-stable 98 0 0
✅ nitro-stable 92 0 6
✅ nuxt-stable 92 0 6
✅ sveltekit-stable 92 0 6
✅ vite-stable 92 0 6
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 98 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 92 0 6
✅ e2e-local-postgres-nest-stable 92 0 6
✅ e2e-local-prod-nest-stable 92 0 6

📋 View full workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 2, 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 🥇 Nitro 0.041s (-4.2%) 1.005s (~) 0.964s 10 1.00x
💻 Local Express 0.044s (~) 1.006s (~) 0.961s 10 1.07x
🐘 Postgres Express 0.061s (+5.0%) 1.011s (~) 0.950s 10 1.47x
🐘 Postgres Nitro 0.062s (-35.1% 🟢) 1.010s (-3.2%) 0.948s 10 1.50x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.209s (-11.1% 🟢) 1.790s (-16.2% 🟢) 1.581s 10 1.00x
▲ Vercel Nitro 0.245s (-40.1% 🟢) 2.381s (-5.1% 🟢) 2.136s 10 1.17x
▲ Vercel Next.js (Turbopack) 0.493s (+96.2% 🔺) 2.123s (-9.0% 🟢) 1.630s 10 2.36x

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

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.130s (~) 2.006s (~) 0.876s 10 1.00x
💻 Local Express 1.133s (+0.7%) 2.006s (~) 0.873s 10 1.00x
🐘 Postgres Express 1.150s (~) 2.010s (~) 0.860s 10 1.02x
🐘 Postgres Nitro 1.157s (+1.5%) 2.013s (~) 0.856s 10 1.02x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.881s (-51.7% 🟢) 3.929s (-33.5% 🟢) 2.048s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.936s (-4.9%) 4.539s (+18.5% 🔺) 2.603s 10 1.03x
▲ Vercel Express 2.002s (+6.8% 🔺) 3.942s (+3.5%) 1.940s 10 1.06x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 10.896s (~) 11.027s (~) 0.131s 3 1.00x
🐘 Postgres Express 10.925s (~) 11.022s (~) 0.096s 3 1.00x
💻 Local Nitro 10.926s (~) 11.023s (~) 0.097s 3 1.00x
💻 Local Express 10.945s (~) 11.026s (~) 0.081s 3 1.00x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 17.273s (+1.7%) 23.617s (+18.0% 🔺) 6.344s 2 1.00x
▲ Vercel Nitro 17.620s (-25.8% 🟢) 19.602s (-22.0% 🟢) 1.982s 2 1.02x
▲ Vercel Next.js (Turbopack) 18.267s (+5.5% 🔺) 20.644s (+6.4% 🔺) 2.377s 2 1.06x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 14.608s (~) 15.024s (~) 0.416s 4 1.00x
🐘 Postgres Express 14.697s (+0.8%) 15.023s (~) 0.326s 4 1.01x
💻 Local Nitro 14.974s (-0.6%) 15.030s (-6.2% 🟢) 0.056s 4 1.03x
💻 Local Express 15.085s (+0.8%) 16.037s (+6.7% 🔺) 0.952s 4 1.03x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 34.069s (-47.1% 🟢) 36.025s (-45.9% 🟢) 1.956s 2 1.00x
▲ Vercel Express 34.371s (-31.7% 🟢) 36.460s (-30.6% 🟢) 2.089s 2 1.01x
▲ Vercel Next.js (Turbopack) 35.372s (-32.7% 🟢) 37.834s (-30.7% 🟢) 2.462s 2 1.04x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 14.085s (+0.8%) 14.880s (+4.0%) 0.795s 7 1.00x
🐘 Postgres Express 14.385s (+2.7%) 15.022s (+2.9%) 0.637s 6 1.02x
💻 Local Nitro 16.368s (-2.5%) 17.029s (~) 0.661s 6 1.16x
💻 Local Express 17.004s (+2.4%) 17.533s (+2.9%) 0.529s 6 1.21x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 58.020s (-52.1% 🟢) 62.091s (-49.8% 🟢) 4.071s 2 1.00x
▲ Vercel Nitro 62.876s (-85.1% 🟢) 66.238s (-84.4% 🟢) 3.362s 2 1.08x
▲ Vercel Next.js (Turbopack) 64.767s (-83.5% 🟢) 66.550s (-83.2% 🟢) 1.782s 2 1.12x

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

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.268s (+0.6%) 2.010s (~) 0.741s 15 1.00x
🐘 Postgres Nitro 1.269s (~) 2.011s (~) 0.742s 15 1.00x
💻 Local Nitro 1.504s (-7.8% 🟢) 2.006s (-3.3%) 0.501s 15 1.19x
💻 Local Express 1.506s (+1.2%) 2.006s (~) 0.500s 15 1.19x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.473s (-27.2% 🟢) 4.591s (-6.9% 🟢) 2.118s 7 1.00x
▲ Vercel Express 2.667s (-6.8% 🟢) 4.775s (+3.3%) 2.109s 7 1.08x
▲ Vercel Nitro 2.780s (-1.3%) 4.900s (+13.4% 🔺) 2.120s 7 1.12x

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

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.334s (-0.7%) 3.009s (~) 0.675s 10 1.00x
🐘 Postgres Express 2.370s (~) 3.011s (~) 0.641s 10 1.02x
💻 Local Express 2.917s (-1.2%) 3.453s (~) 0.537s 9 1.25x
💻 Local Nitro 3.010s (-4.2%) 3.342s (-14.0% 🟢) 0.331s 9 1.29x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.475s (-38.9% 🟢) 4.113s (-30.5% 🟢) 1.638s 8 1.00x
▲ Vercel Express 2.801s (-22.6% 🟢) 4.522s (-11.5% 🟢) 1.721s 7 1.13x
▲ Vercel Next.js (Turbopack) 2.824s (-60.2% 🟢) 5.420s (-39.1% 🟢) 2.596s 6 1.14x

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

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.492s (~) 4.011s (~) 0.519s 8 1.00x
🐘 Postgres Nitro 3.493s (~) 4.009s (~) 0.516s 8 1.00x
💻 Local Nitro 7.258s (-13.1% 🟢) 8.019s (-11.1% 🟢) 0.761s 4 2.08x
💻 Local Express 8.421s (+1.0%) 9.022s (~) 0.601s 4 2.41x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.398s (-3.6%) 6.441s (+16.4% 🔺) 3.043s 5 1.00x
▲ Vercel Express 3.748s (-11.6% 🟢) 5.714s (-6.7% 🟢) 1.966s 6 1.10x
▲ Vercel Next.js (Turbopack) 3.942s (-55.8% 🟢) 5.897s (-46.2% 🟢) 1.955s 6 1.16x

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

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.252s (~) 2.008s (~) 0.756s 15 1.00x
🐘 Postgres Express 1.260s (~) 2.009s (~) 0.749s 15 1.01x
💻 Local Nitro 1.518s (-18.6% 🟢) 2.005s (-14.3% 🟢) 0.487s 15 1.21x
💻 Local Express 1.586s (-16.2% 🟢) 2.006s (-15.1% 🟢) 0.420s 15 1.27x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.257s (-23.0% 🟢) 4.484s (-3.4%) 2.226s 7 1.00x
▲ Vercel Express 2.442s (-5.4% 🟢) 4.439s (+2.1%) 1.997s 7 1.08x
▲ Vercel Nitro 3.165s (+28.7% 🔺) 5.352s (+28.4% 🔺) 2.187s 6 1.40x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.342s (~) 3.011s (~) 0.668s 10 1.00x
🐘 Postgres Express 2.371s (+1.3%) 3.011s (~) 0.639s 10 1.01x
💻 Local Nitro 3.010s (-1.8%) 3.454s (-11.1% 🟢) 0.444s 9 1.29x
💻 Local Express 3.117s (~) 4.011s (+6.6% 🔺) 0.894s 8 1.33x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.335s (-26.9% 🟢) 4.537s (-5.3% 🟢) 2.202s 7 1.00x
▲ Vercel Nitro 2.428s (-24.9% 🟢) 4.463s (-12.1% 🟢) 2.035s 7 1.04x
▲ Vercel Next.js (Turbopack) 2.897s (-7.8% 🟢) 15.296s (+238.3% 🔺) 12.399s 2 1.24x

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

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.488s (~) 4.011s (~) 0.523s 8 1.00x
🐘 Postgres Express 3.510s (~) 4.012s (~) 0.502s 8 1.01x
💻 Local Nitro 8.106s (-11.4% 🟢) 8.520s (-15.0% 🟢) 0.414s 4 2.32x
💻 Local Express 9.358s (+6.3% 🔺) 10.024s (+8.1% 🔺) 0.667s 3 2.68x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.776s (-45.5% 🟢) 13.696s (+100.9% 🔺) 10.920s 3 1.00x
▲ Vercel Express 2.839s (-55.8% 🟢) 7.862s (-3.9%) 5.023s 5 1.02x
▲ Vercel Next.js (Turbopack) 3.757s (-44.4% 🟢) 8.109s (-5.1% 🟢) 4.352s 5 1.35x

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

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.837s (+2.1%) 1.023s (+1.7%) 0.186s 59 1.00x
🐘 Postgres Express 0.852s (+1.5%) 1.006s (-1.6%) 0.155s 60 1.02x
💻 Local Nitro 1.005s (+2.4%) 1.468s (+34.2% 🔺) 0.464s 41 1.20x
💻 Local Express 1.010s (+2.7%) 1.584s (+47.3% 🔺) 0.574s 38 1.21x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 8.842s (-53.5% 🟢) 14.677s (-31.2% 🟢) 5.836s 5 1.00x
▲ Vercel Nitro 9.488s (-57.0% 🟢) 15.095s (-37.2% 🟢) 5.607s 4 1.07x
▲ Vercel Next.js (Turbopack) 9.553s (-34.1% 🟢) 14.404s (-10.4% 🟢) 4.851s 5 1.08x

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

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.965s (+1.9%) 2.204s (+4.9%) 0.239s 41 1.00x
🐘 Postgres Express 2.041s (+3.3%) 2.798s (+23.9% 🔺) 0.757s 33 1.04x
💻 Local Nitro 3.025s (~) 3.689s (-1.9%) 0.664s 25 1.54x
💻 Local Express 3.052s (+1.2%) 4.011s (+11.9% 🔺) 0.959s 23 1.55x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 28.450s (-17.6% 🟢) 34.648s (-5.9% 🟢) 6.199s 3 1.00x
▲ Vercel Nitro 29.355s (-25.7% 🟢) 39.049s (-5.4% 🟢) 9.694s 3 1.03x
▲ Vercel Next.js (Turbopack) 32.340s (-35.1% 🟢) 38.077s (-26.4% 🟢) 5.737s 3 1.14x

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

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 4.015s (-2.1%) 4.565s (-0.8%) 0.550s 27 1.00x
🐘 Postgres Express 4.143s (+3.8%) 4.972s (+13.8% 🔺) 0.829s 25 1.03x
💻 Local Nitro 8.989s (-3.3%) 9.556s (-4.6%) 0.567s 13 2.24x
💻 Local Express 9.172s (~) 9.788s (-2.3%) 0.616s 13 2.28x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 73.357s (-43.6% 🟢) 76.108s (-42.4% 🟢) 2.751s 2 1.00x
▲ Vercel Nitro 78.244s (-19.3% 🟢) 81.122s (-17.6% 🟢) 2.878s 2 1.07x
▲ Vercel Next.js (Turbopack) 78.383s (-26.8% 🟢) 82.499s (-24.3% 🟢) 4.116s 2 1.07x

🔍 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 🥇 Nitro 0.288s (+1.7%) 1.008s (~) 0.720s 60 1.00x
🐘 Postgres Express 0.299s (+6.0% 🔺) 1.008s (~) 0.708s 60 1.04x
💻 Local Nitro 0.579s (-4.2%) 1.004s (-1.7%) 0.425s 60 2.01x
💻 Local Express 0.605s (+7.9% 🔺) 1.005s (~) 0.400s 60 2.10x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 1.775s (-12.2% 🟢) 10.347s (+172.8% 🔺) 8.572s 6 1.00x
▲ Vercel Nitro 2.524s (+52.0% 🔺) 5.079s (+51.6% 🔺) 2.555s 12 1.42x
▲ Vercel Express 2.620s (+34.1% 🔺) 6.694s (+84.0% 🔺) 4.074s 10 1.48x

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

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.501s (+0.9%) 1.007s (~) 0.506s 90 1.00x
🐘 Postgres Express 0.512s (~) 1.006s (~) 0.494s 90 1.02x
💻 Local Nitro 2.350s (-7.4% 🟢) 3.009s (~) 0.659s 30 4.69x
💻 Local Express 2.513s (~) 3.009s (~) 0.496s 30 5.02x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.995s (-1.7%) 8.494s (+76.7% 🔺) 5.499s 11 1.00x
▲ Vercel Nitro 3.818s (+18.4% 🔺) 11.255s (+133.4% 🔺) 7.437s 8 1.27x
▲ Vercel Next.js (Turbopack) 3.955s (+11.9% 🔺) 7.737s (+49.0% 🔺) 3.783s 12 1.32x

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

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.829s (+4.9%) 1.026s (+1.9%) 0.198s 117 1.00x
🐘 Postgres Express 0.838s (+2.4%) 1.010s (-0.7%) 0.172s 119 1.01x
💻 Local Nitro 10.358s (-7.4% 🟢) 10.936s (-6.2% 🟢) 0.578s 11 12.50x
💻 Local Express 11.215s (~) 11.664s (-2.3%) 0.449s 11 13.53x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.108s (-40.9% 🟢) 11.381s (-7.4% 🟢) 5.273s 11 1.00x
▲ Vercel Nitro 6.414s (-16.9% 🟢) 13.562s (+44.3% 🔺) 7.148s 9 1.05x
▲ Vercel Express 6.912s (-6.9% 🟢) 13.400s (+45.0% 🔺) 6.488s 9 1.13x

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

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.206s (+0.6%) 0.996s (~) 0.001s (-13.3% 🟢) 1.011s (~) 0.804s 10 1.00x
🐘 Postgres Express 0.207s (+0.8%) 1.000s (~) 0.002s (-6.3% 🟢) 1.010s (~) 0.803s 10 1.00x
💻 Local Nitro 0.208s (-2.7%) 1.004s (~) 0.010s (-21.6% 🟢) 1.016s (~) 0.808s 10 1.01x
💻 Local Express 0.208s (+4.7%) 1.004s (~) 0.012s (-0.8%) 1.018s (~) 0.810s 10 1.01x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.908s (-50.2% 🟢) 4.269s (-19.1% 🟢) 1.458s (+96.4% 🔺) 6.262s (-3.4%) 4.354s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.985s (-71.0% 🟢) 3.514s (-59.4% 🟢) 3.375s (+434.1% 🔺) 7.519s (-23.2% 🟢) 5.535s 10 1.04x
▲ Vercel Express 2.026s (-19.1% 🟢) 3.489s (-14.7% 🟢) 2.595s (+170.1% 🔺) 6.991s (+25.0% 🔺) 4.965s 10 1.06x

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

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.622s (-1.3%) 1.007s (~) 0.004s (+4.0%) 1.023s (~) 0.401s 59 1.00x
🐘 Postgres Nitro 0.634s (+1.6%) 1.006s (~) 0.005s (+20.1% 🔺) 1.025s (~) 0.391s 59 1.02x
💻 Local Nitro 0.775s (-7.6% 🟢) 1.013s (~) 0.009s (~) 1.024s (-8.2% 🟢) 0.249s 59 1.25x
💻 Local Express 0.855s (+12.9% 🔺) 1.012s (-1.6%) 0.010s (+5.6% 🔺) 1.117s (+7.4% 🔺) 0.262s 54 1.37x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.240s (-34.8% 🟢) 12.843s (+60.3% 🔺) 0.255s (-37.7% 🟢) 13.795s (+56.1% 🔺) 9.555s 5 1.00x
▲ Vercel Nitro 4.291s (-85.4% 🟢) 8.460s (-72.5% 🟢) 0.268s (+138.9% 🔺) 9.437s (-70.3% 🟢) 5.145s 7 1.01x
▲ Vercel Next.js (Turbopack) 5.348s (-68.4% 🟢) 11.186s (-38.7% 🟢) 0.768s (+263.4% 🔺) 12.787s (-32.5% 🟢) 7.439s 5 1.26x

🔍 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.961s (~) 1.172s (-8.3% 🟢) 0.000s (-54.9% 🟢) 1.190s (-8.9% 🟢) 0.229s 51 1.00x
🐘 Postgres Nitro 0.990s (+2.2%) 1.293s (+3.6%) 0.000s (+53.2% 🔺) 1.306s (+3.9%) 0.316s 47 1.03x
💻 Local Nitro 1.237s (+1.2%) 2.021s (~) 0.000s (+300.0% 🔺) 2.023s (~) 0.786s 30 1.29x
💻 Local Express 1.268s (+3.6%) 2.023s (~) 0.000s (-30.0% 🟢) 2.025s (~) 0.757s 30 1.32x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.261s (-12.8% 🟢) 14.309s (+180.4% 🔺) 0.000s (-100.0% 🟢) 15.043s (+172.0% 🔺) 11.782s 5 1.00x
▲ Vercel Next.js (Turbopack) 3.464s (-66.0% 🟢) 7.312s (-36.5% 🟢) 0.000s (NaN%) 9.153s (-24.0% 🟢) 5.688s 7 1.06x
▲ Vercel Nitro 3.996s (+31.0% 🔺) 6.959s (+58.4% 🔺) 0.000s (+85.7% 🔺) 8.817s (+83.4% 🔺) 4.822s 7 1.23x

🔍 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 🥇 Nitro 1.776s (-0.9%) 2.140s (~) 0.000s (-100.0% 🟢) 2.154s (-1.0%) 0.377s 28 1.00x
🐘 Postgres Express 1.878s (+6.0% 🔺) 2.177s (~) 0.000s (NaN%) 2.188s (~) 0.310s 28 1.06x
💻 Local Nitro 3.468s (+2.4%) 4.035s (~) 0.001s (+62.5% 🔺) 4.038s (~) 0.570s 15 1.95x
💻 Local Express 3.749s (+8.1% 🔺) 4.168s (+3.3%) 0.001s (-8.3% 🟢) 4.170s (+3.3%) 0.421s 15 2.11x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.338s (+6.0% 🔺) 12.974s (+141.4% 🔺) 0.000s (-100.0% 🟢) 13.545s (+133.8% 🔺) 9.207s 5 1.00x
▲ Vercel Express 4.413s (-3.8%) 10.430s (+73.2% 🔺) 0.000s (NaN%) 11.167s (+72.9% 🔺) 6.753s 6 1.02x
▲ Vercel Next.js (Turbopack) 4.639s (-17.4% 🟢) 9.135s (+30.8% 🔺) 0.000s (-100.0% 🟢) 10.832s (+43.7% 🔺) 6.194s 6 1.07x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

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

Copy link
Copy Markdown
Contributor

@vercel vercel Bot left a comment

Choose a reason for hiding this comment

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

Additional Suggestion:

PreviewBadge constructs tarball URLs pointing to the docs deployment, but tarballs are no longer served from docs after being split into a separate project, causing 404s for install commands.

Fix on Vercel

…ment, but tarballs are no longer served from docs after being split into a separate project, causing 404s for install commands.

This commit fixes the issue reported at docs/app/[lang]/(home)/components/preview-badge.tsx:70

**Bug explanation:**

The PR (commit 98d97cd) split tarball hosting out of the docs project into a new top-level `tarballs/` workspace that deploys as its own Vercel project (`workflow-tarballs`). This involved:
1. Moving `docs/scripts/pack.ts` → `tarballs/scripts/pack.ts`
2. Removing the `prebuild` script from `docs/package.json` (which previously ran `pack.ts` and placed `.tgz` files into `docs/public/`)
3. Removing the `.tgz` exclusion from the docs proxy middleware matcher
4. Creating `tarballs/vercel.json` for the new static Vercel project

However, the `PreviewBadge` component at `docs/app/[lang]/(home)/components/preview-badge.tsx` was NOT updated. It still constructs tarball URLs using `deploymentUrl` which comes from the docs project's `VERCEL_URL`:
```
const baseUrl = deploymentUrl.replace(//$/, '');
const installCmd = `pnpm i ${baseUrl}/workflow.tgz`;
```

Since the docs deployment no longer serves `.tgz` files (no pack script runs, no tarballs in `docs/public/`, proxy middleware no longer excludes `.tgz`), these URLs will 404. Users clicking the Preview badge and copying the install command will get broken commands.

**Fix explanation:**

Added a `tarballsUrl` prop to `PreviewBadge` sourced from a new `TARBALLS_URL` environment variable. In `page.tsx`, the env var is read and passed to the component. In `preview-badge.tsx`, the tarball URLs are constructed using `tarballsUrl` when available, falling back to `deploymentUrl` for backwards compatibility.

The `TARBALLS_URL` environment variable needs to be configured in the Vercel docs project settings (pointing to the tarballs project's deployment URL). This follows the same pattern as `VERCEL_URL` — it's a hostname without protocol, and `https://` is prepended in the code.

Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: VaguelySerious <mittgfu@gmail.com>
- pack.ts now generates a public/index.html listing every published
  package with copyable `pnpm i …` install commands, so the bare
  deployment URL is itself a useful landing page when shared.
- Drop the OIDC trusted-sources bypass from the tarballs smoke and CI
  workflow. The tarballs project must be publicly accessible (no
  Deployment Protection) for `pnpm install` to fetch tarball URLs from
  third-party projects, so the smoke now makes unauthenticated requests
  and fails loudly on a login redirect.
- README documents the public-access requirement and the index page.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
export function PreviewBadge({ deploymentUrl }: PreviewBadgeProps) {
const baseUrl = deploymentUrl.replace(/\/$/, '');
export function PreviewBadge({ deploymentUrl, tarballsUrl }: PreviewBadgeProps) {
const baseUrl = (tarballsUrl || deploymentUrl).replace(/\/$/, '');
Copy link
Copy Markdown
Contributor

@pranaygp pranaygp May 4, 2026

Choose a reason for hiding this comment

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

honestly we don't need the tarballs link in docs preview-only page anymore for docs now. the tarballs project should just have an index web page that has this information and docs can be simplified

can do in follow up to unblock here

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 2026

Backport to stable failed — unexpected error before the cherry-pick could be attempted. See workflow run.

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

Labels

backport-stable Cherry-pick this PR to the stable branch when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants