Skip to main content
Node remains OpenClaw’s primary, default, and recommended runtime. Bun 1.4+ builds that provide WAL-reset-safe node:sqlite can run the CLI, Gateway, and managed node host as an explicit opt-in. OpenClaw requires SQLite 3.51.3+, 3.50.7+ within 3.50.x, or 3.44.6+ within 3.44.x; older Bun versions and builds with unsafe SQLite are rejected.
Bun remains usable as an optional package-script runner. The default package manager remains pnpm, which is fully supported and used by docs tooling. Bun cannot use pnpm-lock.yaml and ignores it, and current Bun versions fail to resolve this repo’s pnpm-workspace.yaml layout during bun install, so dependency installs should use pnpm install.

Install

1

Install dependencies

Bun cannot resolve this repo’s pnpm workspace layout, so bun install fails during workspace resolution. Use pnpm install.
2

Build and test

Use Node by default for commands that launch OpenClaw.
3

Run OpenClaw with Bun

To run onboarding under Bun and install the managed Gateway under Bun:
For a managed node host, select Bun separately:

Lifecycle scripts

Bun blocks dependency lifecycle scripts unless explicitly trusted. For this repo, the commonly blocked scripts are not required:
  • baileys preinstall: checks Node major >= 20 (OpenClaw requires Node 22.22.3+, 24.15+, or 25.9+, with Node 26 recommended)
  • protobufjs postinstall: emits warnings about incompatible version schemes (no build artifacts)
If you hit a runtime issue that needs these scripts, trust them explicitly:

Caveats

On macOS, Bun uses Apple’s system SQLite, which omits native extension loading. OpenClaw can open ordinary agent databases without extension loading when that library meets the WAL safety floor. Operations that require extensions, including sqlite-vec, need an extension-capable SQLite library. Use Node, or preload a compatible SQLite library with Bun’s custom SQLite setup before opening any database. OpenClaw does not select a different SQLite library automatically. Some package scripts hardcode pnpm internally (for example check:docs, ui:*, protocol:check). Running them via bun run still shells out to pnpm, so just run those via pnpm directly.