2026-01-12 02:00:09 +00:00
---
2026-02-06 10:49:38 -05:00
summary: "How the installer scripts work (install.sh, install-cli.sh, install.ps1), flags, and automation"
2026-01-12 02:00:09 +00:00
read_when:
2026-01-31 13:57:35 +01:00
- You want to understand `openclaw.ai/install.sh`
2026-01-12 02:00:09 +00:00
- You want to automate installs (CI / headless)
- You want to install from a GitHub checkout
2026-01-31 16:04:03 -05:00
title: "Installer Internals"
2026-01-12 02:00:09 +00:00
---
# Installer internals
2026-02-06 10:49:38 -05:00
OpenClaw ships three installer scripts, served from `openclaw.ai` .
2026-01-12 02:00:09 +00:00
2026-04-04 10:51:22 +01:00
| Script | Platform | What it does |
| ---------------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------- |
| [`install.sh` ](#installsh ) | macOS / Linux / WSL | Installs Node if needed, installs OpenClaw via npm (default) or git, and can run onboarding. |
| [`install-cli.sh` ](#install-clish ) | macOS / Linux / WSL | Installs Node + OpenClaw into a local prefix (`~/.openclaw` ) with npm or git checkout modes. No root required. |
| [`install.ps1` ](#installps1 ) | Windows (PowerShell) | Installs Node if needed, installs OpenClaw via npm (default) or git, and can run onboarding. |
2026-01-12 02:00:09 +00:00
2026-02-06 10:49:38 -05:00
## Quick commands
2026-01-12 02:00:09 +00:00
2026-02-06 10:49:38 -05:00
<Tabs>
<Tab title="install.sh">
```bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash
` ``
2026-01-12 02:00:09 +00:00
2026-02-06 10:49:38 -05:00
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash -s -- --help
` ``
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
</Tab>
<Tab title="install-cli.sh">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install-cli.sh | bash
` ``
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install-cli.sh | bash -s -- --help
` ``
2026-02-06 08:55:05 -05:00
2026-02-06 10:49:38 -05:00
</Tab>
<Tab title="install.ps1">
` ``powershell
iwr -useb https://openclaw.ai/install.ps1 | iex
` ``
2026-02-06 08:55:05 -05:00
2026-02-06 10:49:38 -05:00
` ``powershell
& ([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1))) -Tag beta -NoOnboard -DryRun
` ``
2026-02-06 08:55:05 -05:00
2026-02-06 10:49:38 -05:00
</Tab>
</Tabs>
2026-02-06 08:55:05 -05:00
2026-02-06 10:49:38 -05:00
<Note>
If install succeeds but ` openclaw` is not found in a new terminal, see [Node.js troubleshooting](/install/node#troubleshooting).
</Note>
2026-02-06 08:55:05 -05:00
2026-02-06 10:49:38 -05:00
---
2026-01-12 02:00:09 +00:00
2026-03-30 01:21:00 +02:00
<a id="installsh"></a>
2026-02-06 10:49:38 -05:00
## install.sh
<Tip>
Recommended for most interactive installs on macOS/Linux/WSL.
</Tip>
2026-02-06 15:45:39 -08:00
### Flow (install.sh)
2026-02-06 10:49:38 -05:00
<Steps>
<Step title="Detect OS">
Supports macOS and Linux (including WSL). If macOS is detected, installs Homebrew if missing.
</Step>
2026-03-12 15:09:23 +03:00
<Step title="Ensure Node.js 24 by default">
2026-03-25 06:15:21 -07:00
Checks Node version and installs Node 24 if needed (Homebrew on macOS, NodeSource setup scripts on Linux apt/dnf/yum). OpenClaw still supports Node 22 LTS, currently ` 22.14+`, for compatibility.
2026-02-06 10:49:38 -05:00
</Step>
<Step title="Ensure Git">
Installs Git if missing.
</Step>
<Step title="Install OpenClaw">
- ` npm` method (default): global npm install
- ` git` method: clone/update repo, install deps with pnpm, build, then install wrapper at ` ~/.local/bin/openclaw`
</Step>
<Step title="Post-install tasks">
2026-04-04 10:52:02 +01:00
- Refreshes a loaded gateway service best-effort (` openclaw gateway install --force`, then restart)
2026-02-06 10:49:38 -05:00
- 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)
- Defaults ` SHARP_IGNORE_GLOBAL_LIBVIPS=1`
</Step>
</Steps>
### 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.
2026-02-06 15:45:39 -08:00
### Examples (install.sh)
2026-02-06 10:49:38 -05:00
<Tabs>
<Tab title="Default">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash
` ``
</Tab>
<Tab title="Skip onboarding">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash -s -- --no-onboard
` ``
</Tab>
<Tab title="Git install">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash -s -- --install-method git
` ``
</Tab>
2026-03-15 14:18:12 -07:00
<Tab title="GitHub main via npm">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash -s -- --version main
` ``
</Tab>
2026-02-06 10:49:38 -05:00
<Tab title="Dry run">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash -s -- --dry-run
` ``
</Tab>
</Tabs>
<AccordionGroup>
<Accordion title="Flags reference">
2026-03-15 14:18:12 -07:00
| Flag | Description |
| ------------------------------------- | ---------------------------------------------------------- |
| ` --install-method npm\|git` | Choose install method (default: ` npm`). Alias: ` --method` |
| ` --npm` | Shortcut for npm method |
| ` --git` | Shortcut for git method. Alias: ` --github` |
| ` --version <version\|dist-tag\|spec>` | npm version, dist-tag, or package spec (default: ` latest`) |
| ` --beta` | Use beta dist-tag if available, else fallback to ` latest` |
| ` --git-dir <path>` | Checkout directory (default: ` ~/openclaw`). Alias: ` --dir` |
| ` --no-git-update` | Skip ` git pull` for existing checkout |
| ` --no-prompt` | Disable prompts |
| ` --no-onboard` | Skip onboarding |
| ` --onboard` | Enable onboarding |
| ` --dry-run` | Print actions without applying changes |
| ` --verbose` | Enable debug output (` set -x`, npm notice-level logs) |
| ` --help` | Show usage (` -h`) |
2026-02-06 10:49:38 -05:00
</Accordion>
<Accordion title="Environment variables reference">
2026-03-15 14:18:12 -07:00
| Variable | Description |
| ------------------------------------------------------- | --------------------------------------------- |
| ` OPENCLAW_INSTALL_METHOD=git\|npm` | Install method |
| ` OPENCLAW_VERSION=latest\|next\|main\|<semver>\|<spec>` | npm version, dist-tag, or package spec |
| ` OPENCLAW_BETA=0\|1` | Use beta if available |
| ` 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 |
| ` SHARP_IGNORE_GLOBAL_LIBVIPS=0\|1` | Control sharp/libvips behavior (default: ` 1`) |
2026-02-06 10:49:38 -05:00
</Accordion>
</AccordionGroup>
2026-01-12 02:00:09 +00:00
2026-02-06 10:49:38 -05:00
---
2026-01-12 02:00:09 +00:00
2026-03-30 01:21:00 +02:00
<a id="install-clish"></a>
2026-02-06 10:49:38 -05:00
## install-cli.sh
<Info>
2026-04-04 10:51:22 +01:00
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.
2026-02-06 10:49:38 -05:00
</Info>
2026-02-06 15:45:39 -08:00
### Flow (install-cli.sh)
2026-02-06 10:49:38 -05:00
<Steps>
<Step title="Install local Node runtime">
2026-03-19 11:42:57 -07:00
Downloads a pinned supported Node LTS tarball (the version is embedded in the script and updated independently) to ` <prefix>/tools/node-v<version>` and verifies SHA-256.
2026-02-06 10:49:38 -05:00
</Step>
<Step title="Ensure Git">
If Git is missing, attempts install via apt/dnf/yum on Linux or Homebrew on macOS.
</Step>
<Step title="Install OpenClaw under prefix">
2026-04-04 10:51:22 +01:00
- ` npm` method (default): installs under the prefix with npm, then writes wrapper to ` <prefix>/bin/openclaw`
- ` git` method: clones/updates a checkout (default ` ~/openclaw`) and still writes the wrapper to ` <prefix>/bin/openclaw`
</Step>
<Step title="Refresh loaded gateway service">
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.
2026-02-06 10:49:38 -05:00
</Step>
</Steps>
2026-02-06 15:45:39 -08:00
### Examples (install-cli.sh)
2026-02-06 10:49:38 -05:00
<Tabs>
<Tab title="Default">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install-cli.sh | bash
` ``
</Tab>
<Tab title="Custom prefix + version">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install-cli.sh | bash -s -- --prefix /opt/openclaw --version latest
` ``
</Tab>
2026-04-04 10:51:22 +01:00
<Tab title="Git install">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install-cli.sh | bash -s -- --install-method git --git-dir ~/openclaw
` ``
</Tab>
2026-02-06 10:49:38 -05:00
<Tab title="Automation JSON output">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install-cli.sh | bash -s -- --json --prefix /opt/openclaw
` ``
</Tab>
<Tab title="Run onboarding">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install-cli.sh | bash -s -- --onboard
` ``
</Tab>
</Tabs>
<AccordionGroup>
<Accordion title="Flags reference">
2026-04-04 10:51:22 +01:00
| Flag | Description |
| --------------------------- | ------------------------------------------------------------------------------- |
| ` --prefix <path>` | Install prefix (default: ` ~/.openclaw`) |
| ` --install-method npm\|git` | Choose install method (default: ` npm`). Alias: ` --method` |
| ` --npm` | Shortcut for npm method |
| ` --git`, ` --github` | Shortcut for git method |
| ` --git-dir <path>` | Git checkout directory (default: ` ~/openclaw`). Alias: ` --dir` |
| ` --version <ver>` | OpenClaw version or dist-tag (default: ` latest`) |
| ` --node-version <ver>` | Node version (default: ` 22.22.0`) |
| ` --json` | Emit NDJSON events |
| ` --onboard` | Run ` openclaw onboard` after install |
| ` --no-onboard` | Skip onboarding (default) |
| ` --set-npm-prefix` | On Linux, force npm prefix to ` ~/.npm-global` if current prefix is not writable |
| ` --help` | Show usage (` -h`) |
2026-02-06 10:49:38 -05:00
</Accordion>
<Accordion title="Environment variables reference">
2026-04-04 10:51:22 +01:00
| 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_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 |
| ` SHARP_IGNORE_GLOBAL_LIBVIPS=0\|1` | Control sharp/libvips behavior (default: ` 1`) |
2026-02-06 10:49:38 -05:00
</Accordion>
</AccordionGroup>
2026-01-12 02:00:09 +00:00
2026-02-06 10:49:38 -05:00
---
2026-01-18 18:26:20 +00:00
2026-03-30 01:21:00 +02:00
<a id="installps1"></a>
2026-02-06 10:49:38 -05:00
## install.ps1
2026-02-06 15:45:39 -08:00
### Flow (install.ps1)
2026-02-06 10:49:38 -05:00
<Steps>
<Step title="Ensure PowerShell + Windows environment">
Requires PowerShell 5+.
</Step>
2026-03-12 15:26:36 +03:00
<Step title="Ensure Node.js 24 by default">
2026-03-25 06:15:21 -07:00
If missing, attempts install via winget, then Chocolatey, then Scoop. Node 22 LTS, currently ` 22.14+`, remains supported for compatibility.
2026-02-06 10:49:38 -05:00
</Step>
<Step title="Install OpenClaw">
- ` npm` method (default): global npm install using selected ` -Tag`
- ` git` method: clone/update repo, install/build with pnpm, and install wrapper at ` %USERPROFILE%\.local\bin\openclaw.cmd`
</Step>
<Step title="Post-install tasks">
2026-04-04 10:52:02 +01:00
- 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)
2026-02-06 10:49:38 -05:00
</Step>
</Steps>
2026-02-06 15:45:39 -08:00
### Examples (install.ps1)
2026-02-06 10:49:38 -05:00
<Tabs>
<Tab title="Default">
` ``powershell
iwr -useb https://openclaw.ai/install.ps1 | iex
` ``
</Tab>
<Tab title="Git install">
` ``powershell
& ([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1))) -InstallMethod git
` ``
</Tab>
2026-03-15 14:18:12 -07:00
<Tab title="GitHub main via npm">
` ``powershell
& ([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1))) -Tag main
` ``
</Tab>
2026-02-06 10:49:38 -05:00
<Tab title="Custom git directory">
` ``powershell
& ([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1))) -InstallMethod git -GitDir "C:\openclaw"
` ``
</Tab>
<Tab title="Dry run">
` ``powershell
& ([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1))) -DryRun
` ``
</Tab>
2026-02-13 02:06:56 +01:00
<Tab title="Debug trace">
` ``powershell
# install.ps1 has no dedicated -Verbose flag yet.
Set-PSDebug -Trace 1
& ([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1))) -NoOnboard
Set-PSDebug -Trace 0
` ``
</Tab>
2026-02-06 10:49:38 -05:00
</Tabs>
<AccordionGroup>
<Accordion title="Flags reference">
2026-03-15 14:18:12 -07:00
| Flag | Description |
| --------------------------- | ---------------------------------------------------------- |
| ` -InstallMethod npm\|git` | Install method (default: ` npm`) |
| ` -Tag <tag\|version\|spec>` | npm dist-tag, version, or package spec (default: ` latest`) |
| ` -GitDir <path>` | Checkout directory (default: ` %USERPROFILE%\openclaw`) |
| ` -NoOnboard` | Skip onboarding |
| ` -NoGitUpdate` | Skip ` git pull` |
| ` -DryRun` | Print actions only |
2026-02-06 10:49:38 -05:00
</Accordion>
<Accordion title="Environment variables reference">
| Variable | Description |
| ---------------------------------- | ------------------ |
| ` OPENCLAW_INSTALL_METHOD=git\|npm` | Install method |
| ` OPENCLAW_GIT_DIR=<path>` | Checkout directory |
| ` OPENCLAW_NO_ONBOARD=1` | Skip onboarding |
| ` OPENCLAW_GIT_UPDATE=0` | Disable git pull |
| ` OPENCLAW_DRY_RUN=1` | Dry run mode |
</Accordion>
</AccordionGroup>
<Note>
If ` -InstallMethod git` is used and Git is missing, the script exits and prints the Git for Windows link.
</Note>
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
---
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
## CI and automation
Use non-interactive flags/env vars for predictable runs.
<Tabs>
<Tab title="install.sh (non-interactive npm)">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash -s -- --no-prompt --no-onboard
` ``
</Tab>
<Tab title="install.sh (non-interactive git)">
` ``bash
OPENCLAW_INSTALL_METHOD=git OPENCLAW_NO_PROMPT=1 \
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash
` ``
</Tab>
<Tab title="install-cli.sh (JSON)">
` ``bash
curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install-cli.sh | bash -s -- --json --prefix /opt/openclaw
` ``
</Tab>
<Tab title="install.ps1 (skip onboarding)">
` ``powershell
& ([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1))) -NoOnboard
` ``
</Tab>
</Tabs>
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
---
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
## Troubleshooting
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
<AccordionGroup>
<Accordion title="Why is Git required?">
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.
</Accordion>
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
<Accordion title="Why does npm hit EACCES on Linux?">
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).
</Accordion>
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
<Accordion title="sharp/libvips issues">
The scripts default ` SHARP_IGNORE_GLOBAL_LIBVIPS=1` to avoid sharp building against system libvips. To override:
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
` ``bash
SHARP_IGNORE_GLOBAL_LIBVIPS=0 curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash
` ``
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
</Accordion>
2026-01-18 18:26:20 +00:00
2026-02-06 10:49:38 -05:00
<Accordion title='Windows: "npm error spawn git / ENOENT"'>
Install Git for Windows, reopen PowerShell, rerun installer.
</Accordion>
2026-01-25 05:48:18 +00:00
2026-02-06 10:49:38 -05:00
<Accordion title='Windows: "openclaw is not recognized"'>
2026-03-02 13:07:07 -04:00
Run ` npm config get prefix` and add that directory to your user PATH (no ` \bin` suffix needed on Windows), then reopen PowerShell.
2026-02-06 10:49:38 -05:00
</Accordion>
2026-01-25 05:48:18 +00:00
2026-02-13 02:06:56 +01:00
<Accordion title="Windows: how to get verbose installer output">
` install.ps1` does not currently expose a ` -Verbose` switch.
Use PowerShell tracing for script-level diagnostics:
` ``powershell
Set-PSDebug -Trace 1
& ([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1))) -NoOnboard
Set-PSDebug -Trace 0
` ``
</Accordion>
2026-02-06 10:49:38 -05:00
<Accordion title="openclaw not found after install">
Usually a PATH issue. See [Node.js troubleshooting ](/install/node#troubleshooting ).
</Accordion>
</AccordionGroup>