Keep macOS Homebrew setup lazy so users with supported Node and Git can install without admin/Homebrew, while still installing Homebrew before macOS Node or Git package installs.
Updates installer docs and adds focused install.sh coverage for the lazy Git path. Also aligns the live-media provider expectation with current main so built-artifact checks stay green.
Fixes#83232
Co-authored-by: Sebastien Tardif <sebtardif@ncf.ca>
If install succeeds but `openclaw` is not found in a new terminal, see [Node.js troubleshooting](/install/node#troubleshooting).
install.sh
Recommended for most interactive installs on macOS/Linux/WSL.
Flow (install.sh)
Supports macOS and Linux (including WSL).
Checks Node version and installs Node 24 if needed (Homebrew on macOS, NodeSource setup scripts on Linux apt/dnf/yum). On macOS, Homebrew is installed only when the installer needs it for Node or Git. OpenClaw still supports Node 22 LTS, currently `22.19+`, for compatibility.
On Alpine/musl Linux, the installer uses apk packages instead of NodeSource; the configured Alpine repositories must provide Node `22.19+` (Alpine 3.21 or newer at the time of writing).
Installs Git if missing using the detected package manager, including Homebrew on macOS and apk on Alpine.
- `npm` method (default): global npm install
- `git` method: clone/update repo, install deps with pnpm, build, then install wrapper at `~/.local/bin/openclaw`
- Refreshes a loaded gateway service best-effort (`openclaw gateway install --force`, then restart)
- Runs `openclaw doctor --non-interactive` on upgrades and git installs (best effort)
- Attempts onboarding when appropriate (TTY available, onboarding not disabled, and bootstrap/config checks pass)
Source checkout detection
If run inside an OpenClaw checkout (package.json + pnpm-workspace.yaml), the script offers:
use checkout (git), or
use global install (npm)
If no TTY is available and no install method is set, it defaults to npm and warns.
The script exits with code 2 for invalid method selection or invalid --install-method values.
Base directory for OpenClaw state and default git/onboarding paths
OPENCLAW_GIT_DIR=<path>
Checkout directory
OPENCLAW_GIT_UPDATE=0|1
Toggle git updates
OPENCLAW_NO_PROMPT=1
Disable prompts
OPENCLAW_NO_ONBOARD=1
Skip onboarding
OPENCLAW_DRY_RUN=1
Dry run mode
OPENCLAW_VERBOSE=1
Debug mode
OPENCLAW_NPM_LOGLEVEL=error|warn|notice
npm log level
install-cli.sh
Designed for environments where you want everything under a local prefix
(default `~/.openclaw`) and no system Node dependency. Supports npm installs
by default, plus git-checkout installs under the same prefix flow.
Flow (install-cli.sh)
Downloads a pinned supported Node LTS tarball (the version is embedded in the script and updated independently) to `/tools/node-v` and verifies SHA-256.
On Alpine/musl Linux, where Node does not publish compatible tarballs for the pinned runtime, installs `nodejs` and `npm` with `apk` and links that runtime into the prefix wrapper path. The Alpine repositories must provide Node `22.19+`; use Alpine 3.21 or newer if older repositories only provide Node 20 or 21.
If Git is missing, attempts install via apt/dnf/yum/apk on Linux or Homebrew on macOS.
- `npm` method (default): installs under the prefix with npm, then writes wrapper to `/bin/openclaw`
- `git` method: clones/updates a checkout (default `~/openclaw`) and still writes the wrapper to `/bin/openclaw`
If a gateway service is already loaded from that same prefix, the script runs
`openclaw gateway install --force`, then `openclaw gateway restart`, and
probes gateway health best-effort.
On Linux, force npm prefix to ~/.npm-global if current prefix is not writable
--help
Show usage (-h)
Variable
Description
OPENCLAW_PREFIX=<path>
Install prefix
OPENCLAW_INSTALL_METHOD=git|npm
Install method
OPENCLAW_VERSION=<ver>
OpenClaw version or dist-tag
OPENCLAW_NODE_VERSION=<ver>
Node version
OPENCLAW_HOME=<path>
Base directory for OpenClaw state and default git/onboarding paths
OPENCLAW_GIT_DIR=<path>
Git checkout directory for git installs
OPENCLAW_GIT_UPDATE=0|1
Toggle git updates for existing checkouts
OPENCLAW_NO_ONBOARD=1
Skip onboarding
OPENCLAW_NPM_LOGLEVEL=error|warn|notice
npm log level
install.ps1
Flow (install.ps1)
Requires PowerShell 5+.
If missing, attempts install via winget, then Chocolatey, then Scoop. If no package manager is available, the script downloads the official Node.js Windows zip into `%LOCALAPPDATA%\OpenClaw\deps\portable-node` and adds it to the current process and user PATH. Node 22 LTS, currently `22.19+`, remains supported for compatibility.
- `npm` method (default): global npm install using selected `-Tag`, launched from a writable installer temp directory so shells opened in protected folders such as `C:\` still work
- `git` method: clone/update repo, install/build with pnpm, and install wrapper at `%USERPROFILE%\.local\bin\openclaw.cmd`. If Git is missing, the script bootstraps user-local MinGit under `%LOCALAPPDATA%\OpenClaw\deps\portable-git` and adds it to the current process and user PATH.
- Adds needed bin directory to user PATH when possible
- Refreshes a loaded gateway service best-effort (`openclaw gateway install --force`, then restart)
- Runs `openclaw doctor --non-interactive` on upgrades and git installs (best effort)
`iwr ... | iex` and scriptblock installs report a terminating error without closing the current PowerShell session. Direct `powershell -File` / `pwsh -File` installs still exit non-zero for automation.
Git is required for `git` install method. For `npm` installs, Git is still checked/installed to avoid `spawn git ENOENT` failures when dependencies use git URLs.
Some Linux setups point npm global prefix to root-owned paths. `install.sh` can switch prefix to `~/.npm-global` and append PATH exports to shell rc files (when those files exist).
Rerun the installer so it can bootstrap user-local MinGit, or install Git for Windows and reopen PowerShell.
Run `npm config get prefix` and add that directory to your user PATH (no `\bin` suffix needed on Windows), then reopen PowerShell.
`install.ps1` does not currently expose a `-Verbose` switch.
Use PowerShell tracing for script-level diagnostics: