Skip to content

Add encryption documentation and world features manifest#1432

Merged
TooTallNate merged 3 commits into
mainfrom
docs/encryption-and-worlds-features
Mar 18, 2026
Merged

Add encryption documentation and world features manifest#1432
TooTallNate merged 3 commits into
mainfrom
docs/encryption-and-worlds-features

Conversation

@TooTallNate

Copy link
Copy Markdown
Member

Summary

  • Adds a new Encryption page under "How it Works" documenting end-to-end user data encryption in Workflow DevKit
  • Adds a features array to worlds-manifest.json so worlds can declare supported capabilities (e.g. encryption)
  • Surfaces encryption support in the Worlds docs UI (detail hero and card footer)
  • Adds cross-references from the Vercel World and Observability pages to the encryption docs

Encryption docs cover:

  • What data is encrypted (workflow I/O, step I/O, hook metadata/payloads, streams)
  • Key management and AES-256-GCM algorithm
  • Decrypting data via the web dashboard and CLI (--decrypt flag)
  • Permissions model and audit logging
  • Custom World implementation guide (getEncryptionKeyForRun())

Worlds manifest:

  • New features field on each world entry — only Vercel World declares ["encryption"]
  • WorldFeature type and features field added to the World interface
  • WorldDetailHero shows a linked "E2E Encrypted" indicator with shield icon
  • WorldCardSimple shows an "Encrypted" column in the footer grid

- Add encryption.mdx under How it Works explaining end-to-end encryption
- Add features array to worlds-manifest.json (encryption for Vercel World)
- Display encryption support in WorldDetailHero and WorldCardSimple
- Add cross-references from Vercel World and Observability pages
@TooTallNate TooTallNate requested a review from a team as a code owner March 18, 2026 06:28
Copilot AI review requested due to automatic review settings March 18, 2026 06:28
@vercel

vercel Bot commented Mar 18, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment Mar 18, 2026 7:03am
example-nextjs-workflow-webpack Ready Ready Preview, Comment Mar 18, 2026 7:03am
example-workflow Ready Ready Preview, Comment Mar 18, 2026 7:03am
workbench-astro-workflow Ready Ready Preview, Comment Mar 18, 2026 7:03am
workbench-express-workflow Ready Ready Preview, Comment Mar 18, 2026 7:03am
workbench-fastify-workflow Ready Ready Preview, Comment Mar 18, 2026 7:03am
workbench-hono-workflow Ready Ready Preview, Comment Mar 18, 2026 7:03am
workbench-nitro-workflow Ready Ready Preview, Comment Mar 18, 2026 7:03am
workbench-nuxt-workflow Ready Ready Preview, Comment Mar 18, 2026 7:03am
workbench-sveltekit-workflow Ready Ready Preview, Comment Mar 18, 2026 7:03am
workbench-vite-workflow Ready Ready Preview, Comment Mar 18, 2026 7:03am
workflow-docs Ready Ready Preview, 💬 3 unresolved, Open in v0 Mar 18, 2026 7:03am
workflow-nest Ready Ready Preview, Comment Mar 18, 2026 7:03am
workflow-swc-playground Ready Ready Preview, Comment Mar 18, 2026 7:03am

@changeset-bot

changeset-bot Bot commented Mar 18, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3c9f691

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

This PR includes changesets to release 0 packages

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

Not sure what this means? Click here to learn what changesets are.

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

@github-actions

github-actions Bot commented Mar 18, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 758 0 67 825
✅ 💻 Local Development 782 0 118 900
✅ 📦 Local Production 782 0 118 900
✅ 🐘 Local Postgres 782 0 118 900
✅ 🪟 Windows 72 0 3 75
❌ 🌍 Community Worlds 118 56 15 189
✅ 📋 Other 198 0 27 225
Total 3492 56 466 4014

❌ Failed Tests

🌍 Community Worlds (56 failed)

mongodb (3 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KKZW4AXW9QNWAQAMK009KBRB
  • webhookWorkflow | wrun_01KKZW4JQ8X9B8FSW4DRC9WE76
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KKZW9ZRX0MHVRFF4M9WM8WQZ

redis (2 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KKZW4AXW9QNWAQAMK009KBRB
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KKZW9ZRX0MHVRFF4M9WM8WQZ

turso (51 failed):

  • addTenWorkflow | wrun_01KKZW32V8QS2NXYQES1HFRCZN
  • addTenWorkflow | wrun_01KKZW32V8QS2NXYQES1HFRCZN
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KKZW44JP6ECT1W4NJPX33WC9
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KKZW39SZ10WMPHEA7RY7K865
  • promiseRaceWorkflow | wrun_01KKZW3FXXFRTQ80C959BSPRYY
  • promiseAnyWorkflow | wrun_01KKZW3J56APQSYEXGGB5DQ077
  • importedStepOnlyWorkflow | wrun_01KKZW4K7AP4S1YXT2Z8WWHEPK
  • hookWorkflow | wrun_01KKZW3ZGSYNJP5HMF19S3PR92
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KKZW4AXW9QNWAQAMK009KBRB
  • webhookWorkflow | wrun_01KKZW4JQ8X9B8FSW4DRC9WE76
  • sleepingWorkflow | wrun_01KKZW4S7JNGS0NRARPXJPX096
  • parallelSleepWorkflow | wrun_01KKZW558X6F4P64E6KFGPA6WJ
  • nullByteWorkflow | wrun_01KKZW58MMH0SDYD71W4SGEH25
  • workflowAndStepMetadataWorkflow | wrun_01KKZW5ASNVGKR4V1AANJNBHAG
  • fetchWorkflow | wrun_01KKZW67MR2C7BHS16CAPHQ69Z
  • promiseRaceStressTestWorkflow | wrun_01KKZW6B4XE0WFQ0JH83QK584F
  • 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 | wrun_01KKZW9AHG8C1VS3A35A0WNXQX
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KKZW9ZRX0MHVRFF4M9WM8WQZ
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KKZWANJWR6BWW0E5GMFZT6RA
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KKZWB9HDCHV0RCZPCN6GDTM4
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KKZWBJRBPJJHQEKQK0KH4N9D
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KKZWBRC1QFTBF5815HEHNFST
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KKZWBTK2BB0HB4GRF00YABC3
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KKZWC9AN5S12RWFJPEH369PA
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KKZWCF4R70E47RZZ0PDNAYTT
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KKZWCP2PHSX4QGSD5EMW9QAN
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KKZWCWAFYJNGN9AH7RK598VC
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KKZWD3DKYTYYJS8CSPQY5WRA
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KKZWDAE0Q9MNEQP0EJDPS11S
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KKZWDHBJKEZ7HCQZRN7MK4QX
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KKZWDV7ZV0KPPMXH97XFDXJQ
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KKZWE3966V0N5AQ7EFN1G7K2
  • cancelRun - cancelling a running workflow | wrun_01KKZWEA0QSRZ5CDWF6TE3K50Q
  • cancelRun via CLI - cancelling a running workflow | wrun_01KKZWEKFY778QWFZ7V1MSAZV5
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KKZWEZSTYSPN28EHNQT22S8Z
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KKZWFN0X10F63KG52PDC4K9F
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KKZWG04ZAVEXY2EH8CTMGZQ8

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 68 0 7
✅ example 68 0 7
✅ express 68 0 7
✅ fastify 68 0 7
✅ hono 68 0 7
✅ nextjs-turbopack 73 0 2
✅ nextjs-webpack 73 0 2
✅ nitro 68 0 7
✅ nuxt 68 0 7
✅ sveltekit 68 0 7
✅ vite 68 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 66 0 9
✅ express-stable 66 0 9
✅ fastify-stable 66 0 9
✅ hono-stable 66 0 9
✅ nextjs-turbopack-canary 55 0 20
✅ nextjs-turbopack-stable 72 0 3
✅ nextjs-webpack-canary 55 0 20
✅ nextjs-webpack-stable 72 0 3
✅ nitro-stable 66 0 9
✅ nuxt-stable 66 0 9
✅ sveltekit-stable 66 0 9
✅ vite-stable 66 0 9
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 66 0 9
✅ express-stable 66 0 9
✅ fastify-stable 66 0 9
✅ hono-stable 66 0 9
✅ nextjs-turbopack-canary 55 0 20
✅ nextjs-turbopack-stable 72 0 3
✅ nextjs-webpack-canary 55 0 20
✅ nextjs-webpack-stable 72 0 3
✅ nitro-stable 66 0 9
✅ nuxt-stable 66 0 9
✅ sveltekit-stable 66 0 9
✅ vite-stable 66 0 9
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 66 0 9
✅ express-stable 66 0 9
✅ fastify-stable 66 0 9
✅ hono-stable 66 0 9
✅ nextjs-turbopack-canary 55 0 20
✅ nextjs-turbopack-stable 72 0 3
✅ nextjs-webpack-canary 55 0 20
✅ nextjs-webpack-stable 72 0 3
✅ nitro-stable 66 0 9
✅ nuxt-stable 66 0 9
✅ sveltekit-stable 66 0 9
✅ vite-stable 66 0 9
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 72 0 3
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 3 0 2
❌ mongodb 52 3 3
✅ redis-dev 3 0 2
❌ redis 53 2 3
✅ turso-dev 3 0 2
❌ turso 4 51 3
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 66 0 9
✅ e2e-local-postgres-nest-stable 66 0 9
✅ e2e-local-prod-nest-stable 66 0 9

📋 View full workflow run

@github-actions

github-actions Bot commented Mar 18, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 0.041s (-5.9% 🟢) 1.007s (~) 0.966s 10 1.00x
💻 Local Express 0.042s (-18.7% 🟢) 1.005s (~) 0.963s 10 1.02x
🐘 Postgres Nitro 0.062s (+7.4% 🔺) 1.012s (~) 0.950s 10 1.50x
🐘 Postgres Express 0.067s (+36.7% 🔺) 1.012s (~) 0.946s 10 1.61x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 0.512s (-18.7% 🟢) 2.321s (-19.5% 🟢) 1.809s 10 1.00x
▲ Vercel Express 0.540s (+10.6% 🔺) 2.238s (-9.6% 🟢) 1.698s 10 1.05x
▲ Vercel Nitro 0.559s (+33.3% 🔺) 2.523s (+20.8% 🔺) 1.964s 10 1.09x

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

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.097s (-2.6%) 2.006s (~) 0.909s 10 1.00x
💻 Local Express 1.126s (-1.7%) 2.006s (~) 0.880s 10 1.03x
🐘 Postgres Express 1.148s (+2.6%) 2.012s (~) 0.864s 10 1.05x
🐘 Postgres Nitro 1.157s (+0.7%) 2.012s (~) 0.855s 10 1.05x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 1.999s (-7.9% 🟢) 3.503s (-9.3% 🟢) 1.504s 10 1.00x
▲ Vercel Nitro 2.136s (+7.5% 🔺) 3.772s (+10.7% 🔺) 1.635s 10 1.07x
▲ Vercel Express 2.286s (+17.9% 🔺) 3.924s (-1.0%) 1.638s 10 1.14x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.638s (-2.4%) 11.023s (~) 0.386s 3 1.00x
💻 Local Express 10.918s (-0.7%) 11.024s (~) 0.105s 3 1.03x
🐘 Postgres Express 10.978s (+2.5%) 11.042s (~) 0.064s 3 1.03x
🐘 Postgres Nitro 10.979s (~) 11.041s (-5.8% 🟢) 0.062s 3 1.03x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 16.541s (~) 18.339s (~) 1.797s 2 1.00x
▲ Vercel Nitro 16.558s (-0.8%) 18.434s (~) 1.876s 2 1.00x
▲ Vercel Next.js (Turbopack) 16.767s (+2.5%) 18.261s (-2.4%) 1.493s 2 1.01x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 26.775s (-2.5%) 27.055s (-3.6%) 0.280s 3 1.00x
🐘 Postgres Express 27.175s (+1.7%) 28.064s (+3.7%) 0.889s 3 1.01x
🐘 Postgres Nitro 27.258s (~) 28.066s (~) 0.808s 3 1.02x
💻 Local Express 27.476s (-0.9%) 28.053s (~) 0.578s 3 1.03x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 42.483s (~) 43.871s (-1.7%) 1.388s 2 1.00x
▲ Vercel Nitro 42.706s (~) 44.710s (+1.3%) 2.004s 2 1.01x
▲ Vercel Next.js (Turbopack) 44.253s (+4.8%) 45.623s (+3.7%) 1.370s 2 1.04x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 54.302s (+1.8%) 55.100s (+1.9%) 0.798s 2 1.00x
🐘 Postgres Nitro 54.459s (~) 55.108s (~) 0.648s 2 1.00x
💻 Local Nitro 54.950s (-3.0%) 55.101s (-3.5%) 0.152s 2 1.01x
💻 Local Express 56.593s (-0.9%) 57.103s (-0.9%) 0.509s 2 1.04x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 94.929s (+4.7%) 96.406s (+4.9%) 1.477s 1 1.00x
▲ Vercel Nitro 95.614s (+5.9% 🔺) 97.748s (+6.3% 🔺) 2.134s 1 1.01x
▲ Vercel Express 95.634s (+2.2%) 97.796s (+2.9%) 2.162s 1 1.01x

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

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.279s (+3.1%) 2.011s (~) 0.732s 15 1.00x
🐘 Postgres Nitro 1.302s (+2.4%) 2.011s (~) 0.710s 15 1.02x
💻 Local Nitro 1.466s (-2.9%) 2.005s (~) 0.539s 15 1.15x
💻 Local Express 1.545s (+0.8%) 2.005s (~) 0.460s 15 1.21x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.338s (-5.3% 🟢) 3.821s (+4.5%) 1.483s 8 1.00x
▲ Vercel Express 2.383s (-20.1% 🟢) 3.662s (-19.5% 🟢) 1.279s 9 1.02x
▲ Vercel Next.js (Turbopack) 2.584s (+8.8% 🔺) 4.057s (~) 1.473s 8 1.11x

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

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.478s (+0.7%) 3.013s (~) 0.535s 10 1.00x
🐘 Postgres Express 2.480s (+4.9%) 3.013s (~) 0.533s 10 1.00x
💻 Local Nitro 2.649s (-9.6% 🟢) 3.007s (-10.0% 🟢) 0.358s 10 1.07x
💻 Local Express 2.909s (-7.6% 🟢) 3.341s (-14.0% 🟢) 0.432s 9 1.17x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.558s (+0.7%) 3.969s (+10.8% 🔺) 1.411s 8 1.00x
▲ Vercel Express 2.772s (+5.5% 🔺) 4.067s (+0.5%) 1.295s 8 1.08x
▲ Vercel Next.js (Turbopack) 2.774s (-1.1%) 3.952s (-9.1% 🟢) 1.178s 8 1.08x

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

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.630s (+2.6%) 4.014s (~) 0.384s 8 1.00x
🐘 Postgres Nitro 3.638s (+1.2%) 4.015s (~) 0.377s 8 1.00x
💻 Local Nitro 6.689s (-22.5% 🟢) 7.016s (-22.2% 🟢) 0.327s 5 1.84x
💻 Local Express 8.294s (-4.9%) 8.772s (-5.4% 🟢) 0.478s 4 2.29x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.948s (+5.3% 🔺) 4.860s (+10.8% 🔺) 1.912s 7 1.00x
▲ Vercel Express 3.159s (+20.5% 🔺) 4.758s (+24.4% 🔺) 1.600s 7 1.07x
▲ Vercel Next.js (Turbopack) 3.400s (-2.1%) 5.569s (+8.2% 🔺) 2.169s 6 1.15x

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

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.286s (+5.7% 🔺) 2.011s (~) 0.725s 15 1.00x
🐘 Postgres Nitro 1.289s (+1.2%) 2.012s (~) 0.723s 15 1.00x
💻 Local Nitro 1.473s (-10.6% 🟢) 2.005s (-6.3% 🟢) 0.533s 15 1.15x
💻 Local Express 1.527s (-3.7%) 2.006s (~) 0.479s 15 1.19x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.165s (~) 3.730s (-4.4%) 1.564s 9 1.00x
▲ Vercel Nitro 2.474s (+13.9% 🔺) 4.048s (+17.5% 🔺) 1.575s 8 1.14x
▲ Vercel Next.js (Turbopack) 2.565s (+11.0% 🔺) 3.959s (+2.8%) 1.394s 8 1.18x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.455s (~) 3.012s (~) 0.557s 10 1.00x
🐘 Postgres Express 2.462s (+4.0%) 3.011s (~) 0.550s 10 1.00x
💻 Local Nitro 2.662s (-13.5% 🟢) 3.007s (-22.6% 🟢) 0.345s 10 1.08x
💻 Local Express 3.010s (-12.1% 🟢) 3.761s (-9.1% 🟢) 0.751s 8 1.23x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.393s (-14.6% 🟢) 3.546s (-21.2% 🟢) 1.153s 9 1.00x
▲ Vercel Express 2.639s (+10.6% 🔺) 3.853s (+2.2%) 1.214s 8 1.10x
▲ Vercel Nitro 2.786s (+9.9% 🔺) 4.217s (+15.2% 🔺) 1.430s 8 1.16x

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

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.639s (+3.2%) 4.015s (~) 0.376s 8 1.00x
🐘 Postgres Nitro 3.642s (+1.3%) 4.016s (~) 0.374s 8 1.00x
💻 Local Nitro 7.414s (-17.8% 🟢) 8.016s (-18.0% 🟢) 0.601s 4 2.04x
💻 Local Express 8.462s (-12.2% 🟢) 9.020s (-12.9% 🟢) 0.558s 4 2.33x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.935s (+7.0% 🔺) 4.303s (~) 1.368s 7 1.00x
▲ Vercel Nitro 3.002s (~) 4.394s (-1.5%) 1.392s 7 1.02x
▲ Vercel Next.js (Turbopack) 3.289s (-2.0%) 4.692s (-11.6% 🟢) 1.403s 7 1.12x

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

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 0.140s (-30.8% 🟢) 1.003s (~) 0.010s (-14.2% 🟢) 1.015s (~) 0.876s 10 1.00x
💻 Local Express 0.203s (-5.7% 🟢) 1.003s (~) 0.012s (~) 1.017s (~) 0.814s 10 1.46x
🐘 Postgres Nitro 0.211s (-7.5% 🟢) 0.998s (~) 0.002s (+6.7% 🔺) 1.013s (~) 0.802s 10 1.51x
🐘 Postgres Express 0.226s (+35.9% 🔺) 0.993s (-0.7%) 0.002s (+23.1% 🔺) 1.013s (~) 0.787s 10 1.62x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.527s (-0.6%) 2.511s (+24.0% 🔺) 0.007s (-24.4% 🟢) 3.041s (+15.3% 🔺) 1.514s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.571s (+5.0% 🔺) 2.529s (+15.1% 🔺) 0.004s (-21.2% 🟢) 3.059s (+10.2% 🔺) 1.488s 10 1.03x
▲ Vercel Nitro 1.584s (-5.5% 🟢) 2.183s (-4.4%) 0.007s (+44.4% 🔺) 2.763s (-81.5% 🟢) 1.179s 10 1.04x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Nitro 12/12
🐘 Postgres Express 8/12
▲ Vercel Express 5/12
Fastest World by Framework

Winner determined by most benchmark wins

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

Worlds:

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

📋 View full workflow run

Copilot AI 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

Adds end-to-end encryption documentation and exposes “encryption support” as a first-class capability on the Worlds manifest, then surfaces that capability in the docs Worlds UI.

Changes:

  • Adds new “Encryption” conceptual docs page and cross-links it from Observability + Vercel World docs.
  • Extends worlds-manifest.json with a features array per world and threads that into the docs Worlds data/types.
  • Updates Worlds UI components to display an encryption indicator/badge for worlds that declare the feature.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
worlds-manifest.json Adds features per world; Vercel declares ["encryption"].
docs/lib/worlds-data.ts Maps manifest features into the server-fetched Worlds model.
docs/content/docs/observability/index.mdx Adds related link + note about decrypting encrypted fields.
docs/content/docs/how-it-works/meta.json Adds encryption to How It Works sidebar nav.
docs/content/docs/how-it-works/encryption.mdx New encryption conceptual documentation page.
docs/content/docs/deploying/world/vercel-world.mdx Cross-references encryption docs from Vercel World page.
docs/components/worlds/types.ts Introduces WorldFeature and adds features to World.
docs/components/worlds/WorldDetailHero.tsx Shows “E2E Encrypted” indicator linking to docs when supported.
docs/components/worlds/WorldCardSimple.tsx Adds “Encrypted” footer column for world cards.
.changeset/metal-ghosts-cut.md Adds a new changeset file (currently empty).

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

You can also share your feedback on Copilot code review. Take the survey.

Comment thread .changeset/metal-ghosts-cut.md
Comment thread docs/lib/worlds-data.ts
Comment on lines +97 to 99
features: ((world as { features?: string[] }).features ??
[]) as WorldFeature[],
e2e: null,
Comment on lines +85 to +91
The core runtime encrypts data automatically when the `World` implementation provides a `getEncryptionKeyForRun()` method. This method receives the run ID and returns the raw encryption key bytes.

To add encryption support to a custom `World`:

1. Implement `getEncryptionKeyForRun(runId: string)` on your `World` class
2. Return the raw 32-byte key as a `Uint8Array` — the core runtime uses it for AES-256-GCM operations
3. Ensure the same key is returned for the same run ID across invocations (for decryption during replay)

@pranaygp pranaygp 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.

I left some preview comments in vercel toolbar but apart from those, this looks great to me!

@TooTallNate TooTallNate enabled auto-merge (squash) March 18, 2026 07:06
@TooTallNate TooTallNate merged commit 31bc57e into main Mar 18, 2026
165 of 168 checks passed
@TooTallNate TooTallNate deleted the docs/encryption-and-worlds-features branch March 18, 2026 07:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants