Skip to content

Conversation

@pranaygp
Copy link
Collaborator

@pranaygp pranaygp commented Dec 2, 2025

  • Created a new manifest in the repo root to list known/featured community worlds
  • Starting with @dustintownsend's new MongoDB, Turso, Redis and in-memory worlds
  • Updated Github Workflows to run the entire e2e test suite and benchmarking code against the latest npm publish of all the community worlds
    • currently only tested against the nextjs-turbopack workbench and e2e tests are run against local dev
  • Publishes reports of the e2e and benchmarking test results to the docs at docs/worlds (preview. This page is AI slop design, so it's currently hidden on the navbar just so we can iterate on it more before finding the right final place for this - maybe merging with the existing "docs/deploying" section

@changeset-bot
Copy link

changeset-bot bot commented Dec 2, 2025

⚠️ No Changeset found

Latest commit: 896dea0

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

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

Click here to learn what changesets are, and how to add one.

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

@vercel
Copy link
Contributor

vercel bot commented Dec 2, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview Comment Dec 2, 2025 11:13pm
example-nextjs-workflow-webpack Ready Ready Preview Comment Dec 2, 2025 11:13pm
example-workflow Ready Ready Preview Comment Dec 2, 2025 11:13pm
workbench-astro-workflow Ready Ready Preview Comment Dec 2, 2025 11:13pm
workbench-express-workflow Ready Ready Preview Comment Dec 2, 2025 11:13pm
workbench-fastify-workflow Error Error Dec 2, 2025 11:13pm
workbench-hono-workflow Ready Ready Preview Comment Dec 2, 2025 11:13pm
workbench-nitro-workflow Ready Ready Preview Comment Dec 2, 2025 11:13pm
workbench-nuxt-workflow Ready Ready Preview Comment Dec 2, 2025 11:13pm
workbench-sveltekit-workflow Ready Ready Preview Comment Dec 2, 2025 11:13pm
workbench-vite-workflow Ready Ready Preview Comment Dec 2, 2025 11:13pm
workflow-docs Ready Ready Preview Comment Dec 2, 2025 11:13pm

@github-actions
Copy link
Contributor

github-actions bot commented Dec 2, 2025

📊 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
🌐 Redis 🥇 Next.js (Turbopack) 0.042s 1.017s 0.975s 10 1.00x
🌐 Starter Next.js (Turbopack) 0.044s 1.016s 0.972s 10 1.04x
💻 Local Express 0.047s (+4.3%) 1.007s (~) 0.961s 10 1.10x
💻 Local Next.js (Turbopack) 0.052s (+22.7% 🔺) 1.022s (~) 0.970s 10 1.22x
💻 Local Nitro 0.058s (+36.6% 🔺) 1.022s (+1.6%) 0.964s 10 1.37x
🌐 MongoDB Next.js (Turbopack) 0.060s 1.017s 0.956s 10 1.42x
🌐 Turso Next.js (Turbopack) 0.076s 1.016s 0.940s 10 1.79x
🐘 Postgres Nitro 0.244s (-16.6% 🟢) 1.027s (+1.4%) 0.782s 10 5.76x
🐘 Postgres Next.js (Turbopack) 0.333s (+104.7% 🔺) 1.021s (~) 0.688s 10 7.84x
🐘 Postgres Express 0.370s (+106.4% 🔺) 1.015s (~) 0.645s 10 8.73x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.498s (-6.0% 🟢) 1.553s (+10.5% 🔺) 1.055s 10 1.00x
▲ Vercel Nitro 0.521s (+1.1%) 1.366s (-3.1%) 0.845s 10 1.05x
▲ Vercel Next.js (Turbopack) 0.663s (+31.1% 🔺) 1.434s (-2.9%) 0.771s 10 1.33x

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Starter 🥇 Next.js (Turbopack) 0.100s 1.011s 0.911s 10 1.00x
🌐 Redis Next.js (Turbopack) 0.102s 1.012s 0.910s 10 1.02x
💻 Local Next.js (Turbopack) 0.102s (~) 1.014s (~) 0.911s 10 1.02x
💻 Local Nitro 0.108s (-2.7%) 1.005s (~) 0.896s 10 1.08x
💻 Local Express 0.112s (-0.8%) 1.007s (~) 0.895s 10 1.11x
🌐 Turso Next.js (Turbopack) 0.277s 1.013s 0.736s 10 2.76x
🌐 MongoDB Next.js (Turbopack) 0.305s 1.014s 0.709s 10 3.05x
🐘 Postgres Next.js (Turbopack) 0.963s (+4.3%) 1.215s (+19.7% 🔺) 0.252s 10 9.62x
🐘 Postgres Express 1.168s (-6.7% 🟢) 1.612s (-19.9% 🟢) 0.444s 10 11.66x
🐘 Postgres Nitro 1.248s (+19.3% 🔺) 2.012s (+11.0% 🔺) 0.764s 10 12.47x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.682s (+12.6% 🔺) 2.550s (-0.6%) 0.868s 10 1.00x
▲ Vercel Nitro 1.725s (+21.9% 🔺) 2.405s (~) 0.680s 10 1.03x
▲ Vercel Next.js (Turbopack) 2.233s (+46.9% 🔺) 3.028s (+20.4% 🔺) 0.796s 10 1.33x

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Starter 🥇 Next.js (Turbopack) 0.608s 1.009s 0.402s 5 1.00x
🌐 Redis Next.js (Turbopack) 0.646s 1.011s 0.364s 5 1.06x
💻 Local Next.js (Turbopack) 0.683s (+7.2% 🔺) 1.012s (~) 0.329s 5 1.12x
💻 Local Nitro 0.762s (-2.3%) 1.005s (~) 0.243s 5 1.25x
💻 Local Express 0.778s (-0.6%) 1.006s (~) 0.228s 5 1.28x
🌐 Turso Next.js (Turbopack) 2.139s 3.017s 0.878s 5 3.52x
🌐 MongoDB Next.js (Turbopack) 2.181s 3.016s 0.835s 5 3.59x
🐘 Postgres Next.js (Turbopack) 4.877s (-7.9% 🟢) 5.220s (-13.4% 🟢) 0.343s 5 8.02x
🐘 Postgres Express 4.983s (-30.2% 🟢) 5.418s (-28.9% 🟢) 0.435s 5 8.20x
🐘 Postgres Nitro 10.419s (+91.4% 🔺) 11.022s (+83.1% 🔺) 0.603s 5 17.14x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 10.720s (+2.8%) 11.578s (+5.4% 🔺) 0.858s 5 1.00x
▲ Vercel Nitro 10.786s (-0.5%) 11.613s (+1.2%) 0.826s 5 1.01x
▲ Vercel Next.js (Turbopack) 10.932s (+4.2%) 11.649s (+2.7%) 0.717s 5 1.02x

workflow with 10 parallel steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 0.391s 1.010s 0.619s 5 1.00x
🌐 Starter Next.js (Turbopack) 0.392s 1.009s 0.617s 5 1.00x
💻 Local Nitro 0.393s (-7.1% 🟢) 1.004s (~) 0.611s 5 1.01x
💻 Local Express 0.397s (~) 1.006s (~) 0.609s 5 1.01x
💻 Local Next.js (Turbopack) 0.450s (+4.4%) 1.012s (~) 0.562s 5 1.15x
🐘 Postgres Express 0.744s (-52.2% 🟢) 1.209s (-39.8% 🟢) 0.465s 5 1.90x
🐘 Postgres Next.js (Turbopack) 1.047s (+14.5% 🔺) 1.814s (+78.9% 🔺) 0.767s 5 2.68x
🐘 Postgres Nitro 1.541s (-6.0% 🟢) 2.011s (~) 0.470s 5 3.94x
🌐 Turso Next.js (Turbopack) 1.596s 2.019s 0.423s 5 4.08x
🌐 MongoDB Next.js (Turbopack) 1.685s 2.014s 0.329s 5 4.30x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.706s (+3.5%) 3.449s (-3.6%) 0.743s 5 1.00x
▲ Vercel Express 2.751s (+1.9%) 3.608s (+4.1%) 0.857s 5 1.02x
▲ Vercel Nitro 2.794s (~) 4.441s (+25.4% 🔺) 1.647s 5 1.03x

Stream Benchmarks

Stream benchmarks include Time to First Byte (TTFB) metrics.

workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Wall Time Overhead Samples vs Fastest
🌐 Starter 🥇 Next.js (Turbopack) 0.144s 1.004s 1.010s 0.866s 10 1.00x
🌐 Redis Next.js (Turbopack) 0.150s 1.003s 1.011s 0.861s 10 1.04x
💻 Local Next.js (Turbopack) 0.159s (+8.1% 🔺) 1.003s (~) 1.016s (~) 0.857s 10 1.11x
💻 Local Nitro 0.174s (-2.8%) 0.991s (~) 1.007s (~) 0.833s 10 1.21x
💻 Local Express 0.180s (+3.3%) 0.992s (~) 1.009s (~) 0.828s 10 1.25x
🌐 MongoDB Next.js (Turbopack) 0.506s -s 1.012s 0.506s 10 3.51x
🌐 Turso Next.js (Turbopack) 0.521s 0.939s 1.013s 0.492s 10 3.62x
🐘 Postgres Next.js (Turbopack) 0.789s (-24.2% 🟢) 1.111s (-33.7% 🟢) 1.215s (-29.2% 🟢) 0.427s 10 5.48x
🐘 Postgres Express 0.797s (-37.4% 🟢) 1.259s (-29.5% 🟢) 1.311s (-34.8% 🟢) 0.514s 10 5.54x
🐘 Postgres Nitro 1.611s (+21.5% 🔺) 2.133s (+24.4% 🔺) 2.314s (+15.0% 🔺) 0.703s 10 11.20x

▲ Production (Vercel)

World Framework Workflow Time TTFB Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.357s (-6.7% 🟢) 2.664s (-10.2% 🟢) 3.049s (-9.9% 🟢) 0.692s 10 1.00x
▲ Vercel Nitro 2.496s (-5.3% 🟢) 2.898s (-5.2% 🟢) 3.288s (-4.0%) 0.792s 10 1.06x
▲ Vercel Express 2.528s (-4.0%) 2.969s (-3.5%) 3.422s (-2.1%) 0.894s 10 1.07x

Summary: Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Next.js (Turbopack) 3/5
🐘 Postgres Next.js (Turbopack) 3/5
▲ Vercel Express 3/5

Summary: Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 💻 Local 5/5
Next.js (Turbopack) 🌐 Starter 3/5
Nitro 💻 Local 5/5
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)
  • 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
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

- Add community-worlds.json manifest as single source of truth
- Add scripts/generate-community-worlds-workflow.mjs to generate CI workflow
- Add scripts/generate-community-worlds-docs.mjs to generate docs section
- Update aggregate-benchmarks.js to load community worlds dynamically
- Add pnpm generate:community-worlds script
- Update docs/deploying/world/index.mdx with community worlds

The manifest-based approach allows:
- E2E tests to be auto-generated from the manifest
- Benchmark aggregation to include community worlds
- Docs to stay in sync with tested worlds

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Replace 3 mutually exclusive jobs (e2e/e2e-mongodb/e2e-redis) with a single
job that starts services via docker run when needed. This eliminates the
skipped job entries that appear in the GitHub Actions UI.

- Use conditional docker run steps instead of services: block
- Add health check loops to wait for service readiness
- Add cleanup step to stop containers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Comment on lines 103 to 117
function extractWorldId(artifactName: string): string | null {
// E2E results: e2e-results-{world} or e2e-dev-results-{world}
if (artifactName.startsWith('e2e-results-')) {
return artifactName.replace('e2e-results-', '');
}
if (artifactName.startsWith('e2e-dev-results-')) {
return artifactName.replace('e2e-dev-results-', '');
}
// Benchmark results: bench-results-{app}-{world}
if (artifactName.startsWith('bench-results-')) {
const parts = artifactName.replace('bench-results-', '').split('-');
return parts[parts.length - 1]; // Last part is the world
}
return null;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

The world ID extraction function doesn't handle the e2e-results-community-* artifact naming pattern used by community world E2E tests, causing all community world test results to be silently ignored by the dashboard.

View Details
📝 Patch Details
diff --git a/docs/lib/github.ts b/docs/lib/github.ts
index d3c10f8..1637587 100644
--- a/docs/lib/github.ts
+++ b/docs/lib/github.ts
@@ -295,7 +295,10 @@ export function parseBenchmarkResults(results: BenchmarkResult | null): {
  * Map artifact name to world ID
  */
 export function artifactToWorldId(artifactName: string): string | null {
-  // E2E results
+  // E2E results - check community-world pattern first to avoid partial matches
+  if (artifactName.startsWith('e2e-results-community-')) {
+    return artifactName.replace('e2e-results-community-', '');
+  }
   if (artifactName.startsWith('e2e-results-')) {
     return artifactName.replace('e2e-results-', '');
   }
diff --git a/docs/lib/worlds-data.ts b/docs/lib/worlds-data.ts
index e8a246d..173409c 100644
--- a/docs/lib/worlds-data.ts
+++ b/docs/lib/worlds-data.ts
@@ -101,7 +101,10 @@ async function getWorkflowArtifacts(runId: number): Promise<GitHubArtifact[]> {
  * Extract world ID from artifact name
  */
 function extractWorldId(artifactName: string): string | null {
-  // E2E results: e2e-results-{world} or e2e-dev-results-{world}
+  // E2E results: e2e-results-{world} or e2e-dev-results-{world} or e2e-results-community-{world}
+  if (artifactName.startsWith('e2e-results-community-')) {
+    return artifactName.replace('e2e-results-community-', '');
+  }
   if (artifactName.startsWith('e2e-results-')) {
     return artifactName.replace('e2e-results-', '');
   }

Analysis

Community world E2E test results silently ignored due to artifact naming pattern mismatch

What fails: The extractWorldId() function in docs/lib/worlds-data.ts and artifactToWorldId() function in docs/lib/github.ts do not handle the e2e-results-community-* artifact naming pattern generated by .github/workflows/e2e-community-world.yml, causing all community world E2E test results to be silently skipped from the dashboard.

How to reproduce:

  1. The e2e-community-world.yml workflow generates artifacts named e2e-results-community-{world-id} (e.g., e2e-results-community-mongodb)
  2. When the extraction function processes this artifact name, it returns community-mongodb instead of mongodb
  3. The worlds-data.ts code then attempts to match worlds['community-mongodb'] which doesn't exist in the manifest (only worlds['mongodb'] exists)
  4. The condition on line 180 of worlds-data.ts fails: if (worldId && worlds[worldId])if ('community-mongodb' && worlds['community-mongodb']) → false
  5. The artifact is silently skipped, never appears on the dashboard

Result: Community world test results (mongodb, turso, redis, etc.) are never displayed, even though the workflow generates artifacts for them.

Expected: The extraction functions should correctly parse e2e-results-community-mongodbmongodb to match the world ID in the manifest, allowing community world E2E results to be properly displayed on the dashboard.

Fix: Both functions now check for the e2e-results-community- prefix first before falling back to the generic e2e-results- pattern, ensuring correct world ID extraction for community world artifacts.

Add handling for `e2e-results-community-{world}` pattern so community
world test results are properly extracted (e.g., `e2e-results-community-turso`
now correctly extracts `turso` instead of `community-turso`).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
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.

3 participants