May 2026 OpenClaw Performance and Package Size Audit Evidence
This page provides the technical evidence for the May 2026 OpenClaw performance, package size, dependency, and shrinkwrap cleanup. It is intended for developers verifying the release benchmarks.
Read this when
- You are validating the May 2026 performance and package-size cleanup
- You need the numbers behind the OpenClaw performance and dependency blog post
- You are changing release gates, package shrinkwrap, or plugin dependency boundaries
This page documents the evidence underlying the May 2026 OpenClaw performance, package size, dependency, and shrinkwrap cleanup. It serves as the technical counterpart to the public blog post.
Two separate audits are combined here:
- Release performance sweep: GitHub Releases from
v2026.5.28back through stablev2026.4.23, using theOpenClaw Performanceworkflow,profile=smoke, mock-provider lane. Most tag rows contain a single sample; thev2026.5.27andv2026.5.28rows use the most recent repeat-3 release-branch artifacts. - Earlier April context: published
clawgrit-reportsmock-provider baselines fromv2026.4.1throughv2026.5.2, included only to prevent the broken late-April releases from being treated as the public performance baseline. - Install footprint sweep: fresh
npm install --ignore-scriptsinstalls into temporary packages, withdu -sk node_modulesfor size and anode_moduleswalk for package-instance counts. - npm package size sweep:
npm pack openclaw@<version> --dry-run --jsonfor published releases, recording compressed tarball size, unpacked size, and file count.
Warning
The main performance sweep uses one smoke sample per tag, except the
v2026.5.27andv2026.5.28rows, which use the most recent repeat-3 release-branch artifacts. Earlier April context uses published repeat-3 medians fromclawgrit-reports. Treat the numbers as trend evidence and regression-hunting signal, not as release-gate statistics.
Snapshot
Performance coverage: 77 requested releases, 74 artifact-backed points, and 3 unavailable CI runs. Latest stable measured point: v2026.5.28.
-
Stable agent turn, 5.1x faster cold turn -
v2026.4.14: 9.8s -v2026.5.28: 1.9s -
Published package, 17.9MB tarball Latest stable package, down from the 43.3MB March package-size peak.
-
Latest stable install, 361.7MiB fresh install Cuts the nested OpenClaw dependency tree sharply from the
2026.5.22shrinkwrap-introduction peak, though a smaller 259.7MiB nested tree still remains in the local install audit. -
Dependency graph, 300 installed packages Measured as unique package name/version roots in a fresh install with scripts disabled; 71 fewer roots than the prior stable release.
What Changed In 5.28
The cleanup between v2026.5.27 and v2026.5.28 reduced the default-install graph instead of removing the capabilities themselves.
-
Root default graph, Unique package name/version roots fell from 371 to 300. Package instances fell from 372 to 301.
-
Nested tree, Nested
openclaw/node_modulesfell from 656.1MiB to 259.7MiB in the same local install audit. -
Native optional cones, The all-platform
@napi-rs/canvasnative package cone stopped landing in the default install. -
Supply-chain surface, Fewer default packages means fewer tarballs, maintainers, native binaries, install-time behaviors, and transitive update paths to trust by default.
Tip
Shrinkwrap was not the problem by itself. The bad package shape was.
v2026.5.28still ships shrinkwrap, but the nested dependency tree is much smaller and the all-platform canvas fanout is gone in the local audit.
Headline Numbers
Do not use the late-April broken rows as public performance baselines. v2026.4.23 and v2026.4.29 are useful regression evidence, but the large 14x-style deltas mostly describe the recovery from a bad release line.
For the blog narrative, use the earlier April published baseline as scale. The baseline is v2026.4.14 from the published clawgrit-reports mock-provider run (repeat 3; that run failed only because the diagnostic timeline was not emitted, so the cold, warm, and RSS medians are still useful as rough scale). Treat this as narrative context, not a release-gate statistic.
| Metric | Earlier April baseline | v2026.5.28 | Delta |
|---|---|---|---|
| Cold agent turn | 9,819ms | 1,908ms | 80.6% lower, 5.1x faster |
| Warm agent turn | 7,458ms | 1,870ms | 74.9% lower, 4.0x faster |
| Agent peak RSS | 686.2MB | 581.0MB | 15.3% lower |
Within the May sweep, the latest release-branch row moved materially from v2026.5.2:
| Metric | v2026.5.2 | v2026.5.28 | Delta |
|---|---|---|---|
| Cold agent turn | 3,897ms | 1,908ms | 51.0% lower |
| Warm agent turn | 3,610ms | 1,870ms | 48.2% lower |
| Agent peak RSS | 613.7MB | 581.0MB | 5.3% lower |
Compared with the previous stable release:
| Metric | v2026.5.27 | v2026.5.28 | Delta |
|---|---|---|---|
| Cold agent turn | 2,231ms | 1,908ms | 14.5% lower |
| Warm agent turn | 2,226ms | 1,870ms | 16.0% lower |
| Agent peak RSS | 649.0MB | 581.0MB | 10.5% lower |
Install footprint
| Metric | Baseline | v2026.5.28 | Delta |
|---|---|---|---|
Install size from 2026.5.22 peak | 1,020.6MB | 361.7MiB | 64.6% lower |
Install size from latest release 2026.5.27 | 767.1MiB | 361.7MiB | 52.8% lower |
Dependencies from monthly high 2026.2.26 | 645 | 300 | 53.5% lower |
Dependencies from latest release 2026.5.27 | 371 | 300 | 19.1% lower |
Nested openclaw/node_modules from 2026.5.22 | 911.8MB | 259.7MiB | 71.5% lower |
Nested openclaw/node_modules from 2026.5.27 | 656.1MiB | 259.7MiB | 60.4% lower |
npm package size
| Version | Compressed tarball | Unpacked package | Files | Notes |
|---|---|---|---|---|
2026.1.30 | 12.8MB | 33.5MB | 4,607 | early rebranded package |
2026.2.26 | 23.6MB | 82.9MB | 10,125 | feature growth |
2026.3.31 | 43.3MB | 182.6MB | 21,037 | package-size high point |
2026.4.29 | 22.9MB | 74.6MB | 9,309 | package pruning visible |
2026.5.12 | 23.4MB | 80.1MB | 12,035 | major external-plugin split |
2026.5.22 | 17.2MB | 76.9MB | 12,386 | docs/assets excluded from package |
2026.5.27 | 17.8MB | 79.0MB | 12,509 | previous stable package |
2026.5.28 | 17.9MB | 81.0MB | 9,082 | latest stable package |
2026.5.12 is the visible plugin-extraction milestone in the changelog: Amazon Bedrock, Bedrock Mantle, Slack, OpenShell sandbox, Anthropic Vertex, Matrix, and WhatsApp moved out of the core dependency path so their dependency cones install with those plugins instead of every core install.
Kova agent turn summary
The April stable line tells two distinct stories. Early April was slow but recognizable. Late April turned into a sharp regression drop. v2026.5.2 marks the point where the mock-provider lane first falls into the 3-5s range and begins passing reliably in the provided sweep.
Previously published context:
| Release | Kova | Cold turn | Warm turn | Agent peak RSS |
|---|---|---|---|---|
v2026.4.10 | FAIL | 11,031ms | 7,962ms | 679.0MB |
v2026.4.12 | FAIL | 11,965ms | 8,289ms | 713.5MB |
v2026.4.14 | FAIL | 9,819ms | 7,458ms | 686.2MB |
v2026.4.20 | FAIL | 22,314ms | 18,811ms | 810.8MB |
v2026.4.22 | FAIL | 9,630ms | 7,459ms | 743.0MB |
Supplied sweep:
| Release | Kova | Cold turn | Warm turn | Agent peak RSS |
|---|---|---|---|---|
v2026.4.23 | FAIL | 47,847ms | 8,010ms | 1,082.7MB |
v2026.4.24 | FAIL | 48,264ms | 25,483ms | 996.0MB |
v2026.4.25 | FAIL | 81,080ms | 59,172ms | 1,113.9MB |
v2026.4.26 | FAIL | 76,771ms | 54,941ms | 1,140.8MB |
v2026.4.27 | FAIL | 60,902ms | 33,699ms | 1,156.0MB |
v2026.4.29 | FAIL | 94,031ms | 57,334ms | 3,613.7MB |
v2026.5.2 | PASS | 3,897ms | 3,610ms | 613.7MB |
v2026.5.7 | PASS | 3,923ms | 3,693ms | 654.1MB |
v2026.5.12 | PASS | 7,248ms | 6,629ms | 834.8MB |
v2026.5.18 | PASS | 3,301ms | 2,913ms | 630.3MB |
v2026.5.20 | PASS | 3,413ms | 2,952ms | 643.2MB |
v2026.5.22 | PASS | 4,494ms | 4,093ms | 654.3MB |
v2026.5.26 | PASS | 2,626ms | 2,282ms | 660.4MB |
v2026.5.27-beta.1 | PASS | 2,575ms | 2,217ms | 635.3MB |
v2026.5.27 | PASS | 2,231ms | 2,226ms | 649.0MB |
v2026.5.28 | PASS | 1,908ms | 1,870ms | 581.0MB |
Source probes
Source probes were not run for 17 successful older references because those source trees lacked the required probe entry points at the time. Agent-turn metrics are still available for those references.
Representative source-probe points:
| Release | Default readyz p50 | 50 plugins readyz p50 | CLI health p50 | Plugin max RSS |
|---|---|---|---|---|
v2026.4.29 | 2,819ms | 2,618ms | 1,679ms | 389.0MB |
v2026.5.2 | 2,324ms | 2,013ms | 1,384ms | 377.2MB |
v2026.5.7 | 1,649ms | 1,540ms | 1,175ms | 387.6MB |
v2026.5.18 | 1,942ms | 1,927ms | 607ms | 426.5MB |
v2026.5.20 | 1,966ms | 1,987ms | 621ms | 455.0MB |
v2026.5.22 | 2,081ms | 1,884ms | 5,095ms | 444.2MB |
v2026.5.26 | 1,546ms | 1,634ms | 656ms | 400.4MB |
v2026.5.27-beta.1 | 1,462ms | 1,548ms | 548ms | 394.0MB |
v2026.5.27 | 1,491ms | 1,571ms | 553ms | 401.5MB |
v2026.5.28 | 1,457ms | 1,474ms | 623ms | 386.1MB |
The v2026.5.22 CLI health spike is visible in this table even though the agent-turn lane still passed. When investigating targeted CLI or gateway regressions, keep the source probes.
Install footprint audit
Dependency samples use one stable release per month, plus the 2026.5.22 shrinkwrap-introduction event and the latest 2026.5.28 release.
| Point | Installed deps | Fresh install | OpenClaw package | Nested openclaw/node_modules | Root shrinkwrap | Canvas install behavior |
|---|---|---|---|---|---|---|
Jan 2026.1.30 | 605 | 438.4MB | 45.8MB | 2.4MB | no | top-level wrapper + darwin-arm64 |
Feb 2026.2.26 | 645 | 575.7MB | 110.1MB | 3.5MB | no | top-level wrapper + darwin-arm64 |
Mar 2026.3.31 | 438 | 584.1MB | 234.8MB | 0MB | no | top-level wrapper + darwin-arm64 |
Apr 2026.4.29 | 392 | 335.0MB | 97.4MB | 0MB | no | none installed |
2026.5.22 | 401 | 1,020.6MB | 1,020.4MB | 911.8MB | yes | nested: all 12 @napi-rs/canvas packages |
May 2026.5.26 | 371 | 767.5MB | 767.4MB | 656.4MB | yes | nested: all 12 @napi-rs/canvas packages |
2026.5.27 | 371 | 767.1MiB | 766.9MiB | 656.1MiB | yes | nested: all 12 @napi-rs/canvas packages |
Latest 2026.5.28 | 300 | 361.7MiB | 361.6MiB | 259.7MiB | yes | none installed |
Shrinkwrap boundary
2026.5.20 was released without a root shrinkwrap and without a large nested OpenClaw dependency tree. Root shrinkwrap was introduced in 2026.5.22, which installed 911.8MB under nested openclaw/node_modules. 2026.5.28 continues to use shrinkwrap and installs 259.7MiB under nested openclaw/node_modules, though no @napi-rs/canvas packages are installed in the local fresh-install audit anymore.
The published tarball inspection confirms the boundary:
| Version | Published stable? | Root npm-shrinkwrap.json | Notes |
|---|---|---|---|
2026.5.20 | yes | no | last stable release before shrinkwrap |
2026.5.21 | no | n/a | no stable npm release |
2026.5.22 | yes | yes | shrinkwrap introduced |
2026.5.23 | no | n/a | no stable npm release |
2026.5.24 | no | n/a | no stable npm release |
2026.5.25 | no | n/a | no stable npm release |
2026.5.26 | yes | yes | nested dependency tree still present |
2026.5.27 | yes | yes | nested dependency tree still present |
2026.5.28 | yes | yes | nested dependency tree much smaller |
A key distinction: shrinkwrap itself is not the issue.
Root shrinkwrap is still shipped with v2026.5.28. The real problem was the package shape that caused npm to materialize a large nested OpenClaw dependency tree and all 12 @napi-rs/canvas platform packages. In v2026.5.28, the nested tree is smaller, and the canvas platform fanout no longer appears in the local audit.
For a plain-English explanation of shrinkwrap and the maintainer-level package checks, see npm shrinkwrap.
Supply-chain interpretation
Dependency count is an operational security metric, not just an install-size metric. Each package expands the set of maintainers, tarballs, transitive updates, optional native binaries, and install-time behaviors that operators must trust.
The cleanup direction is:
- keep heavy and optional capabilities outside the default core install
- make plugin packages own their runtime dependency graph
- avoid runtime package-manager repair during Gateway startup
- preserve deterministic installs without causing all-platform native package materialization
- keep install scripts disabled in package acceptance and measurement paths
- catch nested dependency trees and native optional dependency explosions before publishing
Related docs: