If you still have moltbot or the even older clawdbot running in production, the clock has been ticking for a while. The package rename to openclaw is final, and new features like multi-tool orchestration only ship under the new namespace. This post walks you through everything I learned upgrading three Moltbot instances (and a dusty Clawdbot from 2022) to OpenClaw 3.4.2. The goal: keep agents online, keep user memory intact, and avoid late-night rollbacks.

Why the naming changed twice and why you should care

Quick recap for context:

  • Clawdbot (Jan 2022 → Aug 2023) — first public release. Written in Node 18. Config in clawdbot.json.
  • Moltbot (Sep 2023 → Feb 2024) — temporary rename after a trademark conflict with a UK robotics startup. Same codebase, bumped to Node 20, added YAML config support.
  • OpenClaw (Mar 2024 → today) — final name, new package scope (openclaw on npm, gh:openclaw/openclaw). Requires Node 22+. Config semantics tightened, auth model overhauled, memory store pluggable.

The old packages are no longer patched for security. GitHub issues on clawdbot and moltbot repos are locked. So even if your bot “works”, you are on borrowed time. The good news: the core architecture stayed the same, so an in-place upgrade is mostly about renaming binaries and mass-editing config keys.

OpenClaw vs Moltbot vs Clawdbot: compatibility matrix

Feature/ReqClawdbot 0.9.xMoltbot 2.xOpenClaw 3.4+
Node.js18 LTS20 LTS22+
Config formatJSON onlyJSON/YAMLYAML (JSON still parsed but deprecated)
Memory backendSQLite fixed pathSQLite / Postgres opt-inPluggable: LiteFS, Postgres, S3
Tool integrations≈200≈500800+ via Composio 1.9
Gateway UIv0 (React 17)v1 (Svelte)v2 (SolidJS)

From this table you can see the main breaking surfaces: runtime, config, and memory store. Everything else is cosmetic.

Step 1 — Upgrade your runtime to Node 22+

OpenClaw uses the new --experimental-permission flag internally for sandboxed shell tools, which only landed in Node 22. If you try to run it on an older runtime you’ll get:

error: unknown or invalid flag --experimental-permission (requires Node >=22.0.0)

On Ubuntu 22.04 you can grab the official tarball or use n:

$ sudo npm i -g n@9 && sudo n 22.2.0 $ node -v v22.2.0

If you manage multiple apps, install Node 22 under /opt/node22 and symlink only the systemd service that runs OpenClaw; this keeps legacy Express apps on Node 18.

Step 2 — Replace the CLI binary

The old CLIs install a global bin named claw (Clawdbot) or molt (Moltbot). OpenClaw uses ocl. These can coexist, so you can stage the new version before cutting traffic.

  1. Install the latest OpenClaw:
$ npm install -g openclaw@latest $ ocl --version OpenClaw CLI 3.4.2
  1. Stop your running bot but leave the gateway process up so the UI still responds with maintenance mode:
$ systemctl stop moltbot-daemon
  1. Create a one-line symlink so any scripts invoking molt point to ocl until you can patch them:
$ ln -s $(command -v ocl) /usr/local/bin/molt

I left this shim in place for two weeks and nothing exploded.

Step 3 — Port your config files

3.1 Locate and back up

Moltbot’s default search path was /etc/moltbot.{yml,json} → current working dir → $HOME/.moltbot. OpenClaw looks in /etc/openclaw.yml then the same fallbacks. So the simplest move is a rename:

$ sudo mv /etc/moltbot.yml /etc/openclaw.yml

Pro tip: stash a copy in git before you start mass-editing.

3.2 Key renames

The schema itself changed only in two areas, but they’ll bite you:

  • memory.storagestorage.driver
  • tools.enabled[]plugins[]

I used yq to patch:

$ yq -i '(.memory.storage) as $x | del(.memory.storage) | .storage.driver=$x' /etc/openclaw.yml $ yq -i '(.tools.enabled) as $x | del(.tools) | .plugins=$x' /etc/openclaw.yml

If you were still on Clawdbot JSON, migrate to YAML now or you’ll be stuck in deprecated land:

$ yq -P eval '.' clawdbot.json > openclaw.yml

3.3 New defaults

OpenClaw assumes an S3-compatible object store for attachments. Moltbot saved files locally under /var/lib/moltbot/blob/. Add this if you want to keep the old behavior:

storage: attachments: driver: local path: /var/lib/openclaw/blob

The local path will be created automatically on first run.

3.4 Environment variables

Avoid secrets in YAML if possible. The env var prefix changed from MOLT_ to OCL_. For example:

# before export MOLT_OPENAI_KEY="sk-..." # after export OCL_OPENAI_KEY="sk-..."

A lazy yet safe fix is to duplicate the exports in your .env or systemd unit until everything is verified.

Step 4 — Preserve memory and chat history

This is the step that kept me up at night. Our agents had been accumulating context for 18 months and losing that would put us back on day one.

4.1 SQLite → SQLite (same host)

If you never touched the memory backend, you are on a local SQLite file. Copy it forward:

$ sudo mkdir -p /var/lib/openclaw/db $ sudo cp /var/lib/moltbot/db/memory.sqlite3 \ /var/lib/openclaw/db/memory.sqlite3

Then point the config:

storage: driver: sqlite dsn: /var/lib/openclaw/db/memory.sqlite3

4.2 Postgres migrations

OpenClaw bundles Knex 3.0 migrations under ocl db migrate. Those are idempotent, so you can reuse the same database.

$ OCL_DB_URL=postgres://claw:secret@127.0.0.1:5432/clawdb ocl db migrate

I had one schema drift when upgrading from Clawdbot 0.9.6: a column named agent_id grew from varchar(36) to varchar(64). Knex detected the mismatch and renamed the column automatically for Postgres 12+, but if you’re on Amazon Aurora 10.x you must do it yourself:

ALTER TABLE memory ALTER COLUMN agent_id TYPE varchar(64);

4.3 Verify

Launch the daemon in dry-run mode and have it dump a memory sample:

$ ocl daemon --dry-run --dump-memory | jq '.conversations | length'

If the count matches production numbers, you’re good.

Step 5 — Validate integrations & tokens

OpenClaw jumped from Composio 1.4 to 1.9, which changed scopes for some OAuth apps:

  • Gmail now needs https://www.googleapis.com/auth/gmail.modify instead of gmail.readonly.
  • GitHub swapped repo:status for repo:workflow.

The upgrade script attempts to auto-refresh tokens, but for private apps (Slack enterprise grid, self-hosted GitLab) the refresh URL is not discoverable. You’ll see warnings like:

[warn] Unable to refresh token for slack-enterprise (manual re-auth required)

I wrote a one-liner to list failing integrations:

$ sqlite3 /var/lib/openclaw/db/memory.sqlite3 \ "select id, provider, expires_at from oauth_tokens where expires_at < strftime('%s','now');"

Manually re-auth in the Gateway UI for each.

Common pitfalls and how to fix them

Daemon fails to start, says “cannot find module ‘svelte’”

You probably installed the gateway package only. OpenClaw split packages: openclaw (core + cli) and openclaw-gateway (UI). Install both or add --with-ui flag:

$ npm install -g openclaw openclaw-gateway

Webhooks returning 403 after switch

Check the secret header. Moltbot used X-Molt-Signature, OpenClaw uses X-Ocl-Signature. Update reverse proxy rules or regenerate secrets.

Systemd service keeps restarting every 90 s

OpenClaw exits if NODE_ENV is not production or development. Moltbot ignored that var. Add it:

[Service] Environment=NODE_ENV=production

Rolling back (if you must)

I didn’t need to, but I tested it. Because we never mutated the original database, rolling back is trivial:

  1. Stop OpenClaw services.
  2. Restore Moltbot binaries: npm i -g moltbot@2.8.7
  3. Move the config back: mv /etc/openclaw.yml /etc/moltbot.yml
  4. Start moltbot-daemon.

The memory file is still compatible because schema changes were additive. The only thing you’ll lose is the new attachment store. Move files back if needed.

Next step: turn on scheduled tasks

Once your agents are stably running on OpenClaw, take advantage of scheduler.yaml. Cron-style tasks were experimental in Moltbot; they’re first-class now:

schedule: - name: morning-brief cron: "0 7 * * Mon-Fri" tool: summarize-inbox output: slack://#marketing

Enable the scheduler service:

$ systemctl enable --now openclaw-scheduler

Your agents will finally do work while you sleep.