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.