{
  "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-<patch>`).\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": []
}