docs: revamp World documentation pages - #763

Merged
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking
Jan 26, 2026
Merged

docs: revamp World documentation pages#763
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking

Conversation

@pranaygp

@pranaygppranaygp commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

Added dedicated worlds page to show all available worlds incuding e2e testbench pass rate and performance benchmarking

Added historic performance benchmarking over last 30 commits/releases on github with request caching (should probably be ISR / PPR since these can be caluclated at build time and don't need to be re-fetched)

Rewrote the Local, Postgres and Vercel world documentation pages to follow a standard structure with config, observability, benchmarking notes

TODOs

  • Do another design and structural pass on the community world detail pages
  • Remove the old pages from docs for worlds and ensure redirect to prevent broken links
  • Include a better explanation on worlds, the interface, and how to build your own world
  • Polish up the worlds index page - need to replace the redundant AI generated components at the bottom with something more useful
  • Ask AI to do a code self review

Additional Changes

Deploying Section Restructure:

  • New streamlined deploying index page explaining portability via Worlds, local dev, and Vercel deployment
  • New detailed "Building a World" guide with Storage, Queue, and Streamer interface documentation
  • Links to Postgres World as reference implementation

Worlds Page UI Improvements:

  • Simplified footer: replaced "What is a World?" and "Build Your Own World" sections with single "Learn more about worlds" section
  • Moved "Last updated" info directly under worlds grid for better visibility
  • Fixed globe visibility in light/dark mode for better text readability
  • Fixed tooltip positioning on mobile breakpoints

Sidebar Navigation:

  • Auto-expand sidebar folders when viewing a child page (improves navigation context)

Other Fixes:

  • Added missing Foundations index cards (Streaming, Serialization, Idempotency)
  • Removed redundant Documentation button for community worlds (GitHub link is sufficient)

Preview

Worlds Page

imageimage

Postgres Docs (also check the other worlds)
image
image
image

CopilotAI review requested due to automatic review settings January 10, 2026 09:54
@changeset-bot

changeset-botBot commented Jan 10, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: d778fab

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

vercelBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.041s (-7.5% 🟢)1.019s (~)0.978s101.00x
💻 LocalNitro0.042s (-1.9%)1.007s (~)0.964s101.04x
💻 LocalExpress0.046s (+1.3%)1.008s (~)0.962s101.13x
🐘 PostgresNext.js (Turbopack)0.148s (+3.7%)1.022s (~)0.873s103.64x
🐘 PostgresExpress0.203s (-29.8% 🟢)1.024s (+0.9%)0.820s104.99x
🐘 PostgresNitro0.311s (+22.6% 🔺)1.031s (+1.7%)0.720s107.62x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.628s (-16.8% 🟢)1.485s (-24.3% 🟢)0.858s101.00x
▲ VercelNitro0.643s (-18.8% 🟢)1.482s (-12.4% 🟢)0.839s101.02x
▲ VercelExpress0.660s (-25.7% 🟢)1.566s (-11.2% 🟢)0.906s101.05x

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

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.096s (~)2.012s (~)0.917s101.00x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
💻 LocalExpress1.118s (~)2.007s (~)0.889s101.02x
🐘 PostgresNitro2.128s (-2.8%)2.414s (-20.0% 🟢)0.286s101.94x
🐘 PostgresNext.js (Turbopack)2.153s (+11.0% 🔺)2.417s (+14.2% 🔺)0.264s101.96x
🐘 PostgresExpress2.359s (+11.2% 🔺)3.016s (~)0.657s102.15x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.809s (-1.3%)3.597s (-1.3%)0.788s101.00x
▲ VercelNitro2.828s (-2.4%)3.626s (-2.3%)0.798s101.01x
▲ VercelExpress2.867s (-3.0%)3.643s (-0.6%)0.776s101.02x

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

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)10.701s (~)11.021s (~)0.321s51.00x
💻 LocalNitro10.823s (~)11.012s (~)0.189s51.01x
💻 LocalExpress10.833s (~)11.013s (~)0.180s51.01x
🐘 PostgresNext.js (Turbopack)14.904s (-2.3%)15.237s (-5.0%)0.333s51.39x
🐘 PostgresNitro15.269s (-25.3% 🟢)16.030s (-23.8% 🟢)0.762s51.43x
🐘 PostgresExpress20.322s (+13.8% 🔺)21.038s (+15.4% 🔺)0.716s51.90x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)22.217s (-15.6% 🟢)23.072s (-13.9% 🟢)0.855s51.00x
▲ VercelExpress23.130s (-8.2% 🟢)23.724s (-8.1% 🟢)0.593s51.04x
▲ VercelNitro23.173s (-12.1% 🟢)23.919s (-11.2% 🟢)0.745s51.04x

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

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.386s (~)2.011s (~)0.625s151.00x
💻 LocalNitro1.406s (+0.9%)2.007s (~)0.601s151.01x
💻 LocalExpress1.416s (~)2.007s (~)0.591s151.02x
🐘 PostgresNext.js (Turbopack)2.075s (+22.9% 🔺)2.599s (+27.4% 🔺)0.524s121.50x
🐘 PostgresNitro2.132s (-3.3%)2.760s (-8.4% 🟢)0.628s111.54x
🐘 PostgresExpress2.553s (+25.7% 🔺)3.014s (+9.9% 🔺)0.462s101.84x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.821s (-9.7% 🟢)3.631s (-6.7% 🟢)0.811s91.00x
▲ VercelNext.js (Turbopack)2.991s (~)3.725s (+2.5%)0.734s91.06x
▲ VercelExpress3.736s (+29.1% 🔺)5.355s (+46.3% 🔺)1.619s61.32x

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

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro2.429s (-4.4%)3.051s (+1.2%)0.623s101.00x
💻 LocalNext.js (Turbopack)2.487s (+3.0%)3.044s (-9.9% 🟢)0.558s101.02x
💻 LocalExpress2.522s (+1.8%)3.020s (~)0.498s101.04x
🐘 PostgresExpress8.825s (~)9.297s (-2.6%)0.472s43.63x
🐘 PostgresNext.js (Turbopack)10.771s (-1.9%)11.694s (~)0.923s34.43x
🐘 PostgresNitro11.244s (+32.5% 🔺)11.695s (+28.9% 🔺)0.451s34.63x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.137s (-12.1% 🟢)3.654s (-12.4% 🟢)0.517s91.00x
▲ VercelNext.js (Turbopack)3.223s (~)3.783s (+1.9%)0.560s81.03x
▲ VercelNitro3.434s (-4.5%)3.915s (-4.9%)0.481s81.09x

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

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.413s (~)2.007s (~)0.594s151.00x
💻 LocalNext.js (Turbopack)1.424s (+1.7%)2.011s (~)0.586s151.01x
💻 LocalExpress1.432s (~)2.007s (~)0.575s151.01x
🐘 PostgresNext.js (Turbopack)1.815s (+21.3% 🔺)2.156s (+7.1% 🔺)0.341s141.28x
🐘 PostgresExpress2.048s (-4.6%)2.527s (-2.7%)0.479s121.45x
🐘 PostgresNitro2.078s (+2.8%)2.680s (~)0.602s121.47x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.859s (-1.7%)3.631s (-2.8%)0.771s91.00x
▲ VercelExpress2.935s (+1.8%)3.757s (~)0.822s81.03x
▲ VercelNitro2.996s (+1.1%)3.773s (+1.4%)0.777s81.05x

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

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)2.593s (+3.6%)3.046s (~)0.453s101.00x
💻 LocalExpress2.606s (+1.0%)3.013s (~)0.407s101.00x
💻 LocalNitro2.650s (~)3.028s (~)0.378s101.02x
🐘 PostgresExpress11.333s (-1.6%)11.719s (~)0.386s34.37x
🐘 PostgresNext.js (Turbopack)11.564s (+6.4% 🔺)12.385s (+8.3% 🔺)0.821s34.46x
🐘 PostgresNitro13.741s (+20.7% 🔺)14.070s (+16.7% 🔺)0.329s35.30x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.296s (+5.7% 🔺)3.866s (+6.9% 🔺)0.571s81.00x
▲ VercelNext.js (Turbopack)3.509s (+1.1%)4.181s (+2.2%)0.672s81.06x
▲ VercelNitro119.077s (+3672.4% 🔺)120.329s (+3084.9% 🔺)1.252s136.13x

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

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.144s (+3.6%)1.004s (~)0.017s (+8.4% 🔺)1.028s (~)0.884s101.00x
💻 LocalExpress0.184s (+1.1%)0.992s (~)0.014s (-5.9% 🟢)1.021s (~)0.838s101.28x
💻 LocalNitro0.184s (-2.3%)0.992s (~)0.016s (-5.3% 🟢)1.022s (~)0.838s101.28x
🐘 PostgresNext.js (Turbopack)0.627s (-48.8% 🟢)0.975s (-46.5% 🟢)0.003s (+2500.0% 🔺)1.018s (-49.6% 🟢)0.391s104.37x
🐘 PostgresNitro1.098s (-50.8% 🟢)1.938s (-31.1% 🟢)0.000s (NaN%)2.013s (-33.2% 🟢)0.914s107.64x
🐘 PostgresExpress2.198s (+66.0% 🔺)2.845s (+58.7% 🔺)0.000s (NaN%)3.016s (+49.7% 🔺)0.818s1015.29x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.931s (~)3.312s (+3.9%)0.390s (+6.3% 🔺)4.134s (+3.5%)1.204s101.00x
▲ VercelNitro3.012s (+2.0%)3.272s (-0.5%)0.491s (+68.3% 🔺)4.257s (+2.6%)1.245s101.03x
▲ VercelExpress3.150s (+9.2% 🔺)3.259s (-1.4%)0.499s (~)4.306s (+0.9%)1.156s101.07x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)5/8
▲ VercelNext.js (Turbopack)5/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)💻 Local8/8
Nitro💻 Local8/8
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
  • 🌐 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)

📋 View full workflow run

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production457038495
❌ 💻 Local Development416232450
✅ 📦 Local Production418032450
✅ 🐘 Local Postgres418032450
✅ 🪟 Windows450045
❌ 🌍 Community Worlds311610192
Total17851631342082

❌ Failed Tests

💻 Local Development (2 failed)

astro-stable (2 failed):

  • 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
🌍 Community Worlds (161 failed)

mongodb (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

redis (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

starter (41 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

turso (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro4104
✅ example4104
✅ express4104
✅ fastify4104
✅ hono4104
✅ nextjs-turbopack4401
✅ nextjs-webpack4401
✅ nitro4104
✅ nuxt4104
✅ sveltekit4104
✅ vite4104
❌ 💻 Local Development
AppPassedFailedSkipped
❌ astro-stable3924
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack4500
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb5400
✅ redis-dev300
❌ redis5400
✅ starter-dev300
❌ starter4410
✅ turso-dev300
❌ turso5400

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR revamps the World documentation by creating dedicated detail pages for official worlds (local, postgres, vercel) with MDX-driven content. It introduces new components for world detail pages, benchmark history visualization with interactive charts, and a redesigned worlds index page with a 3D globe visual.

Changes:

  • Created dedicated /worlds/[id] routes with MDX content for official worlds and template components for community worlds
  • Added benchmark history charts showing performance trends over releases/commits with clickable data points
  • Restructured world documentation with cleaner h3 headings for configuration options instead of tables
  • Added TOC generation from MDX headings and world data provider context for component communication

Reviewed changes

Copilot reviewed 31 out of 32 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
worlds-manifest.jsonAdded example field for linking to example repositories
package.jsonAdded cobe dependency (0.6.5) for 3D globe visualization
next.config.tsAdded redirects from old /docs/deploying/world/* paths to new /worlds/* routes
worlds-data.tsEnhanced to extract framework-specific E2E data, workflow timing metrics, and added single world lookup functions
types.tsAdded framework E2E breakdown types, workflow timing fields, benchmark10SeqMs metric, and formatTime utility
WorldDetailHero.tsxNew hero component for world detail pages with E2E/benchmark summary and quick links
WorldDetailToc.tsxNew TOC component with intersection observer for active section highlighting
WorldTestingPerformance.tsxNew component displaying E2E test results and benchmark tables with history chart integration
WorldDataProvider.tsxNew context provider for sharing world data between MDX and client components
WorldCardSimple.tsxNew simplified card component for worlds index page with E2E/PERF metrics footer
Globe.tsxNew interactive 3D globe component using COBE library
BenchmarkHistoryChart.tsxNew dialog component showing performance trends over time with releases/commits toggle
local-world.mdxRewritten with cleaner structure, h3 config options, and Testing & Performance section
postgres-world.mdxRewritten with installation steps, framework-specific examples, and detailed configuration
vercel-world.mdxRewritten with simplified auto-configuration explanation and versioning details
worlds/page.tsxNew worlds index page with globe hero, world cards grid, and "What is a World?" section
worlds/[id]/page.tsxNew dynamic world detail page supporting both MDX and template rendering
worlds/compare/page.tsxNew benchmark comparison page with tables and charts
benchmark-history/route.tsNew API route fetching historical benchmark data from gh-pages commits
generate-docs-data.jsEnhanced to extract workflow timing metrics (min/max/ttfb/slurp) from benchmark results
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +44 to +63
return (
<nav className="space-y-1">
<p className="font-medium text-sm mb-2">On this page</p>
{items.map((item) => (
<a
key={item.id}
href={`#${item.id}`}
className={cn(
'block text-sm py-1 border-l-2 pl-3 transition-colors',
activeId === item.id
? 'border-primary text-foreground font-medium'
: 'border-transparent text-muted-foreground hover:text-foreground hover:border-muted-foreground'
)}
>
{item.title}
</a>
))}
</nav>
);
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

When items array is empty, this component renders a nav with just the "On this page" heading but no links. While not necessarily broken, consider adding a conditional render or early return if items.length === 0 to avoid rendering an empty navigation section.

Copilot uses AI. Check for mistakes.
Comment on lines +80 to +87
const fileRes = await fetch(
`https://raw.githubusercontent.com/${REPO}/${ghPagesSha}/${FILE_PATH}`,
{ next: { revalidate: 3600 } }
);

if (!fileRes.ok) return null;

return (await fileRes.json()) as CIResultsData;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The JSON parsing at line 87 doesn't handle malformed JSON responses. If the GitHub API returns invalid JSON, this will throw an unhandled error. Consider wrapping the await fileRes.json() in a try-catch or adding validation.

Copilot uses AI. Check for mistakes.
Comment on lines +120 to +145
const ghPagesCommits = (await ghPagesCommitsRes.json()) as GitHubCommit[];

// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

Similarly, the JSON parsing at line 120 for gh-pages commits doesn't handle malformed JSON responses. Consider adding error handling for the await ghPagesCommitsRes.json() call.

Suggested change
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
try{
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
}
}catch(error){
console.error('Failed to parse gh-pages commits JSON',error);
returnsnapshotMap;

Copilot uses AI. Check for mistakes.
Comment on lines +122 to +148
// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}
}

return snapshotMap;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The batch processing loop processes all gh-pages commits (up to 100) without any upper bound on memory usage. If there are many commits, this could create a large number of parallel fetch requests. Consider adding a limit to the total number of commits processed or adding more granular error handling to prevent memory issues.

Copilot uses AI. Check for mistakes.
Comment threaddocs/components/worlds/Globe.tsx Outdated
Comment on lines +69 to +70
const globe = createGlobe(canvasRef.current!, globeConfig);

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The canvasRef.current could be null when createGlobe is called. While the non-null assertion operator (!) is used, this could cause a runtime error if the component unmounts or the ref isn't set before the effect runs. Add a null check before calling createGlobe.

Suggested change
constglobe=createGlobe(canvasRef.current!,globeConfig);
constcanvas=canvasRef.current;
if(!canvas){
return()=>{
window.removeEventListener('resize',onResize);
};
}
constglobe=createGlobe(canvas,globeConfig);

Copilot uses AI. Check for mistakes.

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

World documentation pages at /docs/deploying/world/* should redirect to /worlds/[id], but the redirect was never implemented - only mentioned in a comment

Fix on Vercel

samples: latestPoint?.samples,
current,
trendPercent,
ttfb: latestPoint?.ttfb,

@vercelvercelBotJan 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Trend calculation defaults undefined workflowTime values to 0, making it impossible to distinguish between "no data" and "zero performance time"

Fix on Vercel

Comment threaddocs/app/api/benchmark-history/route.ts Outdated
const pointerInteracting = useRef<number | null>(null);
const pointerInteractionMovement = useRef(0);
const [size, setSize] = useState(1200);
const { resolvedTheme } = useTheme();

@vercelvercelBotJan 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Globe component uses useTheme() without deferring initialization, causing hydration mismatch between server (undefined theme) and client

Fix on Vercel

- Add dedicated world detail pages at /worlds/[id] with MDX-driven content
- Create WorldDetailHero, WorldDetailToc, WorldTestingPerformance components
- Add benchmark history charts and test summary links
- Rewrite local-world, postgres-world, and vercel-world MDX with cleaner structure
- Use h3 headings for configuration options instead of tables/accordions
- Add WorldDataProvider context for passing world data to MDX components
- Add example field to worlds-manifest for linking to example repos
- Update worlds index page design
- Globe now scales with container width up to 1200px max
- Increased opacity from 20% to 30% for better visibility
- Positioned globe 30% down to show north pole behind header
- Globe component now auto-sizes based on container width
- Update title format to '{Name} World | Workflow DevKit'
- Update worlds index page title to 'Worlds | Workflow DevKit'
- Improve world descriptions in worlds-manifest.json for better SEO
- Add dynamic OG image generation at /worlds/[id]/og
- Add openGraph and twitter metadata to world detail pages
- Replace route-based og/route.tsx with opengraph-image.tsx file convention
- Remove runtime = 'edge' to allow generateStaticParams for static generation
- Simplify page.tsx metadata (Next.js auto-detects opengraph-image.tsx)
- Fix globe visibility in light/dark mode
- Fix tooltip positioning on mobile breakpoints
- Remove redundant Documentation button for community worlds
- Add missing pages to Foundations index (streaming, serialization, idempotency)
- Restructure deploying section with new index and building-a-world guide
- Restore original MDX content for official worlds (local, vercel, postgres)
- Auto-expand sidebar folders when child page is active

// Check if any child is active (current path starts with folder's index URL)
const hasActiveChild = item.index?.url
? pathname.startsWith(item.index.url + '/')

@vercelvercelBotJan 23, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sidebar fails to expand root-level folder when checking for active children due to malformed path check.

Fix on Vercel

<Card href="/docs/foundations/hooks" title="Webhooks (and hooks)">
Respond to external events in your workflow using hooks and webhooks.
</Card>
<Card href="/docs/foundations/streaming" title="Streaming">

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

unrelated change - the foundations page was missing cards for these (they were only in meta)

Comment threaddocs/next.config.ts
Comment on lines +53 to +73
// Redirect old world docs to new /worlds routes
{
source: '/docs/deploying/world/local-world',
destination: '/worlds/local',
permanent: true,
},
{
source: '/docs/deploying/world/postgres-world',
destination: '/worlds/postgres',
permanent: true,
},
{
source: '/docs/deploying/world/vercel-world',
destination: '/worlds/vercel',
permanent: true,
},
{
source: '/docs/worlds',
destination: '/worlds',
permanent: true,
},

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

this is so we don't break existing links on twitter, etc.

pranaygpand others added 2 commits January 23, 2026 17:12
- Fix /docs/deploying/world link to /docs/deploying/building-a-world
- Fix /docs/deploying#what-are-worlds invalid anchor to /docs/deploying
- Add @skip-typecheck markers to interface definition code blocks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- benchmark-history/route.ts: Add error handling for JSON parsing,
distinguish 404s from actual errors
- Globe.tsx: Fix hydration mismatch by deferring theme-dependent
rendering until component is mounted
- sidebar.tsx: Improve path check robustness for active child detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​cobe@​0.6.51001009383100

View full report

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🚢

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pranaygp@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

docs: revamp World documentation pages - #763

Merged
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking
Jan 26, 2026
Merged

docs: revamp World documentation pages#763
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking

Conversation

@pranaygp

@pranaygppranaygp commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

Added dedicated worlds page to show all available worlds incuding e2e testbench pass rate and performance benchmarking

Added historic performance benchmarking over last 30 commits/releases on github with request caching (should probably be ISR / PPR since these can be caluclated at build time and don't need to be re-fetched)

Rewrote the Local, Postgres and Vercel world documentation pages to follow a standard structure with config, observability, benchmarking notes

TODOs

  • Do another design and structural pass on the community world detail pages
  • Remove the old pages from docs for worlds and ensure redirect to prevent broken links
  • Include a better explanation on worlds, the interface, and how to build your own world
  • Polish up the worlds index page - need to replace the redundant AI generated components at the bottom with something more useful
  • Ask AI to do a code self review

Additional Changes

Deploying Section Restructure:

  • New streamlined deploying index page explaining portability via Worlds, local dev, and Vercel deployment
  • New detailed "Building a World" guide with Storage, Queue, and Streamer interface documentation
  • Links to Postgres World as reference implementation

Worlds Page UI Improvements:

  • Simplified footer: replaced "What is a World?" and "Build Your Own World" sections with single "Learn more about worlds" section
  • Moved "Last updated" info directly under worlds grid for better visibility
  • Fixed globe visibility in light/dark mode for better text readability
  • Fixed tooltip positioning on mobile breakpoints

Sidebar Navigation:

  • Auto-expand sidebar folders when viewing a child page (improves navigation context)

Other Fixes:

  • Added missing Foundations index cards (Streaming, Serialization, Idempotency)
  • Removed redundant Documentation button for community worlds (GitHub link is sufficient)

Preview

Worlds Page

imageimage

Postgres Docs (also check the other worlds)
image
image
image

CopilotAI review requested due to automatic review settings January 10, 2026 09:54
@changeset-bot

changeset-botBot commented Jan 10, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: d778fab

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

vercelBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.041s (-7.5% 🟢)1.019s (~)0.978s101.00x
💻 LocalNitro0.042s (-1.9%)1.007s (~)0.964s101.04x
💻 LocalExpress0.046s (+1.3%)1.008s (~)0.962s101.13x
🐘 PostgresNext.js (Turbopack)0.148s (+3.7%)1.022s (~)0.873s103.64x
🐘 PostgresExpress0.203s (-29.8% 🟢)1.024s (+0.9%)0.820s104.99x
🐘 PostgresNitro0.311s (+22.6% 🔺)1.031s (+1.7%)0.720s107.62x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.628s (-16.8% 🟢)1.485s (-24.3% 🟢)0.858s101.00x
▲ VercelNitro0.643s (-18.8% 🟢)1.482s (-12.4% 🟢)0.839s101.02x
▲ VercelExpress0.660s (-25.7% 🟢)1.566s (-11.2% 🟢)0.906s101.05x

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

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.096s (~)2.012s (~)0.917s101.00x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
💻 LocalExpress1.118s (~)2.007s (~)0.889s101.02x
🐘 PostgresNitro2.128s (-2.8%)2.414s (-20.0% 🟢)0.286s101.94x
🐘 PostgresNext.js (Turbopack)2.153s (+11.0% 🔺)2.417s (+14.2% 🔺)0.264s101.96x
🐘 PostgresExpress2.359s (+11.2% 🔺)3.016s (~)0.657s102.15x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.809s (-1.3%)3.597s (-1.3%)0.788s101.00x
▲ VercelNitro2.828s (-2.4%)3.626s (-2.3%)0.798s101.01x
▲ VercelExpress2.867s (-3.0%)3.643s (-0.6%)0.776s101.02x

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

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)10.701s (~)11.021s (~)0.321s51.00x
💻 LocalNitro10.823s (~)11.012s (~)0.189s51.01x
💻 LocalExpress10.833s (~)11.013s (~)0.180s51.01x
🐘 PostgresNext.js (Turbopack)14.904s (-2.3%)15.237s (-5.0%)0.333s51.39x
🐘 PostgresNitro15.269s (-25.3% 🟢)16.030s (-23.8% 🟢)0.762s51.43x
🐘 PostgresExpress20.322s (+13.8% 🔺)21.038s (+15.4% 🔺)0.716s51.90x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)22.217s (-15.6% 🟢)23.072s (-13.9% 🟢)0.855s51.00x
▲ VercelExpress23.130s (-8.2% 🟢)23.724s (-8.1% 🟢)0.593s51.04x
▲ VercelNitro23.173s (-12.1% 🟢)23.919s (-11.2% 🟢)0.745s51.04x

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

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.386s (~)2.011s (~)0.625s151.00x
💻 LocalNitro1.406s (+0.9%)2.007s (~)0.601s151.01x
💻 LocalExpress1.416s (~)2.007s (~)0.591s151.02x
🐘 PostgresNext.js (Turbopack)2.075s (+22.9% 🔺)2.599s (+27.4% 🔺)0.524s121.50x
🐘 PostgresNitro2.132s (-3.3%)2.760s (-8.4% 🟢)0.628s111.54x
🐘 PostgresExpress2.553s (+25.7% 🔺)3.014s (+9.9% 🔺)0.462s101.84x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.821s (-9.7% 🟢)3.631s (-6.7% 🟢)0.811s91.00x
▲ VercelNext.js (Turbopack)2.991s (~)3.725s (+2.5%)0.734s91.06x
▲ VercelExpress3.736s (+29.1% 🔺)5.355s (+46.3% 🔺)1.619s61.32x

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

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro2.429s (-4.4%)3.051s (+1.2%)0.623s101.00x
💻 LocalNext.js (Turbopack)2.487s (+3.0%)3.044s (-9.9% 🟢)0.558s101.02x
💻 LocalExpress2.522s (+1.8%)3.020s (~)0.498s101.04x
🐘 PostgresExpress8.825s (~)9.297s (-2.6%)0.472s43.63x
🐘 PostgresNext.js (Turbopack)10.771s (-1.9%)11.694s (~)0.923s34.43x
🐘 PostgresNitro11.244s (+32.5% 🔺)11.695s (+28.9% 🔺)0.451s34.63x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.137s (-12.1% 🟢)3.654s (-12.4% 🟢)0.517s91.00x
▲ VercelNext.js (Turbopack)3.223s (~)3.783s (+1.9%)0.560s81.03x
▲ VercelNitro3.434s (-4.5%)3.915s (-4.9%)0.481s81.09x

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

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.413s (~)2.007s (~)0.594s151.00x
💻 LocalNext.js (Turbopack)1.424s (+1.7%)2.011s (~)0.586s151.01x
💻 LocalExpress1.432s (~)2.007s (~)0.575s151.01x
🐘 PostgresNext.js (Turbopack)1.815s (+21.3% 🔺)2.156s (+7.1% 🔺)0.341s141.28x
🐘 PostgresExpress2.048s (-4.6%)2.527s (-2.7%)0.479s121.45x
🐘 PostgresNitro2.078s (+2.8%)2.680s (~)0.602s121.47x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.859s (-1.7%)3.631s (-2.8%)0.771s91.00x
▲ VercelExpress2.935s (+1.8%)3.757s (~)0.822s81.03x
▲ VercelNitro2.996s (+1.1%)3.773s (+1.4%)0.777s81.05x

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

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)2.593s (+3.6%)3.046s (~)0.453s101.00x
💻 LocalExpress2.606s (+1.0%)3.013s (~)0.407s101.00x
💻 LocalNitro2.650s (~)3.028s (~)0.378s101.02x
🐘 PostgresExpress11.333s (-1.6%)11.719s (~)0.386s34.37x
🐘 PostgresNext.js (Turbopack)11.564s (+6.4% 🔺)12.385s (+8.3% 🔺)0.821s34.46x
🐘 PostgresNitro13.741s (+20.7% 🔺)14.070s (+16.7% 🔺)0.329s35.30x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.296s (+5.7% 🔺)3.866s (+6.9% 🔺)0.571s81.00x
▲ VercelNext.js (Turbopack)3.509s (+1.1%)4.181s (+2.2%)0.672s81.06x
▲ VercelNitro119.077s (+3672.4% 🔺)120.329s (+3084.9% 🔺)1.252s136.13x

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

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.144s (+3.6%)1.004s (~)0.017s (+8.4% 🔺)1.028s (~)0.884s101.00x
💻 LocalExpress0.184s (+1.1%)0.992s (~)0.014s (-5.9% 🟢)1.021s (~)0.838s101.28x
💻 LocalNitro0.184s (-2.3%)0.992s (~)0.016s (-5.3% 🟢)1.022s (~)0.838s101.28x
🐘 PostgresNext.js (Turbopack)0.627s (-48.8% 🟢)0.975s (-46.5% 🟢)0.003s (+2500.0% 🔺)1.018s (-49.6% 🟢)0.391s104.37x
🐘 PostgresNitro1.098s (-50.8% 🟢)1.938s (-31.1% 🟢)0.000s (NaN%)2.013s (-33.2% 🟢)0.914s107.64x
🐘 PostgresExpress2.198s (+66.0% 🔺)2.845s (+58.7% 🔺)0.000s (NaN%)3.016s (+49.7% 🔺)0.818s1015.29x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.931s (~)3.312s (+3.9%)0.390s (+6.3% 🔺)4.134s (+3.5%)1.204s101.00x
▲ VercelNitro3.012s (+2.0%)3.272s (-0.5%)0.491s (+68.3% 🔺)4.257s (+2.6%)1.245s101.03x
▲ VercelExpress3.150s (+9.2% 🔺)3.259s (-1.4%)0.499s (~)4.306s (+0.9%)1.156s101.07x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)5/8
▲ VercelNext.js (Turbopack)5/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)💻 Local8/8
Nitro💻 Local8/8
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
  • 🌐 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)

📋 View full workflow run

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production457038495
❌ 💻 Local Development416232450
✅ 📦 Local Production418032450
✅ 🐘 Local Postgres418032450
✅ 🪟 Windows450045
❌ 🌍 Community Worlds311610192
Total17851631342082

❌ Failed Tests

💻 Local Development (2 failed)

astro-stable (2 failed):

  • 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
🌍 Community Worlds (161 failed)

mongodb (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

redis (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

starter (41 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

turso (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro4104
✅ example4104
✅ express4104
✅ fastify4104
✅ hono4104
✅ nextjs-turbopack4401
✅ nextjs-webpack4401
✅ nitro4104
✅ nuxt4104
✅ sveltekit4104
✅ vite4104
❌ 💻 Local Development
AppPassedFailedSkipped
❌ astro-stable3924
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack4500
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb5400
✅ redis-dev300
❌ redis5400
✅ starter-dev300
❌ starter4410
✅ turso-dev300
❌ turso5400

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR revamps the World documentation by creating dedicated detail pages for official worlds (local, postgres, vercel) with MDX-driven content. It introduces new components for world detail pages, benchmark history visualization with interactive charts, and a redesigned worlds index page with a 3D globe visual.

Changes:

  • Created dedicated /worlds/[id] routes with MDX content for official worlds and template components for community worlds
  • Added benchmark history charts showing performance trends over releases/commits with clickable data points
  • Restructured world documentation with cleaner h3 headings for configuration options instead of tables
  • Added TOC generation from MDX headings and world data provider context for component communication

Reviewed changes

Copilot reviewed 31 out of 32 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
worlds-manifest.jsonAdded example field for linking to example repositories
package.jsonAdded cobe dependency (0.6.5) for 3D globe visualization
next.config.tsAdded redirects from old /docs/deploying/world/* paths to new /worlds/* routes
worlds-data.tsEnhanced to extract framework-specific E2E data, workflow timing metrics, and added single world lookup functions
types.tsAdded framework E2E breakdown types, workflow timing fields, benchmark10SeqMs metric, and formatTime utility
WorldDetailHero.tsxNew hero component for world detail pages with E2E/benchmark summary and quick links
WorldDetailToc.tsxNew TOC component with intersection observer for active section highlighting
WorldTestingPerformance.tsxNew component displaying E2E test results and benchmark tables with history chart integration
WorldDataProvider.tsxNew context provider for sharing world data between MDX and client components
WorldCardSimple.tsxNew simplified card component for worlds index page with E2E/PERF metrics footer
Globe.tsxNew interactive 3D globe component using COBE library
BenchmarkHistoryChart.tsxNew dialog component showing performance trends over time with releases/commits toggle
local-world.mdxRewritten with cleaner structure, h3 config options, and Testing & Performance section
postgres-world.mdxRewritten with installation steps, framework-specific examples, and detailed configuration
vercel-world.mdxRewritten with simplified auto-configuration explanation and versioning details
worlds/page.tsxNew worlds index page with globe hero, world cards grid, and "What is a World?" section
worlds/[id]/page.tsxNew dynamic world detail page supporting both MDX and template rendering
worlds/compare/page.tsxNew benchmark comparison page with tables and charts
benchmark-history/route.tsNew API route fetching historical benchmark data from gh-pages commits
generate-docs-data.jsEnhanced to extract workflow timing metrics (min/max/ttfb/slurp) from benchmark results
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +44 to +63
return (
<nav className="space-y-1">
<p className="font-medium text-sm mb-2">On this page</p>
{items.map((item) => (
<a
key={item.id}
href={`#${item.id}`}
className={cn(
'block text-sm py-1 border-l-2 pl-3 transition-colors',
activeId === item.id
? 'border-primary text-foreground font-medium'
: 'border-transparent text-muted-foreground hover:text-foreground hover:border-muted-foreground'
)}
>
{item.title}
</a>
))}
</nav>
);
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

When items array is empty, this component renders a nav with just the "On this page" heading but no links. While not necessarily broken, consider adding a conditional render or early return if items.length === 0 to avoid rendering an empty navigation section.

Copilot uses AI. Check for mistakes.
Comment on lines +80 to +87
const fileRes = await fetch(
`https://raw.githubusercontent.com/${REPO}/${ghPagesSha}/${FILE_PATH}`,
{ next: { revalidate: 3600 } }
);

if (!fileRes.ok) return null;

return (await fileRes.json()) as CIResultsData;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The JSON parsing at line 87 doesn't handle malformed JSON responses. If the GitHub API returns invalid JSON, this will throw an unhandled error. Consider wrapping the await fileRes.json() in a try-catch or adding validation.

Copilot uses AI. Check for mistakes.
Comment on lines +120 to +145
const ghPagesCommits = (await ghPagesCommitsRes.json()) as GitHubCommit[];

// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

Similarly, the JSON parsing at line 120 for gh-pages commits doesn't handle malformed JSON responses. Consider adding error handling for the await ghPagesCommitsRes.json() call.

Suggested change
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
try{
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
}
}catch(error){
console.error('Failed to parse gh-pages commits JSON',error);
returnsnapshotMap;

Copilot uses AI. Check for mistakes.
Comment on lines +122 to +148
// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}
}

return snapshotMap;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The batch processing loop processes all gh-pages commits (up to 100) without any upper bound on memory usage. If there are many commits, this could create a large number of parallel fetch requests. Consider adding a limit to the total number of commits processed or adding more granular error handling to prevent memory issues.

Copilot uses AI. Check for mistakes.
Comment threaddocs/components/worlds/Globe.tsx Outdated
Comment on lines +69 to +70
const globe = createGlobe(canvasRef.current!, globeConfig);

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The canvasRef.current could be null when createGlobe is called. While the non-null assertion operator (!) is used, this could cause a runtime error if the component unmounts or the ref isn't set before the effect runs. Add a null check before calling createGlobe.

Suggested change
constglobe=createGlobe(canvasRef.current!,globeConfig);
constcanvas=canvasRef.current;
if(!canvas){
return()=>{
window.removeEventListener('resize',onResize);
};
}
constglobe=createGlobe(canvas,globeConfig);

Copilot uses AI. Check for mistakes.

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

World documentation pages at /docs/deploying/world/* should redirect to /worlds/[id], but the redirect was never implemented - only mentioned in a comment

Fix on Vercel

samples: latestPoint?.samples,
current,
trendPercent,
ttfb: latestPoint?.ttfb,

@vercelvercelBotJan 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Trend calculation defaults undefined workflowTime values to 0, making it impossible to distinguish between "no data" and "zero performance time"

Fix on Vercel

Comment threaddocs/app/api/benchmark-history/route.ts Outdated
const pointerInteracting = useRef<number | null>(null);
const pointerInteractionMovement = useRef(0);
const [size, setSize] = useState(1200);
const { resolvedTheme } = useTheme();

@vercelvercelBotJan 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Globe component uses useTheme() without deferring initialization, causing hydration mismatch between server (undefined theme) and client

Fix on Vercel

- Add dedicated world detail pages at /worlds/[id] with MDX-driven content
- Create WorldDetailHero, WorldDetailToc, WorldTestingPerformance components
- Add benchmark history charts and test summary links
- Rewrite local-world, postgres-world, and vercel-world MDX with cleaner structure
- Use h3 headings for configuration options instead of tables/accordions
- Add WorldDataProvider context for passing world data to MDX components
- Add example field to worlds-manifest for linking to example repos
- Update worlds index page design
- Globe now scales with container width up to 1200px max
- Increased opacity from 20% to 30% for better visibility
- Positioned globe 30% down to show north pole behind header
- Globe component now auto-sizes based on container width
- Update title format to '{Name} World | Workflow DevKit'
- Update worlds index page title to 'Worlds | Workflow DevKit'
- Improve world descriptions in worlds-manifest.json for better SEO
- Add dynamic OG image generation at /worlds/[id]/og
- Add openGraph and twitter metadata to world detail pages
- Replace route-based og/route.tsx with opengraph-image.tsx file convention
- Remove runtime = 'edge' to allow generateStaticParams for static generation
- Simplify page.tsx metadata (Next.js auto-detects opengraph-image.tsx)
- Fix globe visibility in light/dark mode
- Fix tooltip positioning on mobile breakpoints
- Remove redundant Documentation button for community worlds
- Add missing pages to Foundations index (streaming, serialization, idempotency)
- Restructure deploying section with new index and building-a-world guide
- Restore original MDX content for official worlds (local, vercel, postgres)
- Auto-expand sidebar folders when child page is active

// Check if any child is active (current path starts with folder's index URL)
const hasActiveChild = item.index?.url
? pathname.startsWith(item.index.url + '/')

@vercelvercelBotJan 23, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sidebar fails to expand root-level folder when checking for active children due to malformed path check.

Fix on Vercel

<Card href="/docs/foundations/hooks" title="Webhooks (and hooks)">
Respond to external events in your workflow using hooks and webhooks.
</Card>
<Card href="/docs/foundations/streaming" title="Streaming">

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

unrelated change - the foundations page was missing cards for these (they were only in meta)

Comment threaddocs/next.config.ts
Comment on lines +53 to +73
// Redirect old world docs to new /worlds routes
{
source: '/docs/deploying/world/local-world',
destination: '/worlds/local',
permanent: true,
},
{
source: '/docs/deploying/world/postgres-world',
destination: '/worlds/postgres',
permanent: true,
},
{
source: '/docs/deploying/world/vercel-world',
destination: '/worlds/vercel',
permanent: true,
},
{
source: '/docs/worlds',
destination: '/worlds',
permanent: true,
},

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

this is so we don't break existing links on twitter, etc.

pranaygpand others added 2 commits January 23, 2026 17:12
- Fix /docs/deploying/world link to /docs/deploying/building-a-world
- Fix /docs/deploying#what-are-worlds invalid anchor to /docs/deploying
- Add @skip-typecheck markers to interface definition code blocks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- benchmark-history/route.ts: Add error handling for JSON parsing,
distinguish 404s from actual errors
- Globe.tsx: Fix hydration mismatch by deferring theme-dependent
rendering until component is mounted
- sidebar.tsx: Improve path check robustness for active child detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​cobe@​0.6.51001009383100

View full report

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🚢

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pranaygp@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs: revamp World documentation pages - #763

Merged
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking
Jan 26, 2026
Merged

docs: revamp World documentation pages#763
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking

Conversation

@pranaygp

@pranaygppranaygp commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

Added dedicated worlds page to show all available worlds incuding e2e testbench pass rate and performance benchmarking

Added historic performance benchmarking over last 30 commits/releases on github with request caching (should probably be ISR / PPR since these can be caluclated at build time and don't need to be re-fetched)

Rewrote the Local, Postgres and Vercel world documentation pages to follow a standard structure with config, observability, benchmarking notes

TODOs

  • Do another design and structural pass on the community world detail pages
  • Remove the old pages from docs for worlds and ensure redirect to prevent broken links
  • Include a better explanation on worlds, the interface, and how to build your own world
  • Polish up the worlds index page - need to replace the redundant AI generated components at the bottom with something more useful
  • Ask AI to do a code self review

Additional Changes

Deploying Section Restructure:

  • New streamlined deploying index page explaining portability via Worlds, local dev, and Vercel deployment
  • New detailed "Building a World" guide with Storage, Queue, and Streamer interface documentation
  • Links to Postgres World as reference implementation

Worlds Page UI Improvements:

  • Simplified footer: replaced "What is a World?" and "Build Your Own World" sections with single "Learn more about worlds" section
  • Moved "Last updated" info directly under worlds grid for better visibility
  • Fixed globe visibility in light/dark mode for better text readability
  • Fixed tooltip positioning on mobile breakpoints

Sidebar Navigation:

  • Auto-expand sidebar folders when viewing a child page (improves navigation context)

Other Fixes:

  • Added missing Foundations index cards (Streaming, Serialization, Idempotency)
  • Removed redundant Documentation button for community worlds (GitHub link is sufficient)

Preview

Worlds Page

imageimage

Postgres Docs (also check the other worlds)
image
image
image

CopilotAI review requested due to automatic review settings January 10, 2026 09:54
@changeset-bot

changeset-botBot commented Jan 10, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: d778fab

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

vercelBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.041s (-7.5% 🟢)1.019s (~)0.978s101.00x
💻 LocalNitro0.042s (-1.9%)1.007s (~)0.964s101.04x
💻 LocalExpress0.046s (+1.3%)1.008s (~)0.962s101.13x
🐘 PostgresNext.js (Turbopack)0.148s (+3.7%)1.022s (~)0.873s103.64x
🐘 PostgresExpress0.203s (-29.8% 🟢)1.024s (+0.9%)0.820s104.99x
🐘 PostgresNitro0.311s (+22.6% 🔺)1.031s (+1.7%)0.720s107.62x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.628s (-16.8% 🟢)1.485s (-24.3% 🟢)0.858s101.00x
▲ VercelNitro0.643s (-18.8% 🟢)1.482s (-12.4% 🟢)0.839s101.02x
▲ VercelExpress0.660s (-25.7% 🟢)1.566s (-11.2% 🟢)0.906s101.05x

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

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.096s (~)2.012s (~)0.917s101.00x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
💻 LocalExpress1.118s (~)2.007s (~)0.889s101.02x
🐘 PostgresNitro2.128s (-2.8%)2.414s (-20.0% 🟢)0.286s101.94x
🐘 PostgresNext.js (Turbopack)2.153s (+11.0% 🔺)2.417s (+14.2% 🔺)0.264s101.96x
🐘 PostgresExpress2.359s (+11.2% 🔺)3.016s (~)0.657s102.15x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.809s (-1.3%)3.597s (-1.3%)0.788s101.00x
▲ VercelNitro2.828s (-2.4%)3.626s (-2.3%)0.798s101.01x
▲ VercelExpress2.867s (-3.0%)3.643s (-0.6%)0.776s101.02x

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

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)10.701s (~)11.021s (~)0.321s51.00x
💻 LocalNitro10.823s (~)11.012s (~)0.189s51.01x
💻 LocalExpress10.833s (~)11.013s (~)0.180s51.01x
🐘 PostgresNext.js (Turbopack)14.904s (-2.3%)15.237s (-5.0%)0.333s51.39x
🐘 PostgresNitro15.269s (-25.3% 🟢)16.030s (-23.8% 🟢)0.762s51.43x
🐘 PostgresExpress20.322s (+13.8% 🔺)21.038s (+15.4% 🔺)0.716s51.90x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)22.217s (-15.6% 🟢)23.072s (-13.9% 🟢)0.855s51.00x
▲ VercelExpress23.130s (-8.2% 🟢)23.724s (-8.1% 🟢)0.593s51.04x
▲ VercelNitro23.173s (-12.1% 🟢)23.919s (-11.2% 🟢)0.745s51.04x

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

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.386s (~)2.011s (~)0.625s151.00x
💻 LocalNitro1.406s (+0.9%)2.007s (~)0.601s151.01x
💻 LocalExpress1.416s (~)2.007s (~)0.591s151.02x
🐘 PostgresNext.js (Turbopack)2.075s (+22.9% 🔺)2.599s (+27.4% 🔺)0.524s121.50x
🐘 PostgresNitro2.132s (-3.3%)2.760s (-8.4% 🟢)0.628s111.54x
🐘 PostgresExpress2.553s (+25.7% 🔺)3.014s (+9.9% 🔺)0.462s101.84x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.821s (-9.7% 🟢)3.631s (-6.7% 🟢)0.811s91.00x
▲ VercelNext.js (Turbopack)2.991s (~)3.725s (+2.5%)0.734s91.06x
▲ VercelExpress3.736s (+29.1% 🔺)5.355s (+46.3% 🔺)1.619s61.32x

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

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro2.429s (-4.4%)3.051s (+1.2%)0.623s101.00x
💻 LocalNext.js (Turbopack)2.487s (+3.0%)3.044s (-9.9% 🟢)0.558s101.02x
💻 LocalExpress2.522s (+1.8%)3.020s (~)0.498s101.04x
🐘 PostgresExpress8.825s (~)9.297s (-2.6%)0.472s43.63x
🐘 PostgresNext.js (Turbopack)10.771s (-1.9%)11.694s (~)0.923s34.43x
🐘 PostgresNitro11.244s (+32.5% 🔺)11.695s (+28.9% 🔺)0.451s34.63x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.137s (-12.1% 🟢)3.654s (-12.4% 🟢)0.517s91.00x
▲ VercelNext.js (Turbopack)3.223s (~)3.783s (+1.9%)0.560s81.03x
▲ VercelNitro3.434s (-4.5%)3.915s (-4.9%)0.481s81.09x

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

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.413s (~)2.007s (~)0.594s151.00x
💻 LocalNext.js (Turbopack)1.424s (+1.7%)2.011s (~)0.586s151.01x
💻 LocalExpress1.432s (~)2.007s (~)0.575s151.01x
🐘 PostgresNext.js (Turbopack)1.815s (+21.3% 🔺)2.156s (+7.1% 🔺)0.341s141.28x
🐘 PostgresExpress2.048s (-4.6%)2.527s (-2.7%)0.479s121.45x
🐘 PostgresNitro2.078s (+2.8%)2.680s (~)0.602s121.47x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.859s (-1.7%)3.631s (-2.8%)0.771s91.00x
▲ VercelExpress2.935s (+1.8%)3.757s (~)0.822s81.03x
▲ VercelNitro2.996s (+1.1%)3.773s (+1.4%)0.777s81.05x

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

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)2.593s (+3.6%)3.046s (~)0.453s101.00x
💻 LocalExpress2.606s (+1.0%)3.013s (~)0.407s101.00x
💻 LocalNitro2.650s (~)3.028s (~)0.378s101.02x
🐘 PostgresExpress11.333s (-1.6%)11.719s (~)0.386s34.37x
🐘 PostgresNext.js (Turbopack)11.564s (+6.4% 🔺)12.385s (+8.3% 🔺)0.821s34.46x
🐘 PostgresNitro13.741s (+20.7% 🔺)14.070s (+16.7% 🔺)0.329s35.30x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.296s (+5.7% 🔺)3.866s (+6.9% 🔺)0.571s81.00x
▲ VercelNext.js (Turbopack)3.509s (+1.1%)4.181s (+2.2%)0.672s81.06x
▲ VercelNitro119.077s (+3672.4% 🔺)120.329s (+3084.9% 🔺)1.252s136.13x

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

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.144s (+3.6%)1.004s (~)0.017s (+8.4% 🔺)1.028s (~)0.884s101.00x
💻 LocalExpress0.184s (+1.1%)0.992s (~)0.014s (-5.9% 🟢)1.021s (~)0.838s101.28x
💻 LocalNitro0.184s (-2.3%)0.992s (~)0.016s (-5.3% 🟢)1.022s (~)0.838s101.28x
🐘 PostgresNext.js (Turbopack)0.627s (-48.8% 🟢)0.975s (-46.5% 🟢)0.003s (+2500.0% 🔺)1.018s (-49.6% 🟢)0.391s104.37x
🐘 PostgresNitro1.098s (-50.8% 🟢)1.938s (-31.1% 🟢)0.000s (NaN%)2.013s (-33.2% 🟢)0.914s107.64x
🐘 PostgresExpress2.198s (+66.0% 🔺)2.845s (+58.7% 🔺)0.000s (NaN%)3.016s (+49.7% 🔺)0.818s1015.29x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.931s (~)3.312s (+3.9%)0.390s (+6.3% 🔺)4.134s (+3.5%)1.204s101.00x
▲ VercelNitro3.012s (+2.0%)3.272s (-0.5%)0.491s (+68.3% 🔺)4.257s (+2.6%)1.245s101.03x
▲ VercelExpress3.150s (+9.2% 🔺)3.259s (-1.4%)0.499s (~)4.306s (+0.9%)1.156s101.07x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)5/8
▲ VercelNext.js (Turbopack)5/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)💻 Local8/8
Nitro💻 Local8/8
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
  • 🌐 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)

📋 View full workflow run

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production457038495
❌ 💻 Local Development416232450
✅ 📦 Local Production418032450
✅ 🐘 Local Postgres418032450
✅ 🪟 Windows450045
❌ 🌍 Community Worlds311610192
Total17851631342082

❌ Failed Tests

💻 Local Development (2 failed)

astro-stable (2 failed):

  • 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
🌍 Community Worlds (161 failed)

mongodb (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

redis (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

starter (41 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

turso (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro4104
✅ example4104
✅ express4104
✅ fastify4104
✅ hono4104
✅ nextjs-turbopack4401
✅ nextjs-webpack4401
✅ nitro4104
✅ nuxt4104
✅ sveltekit4104
✅ vite4104
❌ 💻 Local Development
AppPassedFailedSkipped
❌ astro-stable3924
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack4500
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb5400
✅ redis-dev300
❌ redis5400
✅ starter-dev300
❌ starter4410
✅ turso-dev300
❌ turso5400

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR revamps the World documentation by creating dedicated detail pages for official worlds (local, postgres, vercel) with MDX-driven content. It introduces new components for world detail pages, benchmark history visualization with interactive charts, and a redesigned worlds index page with a 3D globe visual.

Changes:

  • Created dedicated /worlds/[id] routes with MDX content for official worlds and template components for community worlds
  • Added benchmark history charts showing performance trends over releases/commits with clickable data points
  • Restructured world documentation with cleaner h3 headings for configuration options instead of tables
  • Added TOC generation from MDX headings and world data provider context for component communication

Reviewed changes

Copilot reviewed 31 out of 32 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
worlds-manifest.jsonAdded example field for linking to example repositories
package.jsonAdded cobe dependency (0.6.5) for 3D globe visualization
next.config.tsAdded redirects from old /docs/deploying/world/* paths to new /worlds/* routes
worlds-data.tsEnhanced to extract framework-specific E2E data, workflow timing metrics, and added single world lookup functions
types.tsAdded framework E2E breakdown types, workflow timing fields, benchmark10SeqMs metric, and formatTime utility
WorldDetailHero.tsxNew hero component for world detail pages with E2E/benchmark summary and quick links
WorldDetailToc.tsxNew TOC component with intersection observer for active section highlighting
WorldTestingPerformance.tsxNew component displaying E2E test results and benchmark tables with history chart integration
WorldDataProvider.tsxNew context provider for sharing world data between MDX and client components
WorldCardSimple.tsxNew simplified card component for worlds index page with E2E/PERF metrics footer
Globe.tsxNew interactive 3D globe component using COBE library
BenchmarkHistoryChart.tsxNew dialog component showing performance trends over time with releases/commits toggle
local-world.mdxRewritten with cleaner structure, h3 config options, and Testing & Performance section
postgres-world.mdxRewritten with installation steps, framework-specific examples, and detailed configuration
vercel-world.mdxRewritten with simplified auto-configuration explanation and versioning details
worlds/page.tsxNew worlds index page with globe hero, world cards grid, and "What is a World?" section
worlds/[id]/page.tsxNew dynamic world detail page supporting both MDX and template rendering
worlds/compare/page.tsxNew benchmark comparison page with tables and charts
benchmark-history/route.tsNew API route fetching historical benchmark data from gh-pages commits
generate-docs-data.jsEnhanced to extract workflow timing metrics (min/max/ttfb/slurp) from benchmark results
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +44 to +63
return (
<nav className="space-y-1">
<p className="font-medium text-sm mb-2">On this page</p>
{items.map((item) => (
<a
key={item.id}
href={`#${item.id}`}
className={cn(
'block text-sm py-1 border-l-2 pl-3 transition-colors',
activeId === item.id
? 'border-primary text-foreground font-medium'
: 'border-transparent text-muted-foreground hover:text-foreground hover:border-muted-foreground'
)}
>
{item.title}
</a>
))}
</nav>
);
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

When items array is empty, this component renders a nav with just the "On this page" heading but no links. While not necessarily broken, consider adding a conditional render or early return if items.length === 0 to avoid rendering an empty navigation section.

Copilot uses AI. Check for mistakes.
Comment on lines +80 to +87
const fileRes = await fetch(
`https://raw.githubusercontent.com/${REPO}/${ghPagesSha}/${FILE_PATH}`,
{ next: { revalidate: 3600 } }
);

if (!fileRes.ok) return null;

return (await fileRes.json()) as CIResultsData;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The JSON parsing at line 87 doesn't handle malformed JSON responses. If the GitHub API returns invalid JSON, this will throw an unhandled error. Consider wrapping the await fileRes.json() in a try-catch or adding validation.

Copilot uses AI. Check for mistakes.
Comment on lines +120 to +145
const ghPagesCommits = (await ghPagesCommitsRes.json()) as GitHubCommit[];

// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

Similarly, the JSON parsing at line 120 for gh-pages commits doesn't handle malformed JSON responses. Consider adding error handling for the await ghPagesCommitsRes.json() call.

Suggested change
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
try{
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
}
}catch(error){
console.error('Failed to parse gh-pages commits JSON',error);
returnsnapshotMap;

Copilot uses AI. Check for mistakes.
Comment on lines +122 to +148
// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}
}

return snapshotMap;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The batch processing loop processes all gh-pages commits (up to 100) without any upper bound on memory usage. If there are many commits, this could create a large number of parallel fetch requests. Consider adding a limit to the total number of commits processed or adding more granular error handling to prevent memory issues.

Copilot uses AI. Check for mistakes.
Comment threaddocs/components/worlds/Globe.tsx Outdated
Comment on lines +69 to +70
const globe = createGlobe(canvasRef.current!, globeConfig);

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The canvasRef.current could be null when createGlobe is called. While the non-null assertion operator (!) is used, this could cause a runtime error if the component unmounts or the ref isn't set before the effect runs. Add a null check before calling createGlobe.

Suggested change
constglobe=createGlobe(canvasRef.current!,globeConfig);
constcanvas=canvasRef.current;
if(!canvas){
return()=>{
window.removeEventListener('resize',onResize);
};
}
constglobe=createGlobe(canvas,globeConfig);

Copilot uses AI. Check for mistakes.

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

World documentation pages at /docs/deploying/world/* should redirect to /worlds/[id], but the redirect was never implemented - only mentioned in a comment

Fix on Vercel

samples: latestPoint?.samples,
current,
trendPercent,
ttfb: latestPoint?.ttfb,

@vercelvercelBotJan 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Trend calculation defaults undefined workflowTime values to 0, making it impossible to distinguish between "no data" and "zero performance time"

Fix on Vercel

Comment threaddocs/app/api/benchmark-history/route.ts Outdated
const pointerInteracting = useRef<number | null>(null);
const pointerInteractionMovement = useRef(0);
const [size, setSize] = useState(1200);
const { resolvedTheme } = useTheme();

@vercelvercelBotJan 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Globe component uses useTheme() without deferring initialization, causing hydration mismatch between server (undefined theme) and client

Fix on Vercel

- Add dedicated world detail pages at /worlds/[id] with MDX-driven content
- Create WorldDetailHero, WorldDetailToc, WorldTestingPerformance components
- Add benchmark history charts and test summary links
- Rewrite local-world, postgres-world, and vercel-world MDX with cleaner structure
- Use h3 headings for configuration options instead of tables/accordions
- Add WorldDataProvider context for passing world data to MDX components
- Add example field to worlds-manifest for linking to example repos
- Update worlds index page design
- Globe now scales with container width up to 1200px max
- Increased opacity from 20% to 30% for better visibility
- Positioned globe 30% down to show north pole behind header
- Globe component now auto-sizes based on container width
- Update title format to '{Name} World | Workflow DevKit'
- Update worlds index page title to 'Worlds | Workflow DevKit'
- Improve world descriptions in worlds-manifest.json for better SEO
- Add dynamic OG image generation at /worlds/[id]/og
- Add openGraph and twitter metadata to world detail pages
- Replace route-based og/route.tsx with opengraph-image.tsx file convention
- Remove runtime = 'edge' to allow generateStaticParams for static generation
- Simplify page.tsx metadata (Next.js auto-detects opengraph-image.tsx)
- Fix globe visibility in light/dark mode
- Fix tooltip positioning on mobile breakpoints
- Remove redundant Documentation button for community worlds
- Add missing pages to Foundations index (streaming, serialization, idempotency)
- Restructure deploying section with new index and building-a-world guide
- Restore original MDX content for official worlds (local, vercel, postgres)
- Auto-expand sidebar folders when child page is active

// Check if any child is active (current path starts with folder's index URL)
const hasActiveChild = item.index?.url
? pathname.startsWith(item.index.url + '/')

@vercelvercelBotJan 23, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sidebar fails to expand root-level folder when checking for active children due to malformed path check.

Fix on Vercel

<Card href="/docs/foundations/hooks" title="Webhooks (and hooks)">
Respond to external events in your workflow using hooks and webhooks.
</Card>
<Card href="/docs/foundations/streaming" title="Streaming">

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

unrelated change - the foundations page was missing cards for these (they were only in meta)

Comment threaddocs/next.config.ts
Comment on lines +53 to +73
// Redirect old world docs to new /worlds routes
{
source: '/docs/deploying/world/local-world',
destination: '/worlds/local',
permanent: true,
},
{
source: '/docs/deploying/world/postgres-world',
destination: '/worlds/postgres',
permanent: true,
},
{
source: '/docs/deploying/world/vercel-world',
destination: '/worlds/vercel',
permanent: true,
},
{
source: '/docs/worlds',
destination: '/worlds',
permanent: true,
},

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

this is so we don't break existing links on twitter, etc.

pranaygpand others added 2 commits January 23, 2026 17:12
- Fix /docs/deploying/world link to /docs/deploying/building-a-world
- Fix /docs/deploying#what-are-worlds invalid anchor to /docs/deploying
- Add @skip-typecheck markers to interface definition code blocks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- benchmark-history/route.ts: Add error handling for JSON parsing,
distinguish 404s from actual errors
- Globe.tsx: Fix hydration mismatch by deferring theme-dependent
rendering until component is mounted
- sidebar.tsx: Improve path check robustness for active child detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​cobe@​0.6.51001009383100

View full report

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🚢

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pranaygp@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs: revamp World documentation pages - #763

Merged
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking
Jan 26, 2026
Merged

docs: revamp World documentation pages#763
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking

Conversation

@pranaygp

@pranaygppranaygp commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

Added dedicated worlds page to show all available worlds incuding e2e testbench pass rate and performance benchmarking

Added historic performance benchmarking over last 30 commits/releases on github with request caching (should probably be ISR / PPR since these can be caluclated at build time and don't need to be re-fetched)

Rewrote the Local, Postgres and Vercel world documentation pages to follow a standard structure with config, observability, benchmarking notes

TODOs

  • Do another design and structural pass on the community world detail pages
  • Remove the old pages from docs for worlds and ensure redirect to prevent broken links
  • Include a better explanation on worlds, the interface, and how to build your own world
  • Polish up the worlds index page - need to replace the redundant AI generated components at the bottom with something more useful
  • Ask AI to do a code self review

Additional Changes

Deploying Section Restructure:

  • New streamlined deploying index page explaining portability via Worlds, local dev, and Vercel deployment
  • New detailed "Building a World" guide with Storage, Queue, and Streamer interface documentation
  • Links to Postgres World as reference implementation

Worlds Page UI Improvements:

  • Simplified footer: replaced "What is a World?" and "Build Your Own World" sections with single "Learn more about worlds" section
  • Moved "Last updated" info directly under worlds grid for better visibility
  • Fixed globe visibility in light/dark mode for better text readability
  • Fixed tooltip positioning on mobile breakpoints

Sidebar Navigation:

  • Auto-expand sidebar folders when viewing a child page (improves navigation context)

Other Fixes:

  • Added missing Foundations index cards (Streaming, Serialization, Idempotency)
  • Removed redundant Documentation button for community worlds (GitHub link is sufficient)

Preview

Worlds Page

imageimage

Postgres Docs (also check the other worlds)
image
image
image

CopilotAI review requested due to automatic review settings January 10, 2026 09:54
@changeset-bot

changeset-botBot commented Jan 10, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: d778fab

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

vercelBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.041s (-7.5% 🟢)1.019s (~)0.978s101.00x
💻 LocalNitro0.042s (-1.9%)1.007s (~)0.964s101.04x
💻 LocalExpress0.046s (+1.3%)1.008s (~)0.962s101.13x
🐘 PostgresNext.js (Turbopack)0.148s (+3.7%)1.022s (~)0.873s103.64x
🐘 PostgresExpress0.203s (-29.8% 🟢)1.024s (+0.9%)0.820s104.99x
🐘 PostgresNitro0.311s (+22.6% 🔺)1.031s (+1.7%)0.720s107.62x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.628s (-16.8% 🟢)1.485s (-24.3% 🟢)0.858s101.00x
▲ VercelNitro0.643s (-18.8% 🟢)1.482s (-12.4% 🟢)0.839s101.02x
▲ VercelExpress0.660s (-25.7% 🟢)1.566s (-11.2% 🟢)0.906s101.05x

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

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.096s (~)2.012s (~)0.917s101.00x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
💻 LocalExpress1.118s (~)2.007s (~)0.889s101.02x
🐘 PostgresNitro2.128s (-2.8%)2.414s (-20.0% 🟢)0.286s101.94x
🐘 PostgresNext.js (Turbopack)2.153s (+11.0% 🔺)2.417s (+14.2% 🔺)0.264s101.96x
🐘 PostgresExpress2.359s (+11.2% 🔺)3.016s (~)0.657s102.15x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.809s (-1.3%)3.597s (-1.3%)0.788s101.00x
▲ VercelNitro2.828s (-2.4%)3.626s (-2.3%)0.798s101.01x
▲ VercelExpress2.867s (-3.0%)3.643s (-0.6%)0.776s101.02x

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

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)10.701s (~)11.021s (~)0.321s51.00x
💻 LocalNitro10.823s (~)11.012s (~)0.189s51.01x
💻 LocalExpress10.833s (~)11.013s (~)0.180s51.01x
🐘 PostgresNext.js (Turbopack)14.904s (-2.3%)15.237s (-5.0%)0.333s51.39x
🐘 PostgresNitro15.269s (-25.3% 🟢)16.030s (-23.8% 🟢)0.762s51.43x
🐘 PostgresExpress20.322s (+13.8% 🔺)21.038s (+15.4% 🔺)0.716s51.90x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)22.217s (-15.6% 🟢)23.072s (-13.9% 🟢)0.855s51.00x
▲ VercelExpress23.130s (-8.2% 🟢)23.724s (-8.1% 🟢)0.593s51.04x
▲ VercelNitro23.173s (-12.1% 🟢)23.919s (-11.2% 🟢)0.745s51.04x

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

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.386s (~)2.011s (~)0.625s151.00x
💻 LocalNitro1.406s (+0.9%)2.007s (~)0.601s151.01x
💻 LocalExpress1.416s (~)2.007s (~)0.591s151.02x
🐘 PostgresNext.js (Turbopack)2.075s (+22.9% 🔺)2.599s (+27.4% 🔺)0.524s121.50x
🐘 PostgresNitro2.132s (-3.3%)2.760s (-8.4% 🟢)0.628s111.54x
🐘 PostgresExpress2.553s (+25.7% 🔺)3.014s (+9.9% 🔺)0.462s101.84x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.821s (-9.7% 🟢)3.631s (-6.7% 🟢)0.811s91.00x
▲ VercelNext.js (Turbopack)2.991s (~)3.725s (+2.5%)0.734s91.06x
▲ VercelExpress3.736s (+29.1% 🔺)5.355s (+46.3% 🔺)1.619s61.32x

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

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro2.429s (-4.4%)3.051s (+1.2%)0.623s101.00x
💻 LocalNext.js (Turbopack)2.487s (+3.0%)3.044s (-9.9% 🟢)0.558s101.02x
💻 LocalExpress2.522s (+1.8%)3.020s (~)0.498s101.04x
🐘 PostgresExpress8.825s (~)9.297s (-2.6%)0.472s43.63x
🐘 PostgresNext.js (Turbopack)10.771s (-1.9%)11.694s (~)0.923s34.43x
🐘 PostgresNitro11.244s (+32.5% 🔺)11.695s (+28.9% 🔺)0.451s34.63x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.137s (-12.1% 🟢)3.654s (-12.4% 🟢)0.517s91.00x
▲ VercelNext.js (Turbopack)3.223s (~)3.783s (+1.9%)0.560s81.03x
▲ VercelNitro3.434s (-4.5%)3.915s (-4.9%)0.481s81.09x

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

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.413s (~)2.007s (~)0.594s151.00x
💻 LocalNext.js (Turbopack)1.424s (+1.7%)2.011s (~)0.586s151.01x
💻 LocalExpress1.432s (~)2.007s (~)0.575s151.01x
🐘 PostgresNext.js (Turbopack)1.815s (+21.3% 🔺)2.156s (+7.1% 🔺)0.341s141.28x
🐘 PostgresExpress2.048s (-4.6%)2.527s (-2.7%)0.479s121.45x
🐘 PostgresNitro2.078s (+2.8%)2.680s (~)0.602s121.47x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.859s (-1.7%)3.631s (-2.8%)0.771s91.00x
▲ VercelExpress2.935s (+1.8%)3.757s (~)0.822s81.03x
▲ VercelNitro2.996s (+1.1%)3.773s (+1.4%)0.777s81.05x

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

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)2.593s (+3.6%)3.046s (~)0.453s101.00x
💻 LocalExpress2.606s (+1.0%)3.013s (~)0.407s101.00x
💻 LocalNitro2.650s (~)3.028s (~)0.378s101.02x
🐘 PostgresExpress11.333s (-1.6%)11.719s (~)0.386s34.37x
🐘 PostgresNext.js (Turbopack)11.564s (+6.4% 🔺)12.385s (+8.3% 🔺)0.821s34.46x
🐘 PostgresNitro13.741s (+20.7% 🔺)14.070s (+16.7% 🔺)0.329s35.30x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.296s (+5.7% 🔺)3.866s (+6.9% 🔺)0.571s81.00x
▲ VercelNext.js (Turbopack)3.509s (+1.1%)4.181s (+2.2%)0.672s81.06x
▲ VercelNitro119.077s (+3672.4% 🔺)120.329s (+3084.9% 🔺)1.252s136.13x

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

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.144s (+3.6%)1.004s (~)0.017s (+8.4% 🔺)1.028s (~)0.884s101.00x
💻 LocalExpress0.184s (+1.1%)0.992s (~)0.014s (-5.9% 🟢)1.021s (~)0.838s101.28x
💻 LocalNitro0.184s (-2.3%)0.992s (~)0.016s (-5.3% 🟢)1.022s (~)0.838s101.28x
🐘 PostgresNext.js (Turbopack)0.627s (-48.8% 🟢)0.975s (-46.5% 🟢)0.003s (+2500.0% 🔺)1.018s (-49.6% 🟢)0.391s104.37x
🐘 PostgresNitro1.098s (-50.8% 🟢)1.938s (-31.1% 🟢)0.000s (NaN%)2.013s (-33.2% 🟢)0.914s107.64x
🐘 PostgresExpress2.198s (+66.0% 🔺)2.845s (+58.7% 🔺)0.000s (NaN%)3.016s (+49.7% 🔺)0.818s1015.29x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.931s (~)3.312s (+3.9%)0.390s (+6.3% 🔺)4.134s (+3.5%)1.204s101.00x
▲ VercelNitro3.012s (+2.0%)3.272s (-0.5%)0.491s (+68.3% 🔺)4.257s (+2.6%)1.245s101.03x
▲ VercelExpress3.150s (+9.2% 🔺)3.259s (-1.4%)0.499s (~)4.306s (+0.9%)1.156s101.07x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)5/8
▲ VercelNext.js (Turbopack)5/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)💻 Local8/8
Nitro💻 Local8/8
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
  • 🌐 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)

📋 View full workflow run

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production457038495
❌ 💻 Local Development416232450
✅ 📦 Local Production418032450
✅ 🐘 Local Postgres418032450
✅ 🪟 Windows450045
❌ 🌍 Community Worlds311610192
Total17851631342082

❌ Failed Tests

💻 Local Development (2 failed)

astro-stable (2 failed):

  • 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
🌍 Community Worlds (161 failed)

mongodb (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

redis (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

starter (41 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

turso (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro4104
✅ example4104
✅ express4104
✅ fastify4104
✅ hono4104
✅ nextjs-turbopack4401
✅ nextjs-webpack4401
✅ nitro4104
✅ nuxt4104
✅ sveltekit4104
✅ vite4104
❌ 💻 Local Development
AppPassedFailedSkipped
❌ astro-stable3924
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack4500
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb5400
✅ redis-dev300
❌ redis5400
✅ starter-dev300
❌ starter4410
✅ turso-dev300
❌ turso5400

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR revamps the World documentation by creating dedicated detail pages for official worlds (local, postgres, vercel) with MDX-driven content. It introduces new components for world detail pages, benchmark history visualization with interactive charts, and a redesigned worlds index page with a 3D globe visual.

Changes:

  • Created dedicated /worlds/[id] routes with MDX content for official worlds and template components for community worlds
  • Added benchmark history charts showing performance trends over releases/commits with clickable data points
  • Restructured world documentation with cleaner h3 headings for configuration options instead of tables
  • Added TOC generation from MDX headings and world data provider context for component communication

Reviewed changes

Copilot reviewed 31 out of 32 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
worlds-manifest.jsonAdded example field for linking to example repositories
package.jsonAdded cobe dependency (0.6.5) for 3D globe visualization
next.config.tsAdded redirects from old /docs/deploying/world/* paths to new /worlds/* routes
worlds-data.tsEnhanced to extract framework-specific E2E data, workflow timing metrics, and added single world lookup functions
types.tsAdded framework E2E breakdown types, workflow timing fields, benchmark10SeqMs metric, and formatTime utility
WorldDetailHero.tsxNew hero component for world detail pages with E2E/benchmark summary and quick links
WorldDetailToc.tsxNew TOC component with intersection observer for active section highlighting
WorldTestingPerformance.tsxNew component displaying E2E test results and benchmark tables with history chart integration
WorldDataProvider.tsxNew context provider for sharing world data between MDX and client components
WorldCardSimple.tsxNew simplified card component for worlds index page with E2E/PERF metrics footer
Globe.tsxNew interactive 3D globe component using COBE library
BenchmarkHistoryChart.tsxNew dialog component showing performance trends over time with releases/commits toggle
local-world.mdxRewritten with cleaner structure, h3 config options, and Testing & Performance section
postgres-world.mdxRewritten with installation steps, framework-specific examples, and detailed configuration
vercel-world.mdxRewritten with simplified auto-configuration explanation and versioning details
worlds/page.tsxNew worlds index page with globe hero, world cards grid, and "What is a World?" section
worlds/[id]/page.tsxNew dynamic world detail page supporting both MDX and template rendering
worlds/compare/page.tsxNew benchmark comparison page with tables and charts
benchmark-history/route.tsNew API route fetching historical benchmark data from gh-pages commits
generate-docs-data.jsEnhanced to extract workflow timing metrics (min/max/ttfb/slurp) from benchmark results
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +44 to +63
return (
<nav className="space-y-1">
<p className="font-medium text-sm mb-2">On this page</p>
{items.map((item) => (
<a
key={item.id}
href={`#${item.id}`}
className={cn(
'block text-sm py-1 border-l-2 pl-3 transition-colors',
activeId === item.id
? 'border-primary text-foreground font-medium'
: 'border-transparent text-muted-foreground hover:text-foreground hover:border-muted-foreground'
)}
>
{item.title}
</a>
))}
</nav>
);
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

When items array is empty, this component renders a nav with just the "On this page" heading but no links. While not necessarily broken, consider adding a conditional render or early return if items.length === 0 to avoid rendering an empty navigation section.

Copilot uses AI. Check for mistakes.
Comment on lines +80 to +87
const fileRes = await fetch(
`https://raw.githubusercontent.com/${REPO}/${ghPagesSha}/${FILE_PATH}`,
{ next: { revalidate: 3600 } }
);

if (!fileRes.ok) return null;

return (await fileRes.json()) as CIResultsData;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The JSON parsing at line 87 doesn't handle malformed JSON responses. If the GitHub API returns invalid JSON, this will throw an unhandled error. Consider wrapping the await fileRes.json() in a try-catch or adding validation.

Copilot uses AI. Check for mistakes.
Comment on lines +120 to +145
const ghPagesCommits = (await ghPagesCommitsRes.json()) as GitHubCommit[];

// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

Similarly, the JSON parsing at line 120 for gh-pages commits doesn't handle malformed JSON responses. Consider adding error handling for the await ghPagesCommitsRes.json() call.

Suggested change
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
try{
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
}
}catch(error){
console.error('Failed to parse gh-pages commits JSON',error);
returnsnapshotMap;

Copilot uses AI. Check for mistakes.
Comment on lines +122 to +148
// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}
}

return snapshotMap;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The batch processing loop processes all gh-pages commits (up to 100) without any upper bound on memory usage. If there are many commits, this could create a large number of parallel fetch requests. Consider adding a limit to the total number of commits processed or adding more granular error handling to prevent memory issues.

Copilot uses AI. Check for mistakes.
Comment threaddocs/components/worlds/Globe.tsx Outdated
Comment on lines +69 to +70
const globe = createGlobe(canvasRef.current!, globeConfig);

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The canvasRef.current could be null when createGlobe is called. While the non-null assertion operator (!) is used, this could cause a runtime error if the component unmounts or the ref isn't set before the effect runs. Add a null check before calling createGlobe.

Suggested change
constglobe=createGlobe(canvasRef.current!,globeConfig);
constcanvas=canvasRef.current;
if(!canvas){
return()=>{
window.removeEventListener('resize',onResize);
};
}
constglobe=createGlobe(canvas,globeConfig);

Copilot uses AI. Check for mistakes.

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

World documentation pages at /docs/deploying/world/* should redirect to /worlds/[id], but the redirect was never implemented - only mentioned in a comment

Fix on Vercel

samples: latestPoint?.samples,
current,
trendPercent,
ttfb: latestPoint?.ttfb,

@vercelvercelBotJan 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Trend calculation defaults undefined workflowTime values to 0, making it impossible to distinguish between "no data" and "zero performance time"

Fix on Vercel

Comment threaddocs/app/api/benchmark-history/route.ts Outdated
const pointerInteracting = useRef<number | null>(null);
const pointerInteractionMovement = useRef(0);
const [size, setSize] = useState(1200);
const { resolvedTheme } = useTheme();

@vercelvercelBotJan 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Globe component uses useTheme() without deferring initialization, causing hydration mismatch between server (undefined theme) and client

Fix on Vercel

- Add dedicated world detail pages at /worlds/[id] with MDX-driven content
- Create WorldDetailHero, WorldDetailToc, WorldTestingPerformance components
- Add benchmark history charts and test summary links
- Rewrite local-world, postgres-world, and vercel-world MDX with cleaner structure
- Use h3 headings for configuration options instead of tables/accordions
- Add WorldDataProvider context for passing world data to MDX components
- Add example field to worlds-manifest for linking to example repos
- Update worlds index page design
- Globe now scales with container width up to 1200px max
- Increased opacity from 20% to 30% for better visibility
- Positioned globe 30% down to show north pole behind header
- Globe component now auto-sizes based on container width
- Update title format to '{Name} World | Workflow DevKit'
- Update worlds index page title to 'Worlds | Workflow DevKit'
- Improve world descriptions in worlds-manifest.json for better SEO
- Add dynamic OG image generation at /worlds/[id]/og
- Add openGraph and twitter metadata to world detail pages
- Replace route-based og/route.tsx with opengraph-image.tsx file convention
- Remove runtime = 'edge' to allow generateStaticParams for static generation
- Simplify page.tsx metadata (Next.js auto-detects opengraph-image.tsx)
- Fix globe visibility in light/dark mode
- Fix tooltip positioning on mobile breakpoints
- Remove redundant Documentation button for community worlds
- Add missing pages to Foundations index (streaming, serialization, idempotency)
- Restructure deploying section with new index and building-a-world guide
- Restore original MDX content for official worlds (local, vercel, postgres)
- Auto-expand sidebar folders when child page is active

// Check if any child is active (current path starts with folder's index URL)
const hasActiveChild = item.index?.url
? pathname.startsWith(item.index.url + '/')

@vercelvercelBotJan 23, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sidebar fails to expand root-level folder when checking for active children due to malformed path check.

Fix on Vercel

<Card href="/docs/foundations/hooks" title="Webhooks (and hooks)">
Respond to external events in your workflow using hooks and webhooks.
</Card>
<Card href="/docs/foundations/streaming" title="Streaming">

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

unrelated change - the foundations page was missing cards for these (they were only in meta)

Comment threaddocs/next.config.ts
Comment on lines +53 to +73
// Redirect old world docs to new /worlds routes
{
source: '/docs/deploying/world/local-world',
destination: '/worlds/local',
permanent: true,
},
{
source: '/docs/deploying/world/postgres-world',
destination: '/worlds/postgres',
permanent: true,
},
{
source: '/docs/deploying/world/vercel-world',
destination: '/worlds/vercel',
permanent: true,
},
{
source: '/docs/worlds',
destination: '/worlds',
permanent: true,
},

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

this is so we don't break existing links on twitter, etc.

pranaygpand others added 2 commits January 23, 2026 17:12
- Fix /docs/deploying/world link to /docs/deploying/building-a-world
- Fix /docs/deploying#what-are-worlds invalid anchor to /docs/deploying
- Add @skip-typecheck markers to interface definition code blocks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- benchmark-history/route.ts: Add error handling for JSON parsing,
distinguish 404s from actual errors
- Globe.tsx: Fix hydration mismatch by deferring theme-dependent
rendering until component is mounted
- sidebar.tsx: Improve path check robustness for active child detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​cobe@​0.6.51001009383100

View full report

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🚢

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pranaygp@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

docs: revamp World documentation pages - #763

Merged
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking
Jan 26, 2026
Merged

docs: revamp World documentation pages#763
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking

Conversation

@pranaygp

@pranaygppranaygp commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

Added dedicated worlds page to show all available worlds incuding e2e testbench pass rate and performance benchmarking

Added historic performance benchmarking over last 30 commits/releases on github with request caching (should probably be ISR / PPR since these can be caluclated at build time and don't need to be re-fetched)

Rewrote the Local, Postgres and Vercel world documentation pages to follow a standard structure with config, observability, benchmarking notes

TODOs

  • Do another design and structural pass on the community world detail pages
  • Remove the old pages from docs for worlds and ensure redirect to prevent broken links
  • Include a better explanation on worlds, the interface, and how to build your own world
  • Polish up the worlds index page - need to replace the redundant AI generated components at the bottom with something more useful
  • Ask AI to do a code self review

Additional Changes

Deploying Section Restructure:

  • New streamlined deploying index page explaining portability via Worlds, local dev, and Vercel deployment
  • New detailed "Building a World" guide with Storage, Queue, and Streamer interface documentation
  • Links to Postgres World as reference implementation

Worlds Page UI Improvements:

  • Simplified footer: replaced "What is a World?" and "Build Your Own World" sections with single "Learn more about worlds" section
  • Moved "Last updated" info directly under worlds grid for better visibility
  • Fixed globe visibility in light/dark mode for better text readability
  • Fixed tooltip positioning on mobile breakpoints

Sidebar Navigation:

  • Auto-expand sidebar folders when viewing a child page (improves navigation context)

Other Fixes:

  • Added missing Foundations index cards (Streaming, Serialization, Idempotency)
  • Removed redundant Documentation button for community worlds (GitHub link is sufficient)

Preview

Worlds Page

imageimage

Postgres Docs (also check the other worlds)
image
image
image

CopilotAI review requested due to automatic review settings January 10, 2026 09:54
@changeset-bot

changeset-botBot commented Jan 10, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: d778fab

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

vercelBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.041s (-7.5% 🟢)1.019s (~)0.978s101.00x
💻 LocalNitro0.042s (-1.9%)1.007s (~)0.964s101.04x
💻 LocalExpress0.046s (+1.3%)1.008s (~)0.962s101.13x
🐘 PostgresNext.js (Turbopack)0.148s (+3.7%)1.022s (~)0.873s103.64x
🐘 PostgresExpress0.203s (-29.8% 🟢)1.024s (+0.9%)0.820s104.99x
🐘 PostgresNitro0.311s (+22.6% 🔺)1.031s (+1.7%)0.720s107.62x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.628s (-16.8% 🟢)1.485s (-24.3% 🟢)0.858s101.00x
▲ VercelNitro0.643s (-18.8% 🟢)1.482s (-12.4% 🟢)0.839s101.02x
▲ VercelExpress0.660s (-25.7% 🟢)1.566s (-11.2% 🟢)0.906s101.05x

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

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.096s (~)2.012s (~)0.917s101.00x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
💻 LocalExpress1.118s (~)2.007s (~)0.889s101.02x
🐘 PostgresNitro2.128s (-2.8%)2.414s (-20.0% 🟢)0.286s101.94x
🐘 PostgresNext.js (Turbopack)2.153s (+11.0% 🔺)2.417s (+14.2% 🔺)0.264s101.96x
🐘 PostgresExpress2.359s (+11.2% 🔺)3.016s (~)0.657s102.15x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.809s (-1.3%)3.597s (-1.3%)0.788s101.00x
▲ VercelNitro2.828s (-2.4%)3.626s (-2.3%)0.798s101.01x
▲ VercelExpress2.867s (-3.0%)3.643s (-0.6%)0.776s101.02x

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

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)10.701s (~)11.021s (~)0.321s51.00x
💻 LocalNitro10.823s (~)11.012s (~)0.189s51.01x
💻 LocalExpress10.833s (~)11.013s (~)0.180s51.01x
🐘 PostgresNext.js (Turbopack)14.904s (-2.3%)15.237s (-5.0%)0.333s51.39x
🐘 PostgresNitro15.269s (-25.3% 🟢)16.030s (-23.8% 🟢)0.762s51.43x
🐘 PostgresExpress20.322s (+13.8% 🔺)21.038s (+15.4% 🔺)0.716s51.90x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)22.217s (-15.6% 🟢)23.072s (-13.9% 🟢)0.855s51.00x
▲ VercelExpress23.130s (-8.2% 🟢)23.724s (-8.1% 🟢)0.593s51.04x
▲ VercelNitro23.173s (-12.1% 🟢)23.919s (-11.2% 🟢)0.745s51.04x

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

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.386s (~)2.011s (~)0.625s151.00x
💻 LocalNitro1.406s (+0.9%)2.007s (~)0.601s151.01x
💻 LocalExpress1.416s (~)2.007s (~)0.591s151.02x
🐘 PostgresNext.js (Turbopack)2.075s (+22.9% 🔺)2.599s (+27.4% 🔺)0.524s121.50x
🐘 PostgresNitro2.132s (-3.3%)2.760s (-8.4% 🟢)0.628s111.54x
🐘 PostgresExpress2.553s (+25.7% 🔺)3.014s (+9.9% 🔺)0.462s101.84x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.821s (-9.7% 🟢)3.631s (-6.7% 🟢)0.811s91.00x
▲ VercelNext.js (Turbopack)2.991s (~)3.725s (+2.5%)0.734s91.06x
▲ VercelExpress3.736s (+29.1% 🔺)5.355s (+46.3% 🔺)1.619s61.32x

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

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro2.429s (-4.4%)3.051s (+1.2%)0.623s101.00x
💻 LocalNext.js (Turbopack)2.487s (+3.0%)3.044s (-9.9% 🟢)0.558s101.02x
💻 LocalExpress2.522s (+1.8%)3.020s (~)0.498s101.04x
🐘 PostgresExpress8.825s (~)9.297s (-2.6%)0.472s43.63x
🐘 PostgresNext.js (Turbopack)10.771s (-1.9%)11.694s (~)0.923s34.43x
🐘 PostgresNitro11.244s (+32.5% 🔺)11.695s (+28.9% 🔺)0.451s34.63x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.137s (-12.1% 🟢)3.654s (-12.4% 🟢)0.517s91.00x
▲ VercelNext.js (Turbopack)3.223s (~)3.783s (+1.9%)0.560s81.03x
▲ VercelNitro3.434s (-4.5%)3.915s (-4.9%)0.481s81.09x

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

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.413s (~)2.007s (~)0.594s151.00x
💻 LocalNext.js (Turbopack)1.424s (+1.7%)2.011s (~)0.586s151.01x
💻 LocalExpress1.432s (~)2.007s (~)0.575s151.01x
🐘 PostgresNext.js (Turbopack)1.815s (+21.3% 🔺)2.156s (+7.1% 🔺)0.341s141.28x
🐘 PostgresExpress2.048s (-4.6%)2.527s (-2.7%)0.479s121.45x
🐘 PostgresNitro2.078s (+2.8%)2.680s (~)0.602s121.47x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.859s (-1.7%)3.631s (-2.8%)0.771s91.00x
▲ VercelExpress2.935s (+1.8%)3.757s (~)0.822s81.03x
▲ VercelNitro2.996s (+1.1%)3.773s (+1.4%)0.777s81.05x

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

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)2.593s (+3.6%)3.046s (~)0.453s101.00x
💻 LocalExpress2.606s (+1.0%)3.013s (~)0.407s101.00x
💻 LocalNitro2.650s (~)3.028s (~)0.378s101.02x
🐘 PostgresExpress11.333s (-1.6%)11.719s (~)0.386s34.37x
🐘 PostgresNext.js (Turbopack)11.564s (+6.4% 🔺)12.385s (+8.3% 🔺)0.821s34.46x
🐘 PostgresNitro13.741s (+20.7% 🔺)14.070s (+16.7% 🔺)0.329s35.30x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.296s (+5.7% 🔺)3.866s (+6.9% 🔺)0.571s81.00x
▲ VercelNext.js (Turbopack)3.509s (+1.1%)4.181s (+2.2%)0.672s81.06x
▲ VercelNitro119.077s (+3672.4% 🔺)120.329s (+3084.9% 🔺)1.252s136.13x

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

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.144s (+3.6%)1.004s (~)0.017s (+8.4% 🔺)1.028s (~)0.884s101.00x
💻 LocalExpress0.184s (+1.1%)0.992s (~)0.014s (-5.9% 🟢)1.021s (~)0.838s101.28x
💻 LocalNitro0.184s (-2.3%)0.992s (~)0.016s (-5.3% 🟢)1.022s (~)0.838s101.28x
🐘 PostgresNext.js (Turbopack)0.627s (-48.8% 🟢)0.975s (-46.5% 🟢)0.003s (+2500.0% 🔺)1.018s (-49.6% 🟢)0.391s104.37x
🐘 PostgresNitro1.098s (-50.8% 🟢)1.938s (-31.1% 🟢)0.000s (NaN%)2.013s (-33.2% 🟢)0.914s107.64x
🐘 PostgresExpress2.198s (+66.0% 🔺)2.845s (+58.7% 🔺)0.000s (NaN%)3.016s (+49.7% 🔺)0.818s1015.29x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.931s (~)3.312s (+3.9%)0.390s (+6.3% 🔺)4.134s (+3.5%)1.204s101.00x
▲ VercelNitro3.012s (+2.0%)3.272s (-0.5%)0.491s (+68.3% 🔺)4.257s (+2.6%)1.245s101.03x
▲ VercelExpress3.150s (+9.2% 🔺)3.259s (-1.4%)0.499s (~)4.306s (+0.9%)1.156s101.07x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)5/8
▲ VercelNext.js (Turbopack)5/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)💻 Local8/8
Nitro💻 Local8/8
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
  • 🌐 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)

📋 View full workflow run

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production457038495
❌ 💻 Local Development416232450
✅ 📦 Local Production418032450
✅ 🐘 Local Postgres418032450
✅ 🪟 Windows450045
❌ 🌍 Community Worlds311610192
Total17851631342082

❌ Failed Tests

💻 Local Development (2 failed)

astro-stable (2 failed):

  • 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
🌍 Community Worlds (161 failed)

mongodb (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

redis (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

starter (41 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

turso (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro4104
✅ example4104
✅ express4104
✅ fastify4104
✅ hono4104
✅ nextjs-turbopack4401
✅ nextjs-webpack4401
✅ nitro4104
✅ nuxt4104
✅ sveltekit4104
✅ vite4104
❌ 💻 Local Development
AppPassedFailedSkipped
❌ astro-stable3924
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack4500
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb5400
✅ redis-dev300
❌ redis5400
✅ starter-dev300
❌ starter4410
✅ turso-dev300
❌ turso5400

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR revamps the World documentation by creating dedicated detail pages for official worlds (local, postgres, vercel) with MDX-driven content. It introduces new components for world detail pages, benchmark history visualization with interactive charts, and a redesigned worlds index page with a 3D globe visual.

Changes:

  • Created dedicated /worlds/[id] routes with MDX content for official worlds and template components for community worlds
  • Added benchmark history charts showing performance trends over releases/commits with clickable data points
  • Restructured world documentation with cleaner h3 headings for configuration options instead of tables
  • Added TOC generation from MDX headings and world data provider context for component communication

Reviewed changes

Copilot reviewed 31 out of 32 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
worlds-manifest.jsonAdded example field for linking to example repositories
package.jsonAdded cobe dependency (0.6.5) for 3D globe visualization
next.config.tsAdded redirects from old /docs/deploying/world/* paths to new /worlds/* routes
worlds-data.tsEnhanced to extract framework-specific E2E data, workflow timing metrics, and added single world lookup functions
types.tsAdded framework E2E breakdown types, workflow timing fields, benchmark10SeqMs metric, and formatTime utility
WorldDetailHero.tsxNew hero component for world detail pages with E2E/benchmark summary and quick links
WorldDetailToc.tsxNew TOC component with intersection observer for active section highlighting
WorldTestingPerformance.tsxNew component displaying E2E test results and benchmark tables with history chart integration
WorldDataProvider.tsxNew context provider for sharing world data between MDX and client components
WorldCardSimple.tsxNew simplified card component for worlds index page with E2E/PERF metrics footer
Globe.tsxNew interactive 3D globe component using COBE library
BenchmarkHistoryChart.tsxNew dialog component showing performance trends over time with releases/commits toggle
local-world.mdxRewritten with cleaner structure, h3 config options, and Testing & Performance section
postgres-world.mdxRewritten with installation steps, framework-specific examples, and detailed configuration
vercel-world.mdxRewritten with simplified auto-configuration explanation and versioning details
worlds/page.tsxNew worlds index page with globe hero, world cards grid, and "What is a World?" section
worlds/[id]/page.tsxNew dynamic world detail page supporting both MDX and template rendering
worlds/compare/page.tsxNew benchmark comparison page with tables and charts
benchmark-history/route.tsNew API route fetching historical benchmark data from gh-pages commits
generate-docs-data.jsEnhanced to extract workflow timing metrics (min/max/ttfb/slurp) from benchmark results
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +44 to +63
return (
<nav className="space-y-1">
<p className="font-medium text-sm mb-2">On this page</p>
{items.map((item) => (
<a
key={item.id}
href={`#${item.id}`}
className={cn(
'block text-sm py-1 border-l-2 pl-3 transition-colors',
activeId === item.id
? 'border-primary text-foreground font-medium'
: 'border-transparent text-muted-foreground hover:text-foreground hover:border-muted-foreground'
)}
>
{item.title}
</a>
))}
</nav>
);
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

When items array is empty, this component renders a nav with just the "On this page" heading but no links. While not necessarily broken, consider adding a conditional render or early return if items.length === 0 to avoid rendering an empty navigation section.

Copilot uses AI. Check for mistakes.
Comment on lines +80 to +87
const fileRes = await fetch(
`https://raw.githubusercontent.com/${REPO}/${ghPagesSha}/${FILE_PATH}`,
{ next: { revalidate: 3600 } }
);

if (!fileRes.ok) return null;

return (await fileRes.json()) as CIResultsData;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The JSON parsing at line 87 doesn't handle malformed JSON responses. If the GitHub API returns invalid JSON, this will throw an unhandled error. Consider wrapping the await fileRes.json() in a try-catch or adding validation.

Copilot uses AI. Check for mistakes.
Comment on lines +120 to +145
const ghPagesCommits = (await ghPagesCommitsRes.json()) as GitHubCommit[];

// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

Similarly, the JSON parsing at line 120 for gh-pages commits doesn't handle malformed JSON responses. Consider adding error handling for the await ghPagesCommitsRes.json() call.

Suggested change
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
try{
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
}
}catch(error){
console.error('Failed to parse gh-pages commits JSON',error);
returnsnapshotMap;

Copilot uses AI. Check for mistakes.
Comment on lines +122 to +148
// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}
}

return snapshotMap;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The batch processing loop processes all gh-pages commits (up to 100) without any upper bound on memory usage. If there are many commits, this could create a large number of parallel fetch requests. Consider adding a limit to the total number of commits processed or adding more granular error handling to prevent memory issues.

Copilot uses AI. Check for mistakes.
Comment threaddocs/components/worlds/Globe.tsx Outdated
Comment on lines +69 to +70
const globe = createGlobe(canvasRef.current!, globeConfig);

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The canvasRef.current could be null when createGlobe is called. While the non-null assertion operator (!) is used, this could cause a runtime error if the component unmounts or the ref isn't set before the effect runs. Add a null check before calling createGlobe.

Suggested change
constglobe=createGlobe(canvasRef.current!,globeConfig);
constcanvas=canvasRef.current;
if(!canvas){
return()=>{
window.removeEventListener('resize',onResize);
};
}
constglobe=createGlobe(canvas,globeConfig);

Copilot uses AI. Check for mistakes.

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

World documentation pages at /docs/deploying/world/* should redirect to /worlds/[id], but the redirect was never implemented - only mentioned in a comment

Fix on Vercel

samples: latestPoint?.samples,
current,
trendPercent,
ttfb: latestPoint?.ttfb,

@vercelvercelBotJan 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Trend calculation defaults undefined workflowTime values to 0, making it impossible to distinguish between "no data" and "zero performance time"

Fix on Vercel

Comment threaddocs/app/api/benchmark-history/route.ts Outdated
const pointerInteracting = useRef<number | null>(null);
const pointerInteractionMovement = useRef(0);
const [size, setSize] = useState(1200);
const { resolvedTheme } = useTheme();

@vercelvercelBotJan 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Globe component uses useTheme() without deferring initialization, causing hydration mismatch between server (undefined theme) and client

Fix on Vercel

- Add dedicated world detail pages at /worlds/[id] with MDX-driven content
- Create WorldDetailHero, WorldDetailToc, WorldTestingPerformance components
- Add benchmark history charts and test summary links
- Rewrite local-world, postgres-world, and vercel-world MDX with cleaner structure
- Use h3 headings for configuration options instead of tables/accordions
- Add WorldDataProvider context for passing world data to MDX components
- Add example field to worlds-manifest for linking to example repos
- Update worlds index page design
- Globe now scales with container width up to 1200px max
- Increased opacity from 20% to 30% for better visibility
- Positioned globe 30% down to show north pole behind header
- Globe component now auto-sizes based on container width
- Update title format to '{Name} World | Workflow DevKit'
- Update worlds index page title to 'Worlds | Workflow DevKit'
- Improve world descriptions in worlds-manifest.json for better SEO
- Add dynamic OG image generation at /worlds/[id]/og
- Add openGraph and twitter metadata to world detail pages
- Replace route-based og/route.tsx with opengraph-image.tsx file convention
- Remove runtime = 'edge' to allow generateStaticParams for static generation
- Simplify page.tsx metadata (Next.js auto-detects opengraph-image.tsx)
- Fix globe visibility in light/dark mode
- Fix tooltip positioning on mobile breakpoints
- Remove redundant Documentation button for community worlds
- Add missing pages to Foundations index (streaming, serialization, idempotency)
- Restructure deploying section with new index and building-a-world guide
- Restore original MDX content for official worlds (local, vercel, postgres)
- Auto-expand sidebar folders when child page is active

// Check if any child is active (current path starts with folder's index URL)
const hasActiveChild = item.index?.url
? pathname.startsWith(item.index.url + '/')

@vercelvercelBotJan 23, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sidebar fails to expand root-level folder when checking for active children due to malformed path check.

Fix on Vercel

<Card href="/docs/foundations/hooks" title="Webhooks (and hooks)">
Respond to external events in your workflow using hooks and webhooks.
</Card>
<Card href="/docs/foundations/streaming" title="Streaming">

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

unrelated change - the foundations page was missing cards for these (they were only in meta)

Comment threaddocs/next.config.ts
Comment on lines +53 to +73
// Redirect old world docs to new /worlds routes
{
source: '/docs/deploying/world/local-world',
destination: '/worlds/local',
permanent: true,
},
{
source: '/docs/deploying/world/postgres-world',
destination: '/worlds/postgres',
permanent: true,
},
{
source: '/docs/deploying/world/vercel-world',
destination: '/worlds/vercel',
permanent: true,
},
{
source: '/docs/worlds',
destination: '/worlds',
permanent: true,
},

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

this is so we don't break existing links on twitter, etc.

pranaygpand others added 2 commits January 23, 2026 17:12
- Fix /docs/deploying/world link to /docs/deploying/building-a-world
- Fix /docs/deploying#what-are-worlds invalid anchor to /docs/deploying
- Add @skip-typecheck markers to interface definition code blocks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- benchmark-history/route.ts: Add error handling for JSON parsing,
distinguish 404s from actual errors
- Globe.tsx: Fix hydration mismatch by deferring theme-dependent
rendering until component is mounted
- sidebar.tsx: Improve path check robustness for active child detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​cobe@​0.6.51001009383100

View full report

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🚢

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pranaygp@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs: revamp World documentation pages - #763

Merged
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking
Jan 26, 2026
Merged

docs: revamp World documentation pages#763
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking

Conversation

@pranaygp

@pranaygppranaygp commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

Added dedicated worlds page to show all available worlds incuding e2e testbench pass rate and performance benchmarking

Added historic performance benchmarking over last 30 commits/releases on github with request caching (should probably be ISR / PPR since these can be caluclated at build time and don't need to be re-fetched)

Rewrote the Local, Postgres and Vercel world documentation pages to follow a standard structure with config, observability, benchmarking notes

TODOs

  • Do another design and structural pass on the community world detail pages
  • Remove the old pages from docs for worlds and ensure redirect to prevent broken links
  • Include a better explanation on worlds, the interface, and how to build your own world
  • Polish up the worlds index page - need to replace the redundant AI generated components at the bottom with something more useful
  • Ask AI to do a code self review

Additional Changes

Deploying Section Restructure:

  • New streamlined deploying index page explaining portability via Worlds, local dev, and Vercel deployment
  • New detailed "Building a World" guide with Storage, Queue, and Streamer interface documentation
  • Links to Postgres World as reference implementation

Worlds Page UI Improvements:

  • Simplified footer: replaced "What is a World?" and "Build Your Own World" sections with single "Learn more about worlds" section
  • Moved "Last updated" info directly under worlds grid for better visibility
  • Fixed globe visibility in light/dark mode for better text readability
  • Fixed tooltip positioning on mobile breakpoints

Sidebar Navigation:

  • Auto-expand sidebar folders when viewing a child page (improves navigation context)

Other Fixes:

  • Added missing Foundations index cards (Streaming, Serialization, Idempotency)
  • Removed redundant Documentation button for community worlds (GitHub link is sufficient)

Preview

Worlds Page

imageimage

Postgres Docs (also check the other worlds)
image
image
image

CopilotAI review requested due to automatic review settings January 10, 2026 09:54
@changeset-bot

changeset-botBot commented Jan 10, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: d778fab

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

vercelBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.041s (-7.5% 🟢)1.019s (~)0.978s101.00x
💻 LocalNitro0.042s (-1.9%)1.007s (~)0.964s101.04x
💻 LocalExpress0.046s (+1.3%)1.008s (~)0.962s101.13x
🐘 PostgresNext.js (Turbopack)0.148s (+3.7%)1.022s (~)0.873s103.64x
🐘 PostgresExpress0.203s (-29.8% 🟢)1.024s (+0.9%)0.820s104.99x
🐘 PostgresNitro0.311s (+22.6% 🔺)1.031s (+1.7%)0.720s107.62x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.628s (-16.8% 🟢)1.485s (-24.3% 🟢)0.858s101.00x
▲ VercelNitro0.643s (-18.8% 🟢)1.482s (-12.4% 🟢)0.839s101.02x
▲ VercelExpress0.660s (-25.7% 🟢)1.566s (-11.2% 🟢)0.906s101.05x

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

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.096s (~)2.012s (~)0.917s101.00x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
💻 LocalExpress1.118s (~)2.007s (~)0.889s101.02x
🐘 PostgresNitro2.128s (-2.8%)2.414s (-20.0% 🟢)0.286s101.94x
🐘 PostgresNext.js (Turbopack)2.153s (+11.0% 🔺)2.417s (+14.2% 🔺)0.264s101.96x
🐘 PostgresExpress2.359s (+11.2% 🔺)3.016s (~)0.657s102.15x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.809s (-1.3%)3.597s (-1.3%)0.788s101.00x
▲ VercelNitro2.828s (-2.4%)3.626s (-2.3%)0.798s101.01x
▲ VercelExpress2.867s (-3.0%)3.643s (-0.6%)0.776s101.02x

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

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)10.701s (~)11.021s (~)0.321s51.00x
💻 LocalNitro10.823s (~)11.012s (~)0.189s51.01x
💻 LocalExpress10.833s (~)11.013s (~)0.180s51.01x
🐘 PostgresNext.js (Turbopack)14.904s (-2.3%)15.237s (-5.0%)0.333s51.39x
🐘 PostgresNitro15.269s (-25.3% 🟢)16.030s (-23.8% 🟢)0.762s51.43x
🐘 PostgresExpress20.322s (+13.8% 🔺)21.038s (+15.4% 🔺)0.716s51.90x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)22.217s (-15.6% 🟢)23.072s (-13.9% 🟢)0.855s51.00x
▲ VercelExpress23.130s (-8.2% 🟢)23.724s (-8.1% 🟢)0.593s51.04x
▲ VercelNitro23.173s (-12.1% 🟢)23.919s (-11.2% 🟢)0.745s51.04x

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

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.386s (~)2.011s (~)0.625s151.00x
💻 LocalNitro1.406s (+0.9%)2.007s (~)0.601s151.01x
💻 LocalExpress1.416s (~)2.007s (~)0.591s151.02x
🐘 PostgresNext.js (Turbopack)2.075s (+22.9% 🔺)2.599s (+27.4% 🔺)0.524s121.50x
🐘 PostgresNitro2.132s (-3.3%)2.760s (-8.4% 🟢)0.628s111.54x
🐘 PostgresExpress2.553s (+25.7% 🔺)3.014s (+9.9% 🔺)0.462s101.84x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.821s (-9.7% 🟢)3.631s (-6.7% 🟢)0.811s91.00x
▲ VercelNext.js (Turbopack)2.991s (~)3.725s (+2.5%)0.734s91.06x
▲ VercelExpress3.736s (+29.1% 🔺)5.355s (+46.3% 🔺)1.619s61.32x

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

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro2.429s (-4.4%)3.051s (+1.2%)0.623s101.00x
💻 LocalNext.js (Turbopack)2.487s (+3.0%)3.044s (-9.9% 🟢)0.558s101.02x
💻 LocalExpress2.522s (+1.8%)3.020s (~)0.498s101.04x
🐘 PostgresExpress8.825s (~)9.297s (-2.6%)0.472s43.63x
🐘 PostgresNext.js (Turbopack)10.771s (-1.9%)11.694s (~)0.923s34.43x
🐘 PostgresNitro11.244s (+32.5% 🔺)11.695s (+28.9% 🔺)0.451s34.63x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.137s (-12.1% 🟢)3.654s (-12.4% 🟢)0.517s91.00x
▲ VercelNext.js (Turbopack)3.223s (~)3.783s (+1.9%)0.560s81.03x
▲ VercelNitro3.434s (-4.5%)3.915s (-4.9%)0.481s81.09x

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

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.413s (~)2.007s (~)0.594s151.00x
💻 LocalNext.js (Turbopack)1.424s (+1.7%)2.011s (~)0.586s151.01x
💻 LocalExpress1.432s (~)2.007s (~)0.575s151.01x
🐘 PostgresNext.js (Turbopack)1.815s (+21.3% 🔺)2.156s (+7.1% 🔺)0.341s141.28x
🐘 PostgresExpress2.048s (-4.6%)2.527s (-2.7%)0.479s121.45x
🐘 PostgresNitro2.078s (+2.8%)2.680s (~)0.602s121.47x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.859s (-1.7%)3.631s (-2.8%)0.771s91.00x
▲ VercelExpress2.935s (+1.8%)3.757s (~)0.822s81.03x
▲ VercelNitro2.996s (+1.1%)3.773s (+1.4%)0.777s81.05x

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

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)2.593s (+3.6%)3.046s (~)0.453s101.00x
💻 LocalExpress2.606s (+1.0%)3.013s (~)0.407s101.00x
💻 LocalNitro2.650s (~)3.028s (~)0.378s101.02x
🐘 PostgresExpress11.333s (-1.6%)11.719s (~)0.386s34.37x
🐘 PostgresNext.js (Turbopack)11.564s (+6.4% 🔺)12.385s (+8.3% 🔺)0.821s34.46x
🐘 PostgresNitro13.741s (+20.7% 🔺)14.070s (+16.7% 🔺)0.329s35.30x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.296s (+5.7% 🔺)3.866s (+6.9% 🔺)0.571s81.00x
▲ VercelNext.js (Turbopack)3.509s (+1.1%)4.181s (+2.2%)0.672s81.06x
▲ VercelNitro119.077s (+3672.4% 🔺)120.329s (+3084.9% 🔺)1.252s136.13x

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

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.144s (+3.6%)1.004s (~)0.017s (+8.4% 🔺)1.028s (~)0.884s101.00x
💻 LocalExpress0.184s (+1.1%)0.992s (~)0.014s (-5.9% 🟢)1.021s (~)0.838s101.28x
💻 LocalNitro0.184s (-2.3%)0.992s (~)0.016s (-5.3% 🟢)1.022s (~)0.838s101.28x
🐘 PostgresNext.js (Turbopack)0.627s (-48.8% 🟢)0.975s (-46.5% 🟢)0.003s (+2500.0% 🔺)1.018s (-49.6% 🟢)0.391s104.37x
🐘 PostgresNitro1.098s (-50.8% 🟢)1.938s (-31.1% 🟢)0.000s (NaN%)2.013s (-33.2% 🟢)0.914s107.64x
🐘 PostgresExpress2.198s (+66.0% 🔺)2.845s (+58.7% 🔺)0.000s (NaN%)3.016s (+49.7% 🔺)0.818s1015.29x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.931s (~)3.312s (+3.9%)0.390s (+6.3% 🔺)4.134s (+3.5%)1.204s101.00x
▲ VercelNitro3.012s (+2.0%)3.272s (-0.5%)0.491s (+68.3% 🔺)4.257s (+2.6%)1.245s101.03x
▲ VercelExpress3.150s (+9.2% 🔺)3.259s (-1.4%)0.499s (~)4.306s (+0.9%)1.156s101.07x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)5/8
▲ VercelNext.js (Turbopack)5/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)💻 Local8/8
Nitro💻 Local8/8
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
  • 🌐 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)

📋 View full workflow run

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production457038495
❌ 💻 Local Development416232450
✅ 📦 Local Production418032450
✅ 🐘 Local Postgres418032450
✅ 🪟 Windows450045
❌ 🌍 Community Worlds311610192
Total17851631342082

❌ Failed Tests

💻 Local Development (2 failed)

astro-stable (2 failed):

  • 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
🌍 Community Worlds (161 failed)

mongodb (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

redis (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

starter (41 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

turso (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro4104
✅ example4104
✅ express4104
✅ fastify4104
✅ hono4104
✅ nextjs-turbopack4401
✅ nextjs-webpack4401
✅ nitro4104
✅ nuxt4104
✅ sveltekit4104
✅ vite4104
❌ 💻 Local Development
AppPassedFailedSkipped
❌ astro-stable3924
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack4500
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb5400
✅ redis-dev300
❌ redis5400
✅ starter-dev300
❌ starter4410
✅ turso-dev300
❌ turso5400

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR revamps the World documentation by creating dedicated detail pages for official worlds (local, postgres, vercel) with MDX-driven content. It introduces new components for world detail pages, benchmark history visualization with interactive charts, and a redesigned worlds index page with a 3D globe visual.

Changes:

  • Created dedicated /worlds/[id] routes with MDX content for official worlds and template components for community worlds
  • Added benchmark history charts showing performance trends over releases/commits with clickable data points
  • Restructured world documentation with cleaner h3 headings for configuration options instead of tables
  • Added TOC generation from MDX headings and world data provider context for component communication

Reviewed changes

Copilot reviewed 31 out of 32 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
worlds-manifest.jsonAdded example field for linking to example repositories
package.jsonAdded cobe dependency (0.6.5) for 3D globe visualization
next.config.tsAdded redirects from old /docs/deploying/world/* paths to new /worlds/* routes
worlds-data.tsEnhanced to extract framework-specific E2E data, workflow timing metrics, and added single world lookup functions
types.tsAdded framework E2E breakdown types, workflow timing fields, benchmark10SeqMs metric, and formatTime utility
WorldDetailHero.tsxNew hero component for world detail pages with E2E/benchmark summary and quick links
WorldDetailToc.tsxNew TOC component with intersection observer for active section highlighting
WorldTestingPerformance.tsxNew component displaying E2E test results and benchmark tables with history chart integration
WorldDataProvider.tsxNew context provider for sharing world data between MDX and client components
WorldCardSimple.tsxNew simplified card component for worlds index page with E2E/PERF metrics footer
Globe.tsxNew interactive 3D globe component using COBE library
BenchmarkHistoryChart.tsxNew dialog component showing performance trends over time with releases/commits toggle
local-world.mdxRewritten with cleaner structure, h3 config options, and Testing & Performance section
postgres-world.mdxRewritten with installation steps, framework-specific examples, and detailed configuration
vercel-world.mdxRewritten with simplified auto-configuration explanation and versioning details
worlds/page.tsxNew worlds index page with globe hero, world cards grid, and "What is a World?" section
worlds/[id]/page.tsxNew dynamic world detail page supporting both MDX and template rendering
worlds/compare/page.tsxNew benchmark comparison page with tables and charts
benchmark-history/route.tsNew API route fetching historical benchmark data from gh-pages commits
generate-docs-data.jsEnhanced to extract workflow timing metrics (min/max/ttfb/slurp) from benchmark results
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +44 to +63
return (
<nav className="space-y-1">
<p className="font-medium text-sm mb-2">On this page</p>
{items.map((item) => (
<a
key={item.id}
href={`#${item.id}`}
className={cn(
'block text-sm py-1 border-l-2 pl-3 transition-colors',
activeId === item.id
? 'border-primary text-foreground font-medium'
: 'border-transparent text-muted-foreground hover:text-foreground hover:border-muted-foreground'
)}
>
{item.title}
</a>
))}
</nav>
);
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

When items array is empty, this component renders a nav with just the "On this page" heading but no links. While not necessarily broken, consider adding a conditional render or early return if items.length === 0 to avoid rendering an empty navigation section.

Copilot uses AI. Check for mistakes.
Comment on lines +80 to +87
const fileRes = await fetch(
`https://raw.githubusercontent.com/${REPO}/${ghPagesSha}/${FILE_PATH}`,
{ next: { revalidate: 3600 } }
);

if (!fileRes.ok) return null;

return (await fileRes.json()) as CIResultsData;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The JSON parsing at line 87 doesn't handle malformed JSON responses. If the GitHub API returns invalid JSON, this will throw an unhandled error. Consider wrapping the await fileRes.json() in a try-catch or adding validation.

Copilot uses AI. Check for mistakes.
Comment on lines +120 to +145
const ghPagesCommits = (await ghPagesCommitsRes.json()) as GitHubCommit[];

// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

Similarly, the JSON parsing at line 120 for gh-pages commits doesn't handle malformed JSON responses. Consider adding error handling for the await ghPagesCommitsRes.json() call.

Suggested change
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
try{
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
}
}catch(error){
console.error('Failed to parse gh-pages commits JSON',error);
returnsnapshotMap;

Copilot uses AI. Check for mistakes.
Comment on lines +122 to +148
// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}
}

return snapshotMap;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The batch processing loop processes all gh-pages commits (up to 100) without any upper bound on memory usage. If there are many commits, this could create a large number of parallel fetch requests. Consider adding a limit to the total number of commits processed or adding more granular error handling to prevent memory issues.

Copilot uses AI. Check for mistakes.
Comment threaddocs/components/worlds/Globe.tsx Outdated
Comment on lines +69 to +70
const globe = createGlobe(canvasRef.current!, globeConfig);

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The canvasRef.current could be null when createGlobe is called. While the non-null assertion operator (!) is used, this could cause a runtime error if the component unmounts or the ref isn't set before the effect runs. Add a null check before calling createGlobe.

Suggested change
constglobe=createGlobe(canvasRef.current!,globeConfig);
constcanvas=canvasRef.current;
if(!canvas){
return()=>{
window.removeEventListener('resize',onResize);
};
}
constglobe=createGlobe(canvas,globeConfig);

Copilot uses AI. Check for mistakes.

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

World documentation pages at /docs/deploying/world/* should redirect to /worlds/[id], but the redirect was never implemented - only mentioned in a comment

Fix on Vercel

samples: latestPoint?.samples,
current,
trendPercent,
ttfb: latestPoint?.ttfb,

@vercelvercelBotJan 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Trend calculation defaults undefined workflowTime values to 0, making it impossible to distinguish between "no data" and "zero performance time"

Fix on Vercel

Comment threaddocs/app/api/benchmark-history/route.ts Outdated
const pointerInteracting = useRef<number | null>(null);
const pointerInteractionMovement = useRef(0);
const [size, setSize] = useState(1200);
const { resolvedTheme } = useTheme();

@vercelvercelBotJan 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Globe component uses useTheme() without deferring initialization, causing hydration mismatch between server (undefined theme) and client

Fix on Vercel

- Add dedicated world detail pages at /worlds/[id] with MDX-driven content
- Create WorldDetailHero, WorldDetailToc, WorldTestingPerformance components
- Add benchmark history charts and test summary links
- Rewrite local-world, postgres-world, and vercel-world MDX with cleaner structure
- Use h3 headings for configuration options instead of tables/accordions
- Add WorldDataProvider context for passing world data to MDX components
- Add example field to worlds-manifest for linking to example repos
- Update worlds index page design
- Globe now scales with container width up to 1200px max
- Increased opacity from 20% to 30% for better visibility
- Positioned globe 30% down to show north pole behind header
- Globe component now auto-sizes based on container width
- Update title format to '{Name} World | Workflow DevKit'
- Update worlds index page title to 'Worlds | Workflow DevKit'
- Improve world descriptions in worlds-manifest.json for better SEO
- Add dynamic OG image generation at /worlds/[id]/og
- Add openGraph and twitter metadata to world detail pages
- Replace route-based og/route.tsx with opengraph-image.tsx file convention
- Remove runtime = 'edge' to allow generateStaticParams for static generation
- Simplify page.tsx metadata (Next.js auto-detects opengraph-image.tsx)
- Fix globe visibility in light/dark mode
- Fix tooltip positioning on mobile breakpoints
- Remove redundant Documentation button for community worlds
- Add missing pages to Foundations index (streaming, serialization, idempotency)
- Restructure deploying section with new index and building-a-world guide
- Restore original MDX content for official worlds (local, vercel, postgres)
- Auto-expand sidebar folders when child page is active

// Check if any child is active (current path starts with folder's index URL)
const hasActiveChild = item.index?.url
? pathname.startsWith(item.index.url + '/')

@vercelvercelBotJan 23, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sidebar fails to expand root-level folder when checking for active children due to malformed path check.

Fix on Vercel

<Card href="/docs/foundations/hooks" title="Webhooks (and hooks)">
Respond to external events in your workflow using hooks and webhooks.
</Card>
<Card href="/docs/foundations/streaming" title="Streaming">

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

unrelated change - the foundations page was missing cards for these (they were only in meta)

Comment threaddocs/next.config.ts
Comment on lines +53 to +73
// Redirect old world docs to new /worlds routes
{
source: '/docs/deploying/world/local-world',
destination: '/worlds/local',
permanent: true,
},
{
source: '/docs/deploying/world/postgres-world',
destination: '/worlds/postgres',
permanent: true,
},
{
source: '/docs/deploying/world/vercel-world',
destination: '/worlds/vercel',
permanent: true,
},
{
source: '/docs/worlds',
destination: '/worlds',
permanent: true,
},

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

this is so we don't break existing links on twitter, etc.

pranaygpand others added 2 commits January 23, 2026 17:12
- Fix /docs/deploying/world link to /docs/deploying/building-a-world
- Fix /docs/deploying#what-are-worlds invalid anchor to /docs/deploying
- Add @skip-typecheck markers to interface definition code blocks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- benchmark-history/route.ts: Add error handling for JSON parsing,
distinguish 404s from actual errors
- Globe.tsx: Fix hydration mismatch by deferring theme-dependent
rendering until component is mounted
- sidebar.tsx: Improve path check robustness for active child detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​cobe@​0.6.51001009383100

View full report

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🚢

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pranaygp@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs: revamp World documentation pages - #763

Merged
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking
Jan 26, 2026
Merged

docs: revamp World documentation pages#763
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking

Conversation

@pranaygp

@pranaygppranaygp commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

Added dedicated worlds page to show all available worlds incuding e2e testbench pass rate and performance benchmarking

Added historic performance benchmarking over last 30 commits/releases on github with request caching (should probably be ISR / PPR since these can be caluclated at build time and don't need to be re-fetched)

Rewrote the Local, Postgres and Vercel world documentation pages to follow a standard structure with config, observability, benchmarking notes

TODOs

  • Do another design and structural pass on the community world detail pages
  • Remove the old pages from docs for worlds and ensure redirect to prevent broken links
  • Include a better explanation on worlds, the interface, and how to build your own world
  • Polish up the worlds index page - need to replace the redundant AI generated components at the bottom with something more useful
  • Ask AI to do a code self review

Additional Changes

Deploying Section Restructure:

  • New streamlined deploying index page explaining portability via Worlds, local dev, and Vercel deployment
  • New detailed "Building a World" guide with Storage, Queue, and Streamer interface documentation
  • Links to Postgres World as reference implementation

Worlds Page UI Improvements:

  • Simplified footer: replaced "What is a World?" and "Build Your Own World" sections with single "Learn more about worlds" section
  • Moved "Last updated" info directly under worlds grid for better visibility
  • Fixed globe visibility in light/dark mode for better text readability
  • Fixed tooltip positioning on mobile breakpoints

Sidebar Navigation:

  • Auto-expand sidebar folders when viewing a child page (improves navigation context)

Other Fixes:

  • Added missing Foundations index cards (Streaming, Serialization, Idempotency)
  • Removed redundant Documentation button for community worlds (GitHub link is sufficient)

Preview

Worlds Page

imageimage

Postgres Docs (also check the other worlds)
image
image
image

CopilotAI review requested due to automatic review settings January 10, 2026 09:54
@changeset-bot

changeset-botBot commented Jan 10, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: d778fab

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

vercelBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.041s (-7.5% 🟢)1.019s (~)0.978s101.00x
💻 LocalNitro0.042s (-1.9%)1.007s (~)0.964s101.04x
💻 LocalExpress0.046s (+1.3%)1.008s (~)0.962s101.13x
🐘 PostgresNext.js (Turbopack)0.148s (+3.7%)1.022s (~)0.873s103.64x
🐘 PostgresExpress0.203s (-29.8% 🟢)1.024s (+0.9%)0.820s104.99x
🐘 PostgresNitro0.311s (+22.6% 🔺)1.031s (+1.7%)0.720s107.62x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.628s (-16.8% 🟢)1.485s (-24.3% 🟢)0.858s101.00x
▲ VercelNitro0.643s (-18.8% 🟢)1.482s (-12.4% 🟢)0.839s101.02x
▲ VercelExpress0.660s (-25.7% 🟢)1.566s (-11.2% 🟢)0.906s101.05x

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

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.096s (~)2.012s (~)0.917s101.00x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
💻 LocalExpress1.118s (~)2.007s (~)0.889s101.02x
🐘 PostgresNitro2.128s (-2.8%)2.414s (-20.0% 🟢)0.286s101.94x
🐘 PostgresNext.js (Turbopack)2.153s (+11.0% 🔺)2.417s (+14.2% 🔺)0.264s101.96x
🐘 PostgresExpress2.359s (+11.2% 🔺)3.016s (~)0.657s102.15x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.809s (-1.3%)3.597s (-1.3%)0.788s101.00x
▲ VercelNitro2.828s (-2.4%)3.626s (-2.3%)0.798s101.01x
▲ VercelExpress2.867s (-3.0%)3.643s (-0.6%)0.776s101.02x

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

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)10.701s (~)11.021s (~)0.321s51.00x
💻 LocalNitro10.823s (~)11.012s (~)0.189s51.01x
💻 LocalExpress10.833s (~)11.013s (~)0.180s51.01x
🐘 PostgresNext.js (Turbopack)14.904s (-2.3%)15.237s (-5.0%)0.333s51.39x
🐘 PostgresNitro15.269s (-25.3% 🟢)16.030s (-23.8% 🟢)0.762s51.43x
🐘 PostgresExpress20.322s (+13.8% 🔺)21.038s (+15.4% 🔺)0.716s51.90x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)22.217s (-15.6% 🟢)23.072s (-13.9% 🟢)0.855s51.00x
▲ VercelExpress23.130s (-8.2% 🟢)23.724s (-8.1% 🟢)0.593s51.04x
▲ VercelNitro23.173s (-12.1% 🟢)23.919s (-11.2% 🟢)0.745s51.04x

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

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.386s (~)2.011s (~)0.625s151.00x
💻 LocalNitro1.406s (+0.9%)2.007s (~)0.601s151.01x
💻 LocalExpress1.416s (~)2.007s (~)0.591s151.02x
🐘 PostgresNext.js (Turbopack)2.075s (+22.9% 🔺)2.599s (+27.4% 🔺)0.524s121.50x
🐘 PostgresNitro2.132s (-3.3%)2.760s (-8.4% 🟢)0.628s111.54x
🐘 PostgresExpress2.553s (+25.7% 🔺)3.014s (+9.9% 🔺)0.462s101.84x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.821s (-9.7% 🟢)3.631s (-6.7% 🟢)0.811s91.00x
▲ VercelNext.js (Turbopack)2.991s (~)3.725s (+2.5%)0.734s91.06x
▲ VercelExpress3.736s (+29.1% 🔺)5.355s (+46.3% 🔺)1.619s61.32x

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

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro2.429s (-4.4%)3.051s (+1.2%)0.623s101.00x
💻 LocalNext.js (Turbopack)2.487s (+3.0%)3.044s (-9.9% 🟢)0.558s101.02x
💻 LocalExpress2.522s (+1.8%)3.020s (~)0.498s101.04x
🐘 PostgresExpress8.825s (~)9.297s (-2.6%)0.472s43.63x
🐘 PostgresNext.js (Turbopack)10.771s (-1.9%)11.694s (~)0.923s34.43x
🐘 PostgresNitro11.244s (+32.5% 🔺)11.695s (+28.9% 🔺)0.451s34.63x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.137s (-12.1% 🟢)3.654s (-12.4% 🟢)0.517s91.00x
▲ VercelNext.js (Turbopack)3.223s (~)3.783s (+1.9%)0.560s81.03x
▲ VercelNitro3.434s (-4.5%)3.915s (-4.9%)0.481s81.09x

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

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.413s (~)2.007s (~)0.594s151.00x
💻 LocalNext.js (Turbopack)1.424s (+1.7%)2.011s (~)0.586s151.01x
💻 LocalExpress1.432s (~)2.007s (~)0.575s151.01x
🐘 PostgresNext.js (Turbopack)1.815s (+21.3% 🔺)2.156s (+7.1% 🔺)0.341s141.28x
🐘 PostgresExpress2.048s (-4.6%)2.527s (-2.7%)0.479s121.45x
🐘 PostgresNitro2.078s (+2.8%)2.680s (~)0.602s121.47x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.859s (-1.7%)3.631s (-2.8%)0.771s91.00x
▲ VercelExpress2.935s (+1.8%)3.757s (~)0.822s81.03x
▲ VercelNitro2.996s (+1.1%)3.773s (+1.4%)0.777s81.05x

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

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)2.593s (+3.6%)3.046s (~)0.453s101.00x
💻 LocalExpress2.606s (+1.0%)3.013s (~)0.407s101.00x
💻 LocalNitro2.650s (~)3.028s (~)0.378s101.02x
🐘 PostgresExpress11.333s (-1.6%)11.719s (~)0.386s34.37x
🐘 PostgresNext.js (Turbopack)11.564s (+6.4% 🔺)12.385s (+8.3% 🔺)0.821s34.46x
🐘 PostgresNitro13.741s (+20.7% 🔺)14.070s (+16.7% 🔺)0.329s35.30x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.296s (+5.7% 🔺)3.866s (+6.9% 🔺)0.571s81.00x
▲ VercelNext.js (Turbopack)3.509s (+1.1%)4.181s (+2.2%)0.672s81.06x
▲ VercelNitro119.077s (+3672.4% 🔺)120.329s (+3084.9% 🔺)1.252s136.13x

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

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.144s (+3.6%)1.004s (~)0.017s (+8.4% 🔺)1.028s (~)0.884s101.00x
💻 LocalExpress0.184s (+1.1%)0.992s (~)0.014s (-5.9% 🟢)1.021s (~)0.838s101.28x
💻 LocalNitro0.184s (-2.3%)0.992s (~)0.016s (-5.3% 🟢)1.022s (~)0.838s101.28x
🐘 PostgresNext.js (Turbopack)0.627s (-48.8% 🟢)0.975s (-46.5% 🟢)0.003s (+2500.0% 🔺)1.018s (-49.6% 🟢)0.391s104.37x
🐘 PostgresNitro1.098s (-50.8% 🟢)1.938s (-31.1% 🟢)0.000s (NaN%)2.013s (-33.2% 🟢)0.914s107.64x
🐘 PostgresExpress2.198s (+66.0% 🔺)2.845s (+58.7% 🔺)0.000s (NaN%)3.016s (+49.7% 🔺)0.818s1015.29x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.931s (~)3.312s (+3.9%)0.390s (+6.3% 🔺)4.134s (+3.5%)1.204s101.00x
▲ VercelNitro3.012s (+2.0%)3.272s (-0.5%)0.491s (+68.3% 🔺)4.257s (+2.6%)1.245s101.03x
▲ VercelExpress3.150s (+9.2% 🔺)3.259s (-1.4%)0.499s (~)4.306s (+0.9%)1.156s101.07x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)5/8
▲ VercelNext.js (Turbopack)5/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)💻 Local8/8
Nitro💻 Local8/8
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
  • 🌐 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)

📋 View full workflow run

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production457038495
❌ 💻 Local Development416232450
✅ 📦 Local Production418032450
✅ 🐘 Local Postgres418032450
✅ 🪟 Windows450045
❌ 🌍 Community Worlds311610192
Total17851631342082

❌ Failed Tests

💻 Local Development (2 failed)

astro-stable (2 failed):

  • 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
🌍 Community Worlds (161 failed)

mongodb (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

redis (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

starter (41 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

turso (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro4104
✅ example4104
✅ express4104
✅ fastify4104
✅ hono4104
✅ nextjs-turbopack4401
✅ nextjs-webpack4401
✅ nitro4104
✅ nuxt4104
✅ sveltekit4104
✅ vite4104
❌ 💻 Local Development
AppPassedFailedSkipped
❌ astro-stable3924
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack4500
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb5400
✅ redis-dev300
❌ redis5400
✅ starter-dev300
❌ starter4410
✅ turso-dev300
❌ turso5400

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR revamps the World documentation by creating dedicated detail pages for official worlds (local, postgres, vercel) with MDX-driven content. It introduces new components for world detail pages, benchmark history visualization with interactive charts, and a redesigned worlds index page with a 3D globe visual.

Changes:

  • Created dedicated /worlds/[id] routes with MDX content for official worlds and template components for community worlds
  • Added benchmark history charts showing performance trends over releases/commits with clickable data points
  • Restructured world documentation with cleaner h3 headings for configuration options instead of tables
  • Added TOC generation from MDX headings and world data provider context for component communication

Reviewed changes

Copilot reviewed 31 out of 32 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
worlds-manifest.jsonAdded example field for linking to example repositories
package.jsonAdded cobe dependency (0.6.5) for 3D globe visualization
next.config.tsAdded redirects from old /docs/deploying/world/* paths to new /worlds/* routes
worlds-data.tsEnhanced to extract framework-specific E2E data, workflow timing metrics, and added single world lookup functions
types.tsAdded framework E2E breakdown types, workflow timing fields, benchmark10SeqMs metric, and formatTime utility
WorldDetailHero.tsxNew hero component for world detail pages with E2E/benchmark summary and quick links
WorldDetailToc.tsxNew TOC component with intersection observer for active section highlighting
WorldTestingPerformance.tsxNew component displaying E2E test results and benchmark tables with history chart integration
WorldDataProvider.tsxNew context provider for sharing world data between MDX and client components
WorldCardSimple.tsxNew simplified card component for worlds index page with E2E/PERF metrics footer
Globe.tsxNew interactive 3D globe component using COBE library
BenchmarkHistoryChart.tsxNew dialog component showing performance trends over time with releases/commits toggle
local-world.mdxRewritten with cleaner structure, h3 config options, and Testing & Performance section
postgres-world.mdxRewritten with installation steps, framework-specific examples, and detailed configuration
vercel-world.mdxRewritten with simplified auto-configuration explanation and versioning details
worlds/page.tsxNew worlds index page with globe hero, world cards grid, and "What is a World?" section
worlds/[id]/page.tsxNew dynamic world detail page supporting both MDX and template rendering
worlds/compare/page.tsxNew benchmark comparison page with tables and charts
benchmark-history/route.tsNew API route fetching historical benchmark data from gh-pages commits
generate-docs-data.jsEnhanced to extract workflow timing metrics (min/max/ttfb/slurp) from benchmark results
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +44 to +63
return (
<nav className="space-y-1">
<p className="font-medium text-sm mb-2">On this page</p>
{items.map((item) => (
<a
key={item.id}
href={`#${item.id}`}
className={cn(
'block text-sm py-1 border-l-2 pl-3 transition-colors',
activeId === item.id
? 'border-primary text-foreground font-medium'
: 'border-transparent text-muted-foreground hover:text-foreground hover:border-muted-foreground'
)}
>
{item.title}
</a>
))}
</nav>
);
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

When items array is empty, this component renders a nav with just the "On this page" heading but no links. While not necessarily broken, consider adding a conditional render or early return if items.length === 0 to avoid rendering an empty navigation section.

Copilot uses AI. Check for mistakes.
Comment on lines +80 to +87
const fileRes = await fetch(
`https://raw.githubusercontent.com/${REPO}/${ghPagesSha}/${FILE_PATH}`,
{ next: { revalidate: 3600 } }
);

if (!fileRes.ok) return null;

return (await fileRes.json()) as CIResultsData;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The JSON parsing at line 87 doesn't handle malformed JSON responses. If the GitHub API returns invalid JSON, this will throw an unhandled error. Consider wrapping the await fileRes.json() in a try-catch or adding validation.

Copilot uses AI. Check for mistakes.
Comment on lines +120 to +145
const ghPagesCommits = (await ghPagesCommitsRes.json()) as GitHubCommit[];

// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

Similarly, the JSON parsing at line 120 for gh-pages commits doesn't handle malformed JSON responses. Consider adding error handling for the await ghPagesCommitsRes.json() call.

Suggested change
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
try{
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
}
}catch(error){
console.error('Failed to parse gh-pages commits JSON',error);
returnsnapshotMap;

Copilot uses AI. Check for mistakes.
Comment on lines +122 to +148
// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}
}

return snapshotMap;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The batch processing loop processes all gh-pages commits (up to 100) without any upper bound on memory usage. If there are many commits, this could create a large number of parallel fetch requests. Consider adding a limit to the total number of commits processed or adding more granular error handling to prevent memory issues.

Copilot uses AI. Check for mistakes.
Comment threaddocs/components/worlds/Globe.tsx Outdated
Comment on lines +69 to +70
const globe = createGlobe(canvasRef.current!, globeConfig);

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The canvasRef.current could be null when createGlobe is called. While the non-null assertion operator (!) is used, this could cause a runtime error if the component unmounts or the ref isn't set before the effect runs. Add a null check before calling createGlobe.

Suggested change
constglobe=createGlobe(canvasRef.current!,globeConfig);
constcanvas=canvasRef.current;
if(!canvas){
return()=>{
window.removeEventListener('resize',onResize);
};
}
constglobe=createGlobe(canvas,globeConfig);

Copilot uses AI. Check for mistakes.

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

World documentation pages at /docs/deploying/world/* should redirect to /worlds/[id], but the redirect was never implemented - only mentioned in a comment

Fix on Vercel

samples: latestPoint?.samples,
current,
trendPercent,
ttfb: latestPoint?.ttfb,

@vercelvercelBotJan 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Trend calculation defaults undefined workflowTime values to 0, making it impossible to distinguish between "no data" and "zero performance time"

Fix on Vercel

Comment threaddocs/app/api/benchmark-history/route.ts Outdated
const pointerInteracting = useRef<number | null>(null);
const pointerInteractionMovement = useRef(0);
const [size, setSize] = useState(1200);
const { resolvedTheme } = useTheme();

@vercelvercelBotJan 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Globe component uses useTheme() without deferring initialization, causing hydration mismatch between server (undefined theme) and client

Fix on Vercel

- Add dedicated world detail pages at /worlds/[id] with MDX-driven content
- Create WorldDetailHero, WorldDetailToc, WorldTestingPerformance components
- Add benchmark history charts and test summary links
- Rewrite local-world, postgres-world, and vercel-world MDX with cleaner structure
- Use h3 headings for configuration options instead of tables/accordions
- Add WorldDataProvider context for passing world data to MDX components
- Add example field to worlds-manifest for linking to example repos
- Update worlds index page design
- Globe now scales with container width up to 1200px max
- Increased opacity from 20% to 30% for better visibility
- Positioned globe 30% down to show north pole behind header
- Globe component now auto-sizes based on container width
- Update title format to '{Name} World | Workflow DevKit'
- Update worlds index page title to 'Worlds | Workflow DevKit'
- Improve world descriptions in worlds-manifest.json for better SEO
- Add dynamic OG image generation at /worlds/[id]/og
- Add openGraph and twitter metadata to world detail pages
- Replace route-based og/route.tsx with opengraph-image.tsx file convention
- Remove runtime = 'edge' to allow generateStaticParams for static generation
- Simplify page.tsx metadata (Next.js auto-detects opengraph-image.tsx)
- Fix globe visibility in light/dark mode
- Fix tooltip positioning on mobile breakpoints
- Remove redundant Documentation button for community worlds
- Add missing pages to Foundations index (streaming, serialization, idempotency)
- Restructure deploying section with new index and building-a-world guide
- Restore original MDX content for official worlds (local, vercel, postgres)
- Auto-expand sidebar folders when child page is active

// Check if any child is active (current path starts with folder's index URL)
const hasActiveChild = item.index?.url
? pathname.startsWith(item.index.url + '/')

@vercelvercelBotJan 23, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sidebar fails to expand root-level folder when checking for active children due to malformed path check.

Fix on Vercel

<Card href="/docs/foundations/hooks" title="Webhooks (and hooks)">
Respond to external events in your workflow using hooks and webhooks.
</Card>
<Card href="/docs/foundations/streaming" title="Streaming">

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

unrelated change - the foundations page was missing cards for these (they were only in meta)

Comment threaddocs/next.config.ts
Comment on lines +53 to +73
// Redirect old world docs to new /worlds routes
{
source: '/docs/deploying/world/local-world',
destination: '/worlds/local',
permanent: true,
},
{
source: '/docs/deploying/world/postgres-world',
destination: '/worlds/postgres',
permanent: true,
},
{
source: '/docs/deploying/world/vercel-world',
destination: '/worlds/vercel',
permanent: true,
},
{
source: '/docs/worlds',
destination: '/worlds',
permanent: true,
},

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

this is so we don't break existing links on twitter, etc.

pranaygpand others added 2 commits January 23, 2026 17:12
- Fix /docs/deploying/world link to /docs/deploying/building-a-world
- Fix /docs/deploying#what-are-worlds invalid anchor to /docs/deploying
- Add @skip-typecheck markers to interface definition code blocks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- benchmark-history/route.ts: Add error handling for JSON parsing,
distinguish 404s from actual errors
- Globe.tsx: Fix hydration mismatch by deferring theme-dependent
rendering until component is mounted
- sidebar.tsx: Improve path check robustness for active child detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​cobe@​0.6.51001009383100

View full report

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🚢

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pranaygp@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

docs: revamp World documentation pages - #763

Merged
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking
Jan 26, 2026
Merged

docs: revamp World documentation pages#763
pranaygp merged 11 commits into
mainfrom
pranaygp/finish-benchmarking

Conversation

@pranaygp

@pranaygppranaygp commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

Added dedicated worlds page to show all available worlds incuding e2e testbench pass rate and performance benchmarking

Added historic performance benchmarking over last 30 commits/releases on github with request caching (should probably be ISR / PPR since these can be caluclated at build time and don't need to be re-fetched)

Rewrote the Local, Postgres and Vercel world documentation pages to follow a standard structure with config, observability, benchmarking notes

TODOs

  • Do another design and structural pass on the community world detail pages
  • Remove the old pages from docs for worlds and ensure redirect to prevent broken links
  • Include a better explanation on worlds, the interface, and how to build your own world
  • Polish up the worlds index page - need to replace the redundant AI generated components at the bottom with something more useful
  • Ask AI to do a code self review

Additional Changes

Deploying Section Restructure:

  • New streamlined deploying index page explaining portability via Worlds, local dev, and Vercel deployment
  • New detailed "Building a World" guide with Storage, Queue, and Streamer interface documentation
  • Links to Postgres World as reference implementation

Worlds Page UI Improvements:

  • Simplified footer: replaced "What is a World?" and "Build Your Own World" sections with single "Learn more about worlds" section
  • Moved "Last updated" info directly under worlds grid for better visibility
  • Fixed globe visibility in light/dark mode for better text readability
  • Fixed tooltip positioning on mobile breakpoints

Sidebar Navigation:

  • Auto-expand sidebar folders when viewing a child page (improves navigation context)

Other Fixes:

  • Added missing Foundations index cards (Streaming, Serialization, Idempotency)
  • Removed redundant Documentation button for community worlds (GitHub link is sufficient)

Preview

Worlds Page

imageimage

Postgres Docs (also check the other worlds)
image
image
image

CopilotAI review requested due to automatic review settings January 10, 2026 09:54
@changeset-bot

changeset-botBot commented Jan 10, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: d778fab

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

vercelBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.041s (-7.5% 🟢)1.019s (~)0.978s101.00x
💻 LocalNitro0.042s (-1.9%)1.007s (~)0.964s101.04x
💻 LocalExpress0.046s (+1.3%)1.008s (~)0.962s101.13x
🐘 PostgresNext.js (Turbopack)0.148s (+3.7%)1.022s (~)0.873s103.64x
🐘 PostgresExpress0.203s (-29.8% 🟢)1.024s (+0.9%)0.820s104.99x
🐘 PostgresNitro0.311s (+22.6% 🔺)1.031s (+1.7%)0.720s107.62x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)0.628s (-16.8% 🟢)1.485s (-24.3% 🟢)0.858s101.00x
▲ VercelNitro0.643s (-18.8% 🟢)1.482s (-12.4% 🟢)0.839s101.02x
▲ VercelExpress0.660s (-25.7% 🟢)1.566s (-11.2% 🟢)0.906s101.05x

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

workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.096s (~)2.012s (~)0.917s101.00x
💻 LocalNitro1.114s (~)2.006s (~)0.892s101.02x
💻 LocalExpress1.118s (~)2.007s (~)0.889s101.02x
🐘 PostgresNitro2.128s (-2.8%)2.414s (-20.0% 🟢)0.286s101.94x
🐘 PostgresNext.js (Turbopack)2.153s (+11.0% 🔺)2.417s (+14.2% 🔺)0.264s101.96x
🐘 PostgresExpress2.359s (+11.2% 🔺)3.016s (~)0.657s102.15x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.809s (-1.3%)3.597s (-1.3%)0.788s101.00x
▲ VercelNitro2.828s (-2.4%)3.626s (-2.3%)0.798s101.01x
▲ VercelExpress2.867s (-3.0%)3.643s (-0.6%)0.776s101.02x

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

workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)10.701s (~)11.021s (~)0.321s51.00x
💻 LocalNitro10.823s (~)11.012s (~)0.189s51.01x
💻 LocalExpress10.833s (~)11.013s (~)0.180s51.01x
🐘 PostgresNext.js (Turbopack)14.904s (-2.3%)15.237s (-5.0%)0.333s51.39x
🐘 PostgresNitro15.269s (-25.3% 🟢)16.030s (-23.8% 🟢)0.762s51.43x
🐘 PostgresExpress20.322s (+13.8% 🔺)21.038s (+15.4% 🔺)0.716s51.90x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)22.217s (-15.6% 🟢)23.072s (-13.9% 🟢)0.855s51.00x
▲ VercelExpress23.130s (-8.2% 🟢)23.724s (-8.1% 🟢)0.593s51.04x
▲ VercelNitro23.173s (-12.1% 🟢)23.919s (-11.2% 🟢)0.745s51.04x

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

Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)1.386s (~)2.011s (~)0.625s151.00x
💻 LocalNitro1.406s (+0.9%)2.007s (~)0.601s151.01x
💻 LocalExpress1.416s (~)2.007s (~)0.591s151.02x
🐘 PostgresNext.js (Turbopack)2.075s (+22.9% 🔺)2.599s (+27.4% 🔺)0.524s121.50x
🐘 PostgresNitro2.132s (-3.3%)2.760s (-8.4% 🟢)0.628s111.54x
🐘 PostgresExpress2.553s (+25.7% 🔺)3.014s (+9.9% 🔺)0.462s101.84x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Nitro2.821s (-9.7% 🟢)3.631s (-6.7% 🟢)0.811s91.00x
▲ VercelNext.js (Turbopack)2.991s (~)3.725s (+2.5%)0.734s91.06x
▲ VercelExpress3.736s (+29.1% 🔺)5.355s (+46.3% 🔺)1.619s61.32x

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

Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro2.429s (-4.4%)3.051s (+1.2%)0.623s101.00x
💻 LocalNext.js (Turbopack)2.487s (+3.0%)3.044s (-9.9% 🟢)0.558s101.02x
💻 LocalExpress2.522s (+1.8%)3.020s (~)0.498s101.04x
🐘 PostgresExpress8.825s (~)9.297s (-2.6%)0.472s43.63x
🐘 PostgresNext.js (Turbopack)10.771s (-1.9%)11.694s (~)0.923s34.43x
🐘 PostgresNitro11.244s (+32.5% 🔺)11.695s (+28.9% 🔺)0.451s34.63x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.137s (-12.1% 🟢)3.654s (-12.4% 🟢)0.517s91.00x
▲ VercelNext.js (Turbopack)3.223s (~)3.783s (+1.9%)0.560s81.03x
▲ VercelNitro3.434s (-4.5%)3.915s (-4.9%)0.481s81.09x

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

Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.413s (~)2.007s (~)0.594s151.00x
💻 LocalNext.js (Turbopack)1.424s (+1.7%)2.011s (~)0.586s151.01x
💻 LocalExpress1.432s (~)2.007s (~)0.575s151.01x
🐘 PostgresNext.js (Turbopack)1.815s (+21.3% 🔺)2.156s (+7.1% 🔺)0.341s141.28x
🐘 PostgresExpress2.048s (-4.6%)2.527s (-2.7%)0.479s121.45x
🐘 PostgresNitro2.078s (+2.8%)2.680s (~)0.602s121.47x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.859s (-1.7%)3.631s (-2.8%)0.771s91.00x
▲ VercelExpress2.935s (+1.8%)3.757s (~)0.822s81.03x
▲ VercelNitro2.996s (+1.1%)3.773s (+1.4%)0.777s81.05x

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

Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)2.593s (+3.6%)3.046s (~)0.453s101.00x
💻 LocalExpress2.606s (+1.0%)3.013s (~)0.407s101.00x
💻 LocalNitro2.650s (~)3.028s (~)0.378s101.02x
🐘 PostgresExpress11.333s (-1.6%)11.719s (~)0.386s34.37x
🐘 PostgresNext.js (Turbopack)11.564s (+6.4% 🔺)12.385s (+8.3% 🔺)0.821s34.46x
🐘 PostgresNitro13.741s (+20.7% 🔺)14.070s (+16.7% 🔺)0.329s35.30x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Express3.296s (+5.7% 🔺)3.866s (+6.9% 🔺)0.571s81.00x
▲ VercelNext.js (Turbopack)3.509s (+1.1%)4.181s (+2.2%)0.672s81.06x
▲ VercelNitro119.077s (+3672.4% 🔺)120.329s (+3084.9% 🔺)1.252s136.13x

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

Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Next.js (Turbopack)0.144s (+3.6%)1.004s (~)0.017s (+8.4% 🔺)1.028s (~)0.884s101.00x
💻 LocalExpress0.184s (+1.1%)0.992s (~)0.014s (-5.9% 🟢)1.021s (~)0.838s101.28x
💻 LocalNitro0.184s (-2.3%)0.992s (~)0.016s (-5.3% 🟢)1.022s (~)0.838s101.28x
🐘 PostgresNext.js (Turbopack)0.627s (-48.8% 🟢)0.975s (-46.5% 🟢)0.003s (+2500.0% 🔺)1.018s (-49.6% 🟢)0.391s104.37x
🐘 PostgresNitro1.098s (-50.8% 🟢)1.938s (-31.1% 🟢)0.000s (NaN%)2.013s (-33.2% 🟢)0.914s107.64x
🐘 PostgresExpress2.198s (+66.0% 🔺)2.845s (+58.7% 🔺)0.000s (NaN%)3.016s (+49.7% 🔺)0.818s1015.29x

▲ Production (Vercel)

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
▲ Vercel🥇 Next.js (Turbopack)2.931s (~)3.312s (+3.9%)0.390s (+6.3% 🔺)4.134s (+3.5%)1.204s101.00x
▲ VercelNitro3.012s (+2.0%)3.272s (-0.5%)0.491s (+68.3% 🔺)4.257s (+2.6%)1.245s101.03x
▲ VercelExpress3.150s (+9.2% 🔺)3.259s (-1.4%)0.499s (~)4.306s (+0.9%)1.156s101.07x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalNext.js (Turbopack)6/8
🐘 PostgresNext.js (Turbopack)5/8
▲ VercelNext.js (Turbopack)5/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express💻 Local8/8
Next.js (Turbopack)💻 Local8/8
Nitro💻 Local8/8
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
  • 🌐 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)

📋 View full workflow run

@github-actions

github-actionsBot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production457038495
❌ 💻 Local Development416232450
✅ 📦 Local Production418032450
✅ 🐘 Local Postgres418032450
✅ 🪟 Windows450045
❌ 🌍 Community Worlds311610192
Total17851631342082

❌ Failed Tests

💻 Local Development (2 failed)

astro-stable (2 failed):

  • 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
🌍 Community Worlds (161 failed)

mongodb (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

redis (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

starter (41 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

turso (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • 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()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro4104
✅ example4104
✅ express4104
✅ fastify4104
✅ hono4104
✅ nextjs-turbopack4401
✅ nextjs-webpack4401
✅ nitro4104
✅ nuxt4104
✅ sveltekit4104
✅ vite4104
❌ 💻 Local Development
AppPassedFailedSkipped
❌ astro-stable3924
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable4104
✅ express-stable4104
✅ fastify-stable4104
✅ hono-stable4104
✅ nextjs-turbopack-stable4500
✅ nextjs-webpack-stable4500
✅ nitro-stable4104
✅ nuxt-stable4104
✅ sveltekit-stable4104
✅ vite-stable4104
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack4500
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev300
❌ mongodb5400
✅ redis-dev300
❌ redis5400
✅ starter-dev300
❌ starter4410
✅ turso-dev300
❌ turso5400

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR revamps the World documentation by creating dedicated detail pages for official worlds (local, postgres, vercel) with MDX-driven content. It introduces new components for world detail pages, benchmark history visualization with interactive charts, and a redesigned worlds index page with a 3D globe visual.

Changes:

  • Created dedicated /worlds/[id] routes with MDX content for official worlds and template components for community worlds
  • Added benchmark history charts showing performance trends over releases/commits with clickable data points
  • Restructured world documentation with cleaner h3 headings for configuration options instead of tables
  • Added TOC generation from MDX headings and world data provider context for component communication

Reviewed changes

Copilot reviewed 31 out of 32 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
worlds-manifest.jsonAdded example field for linking to example repositories
package.jsonAdded cobe dependency (0.6.5) for 3D globe visualization
next.config.tsAdded redirects from old /docs/deploying/world/* paths to new /worlds/* routes
worlds-data.tsEnhanced to extract framework-specific E2E data, workflow timing metrics, and added single world lookup functions
types.tsAdded framework E2E breakdown types, workflow timing fields, benchmark10SeqMs metric, and formatTime utility
WorldDetailHero.tsxNew hero component for world detail pages with E2E/benchmark summary and quick links
WorldDetailToc.tsxNew TOC component with intersection observer for active section highlighting
WorldTestingPerformance.tsxNew component displaying E2E test results and benchmark tables with history chart integration
WorldDataProvider.tsxNew context provider for sharing world data between MDX and client components
WorldCardSimple.tsxNew simplified card component for worlds index page with E2E/PERF metrics footer
Globe.tsxNew interactive 3D globe component using COBE library
BenchmarkHistoryChart.tsxNew dialog component showing performance trends over time with releases/commits toggle
local-world.mdxRewritten with cleaner structure, h3 config options, and Testing & Performance section
postgres-world.mdxRewritten with installation steps, framework-specific examples, and detailed configuration
vercel-world.mdxRewritten with simplified auto-configuration explanation and versioning details
worlds/page.tsxNew worlds index page with globe hero, world cards grid, and "What is a World?" section
worlds/[id]/page.tsxNew dynamic world detail page supporting both MDX and template rendering
worlds/compare/page.tsxNew benchmark comparison page with tables and charts
benchmark-history/route.tsNew API route fetching historical benchmark data from gh-pages commits
generate-docs-data.jsEnhanced to extract workflow timing metrics (min/max/ttfb/slurp) from benchmark results
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +44 to +63
return (
<nav className="space-y-1">
<p className="font-medium text-sm mb-2">On this page</p>
{items.map((item) => (
<a
key={item.id}
href={`#${item.id}`}
className={cn(
'block text-sm py-1 border-l-2 pl-3 transition-colors',
activeId === item.id
? 'border-primary text-foreground font-medium'
: 'border-transparent text-muted-foreground hover:text-foreground hover:border-muted-foreground'
)}
>
{item.title}
</a>
))}
</nav>
);
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

When items array is empty, this component renders a nav with just the "On this page" heading but no links. While not necessarily broken, consider adding a conditional render or early return if items.length === 0 to avoid rendering an empty navigation section.

Copilot uses AI. Check for mistakes.
Comment on lines +80 to +87
const fileRes = await fetch(
`https://raw.githubusercontent.com/${REPO}/${ghPagesSha}/${FILE_PATH}`,
{ next: { revalidate: 3600 } }
);

if (!fileRes.ok) return null;

return (await fileRes.json()) as CIResultsData;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The JSON parsing at line 87 doesn't handle malformed JSON responses. If the GitHub API returns invalid JSON, this will throw an unhandled error. Consider wrapping the await fileRes.json() in a try-catch or adding validation.

Copilot uses AI. Check for mistakes.
Comment on lines +120 to +145
const ghPagesCommits = (await ghPagesCommitsRes.json()) as GitHubCommit[];

// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

Similarly, the JSON parsing at line 120 for gh-pages commits doesn't handle malformed JSON responses. Consider adding error handling for the await ghPagesCommitsRes.json() call.

Suggested change
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
try{
constghPagesCommits=(awaitghPagesCommitsRes.json())asGitHubCommit[];
// Fetch benchmark data for each gh-pages commit in batches
constBATCH_SIZE=10;
for(leti=0;i<ghPagesCommits.length;i+=BATCH_SIZE){
constbatch=ghPagesCommits.slice(i,i+BATCH_SIZE);
constresults=awaitPromise.all(
batch.map(async(ghCommit)=>{
constdata=awaitfetchBenchmarkFile(ghCommit.sha);
if(!data||!data.commit)returnnull;
return{
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);
for(constresultofresults){
if(result&&!snapshotMap.has(result.mainCommitSha)){
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha,result);
}
}
}
}catch(error){
console.error('Failed to parse gh-pages commits JSON',error);
returnsnapshotMap;

Copilot uses AI. Check for mistakes.
Comment on lines +122 to +148
// Fetch benchmark data for each gh-pages commit in batches
const BATCH_SIZE = 10;
for (let i = 0; i < ghPagesCommits.length; i += BATCH_SIZE) {
const batch = ghPagesCommits.slice(i, i + BATCH_SIZE);
const results = await Promise.all(
batch.map(async (ghCommit) => {
const data = await fetchBenchmarkFile(ghCommit.sha);
if (!data || !data.commit) return null;

return {
ghPagesSha: ghCommit.sha,
mainCommitSha: data.commit,
timestamp: data.lastUpdated,
data,
};
})
);

for (const result of results) {
if (result && !snapshotMap.has(result.mainCommitSha)) {
// Only keep the first (most recent) benchmark for each main commit
snapshotMap.set(result.mainCommitSha, result);
}
}
}

return snapshotMap;

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The batch processing loop processes all gh-pages commits (up to 100) without any upper bound on memory usage. If there are many commits, this could create a large number of parallel fetch requests. Consider adding a limit to the total number of commits processed or adding more granular error handling to prevent memory issues.

Copilot uses AI. Check for mistakes.
Comment threaddocs/components/worlds/Globe.tsx Outdated
Comment on lines +69 to +70
const globe = createGlobe(canvasRef.current!, globeConfig);

CopilotAIJan 10, 2026

Copy link

Choose a reason for hiding this comment

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

The canvasRef.current could be null when createGlobe is called. While the non-null assertion operator (!) is used, this could cause a runtime error if the component unmounts or the ref isn't set before the effect runs. Add a null check before calling createGlobe.

Suggested change
constglobe=createGlobe(canvasRef.current!,globeConfig);
constcanvas=canvasRef.current;
if(!canvas){
return()=>{
window.removeEventListener('resize',onResize);
};
}
constglobe=createGlobe(canvas,globeConfig);

Copilot uses AI. Check for mistakes.

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

World documentation pages at /docs/deploying/world/* should redirect to /worlds/[id], but the redirect was never implemented - only mentioned in a comment

Fix on Vercel

samples: latestPoint?.samples,
current,
trendPercent,
ttfb: latestPoint?.ttfb,

@vercelvercelBotJan 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Trend calculation defaults undefined workflowTime values to 0, making it impossible to distinguish between "no data" and "zero performance time"

Fix on Vercel

Comment threaddocs/app/api/benchmark-history/route.ts Outdated
const pointerInteracting = useRef<number | null>(null);
const pointerInteractionMovement = useRef(0);
const [size, setSize] = useState(1200);
const { resolvedTheme } = useTheme();

@vercelvercelBotJan 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Globe component uses useTheme() without deferring initialization, causing hydration mismatch between server (undefined theme) and client

Fix on Vercel

- Add dedicated world detail pages at /worlds/[id] with MDX-driven content
- Create WorldDetailHero, WorldDetailToc, WorldTestingPerformance components
- Add benchmark history charts and test summary links
- Rewrite local-world, postgres-world, and vercel-world MDX with cleaner structure
- Use h3 headings for configuration options instead of tables/accordions
- Add WorldDataProvider context for passing world data to MDX components
- Add example field to worlds-manifest for linking to example repos
- Update worlds index page design
- Globe now scales with container width up to 1200px max
- Increased opacity from 20% to 30% for better visibility
- Positioned globe 30% down to show north pole behind header
- Globe component now auto-sizes based on container width
- Update title format to '{Name} World | Workflow DevKit'
- Update worlds index page title to 'Worlds | Workflow DevKit'
- Improve world descriptions in worlds-manifest.json for better SEO
- Add dynamic OG image generation at /worlds/[id]/og
- Add openGraph and twitter metadata to world detail pages
- Replace route-based og/route.tsx with opengraph-image.tsx file convention
- Remove runtime = 'edge' to allow generateStaticParams for static generation
- Simplify page.tsx metadata (Next.js auto-detects opengraph-image.tsx)
- Fix globe visibility in light/dark mode
- Fix tooltip positioning on mobile breakpoints
- Remove redundant Documentation button for community worlds
- Add missing pages to Foundations index (streaming, serialization, idempotency)
- Restructure deploying section with new index and building-a-world guide
- Restore original MDX content for official worlds (local, vercel, postgres)
- Auto-expand sidebar folders when child page is active

// Check if any child is active (current path starts with folder's index URL)
const hasActiveChild = item.index?.url
? pathname.startsWith(item.index.url + '/')

@vercelvercelBotJan 23, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sidebar fails to expand root-level folder when checking for active children due to malformed path check.

Fix on Vercel

<Card href="/docs/foundations/hooks" title="Webhooks (and hooks)">
Respond to external events in your workflow using hooks and webhooks.
</Card>
<Card href="/docs/foundations/streaming" title="Streaming">

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

unrelated change - the foundations page was missing cards for these (they were only in meta)

Comment threaddocs/next.config.ts
Comment on lines +53 to +73
// Redirect old world docs to new /worlds routes
{
source: '/docs/deploying/world/local-world',
destination: '/worlds/local',
permanent: true,
},
{
source: '/docs/deploying/world/postgres-world',
destination: '/worlds/postgres',
permanent: true,
},
{
source: '/docs/deploying/world/vercel-world',
destination: '/worlds/vercel',
permanent: true,
},
{
source: '/docs/worlds',
destination: '/worlds',
permanent: true,
},

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

this is so we don't break existing links on twitter, etc.

pranaygpand others added 2 commits January 23, 2026 17:12
- Fix /docs/deploying/world link to /docs/deploying/building-a-world
- Fix /docs/deploying#what-are-worlds invalid anchor to /docs/deploying
- Add @skip-typecheck markers to interface definition code blocks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- benchmark-history/route.ts: Add error handling for JSON parsing,
distinguish 404s from actual errors
- Globe.tsx: Fix hydration mismatch by deferring theme-dependent
rendering until component is mounted
- sidebar.tsx: Improve path check robustness for active child detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addednpm/​cobe@​0.6.51001009383100

View full report

@VaguelySeriousVaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🚢

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pranaygp@VaguelySerious