{ "title": "Development channels", "content": "Last updated: 2026-01-21\n\nOpenClaw ships three update channels:\n\n* **stable**: npm dist-tag `latest`.\n* **beta**: npm dist-tag `beta` (builds under test).\n* **dev**: moving head of `main` (git). npm dist-tag: `dev` (when published).\n\nWe ship builds to **beta**, test them, then **promote a vetted build to `latest`**\nwithout changing the version number — dist-tags are the source of truth for npm installs.\n\n## Switching channels\n\n* `stable`/`beta` check out the latest matching tag (often the same tag).\n* `dev` switches to `main` and rebases on the upstream.\n\nnpm/pnpm global install:\n\nThis updates via the corresponding npm dist-tag (`latest`, `beta`, `dev`).\n\nWhen you **explicitly** switch channels with `--channel`, OpenClaw also aligns\nthe install method:\n\n* `dev` ensures a git checkout (default `~/openclaw`, override with `OPENCLAW_GIT_DIR`),\n updates it, and installs the global CLI from that checkout.\n* `stable`/`beta` installs from npm using the matching dist-tag.\n\nTip: if you want stable + dev in parallel, keep two clones and point your gateway at the stable one.\n\n## Plugins and channels\n\nWhen you switch channels with `openclaw update`, OpenClaw also syncs plugin sources:\n\n* `dev` prefers bundled plugins from the git checkout.\n* `stable` and `beta` restore npm-installed plugin packages.\n\n## Tagging best practices\n\n* Tag releases you want git checkouts to land on (`vYYYY.M.D` or `vYYYY.M.D-`).\n* Keep tags immutable: never move or reuse a tag.\n* npm dist-tags remain the source of truth for npm installs:\n * `latest` → stable\n * `beta` → candidate build\n * `dev` → main snapshot (optional)\n\n## macOS app availability\n\nBeta and dev builds may **not** include a macOS app release. That’s OK:\n\n* The git tag and npm dist-tag can still be published.\n* Call out “no macOS build for this beta” in release notes or changelog.", "code_samples": [ { "code": "* `stable`/`beta` check out the latest matching tag (often the same tag).\n* `dev` switches to `main` and rebases on the upstream.\n\nnpm/pnpm global install:", "language": "unknown" } ], "headings": [ { "level": "h2", "text": "Switching channels", "id": "switching-channels" }, { "level": "h2", "text": "Plugins and channels", "id": "plugins-and-channels" }, { "level": "h2", "text": "Tagging best practices", "id": "tagging-best-practices" }, { "level": "h2", "text": "macOS app availability", "id": "macos-app-availability" } ], "url": "llms-txt#development-channels", "links": [] }