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 (
openclawon 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/Req | Clawdbot 0.9.x | Moltbot 2.x | OpenClaw 3.4+ |
|---|---|---|---|
| Node.js | 18 LTS | 20 LTS | 22+ |
| Config format | JSON only | JSON/YAML | YAML (JSON still parsed but deprecated) |
| Memory backend | SQLite fixed path | SQLite / Postgres opt-in | Pluggable: LiteFS, Postgres, S3 |
| Tool integrations | ≈200 | ≈500 | 800+ via Composio 1.9 |
| Gateway UI | v0 (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.
- Install the latest OpenClaw:
$ npm install -g openclaw@latest
$ ocl --version
OpenClaw CLI 3.4.2
- Stop your running bot but leave the gateway process up so the UI still responds with maintenance mode:
$ systemctl stop moltbot-daemon
- Create a one-line symlink so any scripts invoking
moltpoint toocluntil 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.storage→storage.drivertools.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.modifyinstead ofgmail.readonly. - GitHub swapped
repo:statusforrepo: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:
- Stop OpenClaw services.
- Restore Moltbot binaries:
npm i -g moltbot@2.8.7 - Move the config back:
mv /etc/openclaw.yml /etc/moltbot.yml - 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.