Skip to content
Nicola Sabaini

Writing

OpenClaw is not a coding agent

I installed it expecting a rival to Claude Code. It is a different thing, and once you see what it is, it becomes useful: the local model, reachable from Telegram.

4 min read

I had a tuned llama.cpp server at home already, running a 35-billion MoE that does thirty tokens per second on eight gigabytes of VRAM. I wanted to see what could be stacked on top of it, so I installed OpenClaw expecting a second coding agent to race against Claude Code.

Wrong framing. OpenClaw is not a coding agent: it is a multichannel gateway. The difference is not terminology, it changes what you do with it.

Claude Code OpenClaw
where it works the directory you launch it from its own declared workspace
what it is for editing code and files reaching the model from other channels
seconds per turn ~77 ~148
from a phone no yes — Telegram, WhatsApp, Signal, Discord, Matrix, SMS

Put that way it is not a competitor. It is how you talk to the machine at home while you are not at home, with the session and the memory still there.

Point it at the server you already have

The temptation is to let it manage an engine of its own. There is no sense in that: the server is already there, already measured, already running the right thread count for its architecture. You configure it as an external endpoint, in ~/.openclaw/openclaw.json:

{
  "models": { "providers": { "llama-cpp": {
    "baseUrl": "http://127.0.0.1:8080/v1",
    "api": "openai-completions",
    "request": { "allowPrivateNetwork": true },
    "models": [ { "id": "qwen-local", "name": "Qwen3.6 35B-A3B local",
                  "contextWindow": 65536 } ]
  } } }
}

allowPrivateNetwork is not optional: without it the request to 127.0.0.1 never leaves.

openclaw models list
openclaw infer model run --model llama-cpp/qwen-local --prompt "..."

Bare inference: 23 seconds. An agent turn: 148. The difference is not the model, it is OpenClaw loading plugins and resolving the model on every turn.

The workspace trap

This one cost me the worst kind of time — the kind spent hunting a fault that was not there.

You launch the agent from your folder, ask it about your files, and it reports that they do not exist. It looks broken. It is not: the OpenClaw agent does not work in the current directory, it works in the workspace declared in its configuration, which defaults to ~/.openclaw/workspace. It really was looking. Just somewhere else.

You declare it at creation:

openclaw agents add code --workspace D:\tests --model llama-cpp/qwen-local --non-interactive

or assign one to the default agent, which is the one the terminal interface uses:

openclaw config patch --stdin
{ agents: { list: [ { id: "main", workspace: "D:\tests",
                      model: "llama-cpp/qwen-local" } ] } }

With one warning that matters: OpenClaw seeds its own files into the workspace. AGENTS.md, SOUL.md, IDENTITY.md, USER.md, TOOLS.md, HEARTBEAT.md, BOOTSTRAP.md, openclaw-workspace-state.json, and it initialises a git repository there too. In a scratch folder all of that is fair. Pointing it at a real project is another matter, and there the answer is a dedicated folder.

The web panel, and two errors that look like faults

There is a Control UI served by a Gateway, which has to be started separately. It serves only the panel: the terminal chat and the agents work without it.

The Gateway will not start without gateway.mode. The message is explicit — “Gateway start blocked: existing config is missing gateway.mode” — but it is easy to read as a broken install rather than a missing field. Set it to local and it starts.

The token lives in the fragment after #. If you open the panel and then edit the address by hand, even just to change a port, the fragment disappears and the page asks you to authenticate. It looks like the token expired. It did not: you threw it away yourself, by trimming the URL. Always open it whole.

Why it stays on an old version

2026.7.1-2 wants Node >=22.22.3 <23, >=24.15.0 <25, or >=25.9.0. This machine has 24.14.1 — outside the second window by one patch level. And winget offers nothing that fits: a 22 would be a downgrade, the 26 is two majors ahead.

So it stays on 2026.6.34. I tried the update, it became unstartable, and npm install -g openclaw@2026.6.34 put everything back without losing the configuration.

This is not a criticism of OpenClaw: a narrow version range is a legitimate choice. It is a reminder that a globally installed agent inherits the constraints of the runtime it sits on, and that those constraints decide when you get to update — not you.

What I use it for

Claude Code stays the tool for working on files, because it works where the files are and takes half the time.

OpenClaw does one thing Claude Code does not: it puts the same local model at the end of a Telegram chat. The machine at home answers, the GPU is that GPU, and the model never left the room.

All writing