May 2026 Performance and Package Size Audit Evidence

Technical evidence for the May 2026 OpenClaw performance, package-size, dependency, and shrinkwrap cleanup. Includes release sweep data, install footprint, and npm pack size metrics for developers and release managers.

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 need historical context before changing current policy at /gateway/security/dependency-locking

This page documents the evidence behind the May 2026 OpenClaw performance, package-size, dependency, and shrinkwrap cleanup. It serves as the technical counterpart to the public blog post.

Two audits are combined here:

  • Release performance sweep: GitHub Releases from v2026.5.28 back through stable v2026.4.23, using the OpenClaw Performance workflow, profile=smoke, mock-provider lane. Most tag rows are one sample; the v2026.5.27 and v2026.5.28 rows use the latest repeat-3 release-branch artifacts.
  • Earlier April context: published clawgrit-reports mock-provider baselines from v2026.4.1 through v2026.5.2, used only to avoid treating the broken late-April releases as the public performance baseline.
  • Install footprint sweep: fresh npm install --ignore-scripts installs into temporary packages, with du -sk node_modules for size and a node_modules walk for package-instance counts.
  • npm package size sweep: npm pack openclaw@<version> --dry-run --json for 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.27 and v2026.5.28 rows, which use the latest repeat-3 release-branch artifacts. Earlier April context uses published repeat-3 medians from clawgrit-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.22 shrinkwrap-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_modules fell from 656.1MiB to 259.7MiB in the same local install audit.

  • Native optional cones, The all-platform @napi-rs/canvas native 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.28 still 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.

MetricEarlier April baselinev2026.5.28Delta
Cold agent turn9,819ms1,908ms80.6% lower, 5.1x faster
Warm agent turn7,458ms1,870ms74.9% lower, 4.0x faster
Agent peak RSS686.2MB581.0MB15.3% lower

Within the May sweep, the latest release-branch row moved materially from v2026.5.2:

Metricv2026.5.2v2026.5.28Delta
Cold agent turn3,897ms1,908ms51.0% lower
Warm agent turn3,610ms1,870ms48.2% lower
Agent peak RSS613.7MB581.0MB5.3% lower

Compared with the previous stable release:

Metricv2026.5.27v2026.5.28Delta
Cold agent turn2,231ms1,908ms14.5% lower
Warm agent turn2,226ms1,870ms16.0% lower
Agent peak RSS649.0MB581.0MB10.5% lower

Install footprint

MetricBaselinev2026.5.28Delta
Install size from 2026.5.22 peak1,020.6MB361.7MiB64.6% lower
Install size from latest release 2026.5.27767.1MiB361.7MiB52.8% lower
Dependencies from monthly high 2026.2.2664530053.5% lower
Dependencies from latest release 2026.5.2737130019.1% lower
Nested openclaw/node_modules from 2026.5.22911.8MB259.7MiB71.5% lower
Nested openclaw/node_modules from 2026.5.27656.1MiB259.7MiB60.4% lower

npm package size

VersionCompressed tarballUnpacked packageFilesNotes
2026.1.3012.8MB33.5MB4,607early rebranded package
2026.2.2623.6MB82.9MB10,125feature growth
2026.3.3143.3MB182.6MB21,037package-size high point
2026.4.2922.9MB74.6MB9,309package pruning visible
2026.5.1223.4MB80.1MB12,035major external-plugin split
2026.5.2217.2MB76.9MB12,386docs/assets excluded from package
2026.5.2717.8MB79.0MB12,509previous stable package
2026.5.2817.9MB81.0MB9,082latest 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 sluggish but familiar. Late April turned into a regression cliff. v2026.5.2 marks the point where the mock-provider lane first enters the 3-5s range and begins to pass reliably in the provided sweep.

Previously published context:

ReleaseKovaCold turnWarm turnAgent peak RSS
v2026.4.10FAIL11,031ms7,962ms679.0MB
v2026.4.12FAIL11,965ms8,289ms713.5MB
v2026.4.14FAIL9,819ms7,458ms686.2MB
v2026.4.20FAIL22,314ms18,811ms810.8MB
v2026.4.22FAIL9,630ms7,459ms743.0MB

Supplied sweep:

ReleaseKovaCold turnWarm turnAgent peak RSS
v2026.4.23FAIL47,847ms8,010ms1,082.7MB
v2026.4.24FAIL48,264ms25,483ms996.0MB
v2026.4.25FAIL81,080ms59,172ms1,113.9MB
v2026.4.26FAIL76,771ms54,941ms1,140.8MB
v2026.4.27FAIL60,902ms33,699ms1,156.0MB
v2026.4.29FAIL94,031ms57,334ms3,613.7MB
v2026.5.2PASS3,897ms3,610ms613.7MB
v2026.5.7PASS3,923ms3,693ms654.1MB
v2026.5.12PASS7,248ms6,629ms834.8MB
v2026.5.18PASS3,301ms2,913ms630.3MB
v2026.5.20PASS3,413ms2,952ms643.2MB
v2026.5.22PASS4,494ms4,093ms654.3MB
v2026.5.26PASS2,626ms2,282ms660.4MB
v2026.5.27-beta.1PASS2,575ms2,217ms635.3MB
v2026.5.27PASS2,231ms2,226ms649.0MB
v2026.5.28PASS1,908ms1,870ms581.0MB

Source probes

Seventeen older refs that passed were skipped for source probes, since those source trees lacked the necessary probe entry points. Agent-turn metrics remain available for those refs.

Representative source-probe points:

ReleaseDefault readyz p5050 plugins readyz p50CLI health p50Plugin max RSS
v2026.4.292,819ms2,618ms1,679ms389.0MB
v2026.5.22,324ms2,013ms1,384ms377.2MB
v2026.5.71,649ms1,540ms1,175ms387.6MB
v2026.5.181,942ms1,927ms607ms426.5MB
v2026.5.201,966ms1,987ms621ms455.0MB
v2026.5.222,081ms1,884ms5,095ms444.2MB
v2026.5.261,546ms1,634ms656ms400.4MB
v2026.5.27-beta.11,462ms1,548ms548ms394.0MB
v2026.5.271,491ms1,571ms553ms401.5MB
v2026.5.281,457ms1,474ms623ms386.1MB

The v2026.5.22 CLI health spike shows up in this table, even though the agent-turn lane continued to pass. Keep the source probes in mind when chasing targeted CLI or gateway regressions.

Install footprint audit

Dependency samples pull one stable release per month, plus the 2026.5.22 shrinkwrap-introduction event and the newest 2026.5.28 release.

PointInstalled depsFresh installOpenClaw packageNested openclaw/node_modulesRoot shrinkwrapCanvas install behavior
Jan 2026.1.30605438.4MB45.8MB2.4MBnotop-level wrapper + darwin-arm64
Feb 2026.2.26645575.7MB110.1MB3.5MBnotop-level wrapper + darwin-arm64
Mar 2026.3.31438584.1MB234.8MB0MBnotop-level wrapper + darwin-arm64
Apr 2026.4.29392335.0MB97.4MB0MBnonone installed
2026.5.224011,020.6MB1,020.4MB911.8MByesnested: all 12 @napi-rs/canvas packages
May 2026.5.26371767.5MB767.4MB656.4MByesnested: all 12 @napi-rs/canvas packages
2026.5.27371767.1MiB766.9MiB656.1MiByesnested: all 12 @napi-rs/canvas packages
Latest 2026.5.28300361.7MiB361.6MiB259.7MiByesnone installed

Shrinkwrap boundary

2026.5.20 was released without a root shrinkwrap and without any substantial nested OpenClaw dependency tree. Root shrinkwrap made its debut in 2026.5.22, which brought 911.8MB of dependencies under the nested openclaw/node_modules structure. 2026.5.28 continues to use shrinkwrap, now installing 259.7MiB under nested openclaw/node_modules, yet the local fresh-install audit no longer includes any @napi-rs/canvas packages.

The published tarball check confirms the boundary:

VersionPublished stable?Root npm-shrinkwrap.jsonNotes
2026.5.20yesnolast stable release before shrinkwrap
2026.5.21non/ano stable npm release
2026.5.22yesyesshrinkwrap introduced
2026.5.23non/ano stable npm release
2026.5.24non/ano stable npm release
2026.5.25non/ano stable npm release
2026.5.26yesyesnested dependency tree still present
2026.5.27yesyesnested dependency tree still present
2026.5.28yesyesnested dependency tree much smaller

The key point: shrinkwrap is not the culprit. v2026.5.28 still carries root shrinkwrap. The real issue was the package layout that forced npm to build a large nested OpenClaw dependency tree and all 12 @napi-rs/canvas platform packages. By v2026.5.28, the nested tree has shrunk, and the canvas platform fanout no longer appears in the local audit.

For the current dependency review and package policy, see dependency locking.

Supply-chain interpretation

Dependency count matters as an operational security measure, not just for install size. Each package widens the circle of maintainers, tarballs, transitive updates, optional native binaries, and install-time behaviors that operators have to rely on.

The cleanup approach:

  • 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:

2,113 words · updated Aug 4, 2026