Skip to content

perf(eve): build a single Nitro app on Vercel - #1229

Merged
ctgowrie merged 2 commits into
mainfrom
rihan/single-nitro-build
Jul 27, 2026
Merged

perf(eve): build a single Nitro app on Vercel#1229
ctgowrie merged 2 commits into
mainfrom
rihan/single-nitro-build

Conversation

@RihanArfan

@RihanArfan RihanArfan commented Jul 27, 2026

Copy link
Copy Markdown
Member

Description

Currently two Nitro builds are ran during eve build when deploying to Vercel. Logic is prior to Nitro supporting modifying specific function's config nitrojs/nitro#4124, and Eve/Workflows requires queue triggers, so we were generating the workflow flow function separately and then copying this separate function build into the core Nitro build later.

Now we drop the standalone flow build and instead emit the workflow flow function from one Nitro build.

Benchmarked building weather-agent and it's:

  • 33% faster on my Mac (see benchmark below)
  • Used ~30% less CPU during GHA CI (see report below)
  • In Vercel CI (and other CoW FS's that Node.js supports COPYFILE_FICLONE) the total combined function size on disk goes from 11.08MB (main) to 6.97 MB (branch) (numbers based on generated function sizes on main vs brach from a build on macOS)

How did you test your changes?

hyperfine --warmup 1 --runs 5 \
  --prepare 'cd <eve-main-worktree>/apps/fixtures/weather-agent && rm -rf .eve .vercel/output' \
  --command-name 'main (2 nitro builds)' \
  'cd <eve-main-worktree>/apps/fixtures/weather-agent && VERCEL=1 node <eve-main-worktree>/packages/eve/bin/eve.js build --skip-sandbox-prewarm' \
  --prepare 'cd <eve-branch-worktree>/apps/fixtures/weather-agent && rm -rf .eve .vercel/output' \
  --command-name 'branch (1 nitro build)' \
  'cd /<eve-branch-worktree>/apps/fixtures/weather-agent && VERCEL=1 node <eve-branch-worktree>/packages/eve/bin/eve.js build --skip-sandbox-prewarm'
Benchmark 1: main (2 nitro builds)
  Time (mean ± σ):      1.284 s ±  0.053 s    [User: 1.934 s, System: 0.587 s]
  Range (min … max):    1.240 s …  1.364 s    5 runs
 
Benchmark 2: branch (1 nitro build)
  Time (mean ± σ):     964.9 ms ±  23.8 ms    [User: 1376.8 ms, System: 410.3 ms]
  Range (min … max):   930.9 ms … 987.9 ms    5 runs
 
Summary
  branch (1 nitro build) ran
    1.33 ± 0.06 times faster than main (2 nitro builds)

PR Checklist

  • I linked an issue with prior discussion confirming this change is wanted
  • I ran the relevant checks from CONTRIBUTING.md
  • I added tests and documentation where relevant
  • I added a changeset if this touches the published eve package
  • DCO sign-off passes for every commit (git commit --signoff)

@vercel

vercel Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
eve-docs Ready Ready Preview, Comment, Open in v0 Jul 27, 2026 8:27am
eve-docs-1644 Ready Ready Preview, Comment, Open in v0 Jul 27, 2026 8:27am
eve-docs-4759 Ready Ready Preview, Comment, Open in v0 Jul 27, 2026 8:27am

@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Bundle + Package Summary: apps/fixtures/weather-agent

Key takeaways

  • Bundle warning: function payloads grew 25.2%.
  • Runtime delta: function payloads 11.69 MB -> 14.63 MB (+2.94 MB ⚠️); 1 changed payload.

❌ Bundle Warning: Action Will Fail

This action will fail because the bundle warning policy was exceeded. Add the acknowledge-bundle-warning label to acknowledge the regression and allow the check to pass without regenerating this report.

Area Warning Details
Runtime Total function bytes 11.69 MB -> 14.63 MB; +2.94 MB ⚠️ (25.2%) over limit 10.0%

Delta vs main (632605f)

Area Metric Baseline Current Delta
Package Packed tarball 4.07 MB 4.06 MB -4.1 kB ✅
Package Unpacked publish size 14.77 MB 14.76 MB -14.6 kB ✅
Package Installed footprint 53.93 MB 53.91 MB -14.6 kB ✅
Package Published files 2775 2775 0
Package Installed files 6015 6015 0
Runtime Unique function payloads 2 2 0
Runtime Total function bytes 11.69 MB 14.63 MB +2.94 MB ⚠️
Runtime Public routes 11 11 0
Changed function payloads vs main (632605f) (2)
Function Status Baseline Current Delta Route changes
functions/__server.func changed 4.41 MB 7.31 MB +2.90 MB ⚠️ none
functions/.well-known/workflow/v1/flow.func changed 7.27 MB 7.31 MB +41.7 kB ⚠️ none

eve init install

Metric Baseline Current Delta
Installed footprint 92.33 MB 92.32 MB -14.6 kB ✅
Installed packages 122 122 0
dependencies 4 4 0
devDependencies 2 2 0
Dependency package bytes 29.05 MB 29.04 MB -14.6 kB ✅
devDependency package bytes 5.04 MB 5.04 MB 0 B ➖
Build Metadata
  • Preset: vercel
  • Nitro: nitro@3.0.260610-beta
  • Output directory: apps/fixtures/weather-agent/.vercel/output
  • Build metadata timestamp: 2026-07-27T08:28:15.252Z
  • Route aliases: 11 public, 1 internal (12 total aliases)
  • Vercel routes in config: 14
  • Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down

Package Details

  • Package: eve@0.27.6
  • Package directory: packages/eve
  • Tarball: 4.06 MB (eve-0.27.6.tgz)
  • Unpacked payload: 14.76 MB across 2775 published files
  • Installed footprint: 53.91 MB across 6015 installed files
  • Installed root package: 13.47 MB
  • Installed dependencies: 40.44 MB
  • Runtime dependencies: 1
  • Peer dependencies: 5 (4 optional)

Installed footprint is measured from an isolated temporary npm install of the packed tarball.

Heavy installed dependencies

  • @rolldown/binding-linux-x64-gnu: 18.96 MB (35.2%)
  • eve: 13.47 MB (25.0%)
  • ai: 6.43 MB (11.9%)
  • zod: 5.04 MB (9.3%)
  • nitro: 2.41 MB (4.5%)
Publish payload breakdown
Published file size
🟠 dist/src/compiled/experimental-ai-sdk-code-mo... [###.....................] 1.51 MB 10.2%
🟡 dist/src/compiled/@vercel/sandbox/index.js       [#.......................] 632.4 kB 4.3%
🟡 dist/src/compiled/_chunks/workflow/undici-C2Z... [#.......................] 502.4 kB 3.4%
🟡 dist/src/compiled/@chat-adapter/slack/index.js   [#.......................] 440.5 kB 3.0%
🟡 dist/src/compiled/@vercel/oidc/index.js          [#.......................] 379.5 kB 2.6%
🔴 Other published files                            [########################] 11.30 MB 76.5%
Installed footprint breakdown
Installed package size
🔴 @rolldown/binding-linux-x64-gnu [########################] 18.96 MB 35.2%
🔴 eve                             [#################.......] 13.47 MB 25.0%
🔴 ai                              [########................] 6.43 MB 11.9%
🔴 zod                             [######..................] 5.04 MB 9.3%
🟠 nitro                           [###.....................] 2.41 MB 4.5%
🟡 @ai-sdk/provider-utils          [#.......................] 852.0 kB 1.6%
🔴 Other installed packages        [#########...............] 6.75 MB 12.5%
Runtime dependencies (1)
Package Range Notes
nitro 3.0.260610-beta
Peer dependencies (5)
Package Range Notes
@opentelemetry/api ^1.0.0 optional peer
ai catalog:
braintrust ^3.0.0 optional peer
just-bash ^3.0.0 optional peer
microsandbox ^0.5.0 optional peer
eve init install drill-down

eve init install details

  • Command: eve init my-agent
  • Package manager: npm
  • Installed footprint: 92.32 MB across 7883 installed files
  • Installed packages: 122 total (116 transitive-only)
  • dependencies: 4 direct packages totaling 29.04 MB
  • devDependencies: 2 direct packages totaling 5.04 MB
  • Other transitive package files: 58.24 MB

Installed footprint is measured from an isolated temporary eve init my-agent using the current packed eve tarball.

Heavy installed dependencies

  • @typescript/typescript-linux-x64: 27.95 MB (30.3%)
  • @rolldown/binding-linux-x64-gnu: 18.96 MB (20.5%)
  • eve: 13.47 MB (14.6%)
  • zod: 9.00 MB (9.7%)
  • ai: 6.43 MB (7.0%)
Installed footprint breakdown
Installed package size
🔴 @typescript/typescript-linux-x64 [########################] 27.95 MB 30.3%
🔴 @rolldown/binding-linux-x64-gnu  [################........] 18.96 MB 20.5%
🔴 eve                              [############............] 13.47 MB 14.6%
🔴 zod                              [########................] 9.00 MB 9.7%
🔴 ai                               [######..................] 6.43 MB 7.0%
🟠 @types/node                      [##......................] 2.54 MB 2.8%
🔴 Other installed packages         [############............] 13.97 MB 15.1%
dependencies (4)
Package Range Installed size Share
@vercel/connect 0.4.2 135.8 kB 0.1%
ai ^7.0.34 6.43 MB 7.0%
eve file:eve-0.27.6.tgz 13.47 MB 14.6%
zod 4.4.3 9.00 MB 9.7%
devDependencies (2)
Package Range Installed size Share
@types/node 24.x 2.54 MB 2.8%
typescript 7.0.2 2.50 MB 2.7%
Function Drill-Down

Payload Size Graph

Unique function payload size and share of total
🔴 functions/.well-known/workflow/v1/flow.func     [########################] 7.31 MB 50.0%
🔴 functions/__server.func                         [########################] 7.31 MB 50.0%

Top Function Payloads

🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 7.31 MB
Metric Value
Public routes /.well-known/workflow/v1/flow
Runtime nodejs24.x
Handler index.mjs
Payload 7.31 MB
Function files 7.31 MB across 43 files
Traced dependencies 0 B
Signal 🟠 Bundled file _chunks/runtime-artifacts.mjs is 1.57 MB (21.5%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 _chunks/runtime-artifacts.mjs   [###############.........] 1.57 MB 21.5%
🟠 index.mjs                       [###########.............] 1.17 MB 16.0%
🟡 _chunks/world-vercel.mjs        [#########...............] 900.3 kB 12.3%
🟡 _chunks/sandbox.mjs             [#######.................] 767.6 kB 10.5%
🟡 _libs/@ai-sdk/gateway+[...].mjs [####....................] 432.5 kB 5.9%
🟠 Other bundled files             [########################] 2.47 MB 33.8%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x",
  "maxDuration": "max",
  "experimentalTriggers": [
    {
      "type": "queue/v2beta",
      "topic": "__eve776561746865722d6167656e74_wkf_workflow_*",
      "consumer": "default",
      "retryAfterSeconds": 5,
      "initialDelaySeconds": 0
    }
  ],
  "environment": {
    "WORKFLOW_PRECONDITION_GUARD": "1"
  }
}

🟠 functions/__server.func • 10 public routes, 1 internal alias • 7.31 MB
Metric Value
Public routes /
/eve/v1/callback/[token]
/eve/v1/connections/[name]/callback/[token]
/eve/v1/health
/eve/v1/info
/eve/v1/session
/eve/v1/session/[sessionId]
/eve/v1/session/[sessionId]/cancel
/eve/v1/session/[sessionId]/stream
/eve/v1/session/reset
Internal aliases /__server
Runtime nodejs24.x
Handler index.mjs
Payload 7.31 MB
Function files 7.31 MB across 43 files
Traced dependencies 0 B
Signal 🟠 Bundled file _chunks/runtime-artifacts.mjs is 1.57 MB (21.5%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 _chunks/runtime-artifacts.mjs   [###############.........] 1.57 MB 21.5%
🟠 index.mjs                       [###########.............] 1.17 MB 16.0%
🟡 _chunks/world-vercel.mjs        [#########...............] 900.3 kB 12.3%
🟡 _chunks/sandbox.mjs             [#######.................] 767.6 kB 10.5%
🟡 _libs/@ai-sdk/gateway+[...].mjs [####....................] 432.5 kB 5.9%
🟠 Other bundled files             [########################] 2.47 MB 33.8%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x"
}

Build Timing: e2e/fixtures/agent-tools-sandbox

This is an informational timing measurement inside eve build, from preflight through publication. Output-size measurement and profile writing are excluded.

Build mode: deployable Vercel build with sandbox template prewarm included.

  • Build pipeline: 2.91 s -> 1.60 s (-1.31 s) vs main (632605f).
  • Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `main (632605f)`
Phase Baseline Current Delta
extension.check 5.5 ms 9.5 ms +4.0 ms
project.resolve 5.7 ms 3.5 ms -2.2 ms
workspace.create 1.4 ms 1.2 ms -0.2 ms
host.prepare 466.3 ms 158.9 ms -307.4 ms
vercel.service-prefix.resolve 1.7 ms 1.7 ms 0.0 ms
nitro.create 178.5 ms
sandbox.prewarm 333.0 ms 175.2 ms -157.8 ms
nitro.cache.prepare 0.3 ms
nitro.prepare 0.7 ms
nitro.public-assets 0.7 ms
nitro.prerender 0.5 ms
nitro.bundle 1.06 s
nitro.cache.write 0.3 ms
agent-summary.emit 0.5 ms 0.5 ms 0.0 ms
nitro.close 0.1 ms
output.publish 3.3 ms 3.3 ms 0.0 ms
workspace.remove 4.6 ms 1.9 ms -2.7 ms
nitro.app.create 23.8 ms
nitro.app.cache.prepare 0.2 ms
nitro.app.prepare 0.8 ms
nitro.app.public-assets 0.7 ms
nitro.app.prerender 0.4 ms
nitro.app.bundle 679.9 ms
nitro.app.cache.write 0.3 ms
nitro.flow.create 180.6 ms
nitro.flow.cache.prepare 0.2 ms
nitro.flow.prepare 0.7 ms
nitro.flow.public-assets 0.2 ms
nitro.flow.prerender 0.0 ms
nitro.flow.bundle 1.05 s
nitro.flow.cache.write 0.3 ms
nitro.flow.close 0.2 ms
workflow.emit 156.6 ms
nitro.app.close 0.1 ms

Signed-off-by: Rihan Arfan <me@file.properties>
@RihanArfan
RihanArfan force-pushed the rihan/single-nitro-build branch from cc7f43a to 1d50bec Compare July 27, 2026 08:25
@vercel
vercel Bot temporarily deployed to Preview – eve-docs-1644 July 27, 2026 08:25 Inactive
@vercel
vercel Bot temporarily deployed to Preview – eve-docs-4759 July 27, 2026 08:26 Inactive
@RihanArfan

Copy link
Copy Markdown
Member Author

In nitro-nightly and the next Nitro v3 release, we added reflink support (on Copy on Write filesystems) so in Vercel CI the separate function in the same Nitro doesn't actually equate to duplicate disk usage, and in fact would result in a smaller total function output size. nitrojs/nitro#4373

@RihanArfan
RihanArfan marked this pull request as ready for review July 27, 2026 09:41
@ctgowrie
ctgowrie merged commit 3c53306 into main Jul 27, 2026
138 of 141 checks passed
@ctgowrie
ctgowrie deleted the rihan/single-nitro-build branch July 27, 2026 12:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

acknowledge-bundle-warning Acknowledge an intentional bundle footprint increase

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants