#Setting up - Help a beginner

1 messages ¡ Page 1 of 1 (latest)

trail cryptBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> ✅ Mark Solution

wicked solarBOT
#

If your main goal is OpenClaw + Telegram + basic “assistant-y” stuff, a Mac mini is a totally reasonable always-on box — but 16GB unified memory is the main bottleneck the moment you try to run a local LLM and keep the gateway/agent tooling comfy.

Practical reality check on “local LLM to save tokens”

  • You can run local models on a Mac mini, but for OpenClaw-style “agentic” work (tool calling, multi-step tasks, reliability), small local models often feel flaky compared to good cloud models.
  • So the best experience for most people is hybrid:
  • cheap cloud model for routine chat/heartbeats
  • stronger model only when you actually ask it to do real work
  • optional: local model for “offline Q&A / quick drafts”, not mission-critical tool use

(For up-to-date model recommendations, ask in #models — things change fast. Docs: https://docs.openclaw.ai/concepts/models)

If you keep the Mac mini: what upgrades matter?

RAM is king. SSD is second.

  • 32GB RAM: the “minimum I’d personally recommend” if local LLM is a real goal.
  • 64GB RAM: starts to feel comfortable for bigger local models and longer contexts.
  • 256GB SSD: workable, but you’ll run out surprisingly fast (models + caches + dev stuff). I’d aim for 512GB or 1TB if you can.
#

With 16GB, you’ll likely be limited to small quantized models and shorter contexts, and macOS will lean on swap when you multitask (which feels bad on an always-on box).

If you’re open to non-mac options (still “small box by the router”)

A small Linux mini-PC can be a great always-on gateway host, and you can keep your “main computer” separate. GPU-based local LLM setups get expensive/complicated fast though (and aren’t as discreet once cooling/power enters the picture).

What I’d do in your shoes (rookie-friendly path)

  1. Don’t return the Mac solely for local LLM dreams unless you’re ready to pay for more RAM.
  2. Get OpenClaw stable + useful with a cheap cloud model + spending limits first.
  3. Once you’re comfortable, experiment with local inference knowing it’s a tradeoff.

If you tell me what you mean by “basic tasks” (just chat? summaries? web browsing? coding? home automation?), I can sanity-check whether 16GB is likely to frustrate you or not. Also: you’ll get real “what people run at home” anecdotes in #users-helping-users.

snow siren
#

The point is to eventually run different agents, specialized in different tasks and learning about different topics so they can work together to build software that I can sell. This aside from checking, resuming and replying to personal and work e-mails, do online tasks for me, etc....
Commercializing access to agents running simple daily use-tasks bots to other people that dont have the patience or knowledge to set up an openclaw is another possibility. I just want to be sure if I should keep this Mac Mini for now as it will still serve me for a while or if I should return it while I can still get a 100% refund and move on to another one

wicked solarBOT
#

Given what you want long-term, it helps to separate two goals:

1) Learning + personal assistant (email, online tasks, “help me build stuff”)

For this, the Mac mini M4 16GB / 256GB is totally fine as an always-on OpenClaw box if you’re OK using a cloud model for the “thinking”.

What will frustrate you on 16GB is specifically: “run a local LLM + run the gateway + do browser/tool automation + multitask” all on the same machine. It’ll work for small local models, but you’ll hit limits fast (swap, slowdowns, short contexts).

If your priority is “get productive, learn, build prototypes”: keep the Mac, and control spend by:

  • using a cheaper model for day-to-day chatter/background tasks
  • reserving “strong” models for big jobs
  • putting hard spend limits on API keys

(See: https://docs.openclaw.ai/concepts/models — and for current community picks, ask in #models.)

2) “I might sell this / host agents for other people”

That’s a completely different hardware and architecture problem.

#

The hard parts aren’t just “can it run locally?” — it’s:

  • security isolation between users (multi-tenant risk)
  • handling other people’s email / accounts (privacy, compliance, incident response)
  • uptime/monitoring/backups
  • billing + rate limiting + abuse handling
  • model/provider Terms (many providers have rules around reselling / offering access)

A single Mac mini under your router is fine for your assistant, but it’s not the direction I’d bet on for a hosted product.

So should you return it?

If you want a simple decision rule:

  • Keeping it makes sense if: your next 1–3 months are “learn OpenClaw, build flows for yourself, prototype agents”, and you’re OK with cloud models for the heavy lifting.
  • Return/upgrade makes sense if: you’re committed to local LLM as a core requirement soon. In that case I’d strongly consider 32GB RAM minimum (Apple RAM isn’t upgradeable), and ideally 512GB+ storage (or plan on an external SSD).

If you answer these 3 questions, I can be much more concrete:

  1. Do you want the local model to be the default brain, or just a “cheap fallback”?
#
  1. Will the Mac be doing browser automation/tasks too (so it needs headroom), or just running the gateway?
  2. What’s your realistic budget ceiling for RAM/SSD upgrades?
snow siren
#

1 - Local LLM as capable as possible as I believe that will save me in API costs in the long run. Why? Because yes, I can set up daily limits on API but that will just mean I will take longer to reach the same goal, as the amount of transmissions and content (and thus the "price") wont change. With a decent local LLM, that cost doesn't exist in the long run and would most likely offset the higher initial PC cost.

2 - Knowing from 1 that a local LLM is the main point, the Mac will be doing as much as possible.

3 - 2000$-ish mark for the full setup

wicked solarBOT
#

If “local LLM as capable as possible” is non‑negotiable, then I’d not keep a 16GB / 256GB Mac mini. You’ll hit the wall quickly once you run: gateway + browser/tooling + a decent local model + multiple agent sessions.

Also one key correction: local inference isn’t truly “free” long‑run — you pay in hardware, power, and (big one) time/latency. And for agentic tool use, the “cheapest” model is often the one that actually succeeds in fewer steps. So even local-first people usually keep a cloud fallback for hard jobs.

That said, with a ~$2000 budget, here are the realistic best paths:

Option A (simplest/quiet/discreet): stay Apple, buy RAM

If you want a small silent box by the router, Apple Silicon is great if you buy enough unified memory.

  • RAM: I’d target 64GB if you can, otherwise 32GB minimum.
  • SSD: 512GB+ strongly recommended (models + caches + dev stuff add up fast). External SSD is fine too, but internal still helps.
  • CPU upgrades: usually less important than RAM for your stated goal.

This is the “least hassle” setup, and very newbie-friendly.

Option B (most capability per $ for local LLM): small PC + NVIDIA GPU (Linux)

If you’re not a fan of macOS and want maximum local capability per dollar:

  • Aim for NVIDIA (easiest path for LLM tooling).
#
  • VRAM matters more than CPU: 16GB VRAM is the floor, 24GB VRAM is the sweet spot for “capable local” before things get awkward.
  • Tradeoff: it’s usually bigger/noisier than a Mac mini, and “discreet living room box” gets harder.

This is the “best performance” route, but it’s also the most DIY.

My blunt recommendation based on your answers

  • If you want discreet + low-maintenance: return the 16GB Mac mini and rebuy with more RAM (32GB/64GB) and ideally more SSD.
  • If you want maximum local LLM capability per $ and don’t love macOS anyway: consider a small Linux + NVIDIA box and treat it as your always-on “agent server”.

If you want, tell me which matters more: silent/discreet vs max capability, and whether you’re OK with a “two-box” setup (Mac mini for OpenClaw + separate GPU box for inference). Then I can give a much tighter “buy this class of machine” recommendation without hand-waving.

(And for real-world “what people actually run”, ask in #users-helping-users too — you’ll get concrete builds and noise/thermals feedback.)

snow siren
#

At this stage, discrete interests me more. Returning the 16/256 and going for a 64/512 seems like the best compromise

wicked solarBOT
#

Yeah — if “discreet single box” is the priority, 64GB RAM / 512GB SSD is a solid compromise and (importantly) avoids the one thing you can’t fix later: RAM.

A few practical notes so you don’t get surprised later:

  • 64GB is the real win for local LLM on Apple Silicon. It gives you headroom for: gateway + browser/tool automation + longer contexts + not living in swap.
  • 512GB is the minimum I’d be comfortable with if this is going to be your “always-on agent box”. Models, caches, logs, and general dev stuff add up fast.
    If 1TB is in budget, it’s nice — but you can also add a fast external SSD later for model storage.
  • Even with 64GB, I’d still plan a cloud fallback for the occasional “hard” task (local can be great, but tool reliability is the difference between finishing in 3 steps vs 30).

If you go this route and want to sanity-check performance before the return window closes: run your intended local inference stack + OpenClaw for a day, watch memory pressure / swap, and see if it feels “snappy enough” for you. That’ll make the decision feel a lot less theoretical.

snow siren
#

Sounds good! I'll keep the thread open in case someone that has gone/is going through the same can provide their inputs as well

wicked solarBOT
#

Makes sense.

If you want more “people who run this at home” input, it’s worth also asking in #users-helping-users — you’ll get better anecdotes on noise/thermals, “did I regret 32 vs 64”, external SSD setups, etc.

If you end up going 64/512 and want a quick sanity checklist for first-week setup (keeping it stable + keeping costs down), drop a note here and I’ll outline one.

snow siren
#

Feel free to, I'm all ears

wicked solarBOT
#

Here’s a “first week” checklist I’d follow on a Mac mini that’s meant to sit quietly by the router (stable + not burning money). I’m keeping it practical / rookie-friendly.

Day 0: Baseline sanity (saves you hours later)

  • Record versions: run openclaw --version and note it somewhere.
  • Make sure the gateway survives reboots: after you restart the Mac, confirm it comes back and still replies on Telegram.
  • Know the 3 commands you’ll use most (service control):
    openclaw gateway status / openclaw gateway restart / openclaw gateway stop|start

Docs index: https://docs.openclaw.ai/help/faq (tons of “real-world setup” answers)

Day 1: Make it stable as an always-on box

  • Disable sleep (sleep is the #1 “why did it stop replying?” issue on home Macs).
  • Prefer Ethernet over Wi‑Fi if possible (less random disconnect pain).
  • Bookmark troubleshooting + log locations so you’re not guessing later:
    https://docs.openclaw.ai/gateway/troubleshooting

Day 2: Lock down access (especially if it touches email later)

#
  • In Telegram (and any channel), make sure you’re using allowlists / restricted access so random people can’t DM your bot. (FAQ covers Telegram allowFrom, group behavior, etc.)
  • Don’t expose the dashboard/gateway openly to the internet unless you really know what you’re doing. If you need remote access, prefer a private network approach (VPN/Tailscale-style).

Day 3: Cost control that actually moves the needle

Even if you go local-first, you’ll still want controls so you don’t accidentally burn tokens when you do use a hosted model.

  • Set up two tiers mentally:
  • “cheap/default” for routine chat + background
  • “strong/fallback” for hard tasks
  • Keep contexts small on purpose:
  • Use /new when you switch topics (prevents “context snowball”)
  • If you hit context issues, use the reset/compact guidance in the FAQ sections on sessions/context limits

Models docs (how selection/defaults/failover work): https://docs.openclaw.ai/concepts/models

Day 4: Local LLM reality check (before you commit)

  • Run your local inference stack + OpenClaw for a couple hours doing real tasks (not benchmarks).
  • Watch for: slowdowns, swap usage, overheating/throttling, and whether tool-using tasks “stick the landing”.
#
  • If it’s flaky: keep local as default for casual chat, but keep that cloud fallback for anything important.

Day 5–7: Backup + “oops recovery”

  • Figure out what folder OpenClaw stores its data in on your machine and back it up (FAQ has a “where things live on disk” section).
  • Make sure you can recover from: a broken config edit, a bad skill, or a stuck session (FAQ + troubleshooting cover common resets).

If you tell me which local inference route you’re planning (e.g., Ollama vs llama.cpp vs something else) and whether you’ll run it on the same box, I can tighten this into a more specific “do these exact checks” plan—without going into deep sysadmin land.

snow siren
#

I've tried to set up Ollama locally but it wouldnt work and would fallback right into google API. Is it a known issue?

wicked solarBOT
#

Usually not a “known Ollama is broken” issue — it’s OpenClaw doing normal failover because it can’t see/use Ollama, so it falls back to the next provider you have configured (Google in your case).

The 3 most common causes:

  1. Ollama isn’t actually reachable from where the Gateway runs
  • Quick check: curl http://localhost:11434/api/tags (should return JSON)
  1. Ollama provider isn’t enabled (super common on macOS service installs)
  • If you only did export OLLAMA_API_KEY=... in your terminal, but the Gateway is running as a launchd service, it often won’t inherit that env var → OpenClaw won’t auto-discover Ollama → fallback triggers.
  • Fix: set it in config instead (docs show this), then restart the gateway.
  1. No models are being discovered
  • OpenClaw’s Ollama auto-discovery only keeps models that report tool support, so you can end up with “0 Ollama models available” even though ollama list shows models installed → then it falls back.

Docs (worth skimming, especially the “/v1” warning + discovery rules):
https://docs.openclaw.ai/providers/ollama

#

Minimal debug checklist

Can you paste the output of:

  • ollama list
  • openclaw models list
  • openclaw gateway status

That will usually make it obvious whether it’s (a) env/config not applied to the service, (b) wrong base URL (e.g. accidentally using /v1), or (c) discovery filtering out your installed model(s).

snow siren
#

I will as soon as possible

wicked solarBOT
#

Cool — whenever you get a minute, paste those outputs and we’ll pin it down.

If you’re running the Gateway as a macOS service, the most likely culprit is the env var not being seen by launchd. So if you want a quick thing to try in the meantime: follow the “Enable Ollama for OpenClaw” step on the Ollama provider page using the config method (not just export ...), then openclaw gateway restart.

Docs: https://docs.openclaw.ai/providers/ollama

snow siren
#

Still on the Mac Mini M4 topic, why exactly have you not elaborated on VRAM?

wicked solarBOT
#

Because on a Mac mini (Apple Silicon) VRAM isn’t a separate thing you can pick the way you would on an NVIDIA/AMD GPU PC.

What’s different on Macs

  • Apple Silicon uses unified memory: the CPU and GPU share the same pool of RAM.
  • So the “VRAM” the GPU uses is basically a slice of your unified memory, allocated dynamically by the OS (plus some driver/OS reservations). You can’t buy “more VRAM” without buying more unified memory.

Why I kept talking about RAM instead

For local LLMs, the hard requirement is “do the model weights + KV cache fit in fast memory?”

  • On a PC with a discrete GPU: that fast memory is VRAM, so VRAM is the headline spec.
  • On a Mac: that fast memory is unified memory, so 64GB unified memory effectively is your ‘VRAM budget’ too.

Practical takeaway

If you’re staying Mac mini and you care about local LLM capability, the knob that matters most is:

  • Unified memory (32GB/64GB) → directly increases what the GPU can hold (and what your system can do without swapping)

If you switch to a GPU PC, then we’d talk VRAM first (because you’ll feel the difference between 16GB vs 24GB VRAM immediately for local inference).

snow siren
#

Ok, lets start fresh. Instruct me step by step on how to install the overall best possible free local LLM to feed openclaw on a Mac Mini M4 16/256 thats currently working with an esxternal API

wicked solarBOT
#

I can walk you through this cleanly. Two quick constraints up front:

  • On a Mac mini M4 16GB, “best possible” local LLM really means best that fits + runs without swapping. You will be limited to smaller/quantized options.
  • “Free” models still have licenses — if you plan to sell something, you must pick a model whose license allows commercial use.

Also: I don’t actually see the screenshot attached here. Please re-upload the pic (the OpenClaw model/provider settings page / config view) so I can make sure we’re matching your current setup.

That said, here’s the step-by-step “fresh start” path that works for most people on macOS, using Ollama (simplest integration):

Step 1 — Verify your Gateway is healthy

In Terminal:

  1. openclaw --version
  2. openclaw gateway status

If gateway status isn’t “running / RPC probe ok”, stop here and we fix that first.

Step 2 — Install & start Ollama

#
  1. Install Ollama: https://ollama.ai
  2. Make sure it’s running (Ollama app running, or service running).
  3. Verify the API responds:
  • curl http://localhost:11434/api/tags

If that fails, OpenClaw can’t use Ollama yet.

Step 3 — Pull a tool-capable model in Ollama

OpenClaw’s auto-discovery only lists Ollama models that report tool support.

So:

  1. Go to the OpenClaw Ollama provider doc and pick a model from their “Quick start” list (they keep this current):
    https://docs.openclaw.ai/providers/ollama
  2. Run:
  • ollama pull <model-id-you-picked>

Then confirm:

#
  • ollama list

Step 4 — Enable Ollama in OpenClaw (IMPORTANT on macOS services)

If your Gateway runs as a macOS service, don’t rely on export OLLAMA_API_KEY=... in your shell (launchd often won’t see it).

Do this (any value works; Ollama doesn’t require a real key):

  • openclaw config set models.providers.ollama.apiKey "ollama-local"

Then restart the gateway:

  • openclaw gateway restart

(These exact keys/commands are from the provider doc above.)

Step 5 — Confirm OpenClaw sees Ollama models

Run:

  • openclaw models list
#

You should see models with IDs like ollama/....
If you see none, it’s usually one of:

  • Ollama not reachable (curl fails)
  • you defined models.providers.ollama explicitly (disables auto-discovery) but didn’t define models
  • the model you pulled doesn’t report tool support → it gets filtered out

Step 6 — Set the default agent model to Ollama

Once openclaw models list shows at least one ollama/... model, set your agent default to it (docs example):

  • set agents.defaults.model.primary to the ollama/... model id you want
  • restart gateway again

(If you paste your screenshot / current config, I’ll tell you exactly what to change so it doesn’t keep falling back to Google.)


Next message from you (so I can make this 100% precise)

Please paste the output of:

#
  1. curl http://localhost:11434/api/tags
  2. ollama list
  3. openclaw models list
  4. openclaw gateway status

…and re-upload the screenshot you mentioned. Then I’ll tell you exactly why it’s falling back and which step is missing.

snow siren
#

Step 1 - 1) v2026.3.2
2)Runtime: running (pid 548, state active)
RPC probe: ok

wicked solarBOT
#

Perfect — Gateway is up and reachable (RPC probe: ok). 👍

Step 2 — Install + start Ollama, then confirm it’s reachable

2.1 Install Ollama

  • Install from: https://ollama.ai
  • After install, open the Ollama app once (so the background service starts).

2.2 Confirm the Ollama service is running

In Terminal, run:

  1. Does the API respond?
curl http://localhost:11434/api/tags

What I’m looking for:

#
  • It should return JSON (even if the model list is empty).
  • If you get “connection refused” / can’t connect, Ollama isn’t running yet.
  1. Do you have any models installed yet?
ollama list

If ollama says “command not found”, your PATH isn’t picking it up (we’ll fix that), but try the curl first since that’s the real “is it running” test.

Reply with the output of those two commands and we’ll go to Step 3 (pulling a tool-capable model and wiring OpenClaw to it).

snow siren
#

Installing Ollama to /Applications...

Starting Ollama...
Unable to find application named 'Ollama'

wicked solarBOT
#

That output means “the installer tried to launch the Ollama macOS app, but macOS couldn’t find Ollama.app”.

This usually happens in one of these cases:

  • the app didn’t actually get copied to /Applications, or
  • you installed only the CLI (e.g. via Homebrew), so there is no GUI app to launch, or
  • the app is somewhere else (like ~/Applications).

Let’s diagnose in the simplest way.

Step 2A — Check if the Ollama app exists

In Terminal, run:

ls -ld /Applications/Ollama.app

If it exists

Start it explicitly:

#
open /Applications/Ollama.app

If macOS blocks it, go to System Settings → Privacy & Security and allow it (“Open Anyway”), then try again.

If it does not exist

Then either the install failed or you only have the CLI. Let’s check if the CLI is installed:

which ollama
ollama --version
  • If ollama --version works: great — we can run it without the GUI app. Start the server manually:
ollama serve
#

(Leave that terminal window open for now.)

  • If ollama is not found: re-install via the official mac download (drag into Applications):
    https://ollama.ai

Step 2B — Confirm the server is reachable

Once Ollama is running (GUI app open or ollama serve running), run:

curl http://localhost:11434/api/tags

Paste the outputs of:

  • ls -ld /Applications/Ollama.app
  • which ollama + ollama --version
  • curl http://localhost:11434/api/tags

…and we’ll move to Step 3 (pull a model + make OpenClaw use it).

snow siren
wicked solarBOT
#

Nice — that means Ollama is running and reachable, it just has zero models installed yet ("models":[]).

Step 3 — Install (pull) a model into Ollama

3.1 Pick a tool-capable model (important for OpenClaw)

OpenClaw’s Ollama auto-discovery only lists models that report tool support.

So: open this page and pick one model from the “Quick start” list (they keep it current):
https://docs.openclaw.ai/providers/ollama

On your 16GB Mac, I recommend you start with the smallest option from that list first (just to validate the whole pipeline). You can always try bigger after it’s working.

3.2 Pull it

Run:

ollama pull <model-id-you-picked>
#

3.3 Confirm Ollama now sees it

Run:

ollama list
curl http://localhost:11434/api/tags

At that point, api/tags should show at least one model.

Reply with the output of ollama list (just that), and we’ll do Step 4: configure OpenClaw to actually use ollama/<that-model> as the default (and optionally stop it from falling back to Google during testing).

snow siren
#

Which of these is the most adequate for my computer (using it solely for this and nothing else)

ollama pull gpt-oss:20b

or

ollama pull llama3.3

or

ollama pull qwen2.5-coder:32b

or

ollama pull deepseek-r1:32b

wicked solarBOT
#

On a Mac mini M4 with 16GB unified memory, that exact list is (bluntly) way too heavy except maybe the 20B one — and even that is likely to be slow / memory-tight once you add OpenClaw + tool use.

Here’s the breakdown:

  • llama3.3 → that’s the 70B model. Not realistic on 16GB (it’ll either fail to run or swap itself to death).
  • qwen2.5-coder:32b → 32B is also not realistic on 16GB for the same reason.
  • deepseek-r1:32b → same story: 32B is too big for 16GB.
  • gpt-oss:20b → the only one from your list I’d even try on 16GB, but expect it to be tight (and if it runs, it may still be painfully slow once contexts/tool calls grow).

What I recommend for your machine (so it actually works)

Start with a tool-capable model in the ~7B–10B range first (something with an explicit small size tag like :7b / :8b / :9b), get OpenClaw working end-to-end, then try bigger if you want.

Those 20B/32B/70B pulls are great targets for a 32GB/64GB Mac mini — but they’re not a good first move on 16GB/256GB.

If you still want to proceed right now using only the four commands you posted: pick gpt-oss:20b as the “least bad” option.

Tell me which route you want:

#
  1. “Make it work reliably on 16GB” (I’ll point you to a small-size pull command style), or
  2. “Try the biggest thing that might run” (you pull gpt-oss:20b and we see if it’s usable).
snow siren
wicked solarBOT
#

Yep — that page is showing examples, not “the only models that exist”, and (annoyingly) the examples skew big.

For a Mac mini 16GB / 256GB, from that specific list:

  • llama3.3 → this is the 70B model. Not suitable on 16GB.
  • qwen2.5-coder:32b → 32B, also not suitable on 16GB.
  • deepseek-r1:32b → 32B, also not suitable on 16GB.
  • gpt-oss:20b → the only one that’s even remotely plausible on 16GB (and even then, expect it to be tight/slow once OpenClaw + contexts grow).

So if you want the simplest path that’s consistent with the OpenClaw docs (and avoids manual model config): pull the 20B one first and see if it’s usable:

ollama pull gpt-oss:20b
ollama list

If that ends up too slow or you hit memory pressure, the next step is: pick a smaller Ollama model (not on that OpenClaw page), and we can still use it with OpenClaw — but it may require explicit model config (and some smaller models won’t be as reliable at tool calling).

#

If you run the pull, paste ollama list after it finishes and we’ll continue to Step 4 (making OpenClaw actually use it and preventing Google fallback while testing).

snow siren
#

Or, alternatively, give me smaller model names and we'll go from there right away

wicked solarBOT
#

I can’t give you a list of specific “small model names” to pull here — those recommendations go stale really fast (and I’d rather not send you on a 30GB download chase that turns out to be the wrong pick). The best place for current “this works well on 16GB” picks is #models.

What I can do is get you unstuck immediately with a reliable selection method:

How to pick a smaller Ollama model for a 16GB Mac (that actually works with OpenClaw)

  1. Go to the Ollama library and pick something explicitly small (look for tags like :7b / :8b / :9b):
    https://ollama.com/library

  2. Pull it:

ollama pull <model-id>
  1. Check that Ollama sees it:
ollama list
#
  1. Check whether OpenClaw auto-discovers it (tool-capable filter):
openclaw models list
  • If it shows up as ollama/...: great — we can set it as your default and you’ll stay local.
  • If it doesn’t show up: that model likely doesn’t report tool support, so OpenClaw hides it during auto-discovery. Then you have two choices:
  • pick a different model (repeat steps 1–4), or
  • we switch to explicit model config to force it (works, but tool calling may be weaker depending on the model).

If you tell me which size tag you want to target (7B vs 8B vs 9B) and whether you care more about general chat vs coding, I’ll tell you exactly what to look for on the library page (without guessing names).

snow siren
#

Pulling ollama qwen3.5:9b

wicked solarBOT
#

Good pick for a 16GB box — 9B is in the “should actually run” range.

Once the pull finishes, do these in order:

Step 3.4 — Confirm Ollama sees the model

ollama list
curl http://localhost:11434/api/tags

Step 4 — Make OpenClaw see/use Ollama

4.1 Enable the Ollama provider (service-safe)

openclaw config set models.providers.ollama.apiKey "ollama-local"
openclaw gateway restart
#

4.2 Check whether OpenClaw discovered it

openclaw models list

You’re looking for an entry like:

  • ollama/qwen3.5:9b

4.3 If it shows up: set it as the default model

openclaw config set agents.defaults.model.primary "ollama/qwen3.5:9b"
openclaw gateway restart

Important note about “falling back to Google”

If you leave a cloud fallback configured, OpenClaw may still use it when the Ollama model errors / times out. If you want strictly local (no surprise charges), paste your current agents.defaults.model + any models.providers.google... bits (or screenshot), and I’ll tell you the smallest safe change to prevent fallback while you test.

#

Send me the output of:

  • ollama list
  • openclaw models list
    after you run the steps above.
snow siren
#

openclaw models list

🦞 OpenClaw 2026.3.2 (85377a2) — I'm not AI-powered, I'm AI-possessed. Big difference.

Model Input Ctx Local Auth Tags
google/gemini-2.5-flash-lite text+image 1024k no yes default,configured
groq/llama3-8b-8192 text 8k no yes fallback#1
anthropic/claude-haiku-4-5-20251001 text+image 195k no yes configured,alias:haiku
anthropic/claude-sonnet-4-6 text+image 195k no yes configured,alias:sonnet
google/gemini-2.5-flash text+image 1024k no yes configured
google/gemini-2.5-pro text+image 1024k no yes configured
openrouter/anthropic/claude-haiku-4.5 text+image 195k no yes configured
openrouter/openrouter/auto text+image 1953k no yes configured,alias:OpenRouter
qwen-portal/coder-model text 125k no yes configured,alias:qwen
qwen-portal/vision-model text+image 125k no yes configured

wicked solarBOT
#

That output explains the problem: OpenClaw isn’t seeing any Ollama provider/models at all yet, so it can only list your cloud providers.

Let’s wire Ollama in explicitly (this works even if the model doesn’t advertise “tools” perfectly).

Step 4 — Confirm you’re editing the same config the Gateway service uses

Run:

openclaw config file
openclaw gateway status

(If gateway status shows “Config (cli)” vs “Config (service)” different, tell me — that’s a very common reason changes “don’t stick”.)

Step 5 — Add Ollama provider + your model (explicit config)

Run these commands:

#
openclaw config set models.providers.ollama.baseUrl "http://127.0.0.1:11434"
openclaw config set models.providers.ollama.apiKey "ollama-local"
openclaw config set models.providers.ollama.api "ollama"

Now register the model explicitly:

openclaw config set models.providers.ollama.models '[
{
id: "qwen3.5:9b",
name: "Local Ollama (qwen3.5:9b)",
reasoning: false,
input: ["text"],
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
#
contextWindow: 8192,
maxTokens: 81920,
}
]' --strict-json

Set it as your default:

openclaw config set agents.defaults.model.primary "ollama/qwen3.5:9b"

Restart + validate:

openclaw config validate
openclaw gateway restart
#
openclaw models list

After that, openclaw models list should include ollama/qwen3.5:9b.

Avoiding surprise Google charges (optional but recommended while testing)

If you want “local only” during testing, we should also clear/disable fallbacks (otherwise it can still jump to Google when Ollama errors). If you paste:

openclaw config get agents.defaults.model

I’ll tell you the exact one-liner to make fallbacks empty without touching the rest of your setup.

snow siren
#

{
"primary": "ollama/qwen3.5:9b",
"fallbacks": [
"groq/llama3-8b-8192"
]

wicked solarBOT
#

Great — that’s exactly what we need.

To make it local-only (no Groq fallback), run:

openclaw config set agents.defaults.model.fallbacks '[]' --strict-json
openclaw gateway restart

Now if Ollama isn’t configured correctly (or the model errors), you’ll get a failure instead of silently using Groq/Google — which is what we want while validating.

Next, run and paste:

openclaw models list

We should see an ollama/... entry. If we still don’t, we’ll finish the explicit models.providers.ollama config so OpenClaw can actually talk to your local Ollama server.

snow siren
#

🦞 OpenClaw 2026.3.2 (85377a2) — Hot reload for config, cold sweat for deploys.

Model Input Ctx Local Auth Tags
ollama/qwen3.5:9b text 8k yes yes default
anthropic/claude-haiku-4-5-20251001 text+image 195k no yes configured,alias:haiku
anthropic/claude-sonnet-4-6 text+image 195k no yes configured,alias:sonnet
google/gemini-2.5-flash text+image 1024k no yes configured
google/gemini-2.5-pro text+image 1024k no yes configured
openrouter/anthropic/claude-haiku-4.5 text+image 195k no yes configured
openrouter/openrouter/auto text+image 1953k no yes configured,alias:OpenRouter
qwen-portal/coder-model text 125k no yes configured,alias:qwen
qwen-portal/vision-model text+image 125k no yes configured
google/gemini-2.5-flash-lite text+image 1024k no yes configured

wicked solarBOT
#

Perfect — that’s the state you wanted:

  • ollama/qwen3.5:9b shows as Local: yes and tagged default
  • and you’ve cleared fallbacks, so it won’t silently jump to a paid provider for normal text chats

Next step: verify it’s actually answering via Telegram

  1. Send your bot a simple text like: “tell me a 1‑sentence joke”
  2. If it replies: you’re done for the “local text LLM” part.

Two practical follow-ups (so it stays working)

1) Make sure Ollama starts after reboots

Since OpenClaw depends on http://localhost:11434, you want Ollama to always be running. Easiest path: add Ollama to macOS Login Items (or just make sure the Ollama app launches on boot).

2) Know when it will still use cloud models

You still have cloud models configured (Anthropic/Google/etc). That’s fine and doesn’t cost anything unless used — but if you send images or use a vision-only workflow, OpenClaw may need a vision-capable model (often cloud).

If you want, tell me your goal:

#
  • Local-only, even if features break, or
  • Local for text, cloud allowed for images / special cases
    …and I’ll suggest the cleanest config for that.
snow siren
#

The reply was:

⚠️ Agent failed before reply: Model context window too small (8192 tokens). Minimum is 16000.
Logs: openclaw logs --follow

wicked solarBOT
#

Good news: Ollama is wired up correctly. Bad news: OpenClaw is refusing to use that model because (per your config) it only has an 8192 token context window, and this agent needs ≥ 16000 just to fit the system + tools.

This is fixable by increasing the declared contextWindow for your Ollama model entry.

Fix (2 commands + restart)

Run:

openclaw config set models.providers.ollama.models[0].contextWindow 16384 --strict-json
openclaw config set models.providers.ollama.models[0].maxTokens 163840 --strict-json
openclaw gateway restart

Then try your Telegram message again.

If it still errors

Run this and paste the output:

#
openclaw config get models.providers.ollama.models[0]

(Also, openclaw logs --follow is the right way to watch what’s happening, yep.)

snow siren
#

Sent it exactly the "tell me a 1-sentence joke" text, it showed "typing..." for a while. Then it stopped and about around two minutes later it replied with a joke. Is it normal for it to be this slow?

wicked solarBOT
#

Yeah — on a local 9B model + OpenClaw, that kind of delay can be normal, especially on the first request.

There are two main reasons it feels “weirdly slow” for a 1‑sentence joke:

  1. Cold start / model load
    The first time Ollama uses a model (or after it’s been idle/unloaded), it has to load weights into memory. First response can be dramatically slower than the next few.

  2. OpenClaw’s prompt is big (tools + policies)
    Even if your message is tiny, OpenClaw is sending a large system/tool setup along with it. The model still has to process all of that before it can output 1 sentence. On 16GB hardware, that “prompt processing” dominates.

Quick way to tell which one is biting you

Try the same prompt directly in Ollama (no OpenClaw overhead):

ollama run qwen3.5:9b "tell me a 1-sentence joke"
#
  • If this is fast (a few seconds) but Telegram is slow → it’s mostly OpenClaw prompt/tool overhead.
  • If this is also slow → it’s mostly hardware/model speed.

Biggest speed win on OpenClaw: reduce tools (shrinks the prompt)

If you’re currently using this as a “chat-only” agent, set a minimal tool profile:

openclaw config set tools.profile "minimal"
openclaw gateway restart

This can make local models feel much snappier because the model isn’t being fed huge tool schemas every turn. (You can switch back to full later when you want browsing/coding tools.)

Docs on tool profiles: https://docs.openclaw.ai/tools

If you tell me whether you want this agent to be chat-only or chat + web/browser automation, I can suggest the best tools.profile/allowlist combo for speed without breaking what you need.

snow siren
#

It took 66.8 seconds, including all the reasoning behind it. OC took nearly 2 minutes

wicked solarBOT
#

That comparison is actually super informative:

  • ~67s in raw Ollama ⇒ this model is already pretty heavy/slow on your 16GB box (especially if it insists on “thinking out loud”).
  • ~2 min via OpenClaw ⇒ expected, because OpenClaw adds a lot of extra prompt around your message (system instructions + tool schemas + safety/policy). More input tokens = more time before it can even start generating the joke.

So yes: the extra ~50–70 seconds is very plausibly just prompt overhead.

The quickest win (and why I suggested it)

If you set tools to minimal, OpenClaw stops sending huge tool schemas every turn, which can cut that overhead a lot:

openclaw config set tools.profile "minimal"
openclaw gateway restart

Then retry the same “1-sentence joke” and see if it’s closer to the ~67s baseline.

#

Reality check

Even at ~67s, that’s still slow for “chatty” usage. To get snappy local chat you usually need one (or more) of:

  • a smaller model for day-to-day chatting (and keep 9B for “heavier” requests), and/or
  • stronger hardware (though more RAM alone doesn’t guarantee speed; it mostly expands what you can run)

If you want, we can pinpoint where the extra time is going

Run openclaw logs --follow, send one prompt, then paste the few lines around the model request timing (there’s usually a “request took …ms” style line). That’ll tell us whether the delay is inside the LLM call vs queueing/Telegram/etc.

snow siren
#

Even calling the bot by his name just like "Bot?" takes 160 seconds through telegram

wicked solarBOT
#

160 seconds for just “Bot?” is not what you want — but it’s also very often explainable with OpenClaw:

The usual culprit: your session context is huge

Even if your new message is 1 token, the model still has to process:

  • the entire conversation so far, plus
  • OpenClaw’s system prompt + tool/policy prompt

If you’ve been testing a bunch (and the model has been outputting long “reasoning”), the context can balloon and everything gets slower and slower.

Do this first (fastest fix)

In Telegram, send:

  • /new

Then try again with something tiny like “hi”.

Also confirm you’re actually in “minimal tools” mode

Run:

#
openclaw config get tools.profile

If it’s not "minimal", set it (again) and restart:

openclaw config set tools.profile "minimal"
openclaw gateway restart

If it’s still slow after /new

Then it’s mostly just “this 9B model on 16GB is slow for agent-style prompts”.

At that point the real options are:

  • switch to a smaller local model for chat (look for :4b / :7b variants in the Ollama library), or
  • accept a cheap cloud model for “instant chat”, and keep local for heavier/offline use.

If you want, run openclaw logs --follow, send one “hi” after /new, and paste the lines showing how long the LLM call took + prompt token counts — that will tell us exactly whether it’s (a) prompt size, (b) model speed, or (c) something else in the pipeline.

snow siren
#

Took it 78 seconds after the prompt with the minimal tools patch

wicked solarBOT
#

78s after switching to minimal tools tells us two things:

  1. The “OpenClaw overhead” part is mostly under control now (good).
  2. The remaining slowness is basically the model/runtime speed on your 16GB Mac.

Because you measured ~67s in raw ollama run earlier, OpenClaw being ~78s is actually pretty close to the baseline — which means there isn’t a magical OpenClaw setting that will turn this into a 3‑second bot. You need a faster model (usually smaller) or different hardware.

What to do next (pick one)

Option A: Keep this model, accept it’s “slow but local”

This is fine for “fire-and-forget” tasks, but it won’t feel chatty/interactive.

Option B: Switch to a smaller local model for chat (recommended)

Look for a :4b or :7b class model in the Ollama library, pull it, and swap your OpenClaw default to it.

High-level steps:

  1. ollama pull <smaller-model-id>
#
  1. Update OpenClaw to use it:
openclaw config set models.providers.ollama.models[0].id "<smaller-model-id>"
openclaw config set agents.defaults.model.primary "ollama/<smaller-model-id>"
openclaw gateway restart

(If you tell me what smaller model id you pulled, I’ll give you the exact config set lines including updating the name field cleanly.)

One more useful debug command (shows you why it’s slow)

In Telegram, run:

  • /context detail

That will show how big your system/tool prompt is. If it’s still huge, we can trim more.

If your goal is “fast chatty assistant”, Option B is the realistic path on 16GB.

snow siren
#

Here’s the result of the /context detail:

🧠 Context breakdown (detailed)
Workspace: /Users/aiverse/.openclaw/workspace
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 36,632 chars (~9,158 tok) (Project Context 16,513 chars (~4,129 tok))
Injected workspace files:

• AGENTS.md: OK | raw 7,804 chars (~1,951 tok) | injected 7,804 chars (~1,951 tok)
• SOUL.md: OK | raw 1,664 chars (~416 tok) | injected 1,664 chars (~416 tok)
• TOOLS.md: OK | raw 850 chars (~213 tok) | injected 850 chars (~213 tok)
• IDENTITY.md: OK | raw 459 chars (~115 tok) | injected 459 chars (~115 tok)
• USER.md: OK | raw 583 chars (~146 tok) | injected 583 chars (~146 tok)
• HEARTBEAT.md: OK | raw 167 chars (~42 tok) | injected 167 chars (~42 tok)
• BOOTSTRAP.md: MISSING | raw 0 | injected 0
• MEMORY.md: OK | raw 4,298 chars (~1,075 tok) | injected 4,298 chars (~1,075 tok)
Skills list (system prompt text): 12,886 chars (~3,222 tok) (42 skills)
Skills: 1password, apple-notes, apple-reminders, bear-notes, blogwatcher, blucli, camsnap, clawhub, discord, eightctl, gemini, gh-issues, gifgrep, github, gog, goplaces, healthcheck, himalaya, imsg, mcporter, … (+22 more)

#

Top skills (prompt entry size):
• github: 569 chars (~143 tok)
• gh-issues: 505 chars (~127 tok)
• healthcheck: 488 chars (~122 tok)
• model-usage: 460 chars (~115 tok)
• things-mac: 433 chars (~109 tok)
• clawhub: 429 chars (~108 tok)
• weather: 413 chars (~104 tok)
• xurl: 384 chars (~96 tok)
• himalaya: 380 chars (~95 tok)
• apple-notes: 372 chars (~93 tok)
• 1password: 345 chars (~87 tok)
• goplaces: 331 chars (~83 tok)
• mcporter: 327 chars (~82 tok)
• apple-reminders: 307 chars (~77 tok)
• skill-creator: 293 chars (~74 tok)
• summarize: 293 chars (~74 tok)
• wacli: 274 chars (~69 tok)
• oracle: 273 chars (~69 tok)
• openai-image-gen: 269 chars (~68 tok)
• songsee: 248 chars (~62 tok)
• openai-whisper-api: 246 chars (~62 tok)
• ordercli: 245 chars (~62 tok)
• nano-banana-pro: 242 chars (~61 tok)
• obsidian: 242 chars (~61 tok)
• blogwatcher: 240 chars (~60 tok)
• gifgrep: 240 chars (~60 tok)
• imsg: 238 chars (~60 tok)
• nano-pdf: 231 chars (~58 tok)
• openai-whisper: 230 chars (~58 tok)
• eightctl: 229 chars (~58 tok)
… (+12 more skills)
Tool list (system prompt text): 185 chars (~47 tok)
Tool schemas (JSON): 89 chars (~23 tok) (counts toward context; not shown as text)
Tools: session_status
Top tools (schema size):
• session_status: 89 chars (~23 tok)
Top tools (summary text size):
• session_status: 207 chars (~52 tok)
Tools (param count):
• session_status: 2 params
Session tokens (cached): unknown / ctx=16384
Inline shortcut: a command token inside normal text (e.g. “hey /status”) that runs immediately (allowlisted senders only) and is stripped before the model sees the remaining message.

wicked solarBOT
#

That /context detail output basically answers the “why is it slow?” question:

You’re feeding the model ~9,158 tokens of system prompt before it even sees your message (plus the chat history). On a local 9B model, just reading that much text every turn is expensive.

Two biggest chunks you can trim immediately:

  • Skills list: ~3,222 tokens (“42 skills”)
  • Workspace files: AGENTS.md (~1,951 tok) + MEMORY.md (~1,075 tok) are pretty chunky

Fastest “make it faster” steps

1) Stop injecting the 42 bundled skills (big win)

Those skills are great when you’re using a strong cloud model, but for local chat they mostly just bloat the prompt.

Per docs, you can allowlist bundled skills. To effectively disable bundled skills injection:

#
openclaw config set skills.allowBundled '[]' --strict-json
openclaw gateway restart

Then do /new in Telegram and run /context detail again — you should see that skills section shrink a lot.

Docs: https://docs.openclaw.ai/tools/skills-config

2) Keep tools minimal (you already did)

That was the right move.

3) (Optional but huge) Slim down AGENTS.md / MEMORY.md

For a local-first “chat bot” workspace, you want those files tiny. Every extra line is paid for on every message.

If you want, paste your AGENTS.md and MEMORY.md sizes are already shown — you could cut them down to a few rules each and you’ll feel it immediately.

#

If you do step (1) and re-run /context detail, paste the new numbers (system prompt tokens + skills tokens). We can iterate until it feels acceptable on your hardware.

#

This is great debugging output — and it shows exactly what’s still bloating your prompt:

  • Tools are basically gone now (Tools: session_status, tiny schemas) ✅
  • But you’re still injecting ~42 skills into the system prompt every turn ❌
    (that was ~3,222 tokens in your earlier breakdown)

On a local 9B model, that skills list alone can cost you a lot of seconds per message.

Next step: disable bundled skills (and start a new session)

Per the docs, skills.allowBundled is the switch for bundled skills, and changes take effect on the next new session.

Run on the Mac:

openclaw config set skills.allowBundled '[]' --strict-json
openclaw gateway restart
#

Then in Telegram:

  1. /new
  2. /context detail again

You should see the skills section shrink dramatically (ideally to 0 bundled skills).

If skills still show up after that

Then they’re coming from ~/.openclaw/skills or <workspace>/skills (managed/workspace skills are not affected by allowBundled). In that case, paste:

openclaw config get skills.load.extraDirs

and we’ll disable those sources too.

Once the skills injection is gone, your local latency should drop noticeably.

snow siren
#

After step1

🧠 Context breakdown (detailed)
Workspace: /Users/aiverse/.openclaw/workspace
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 36,632 chars (~9,158 tok) (Project Context 16,513 chars (~4,129 tok))
Injected workspace files:

• AGENTS.md: OK | raw 7,804 chars (~1,951 tok) | injected 7,804 chars (~1,951 tok)
• SOUL.md: OK | raw 1,664 chars (~416 tok) | injected 1,664 chars (~416 tok)
• TOOLS.md: OK | raw 850 chars (~213 tok) | injected 850 chars (~213 tok)
• IDENTITY.md: OK | raw 459 chars (~115 tok) | injected 459 chars (~115 tok)
• USER.md: OK | raw 583 chars (~146 tok) | injected 583 chars (~146 tok)
• HEARTBEAT.md: OK | raw 167 chars (~42 tok) | injected 167 chars (~42 tok)
• BOOTSTRAP.md: MISSING | raw 0 | injected 0
• MEMORY.md: OK | raw 4,298 chars (~1,075 tok) | injected 4,298 chars (~1,075 tok)
Skills list (system prompt text): 12,886 chars (~3,222 tok) (42 skills)
Skills: 1password, apple-notes, apple-reminders, bear-notes, blogwatcher, blucli, camsnap, clawhub, discord, eightctl, gemini, gh-issues, gifgrep, github, gog, goplaces, healthcheck, himalaya, imsg, mcporter, … (+22 more)
Top skills (prompt entry size):
• github: 569 chars (~143 tok)
• gh-issues: 505 chars (~127 tok)
• healthcheck: 488 chars (~122 tok)
• model-usage: 460 chars (~115 tok)
• things-mac: 433 chars (~109 tok)

#

• clawhub: 429 chars (~108 tok)
• weather: 413 chars (~104 tok)
• xurl: 384 chars (~96 tok)
• himalaya: 380 chars (~95 tok)
• apple-notes: 372 chars (~93 tok)
• 1password: 345 chars (~87 tok)
• goplaces: 331 chars (~83 tok)
• mcporter: 327 chars (~82 tok)
• apple-reminders: 307 chars (~77 tok)
• skill-creator: 293 chars (~74 tok)
• summarize: 293 chars (~74 tok)
• wacli: 274 chars (~69 tok)
• oracle: 273 chars (~69 tok)
• openai-image-gen: 269 chars (~68 tok)
• songsee: 248 chars (~62 tok)
• openai-whisper-api: 246 chars (~62 tok)
• ordercli: 245 chars (~62 tok)
• nano-banana-pro: 242 chars (~61 tok)
• obsidian: 242 chars (~61 tok)
• blogwatcher: 240 chars (~60 tok)
• gifgrep: 240 chars (~60 tok)
• imsg: 238 chars (~60 tok)
• nano-pdf: 231 chars (~58 tok)
• openai-whisper: 230 chars (~58 tok)
• eightctl: 229 chars (~58 tok)
… (+12 more skills)
Tool list (system prompt text): 185 chars (~47 tok)
Tool schemas (JSON): 89 chars (~23 tok) (counts toward context; not shown as text)
Tools: session_status
Top tools (schema size):
• session_status: 89 chars (~23 tok)
Top tools (summary text size):
• session_status: 207 chars (~52 tok)
Tools (param count):
• session_status: 2 params
Session tokens (cached): unknown / ctx=16384
Inline shortcut: a command token inside normal text (e.g. “hey /status”) that runs immediately (allowlisted senders only) and is stripped before the model sees the remaining message.

wicked solarBOT
#

Those numbers are identical to before (still 42 skills / ~3,222 tokens), which strongly suggests the change hasn’t been applied to the session snapshot yet.

Two things to check:

1) Verify the config actually took

In Terminal, run:

openclaw config get skills.allowBundled

It should print:

  • []

If it’s null/missing (or not []), then the config set didn’t stick and we fix that first.

2) Start a NEW session (this is required for skills changes)

Skills are snapshotted when the session starts (docs: skills snapshot/performance). So after changing skills.allowBundled, you must do:

#

In Telegram (standalone message):

  • /new

Then run:

  • /context detail

If skills.allowBundled is [] and you’ve done /new, the skills list should drop (for bundled skills).

If you still see 42 skills after /new

Then those skills are not “bundled” anymore — they’re being loaded from ~/.openclaw/skills or <workspace>/skills (managed/workspace skills are unaffected by allowBundled).

In that case, paste:

openclaw config get skills.load.extraDirs

and also tell me if you ever installed skills via ClawHub (that often puts them into ~/.openclaw/skills). Then we’ll disable the managed/workspace skill sources cleanly.

#

Got it — still showing the full skills list, so we’re definitely not past the “session snapshot” issue yet (or skills.allowBundled didn’t apply).

Next 2 checks (these will tell us exactly which):

  1. In Terminal, paste:
openclaw config get skills.allowBundled
  1. In Telegram, send a standalone:
  • /new

…and then run /context detail again.

If skills.allowBundled prints [] and you’ve done /new and you still see those skills, then they’re coming from ~/.openclaw/skills or <workspace>/skills (managed/workspace), and we’ll disable that source next.

snow siren
#

bash-3.2$ openclaw config get skills.allowBundled

🦞 OpenClaw 2026.3.2 (85377a2) — Your personal assistant, minus the passive-aggressive calendar reminders.

[]
You have new mail in /var/mail/aiverse
bash-3.2$

wicked solarBOT
#

Perfect — skills.allowBundled is definitely set to [] now. 👍

Two important details:

  1. Skills are snapshotted when a session starts, so you must start a new session for this to affect /context.
  2. If you still see lots of skills after /new, then they’re not “bundled” anymore — they’re coming from managed/workspace skills (~/.openclaw/skills or <workspace>/skills), which allowBundled does not filter.

Do this next

Step A — Force a fresh session snapshot

In Telegram, send (standalone):

  • /new

Then run:

  • /context detail

Step B — If skills still show up, identify where they’re coming from

#

On the Mac, run:

openclaw skills list --eligible

That command is specifically meant to show what skills are eligible and (usually) where they’re loaded from. Paste the top chunk of that output and we’ll disable the right source (managed/workspace/extraDirs) so your local prompt shrinks and speed improves.

Docs for that command: https://docs.openclaw.ai/cli/skills

snow siren
#

⚠️ 📖 Read failed

🧠 Context breakdown (detailed)
Workspace: /Users/aiverse/.openclaw/workspace
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 36,632 chars (~9,158 tok) (Project Context 16,513 chars (~4,129 tok))
Injected workspace files:

• AGENTS.md: OK | raw 7,804 chars (~1,951 tok) | injected 7,804 chars (~1,951 tok)
• SOUL.md: OK | raw 1,664 chars (~416 tok) | injected 1,664 chars (~416 tok)
• TOOLS.md: OK | raw 850 chars (~213 tok) | injected 850 chars (~213 tok)
• IDENTITY.md: OK | raw 459 chars (~115 tok) | injected 459 chars (~115 tok)
• USER.md: OK | raw 583 chars (~146 tok) | injected 583 chars (~146 tok)
• HEARTBEAT.md: OK | raw 167 chars (~42 tok) | injected 167 chars (~42 tok)
• BOOTSTRAP.md: MISSING | raw 0 | injected 0

#

• MEMORY.md: OK | raw 4,298 chars (~1,075 tok) | injected 4,298 chars (~1,075 tok)
Skills list (system prompt text): 12,886 chars (~3,222 tok) (42 skills)
Skills: 1password, apple-notes, apple-reminders, bear-notes, blogwatcher, blucli, camsnap, clawhub, discord, eightctl, gemini, gh-issues, gifgrep, github, gog, goplaces, healthcheck, himalaya, imsg, mcporter, … (+22 more)
Top skills (prompt entry size):
• github: 569 chars (~143 tok)
• gh-issues: 505 chars (~127 tok)
• healthcheck: 488 chars (~122 tok)
• model-usage: 460 chars (~115 tok)
• things-mac: 433 chars (~109 tok)
• clawhub: 429 chars (~108 tok)
• weather: 413 chars (~104 tok)
• xurl: 384 chars (~96 tok)
• himalaya: 380 chars (~95 tok)
• apple-notes: 372 chars (~93 tok)
• 1password: 345 chars (~87 tok)
• goplaces: 331 chars (~83 tok)
• mcporter: 327 chars (~82 tok)
• apple-reminders: 307 chars (~77 tok)
• skill-creator: 293 chars (~74 tok)
• summarize: 293 chars (~74 tok)
• wacli: 274 chars (~69 tok)
• oracle: 273 chars (~69 tok)
• openai-image-gen: 269 chars (~68 tok)
• songsee: 248 chars (~62 tok)
• openai-whisper-api: 246 chars (~62 tok)
• ordercli: 245 chars (~62 tok)
• nano-banana-pro: 242 chars (~61 tok)
• obsidian: 242 chars (~61 tok)
• blogwatcher: 240 chars (~60 tok)
• gifgrep: 240 chars (~60 tok)
• imsg: 238 chars (~60 tok)
• nano-pdf: 231 chars (~58 tok)
• openai-whisper: 230 chars (~58 tok)
• eightctl: 229 chars (~58 tok)
… (+12 more skills)
Tool list (system prompt text): 185 chars (~47 tok)
Tool schemas (JSON): 89 chars (~23 tok) (counts toward context; not shown as text)
Tools: session_status
Top tools (schema size):
• session_status: 89 chars (~23 tok)
Top tools (summary text size):
• session_status: 207 chars (~52 tok)
Tools (param count):
• session_status: 2 params
Session tokens (cached): unknown / ctx=16384
Inline shortcut: a command token inside normal text (e.g. “hey /status”) that runs immediately (allowlisted senders only) and is stripped before the model sees the remaining message.

wicked solarBOT
#

That ⚠️ 📖 Read failed line means /context detail couldn’t read something it normally injects (a workspace file or a skill file). The snippet you pasted cuts off right before it would show which item failed, so I can’t tell what it is yet.

Two things to do:

1) Paste the rest of the /context detail output

Specifically the part that lists:

  • MEMORY.md: ... (and whether it says READ FAILED)
  • the Skills list section (how many skills now)
  • the Tools section (you said you’re on minimal tools — want to confirm it stuck)

2) Confirm where those “42 skills” are coming from

Since skills.allowBundled is [], bundled skills should be gone in a new session. If they’re still present, they’re almost certainly being loaded from managed/workspace skills.

Run on the Mac and paste the first ~30 lines:

openclaw skills list --eligible
#

That will tell us whether the skills are coming from:

  • ~/.openclaw/skills (managed/local)
  • <workspace>/skills
  • skills.load.extraDirs

Once we know the source, we can disable it cleanly (and your prompt size / latency will drop a lot).

#

Cool — this is now unambiguous:

  • skills.allowBundled is []
  • but you still have 42 skills injected

That means those 42 skills are not coming from “bundled skills” anymore. They’re coming from one of the other skill locations:

  • ~/.openclaw/skills (managed/local) or
  • <workspace>/skills or
  • skills.load.extraDirs

allowBundled can’t hide those (by design).

Next step: find the source path

Run this on the Mac and paste the output (or at least the first 30 lines):

#
openclaw skills list --eligible

That command will show where each eligible skill is loaded from.

If they’re mostly from ~/.openclaw/skills (most common)

And you want a fast local chat bot, the quickest reversible way to stop injecting them is to temporarily move that folder out of the way:

mv ~/.openclaw/skills ~/.openclaw/skills.disabled
openclaw gateway restart

Then in Telegram:

  • /new
  • /context detail
#

You should see the skills list drop (or become tiny), and latency should improve noticeably.

Nothing is deleted — you can undo it anytime:

mv ~/.openclaw/skills.disabled ~/.openclaw/skills

Before we do the move though, paste openclaw skills list --eligible so we’re not guessing.

snow siren
#

Here it goes again then

#

🧠 Context breakdown (detailed)
Workspace: /Users/aiverse/.openclaw/workspace
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 36,632 chars (~9,158 tok) (Project Context 16,513 chars (~4,129 tok))
Injected workspace files:

• AGENTS.md: OK | raw 7,804 chars (~1,951 tok) | injected 7,804 chars (~1,951 tok)
• SOUL.md: OK | raw 1,664 chars (~416 tok) | injected 1,664 chars (~416 tok)
• TOOLS.md: OK | raw 850 chars (~213 tok) | injected 850 chars (~213 tok)
• IDENTITY.md: OK | raw 459 chars (~115 tok) | injected 459 chars (~115 tok)
• USER.md: OK | raw 583 chars (~146 tok) | injected 583 chars (~146 tok)
• HEARTBEAT.md: OK | raw 167 chars (~42 tok) | injected 167 chars (~42 tok)
• BOOTSTRAP.md: MISSING | raw 0 | injected 0

#

• MEMORY.md: OK | raw 4,298 chars (~1,075 tok) | injected 4,298 chars (~1,075 tok)
Skills list (system prompt text): 12,886 chars (~3,222 tok) (42 skills)
Skills: 1password, apple-notes, apple-reminders, bear-notes, blogwatcher, blucli, camsnap, clawhub, discord, eightctl, gemini, gh-issues, gifgrep, github, gog, goplaces, healthcheck, himalaya, imsg, mcporter, … (+22 more)
Top skills (prompt entry size):
• github: 569 chars (~143 tok)
• gh-issues: 505 chars (~127 tok)
• healthcheck: 488 chars (~122 tok)
• model-usage: 460 chars (~115 tok)
• things-mac: 433 chars (~109 tok)
• clawhub: 429 chars (~108 tok)
• weather: 413 chars (~104 tok)
• xurl: 384 chars (~96 tok)
• himalaya: 380 chars (~95 tok)
• apple-notes: 372 chars (~93 tok)
• 1password: 345 chars (~87 tok)
• goplaces: 331 chars (~83 tok)
• mcporter: 327 chars (~82 tok)
• apple-reminders: 307 chars (~77 tok)
• skill-creator: 293 chars (~74 tok)
• summarize: 293 chars (~74 tok)
• wacli: 274 chars (~69 tok)
• oracle: 273 chars (~69 tok)
• openai-image-gen: 269 chars (~68 tok)
• songsee: 248 chars (~62 tok)
• openai-whisper-api: 246 chars (~62 tok)
• ordercli: 245 chars (~62 tok)
• nano-banana-pro: 242 chars (~61 tok)
• obsidian: 242 chars (~61 tok)
• blogwatcher: 240 chars (~60 tok)
• gifgrep: 240 chars (~60 tok)
• imsg: 238 chars (~60 tok)
• nano-pdf: 231 chars (~58 tok)
• openai-whisper: 230 chars (~58 tok)
• eightctl: 229 chars (~58 tok)
… (+12 more skills)
Tool list (system prompt text): 185 chars (~47 tok)
Tool schemas (JSON): 89 chars (~23 tok) (counts toward context; not shown as text)
Tools: session_status
Top tools (schema size):
• session_status: 89 chars (~23 tok)
Top tools (summary text size):
• session_status: 207 chars (~52 tok)
Tools (param count):
• session_status: 2 params
Session tokens (cached): unknown / ctx=16384
Inline shortcut: a command token inside normal text (e.g. “hey /status”) that runs immediately (allowlisted senders only) and is stripped before the model sees the remaining message.

wicked solarBOT
#

Yep — next step is just to grab the source paths so we stop guessing.

Run on the Mac and paste the output here:

openclaw skills list --eligible

If it’s long, even the first ~40 lines is enough — I’m mainly looking for whether the paths point at ~/.openclaw/skills or <workspace>/skills (or an extraDirs folder).

#

That’s still the /context detail output (from Telegram).

What we need now is a Terminal command on the Mac that shows where the skills are coming from:

openclaw skills list --eligible

Please copy/paste the output of that command here (even just the first ~40 lines). It will include the file paths, which is the missing piece — that’s how we’ll tell if those 42 skills are coming from:

  • ~/.openclaw/skills (managed/local)
  • /Users/aiverse/.openclaw/workspace/skills (workspace)
  • or an extraDirs folder

Once we see the paths, the fix is straightforward.

#

You’re still sending the Telegram /context detail output — that’s useful, but it won’t tell us where those skills live on disk.

If you’re having trouble getting openclaw skills list --eligible output, we can do a simpler “brute force but reversible” test that answers the same question:

Reversible test: temporarily disable managed/workspace skill folders

On the Mac mini Terminal (not Telegram), run these one at a time:

1) Check if the managed skills folder exists

ls -la ~/.openclaw/skills

If that shows a folder full of skills, temporarily move it out of the way:

mv ~/.openclaw/skills ~/.openclaw/skills.disabled
#

2) Check if the workspace skills folder exists

ls -la ~/.openclaw/workspace/skills

If it exists and has skills, disable it too:

mv ~/.openclaw/workspace/skills ~/.openclaw/workspace/skills.disabled

3) Restart + new session

openclaw gateway restart

Then in Telegram:

  • /new
  • /context detail
#

If the skills list disappears (or drops to ~0), we found the source and your prompt will shrink a lot → faster replies.

Undo anytime:

mv ~/.openclaw/skills.disabled ~/.openclaw/skills
mv ~/.openclaw/workspace/skills.disabled ~/.openclaw/workspace/skills
openclaw gateway restart

If you run step (1) and paste what ls -la ~/.openclaw/skills prints (even just “No such file” vs showing contents), I can tell you exactly which branch to take.

snow siren
#

bash-3.2$ openclaw skills list --eligible

🦞 OpenClaw 2026.3.2 (85377a2) — It's not "failing," it's "discovering new ways to configure the same thing wrong."

Skills (42/42 ready)
┌──────────┬──────────────────┬────────────────────────────────────────────────────────────────────┬──────────────────┐
│ Status │ Skill │ Description │ Source │
├──────────┼──────────────────┼────────────────────────────────────────────────────────────────────┼──────────────────┤
│ ✓ ready │ 🔐 1password │ Set up and use 1Password CLI (op). Use when installing the CLI, │ openclaw-bundled │
│ │ │ enabling desktop app integration, signing in (single or multi- │ │
│ │ │ account), or reading/injecting/running secrets via op. │ │
│ ✓ ready │ 📝 apple-notes │ Manage Apple Notes via the memo CLI on macOS (create, view, │ openclaw-bundled │
│ │ │ edit, delete, search, move, and export notes). Use when a user │ │
│ │ │ asks OpenClaw to add a note, list notes, search notes, or manage │ │
│ │ │ note folders. │ │
│ ✓ ready │ ⏰ apple- │ Manage Apple Reminders via remindctl CLI (list, add, edit, │ openclaw-bundled │
│ │ reminders │ complete, delete). Supports lists, date filters, and JSON/plain │ │
│ │ │ output. │ │

#

│ ✓ ready │ 🐻 bear-notes │ Create, search, and manage Bear notes via grizzly CLI. │ openclaw-bundled │
│ ✓ ready │ 📰 blogwatcher │ Monitor blogs and RSS/Atom feeds for updates using the │ openclaw-bundled │
│ │ │ blogwatcher CLI. │ │
│ ✓ ready │ 🫐 blucli │ BluOS CLI (blu) for discovery, playback, grouping, and volume. │ openclaw-bundled │
│ ✓ ready │ 📸 camsnap │ Capture frames or clips from RTSP/ONVIF cameras. │ openclaw-bundled │
│ ✓ ready │ 📦 clawhub │ Use the ClawHub CLI to search, install, update, and publish agent │ openclaw-bundled │
│ │ │ skills from clawhub.com. Use when you need to fetch new skills on │ │
│ │ │ the fly, sync installed skills to latest or a specific version, │ │
│ │ │ or publish new/updated skill folders with the npm-installed │ │
│ │ │ clawhub CLI. │ │
│ ✓ ready │ 🎮 discord │ Discord ops via the message tool (channel=discord). │ openclaw-bundled │
│ ✓ ready │ 🎛️ eightctl │ Control Eight Sleep pods (status, temperature, alarms, schedules). │ openclaw-bundled │
│ ✓ ready │ ♊️ gemini │ Gemini CLI for one-shot Q&A, summaries, and generation. │ openclaw-bundled │

wicked solarBOT
#

Awesome — this output is exactly what we needed.

Key point: your 42 skills are 100% bundled (Source = openclaw-bundled). So skills.allowBundled should be able to filter them.

But since skills.allowBundled is currently [] and you still see 42/42 ready, OpenClaw is almost certainly treating an empty allowlist as “no filter” (i.e., allow everything). That’s a common allowlist semantics gotcha.

Workaround: set allowBundled to a non-empty list

If you want zero bundled skills injected, set it to a skill name that doesn’t exist:

openclaw config set skills.allowBundled '["__none__"]' --strict-json
openclaw gateway restart

Then in Telegram:

  • /new
  • /context detail
#

And in Terminal, confirm:

openclaw skills list --eligible

You should now see 0 eligible bundled skills, and your system prompt should shrink by ~3,222 tokens (the skills list), which helps local speed.

If you do want a tiny set of skills (instead of none)

Set skills.allowBundled to just a couple you actually need (much smaller prompt than 42).

If ["__none__"] still doesn’t reduce the eligible list, that’s a bug — and it’d be worth filing an issue with the exact openclaw --version + openclaw config get skills.allowBundled + openclaw skills list --eligible output.

#

Yep — that’s still the “everything allowed” state.

Now do the change + re-check:

  1. Set a non-empty allowlist that matches nothing:
openclaw config set skills.allowBundled '["__none__"]' --strict-json
openclaw gateway restart
  1. Start a fresh session snapshot in Telegram:
  • /new
  1. Re-run and paste just the top part (the “Skills (… ready)” line is enough):
openclaw skills list --eligible
#

If this works, it should drop from 42/42 ready to 0 ready (or close to it), and /context detail should no longer show that 42-skill list being injected.

snow siren
#

🧠 Context breakdown (detailed)
Workspace: /Users/aiverse/.openclaw/workspace
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 23,348 chars (~5,837 tok) (Project Context 16,513 chars (~4,129 tok))
Injected workspace files:

• AGENTS.md: OK | raw 7,804 chars (~1,951 tok) | injected 7,804 chars (~1,951 tok)
• SOUL.md: OK | raw 1,664 chars (~416 tok) | injected 1,664 chars (~416 tok)
• TOOLS.md: OK | raw 850 chars (~213 tok) | injected 850 chars (~213 tok)
• IDENTITY.md: OK | raw 459 chars (~115 tok) | injected 459 chars (~115 tok)
• USER.md: OK | raw 583 chars (~146 tok) | injected 583 chars (~146 tok)
• HEARTBEAT.md: OK | raw 167 chars (~42 tok) | injected 167 chars (~42 tok)
• BOOTSTRAP.md: MISSING | raw 0 | injected 0

#

• MEMORY.md: OK | raw 4,298 chars (~1,075 tok) | injected 4,298 chars (~1,075 tok)
Skills list (system prompt text): 0 chars (~0 tok) (0 skills)
Skills: (none)
Tool list (system prompt text): 185 chars (~47 tok)
Tool schemas (JSON): 89 chars (~23 tok) (counts toward context; not shown as text)
Tools: session_status
Top tools (schema size):
• session_status: 89 chars (~23 tok)
Top tools (summary text size):
• session_status: 207 chars (~52 tok)
Tools (param count):
• session_status: 2 params
Session tokens (cached): unknown / ctx=16384
Inline shortcut: a command token inside normal text (e.g. “hey /status”) that runs immediately (allowlisted senders only) and is stripped before the model sees the remaining message.

wicked solarBOT
#

Nice — that’s a win.

Your system prompt dropped from ~9,158 tok → ~5,837 tok, which is exactly what we wanted (it strongly suggests the 42-skill list is no longer being injected).

Next: confirm + re-test speed

  1. Scroll a bit further down in /context detail and confirm it now says something like:
  • Skills list: 0 skills (or missing entirely)
  1. Then try a simple message in Telegram again (e.g. “hi” or “1-sentence joke”) and time it.

You should see a noticeable speedup because the model has ~3k fewer tokens to read every turn.

If it’s still too slow

At this point the remaining biggest prompt chunk is your workspace files, especially:

  • AGENTS.md (~1,951 tok)
  • MEMORY.md (~1,075 tok)
#

For a local chat-only bot, you can often shrink those a lot (or use a separate minimal workspace) and get another meaningful latency drop.

#

Perfect — that’s exactly the “lean local chat” setup:

  • Skills: none (0 tok) ✅
  • Tools: session_status only ✅
  • System prompt is now much smaller ✅

Now the only big remaining prompt chunks are your injected workspace files (especially AGENTS.md and MEMORY.md), and then the raw speed of the local model itself.

Next: re-test latency

Try the same Telegram prompt again (“hi” / “1‑sentence joke”) and time it. It should be noticeably faster than before.

If it’s still too slow

Two levers left:

  1. Slim AGENTS.md / MEMORY.md
    For a local chat bot, you can often cut AGENTS.md down to ~10–20 lines and keep MEMORY.md tiny/empty. Every token there is paid every message.
#
  1. Use a smaller local model for chat
    Even with the prompt trimmed, a 9B model on 16GB can just be inherently slow. If you want “near-instant” replies, you’ll usually need a smaller model for day-to-day chat.

If you tell me the new timed result after this prompt cleanup, I can tell you whether you’re hitting “prompt overhead” still or just the model/hardware limit.

snow siren
#

Took it about 26 seconds, which is a massive improvement from the initial time

wicked solarBOT
#

26 seconds is a huge improvement — that tracks perfectly with what we fixed (you stopped paying ~3k “skills list” tokens every single message).

Quick recap of what’s now making it fast(er):

  • Skills injected: 0
  • Tools: session_status only
  • Much smaller system prompt → far less “prompt processing” time per turn

What to expect going forward

  • The first reply after a long idle/reboot can still be slower (model cold-start / load).
  • 26s is about what I’d call “usable but not chatty”. If you want near-instant replies, the next lever is usually a smaller local model (or more compute), not more config trimming.

Don’t forget how to “turn features back on” later

Right now you’ve intentionally stripped things down for speed. When you want skills back:

  • you can remove the bundled-skill block with:
openclaw config unset skills.allowBundled
#
openclaw gateway restart

(and /new in Telegram so the session re-snapshots skills)

Same idea for tools: if you later want browsing/web/etc, you’ll switch tools.profile back from minimal.

If this got you to a good baseline, please mark the solution in the thread so the fix is searchable for the next person.

snow siren
#

Now if we consider a 4b model instead but with I some skills and tools with it, will those 26 seconds improve or degrade?

wicked solarBOT
#

Mostly improve, unless you re-bloat the prompt again.

A decent mental model is:

latency ≈ (input tokens the model must read + output tokens it generates) ÷ tokens/sec of the model

So two knobs fight each other:

1) Smaller model (9B → ~4B)

  • Usually faster per token on the same Mac (often noticeably faster).
  • But quality drops, and you may need more back-and-forth to get the same result (which can erase the speed win for “real tasks”).

2) Re-enabling skills/tools

  • Increases input tokens every single message.
  • The “42 skills list” you had earlier was ~3,222 tokens of extra prompt. That alone added a ton of time.
  • Some tools (especially UI/browser ones) add big schemas, which can also force larger context windows and slow things down.
#

Rule of thumb for your case

  • 4B + a small handful of skills/tools (say 0–5 skills, and a light tool profile) will likely feel faster than your current 9B setup.
  • 4B + “turn everything back on” (dozens of skills + heavy tools) will likely creep back toward slow again, because prompt size dominates.

Best way to do this without guessing

  1. Switch to the 4B model
  2. Re-enable only the 1–3 skills/tools you actually want
  3. Run /context detail and watch the system prompt tokens
  4. Time a fixed prompt (“1‑sentence joke”, “summarize this sentence”, etc.)

If you tell me what tools you want (just web? browser? email? reminders?), I can suggest the smallest tools.profile + skills.allowBundled combo that gets you that capability without going back to a 9k-token system prompt.

snow siren
#

Say (as an example) I want to use the agent to put in place a betting strategy on polymarket and use the agent’s web browsing capabilities (API and without API) to continuously monitor the web for news related to the topics it is betting on so that it can adjust the strategy and improve its odds. What skills and tools would I need?

wicked solarBOT
#

For that Polymarket + “monitor news and adjust” workflow, think in capabilities first (tools), then optional helper wrappers (skills). Also: I’d strongly recommend human-in-the-loop for any trade/bet execution and to check Polymarket’s ToS/geo rules before automating anything.

Tools you’d need (the real “power”)

Minimum set for monitor → decide → notify:

  1. Web monitoring
  • web_search (find new items fast)
  • web_fetch (pull article text for summarizing/extraction)
  1. Interaction with Polymarket
  • Prefer API (more reliable): typically via exec running a small script/CLI that calls the API (or a custom tool/skill you write that wraps it).
  • “Without API” (UI automation): browser tool (works, but more brittle—selectors change, bot detection, logins, etc.)
  1. Automation / running continuously
  • cron tool (run every N minutes / on schedule)
  1. State + reporting
#
  • read/write (store current positions, last-seen headlines, decision logs, etc.)
  • message (send you alerts/approval requests to Telegram)

Docs: Tools overview https://docs.openclaw.ai/tools

Skills you might enable (optional, but can help)

These don’t add new powers; they mostly add guidance / workflows. For this use case, useful ones are typically:

  • a feed/news watcher skill (RSS/blog monitoring)
  • a summarizer skill (turn long articles into “impact on market?” bullets)
  • a URL/article cleaner skill

You can also just skip skills entirely and rely on the tools above (often better for keeping prompts small on local models).

Practical architecture (what usually works best)

  • Agent A (chatty, fast, local): minimal tools, just talks to you.
  • Agent B (worker): has cron + web_search/web_fetch + browser/exec + message, runs scheduled checks, and sends you “Here’s what changed + what I propose” messages. You approve before it places/adjusts bets.
#

If you tell me whether you want API-only (recommended) or UI automation too, I can suggest the smallest tool allowlist/profile that enables it without blowing your prompt size back up.

snow siren
#

Would any of this work better on a 4b model, or even better, Gemini 2.5 flash lite?

wicked solarBOT
#

For the Polymarket worker idea (web monitoring + decide + maybe act), a 4B local model and Gemini 2.5 Flash Lite will feel very different:

4B local (Ollama)

Pros

  • Free per-token (after hardware)
  • Private/local
  • Can be fast if the prompt is lean

Cons (big for your use case)

  • Much less reliable at multi-step tool use (browser automation, keeping state, not getting confused by long pages)
  • More likely to need extra back-and-forth to get the same result
  • If you re-enable lots of tools/skills, it can still bog down because it must read a big prompt every turn

Where it fits best: “chat + simple summarization/extraction” and as a cheap local assistant, not as the main autonomous web/trading worker.

Gemini 2.5 Flash Lite (hosted)

Pros

#
  • Typically way better at agentic workflows: web research, long context, consistent tool calling, planning
  • Much faster wall-clock for “read a bunch of stuff and decide”

Cons

  • Costs money
  • Data leaves your machine (provider/privacy considerations)

Where it fits best: the worker agent that does continuous monitoring + web tasks, then sends you “here’s what changed + what I propose” messages.

Practical recommendation

  • Use local (4B/9B) for day-to-day chat and lightweight tasks.
  • Use Flash Lite (or another strong hosted model) for the “monitor + browse + decide” worker, with human approval before any bet placement.

If you tell me whether you want API-only Polymarket interaction or UI automation too, I can suggest a minimal tool set and a split that keeps token spend low while staying reliable.

snow siren
#

Let’s move on to qwen 4b and check the speed, and then decide

wicked solarBOT
#

Cool — let’s do a clean A/B speed test.

Step 0 — Pick the exact Ollama model ID

“qwen 4b” needs the exact Ollama tag (something like …:4b).
Grab the exact ID from the Ollama library page you’re using, then we’ll plug it in below as:

<QWEN_4B_ID>

Step 1 — Pull the 4B model

ollama pull <QWEN_4B_ID>
ollama list

(Optional quick baseline, no OpenClaw overhead):

#
time ollama run <QWEN_4B_ID> "tell me a 1-sentence joke"

Step 2 — Switch OpenClaw to the 4B model

You currently have a single explicit Ollama model entry, so we’ll just swap that entry + the default:

openclaw config set models.providers.ollama.models[0].id "<QWEN_4B_ID>"
openclaw config set agents.defaults.model.primary "ollama/<QWEN_4B_ID>"
openclaw gateway restart
openclaw models list

Step 3 — Test on Telegram (important)

In Telegram:

  • /new
#
  • then send: tell me a 1-sentence joke
    Time it like before.

Rollback (if it’s worse)

openclaw config set models.providers.ollama.models[0].id "qwen3.5:9b"
openclaw config set agents.defaults.model.primary "ollama/qwen3.5:9b"
openclaw gateway restart

Reply with the exact <QWEN_4B_ID> you plan to pull (copy/paste from Ollama), and your measured times (direct Ollama + Telegram/OpenClaw).

snow siren
#

step1

bash-3.2$ bash

The default interactive shell is now zsh.
To update your account to use zsh, please run chsh -s /bin/zsh.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$ time ollama run <QWEN_4B_ID> "tell me a 1-sentence joke"
bash: QWEN_4B_ID: No such file or directory

real 0m0.003s
user 0m0.000s
sys 0m0.001s

wicked solarBOT
#

That error is just because you literally ran the placeholder. In shells, the < ... > part is not “variables” — < is treated as input redirection, so it tries to run a command called QWEN_4B_ID, etc.

For Qwen 3.5, the 4B tag is:

qwen3.5:4b (Ollama library lists 0.8b/2b/4b/9b/etc.)

Do this instead

1) Pull the 4B model

ollama pull qwen3.5:4b
ollama list

2) Baseline speed test (direct Ollama)

#
time ollama run qwen3.5:4b "tell me a 1-sentence joke"

3) Switch OpenClaw to it

openclaw config set models.providers.ollama.models[0].id "qwen3.5:4b"
openclaw config set agents.defaults.model.primary "ollama/qwen3.5:4b"
openclaw gateway restart

Then in Telegram:

  • /new
  • send the same prompt and time it

Paste the two timings (direct Ollama + Telegram/OpenClaw) and we’ll decide if 4B is the better default for you.

snow siren
#

real 4m19.689s
user 0m0.380s
sys 0m0.465s

#

thats for 4b

#

im waiting on the telegram results now

wicked solarBOT
#

Oof — 4m19s for a direct ollama run is not what we’d expect from a 4B model. That’s slower than your 9B baseline, which means something’s off (or it did a huge “thinking” dump).

A couple quick sanity checks before we conclude “4B is worse”:

1) Was that the first run after pulling?

The first run can be much slower (load/compile/warm-up). Please run it a second time and time it again:

time ollama run qwen3.5:4b "tell me a 1-sentence joke. Output ONLY the joke."

2) Did it output a ton of text/reasoning?

If it printed a long explanation, that alone can add minutes. If you can, tell me roughly how many lines it produced.

3) Show the model sizes you have installed

Paste:

#
ollama list

If the 2nd run is still minutes…

Then yeah: for your machine/setup, qwen3.5:4b is not a speed win, and you should stick with the 9B (since you got it down to ~26s in OpenClaw) or try a different small model variant.

Send me the second timing + ollama list and we’ll decide whether to switch OpenClaw over or roll back.

#

Got it — if qwen3.5:4b is taking 4m19s directly in Ollama, then switching OpenClaw to it won’t make anything faster (OpenClaw will only add overhead).

Before we write it off completely, we need 2 quick data points:

  1. Second-run timing (warm):
time ollama run qwen3.5:4b "tell me a 1-sentence joke. Output ONLY the joke."
  1. Your installed models + sizes:
ollama list

If the second run is still in the multi-minute range, I’d roll back and stick with the 9B (since we already got that down to ~26s in Telegram), and we can look for a different small model that actually improves latency.

#

Makes sense — if OpenClaw is currently pointed at the 4B model, Telegram can easily take minutes (your direct Ollama baseline was ~4m).

While you’re waiting, two quick checks help keep this controlled:

  1. Confirm what model Telegram is actually using:
openclaw models list

(look for which one is tagged default)

  1. If it’s still “typing…” after ~2 minutes and you don’t want to wait forever, you can abort the in-flight turn from Telegram with:
  • /stop

If the Telegram result comes back anywhere near that 4-minute Ollama time, I’d roll back to the 9B as your default (since we already got that down to ~26s with prompt slimming).

snow siren
#

When I changed the model to :4b and sent the /new command to telegram, I got this:

✅ New session started · model: ollama/qwen3.5:4b

[MISSING] Expected at: /Users/aiverse/.openclaw/workspace/BOOTSTRAP.md

wicked solarBOT
#

That message is normal.

/new starts a fresh session and OpenClaw prints a little bootstrap check. It can inject a BOOTSTRAP.md file (if present) as “startup instructions” for the agent — but in your workspace it isn’t there, so it reports:

[MISSING] Expected at: .../BOOTSTRAP.md

Nothing is broken; it’s just informational. In fact, for a local-speed-focused setup, you probably want it missing (or empty), because anything in BOOTSTRAP.md would be extra prompt tokens every session.

Next step is simply: send a normal prompt now and time it. If the 4B model is painfully slow, roll back to the 9B default.

snow siren
#

21 seconds to tell a joke through telegram on the 4b model

wicked solarBOT
#

Nice — 21s vs ~26s is a real improvement (and it confirms your setup is now “prompt-light” enough that model size/speed actually matters).

A few practical takeaways:

  • The speed win is modest (~20% faster), so the real question is quality:

  • If the 4B model still answers well for your day-to-day chat/summaries → keep it as default.

  • If you notice it getting confused / giving weaker answers → the 9B is usually the better “brain”, just a bit slower.

  • As soon as you turn on heavier tools/skills (browser/web/automation), the 4B model is more likely to struggle than the 9B. For your Polymarket-style “worker agent” idea, I’d still expect you’ll want either:

  • a bigger local model, or

  • a hosted model for the worker, with local for chat.

If you want a clean decision: try 5 prompts you actually care about (summarize an article, extract key facts, write a short email reply, etc.) on 4B, then switch back to 9B and compare quality. Speed is only worth it if the answers are still usable.

snow siren
#

Tell me what 5 prompts would help me the most for the polymarket strategy I told you about as an example. And tell me what tasks I should give my local LLM agent (qwen 3.5 4b or 9b if you deem it better for the job in hand) and what tasks I should give to another agent using Gemini 2.5 flash lite, and how to create that agent

wicked solarBOT
#

I’ll keep this non-gambling-advice / non-automation-by-default: the safe pattern is monitor + analyze + propose, then you approve before any bet/trade action. (Also double-check Polymarket ToS/region rules before automating anything.)

5 prompts that actually move you forward (for the “Polymarket worker” agent)

Use these as copy/paste prompts to your Gemini 2.5 Flash Lite worker (because it’ll be doing web + long-context + tool-heavy work):

  1. Market spec + constraints (turn vague idea into a config)

“Help me define a monitoring + decision spec for Polymarket market: <paste market URL + rules text>.
Output JSON with: markets[], outcomes[], what events invalidate the thesis, max exposure, max daily changes, cooldown rules, and what data sources to monitor.”

  1. News monitoring plan (queries + sources)

“Create a news monitoring plan for this market.
Output: (a) 10 web_search queries (include synonyms, people/orgs, key phrases), (b) 10 trustworthy sources/RSS feeds, (c) a schedule (how often to check), (d) keywords that indicate material updates.”

  1. Article triage (convert articles into ‘does this matter?’)

“Given this article text: <paste fetched text>, extract the new factual claims, rate relevance to each outcome (0–5), and explain in 3 bullets what it changes (if anything). Output a table.”

  1. Portfolio/position review (human-in-the-loop action proposal)
#

“Given current positions + odds (I’ll paste them), and the last 24h of signals, propose ‘Hold/Adjust/Exit’ with: reason, confidence, max size change, and a one-line message to request my approval. Do NOT execute anything.”

  1. Monitoring log + post-mortem

“Maintain a decision log. For every proposed change, record: timestamp, evidence links, what changed, what was decided, and what would falsify it. Output append-only JSONL entries.”

What to give the local agent vs the Gemini agent

Local agent (Qwen 4B/9B) — keep it “fast + cheap”

Best tasks:

  • Your chat interface (“what are we monitoring?”, “summarize last update”, “what’s the current plan?”)
  • Formatting/summarizing messages you’ll read on your phone
  • Simple “config edits” / “reminders” / “status checks”

Model choice:

  • 4B if you prioritize speed for chat/summaries
  • 9B if you notice the 4B gets confused or misses nuance

Keep this agent’s tools/skills minimal (like you’ve done), otherwise you’ll lose the speed advantage.

#

Gemini 2.5 Flash Lite worker — “tool-heavy analyst”

Best tasks:

  • Web monitoring: web_search, web_fetch
  • Browser automation (only if needed): browser
  • Scheduled monitoring: cron
  • Parsing lots of text and producing structured recommendations

How to create a second “Gemini worker” agent (recommended approach)

The cleanest beginner setup is two Telegram bots → two isolated agents.

  1. Create a 2nd Telegram bot in BotFather (get a second token)

  2. Add a new agent workspace

openclaw agents add polymarket

Docs: https://docs.openclaw.ai/concepts/multi-agent

#
  1. Bind that Telegram bot to the new agent
    In ~/.openclaw/openclaw.json, you’ll end up with something like (from the docs pattern):
{
agents: { list: [
{ id: "main", default: true, workspace: "~/.openclaw/workspace" },
{ id: "polymarket", workspace: "~/.openclaw/workspace-polymarket" },
]},
bindings: [
{ agentId: "main", match: { channel: "telegram", accountId: "default" } },
{ agentId: "polymarket", match: { channel: "telegram", accountId: "polymarket" } },
],
channels: { telegram: { accounts: {
default: { botToken: "…", dmPolicy: "pairing" },
polymarket: { botToken: "…", dmPolicy: "pairing" }
#
}}}
}
  1. Restart:
openclaw gateway restart
  1. DM the polymarket bot and set its session model once:
  • /new
  • /model google/gemini-2.5-flash-lite

From there, you talk to the local bot for “fast chat”, and the polymarket bot for “worker tasks”.

If you want, paste your current openclaw config get channels.telegram.accounts (redact tokens) and I’ll tell you the exact minimal diff to add the second bot + binding.

snow siren
#

On your 1 marker spec step, do I have to give it a specific URL? Or can I simply tell it to search the web for news in general?

wicked solarBOT
#

For the market spec prompt, you really want to give it something concrete about the market.

Best: give the Polymarket market URL

That lets the worker agent anchor on:

  • the exact question
  • outcomes
  • resolution/settlement criteria
  • deadlines / edge cases

Without that, it’s very easy for the agent to “spec” the wrong market (or invent resolution rules).

If you don’t have the URL handy

You can still do it, but you must paste at least:

  • the exact market question text
  • the outcomes
  • the settlement rules (or a screenshot / copied text)
#

“Search the web for news in general?”

You can, but it won’t be useful unless you narrow it. “News in general” is infinite; you’ll drown in irrelevant articles and burn tokens.

A good middle ground prompt is:

“Search the web for news related to <topic/person/company/event> that could affect the probability of <outcome A/B> in this market: <paste market question/outcomes>. Propose 10 focused queries + 10 reliable sources + an update cadence.”

If you paste one market URL (or the question/outcomes text), I can rewrite your “market spec” prompt so it’s tight and doesn’t waste searches.

snow siren
#

On another note: If I am limited by RAM, would it help to have 10 different agents asking 10 different questions in parallel with the local qwen3.5 instead of having a single agent asking 10 questions one after the other? Time wise

wicked solarBOT
#

On one Mac mini running one local model, spinning up 10 agents in parallel usually does not make it faster — it usually makes it slower (and less stable).

Why:

The bottleneck is compute, not “number of agents”

Local inference is basically: one GPU/CPU crunching tokens. If you run 10 requests at once, they don’t magically get 10× compute — they time-slice the same hardware.

So total throughput is roughly the same (often worse), and:

  • each individual reply takes longer (higher latency)
  • you risk RAM pressure / swapping (which is catastrophic for speed)

Parallel can help only when you’re I/O-bound

If the tasks are mostly “wait for web pages / APIs”, parallelism helps.
But if each task is “read big prompt → think”, local LLM inference dominates, and parallelism hurts.

Practical rule on a 16GB local setup

  • Keep one worker doing LLM calls sequentially.
#
  • If you must parallelize, do it lightly (e.g. 2 at a time), and only for I/O-heavy steps.

If your goal is “10 questions quickly”, the real speedups are:

  • smaller prompts (what we already did)
  • smaller/faster model
  • or offload heavy parallel work to a hosted model (where concurrency actually scales).
snow siren
#

So if I had a Mac Mini M4 Pro (14 core CPU and 20 core GPU) with 64GB of RAM and 512GB, would I be able to run everything locally with literally zero API costs? This still on the hypothetical polymarket context and when when compared to my current M4 16/256 setup running local + online based LLM

wicked solarBOT
#

You could get very close to “zero API spend” on an M4 Pro + 64GB unified memory, but it won’t be “free in the absolute sense”, and it won’t automatically be “as good as cloud”.

What that upgraded Mac mini would change vs your M4 16/256

  • 64GB unified memory = you can run much stronger local models (bigger weights, bigger context, less swapping) and keep more stuff resident.
  • M4 Pro GPU/CPU = generally better local inference throughput/latency than the base M4.
  • 512GB SSD = more room for multiple model files + caches (still easy to fill if you hoard models).

So yes: it can make “local-first OpenClaw” far more viable.

Can you run “everything” locally with literally $0 API costs?

Only if you avoid any tools/features that call paid APIs. Examples:

Can be $0 (API-wise):

  • Local LLM inference via Ollama
  • Browser automation / scraping (still “online”, but not paid API)
  • Pulling public web pages and parsing them locally
#

Often NOT $0 (unless you deliberately disable/replace):

  • web_search tool (typically uses a search provider API key)
  • Any cloud speech-to-text / TTS / image generation you enable
  • Any paid data sources you choose (news APIs, market data feeds, etc.)

So the answer is: yes, you can set up a “no paid model API” system, but you must design for it.

Polymarket-specific reality check

Even with strong local models, the reliable way to do this is usually:

  • deterministic code for “fetch market data / compute exposure / place order”
  • LLM (local or cloud) for “summarize news + extract claims + propose actions”
  • human approval before execution

You can scrape instead of using an API, but it’s brittle and can break anytime the site changes.

Compared to your current setup (M4 16/256 + mix of local/cloud)

  • The upgraded machine will reduce how often you “need” cloud for capability.
#
  • But for tool reliability + complex multi-step browsing, cloud models can still be better (and sometimes cheaper overall because they finish in fewer attempts).

If you tell me “I want $0 paid APIs, I’m okay with slower/less capable”, I can outline the exact knobs to disable (web_search, skills that use cloud APIs, etc.) while keeping the browser-based workflow working.

snow siren
#

Im just wondering if the upgrade cost (about 1600$) would be compensated by the savings in API tokens in the long run

wicked solarBOT
#

It can pay off, but only if your monthly API spend is high enough — otherwise $1600 is a long break-even.

Simple break-even math

Roughly:

break-even months ≈ 1600 ÷ (monthly API spend you avoid)

So for example:

  • If you’d otherwise spend $200/mo on APIs → break-even ~ 8 months
  • $50/mo → ~ 32 months (~2.7 years)
  • $20/mo → ~ 80 months (~6.5 years)

(And local isn’t truly $0: you’ll still have some electricity cost, and you may still choose to use a hosted model for certain tasks.)

The trap: local often increases “time cost”

Even if it saves tokens, local can be slower/less reliable for tool-heavy work — you may end up spending more time getting the same outcome. That matters a lot when you’re learning/building.

#

Best way to decide without guessing

Measure your real usage for 1–2 weeks, then extrapolate:

  1. Turn on usage footers in chat: /usage cost (or /usage full)
  2. Do your normal workflow for a week (or simulate the Polymarket “worker” checks)
  3. Look at the daily/weekly cost trend and project monthly

If you tell me what you’re currently spending per week (or paste a couple /usage cost results), I can help you estimate a realistic break-even.

snow siren
#

Im just thinking that if I spend 3$ a day which isn’t that hard on a computer running 24h a day, that’s 93$ per month (let’s call it 100$). In 1.5 years the difference is paid for in API savings, electricity included

wicked solarBOT
#

Your math is basically right if (big if) the upgrade really lets you eliminate most of that ~$3/day:

  • $3/day ≈ $90/mo
  • $1600 á $90/mo ≈ 17–18 months (call it ~1.5 years)

So the break-even story is plausible.

Where this often goes sideways is in the assumptions:

1) The upgrade won’t necessarily take API spend to “near-zero”

Even on an M4 Pro/64GB, you may still choose to use a hosted model for:

  • tool-heavy browsing/planning reliability
  • speed (cloud can be dramatically faster wall-clock)
  • vision/image tasks
  • web search APIs (unless you disable them and rely on browser scraping)

So savings might be, say, $90 → $30/mo, not $90 → $0/mo. That doubles/triples break-even time.

#

2) You already proved your current M4 can run local

You’ve got Qwen 4B doing ~21s replies after prompt slimming. So the upgrade isn’t “cloud vs local”, it’s “better local vs current local + occasional cloud”. The incremental savings may be smaller than you’re thinking.

Best next step before spending $1600

Run a 1–2 week “local-first” trial on your current Mac:

  • keep your current lean prompt setup
  • only use Gemini/hosted when you truly get stuck
  • track actual spend with /usage cost

Then you’ll know whether the upgrade would save you $20/mo or $100/mo in practice.

If you paste a couple days of /usage cost totals (or just “I spent $X in 3 days doing Y”), I can help you estimate a more realistic break-even.

snow siren
#

What I really need to know is if that speed difference between local and online-based (with the more capable M4Pro version) is big enough to eventually make any betting strategy make or break

wicked solarBOT
#

It depends entirely on what kind of “strategy” you mean — and for most Polymarket-style edges, the “LLM latency difference” is rarely the make‑or‑break factor.

When speed does matter (and local vs cloud can matter)

If your plan is basically “react to breaking news before everyone else”, then yes: seconds matter. In that world:

  • 20–30s local latency can be too slow
  • 2–5s cloud latency can be better
    …but also: you’re competing against people with direct feeds + custom code + automation. An LLM-driven pipeline (local or cloud) usually isn’t the winning edge there.

When speed doesn’t matter much

If your plan is more like:

  • medium-term thesis updates
  • interpreting complex developments
  • adjusting positions a few times per day / week
    …then the difference between 5s vs 25s usually doesn’t decide profitability. Correctness + discipline + risk management matter far more.

The real “make or break” factors are usually:

  • data freshness (what sources you watch, alerts, RSS, transcripts, filings, etc.)
#
  • execution plumbing (API reliability, avoiding UI scraping, reducing friction)
  • false positives / hallucinations (LLM confidently wrong = expensive)
  • risk controls (position sizing, max loss, cooldowns, human approval)

Practical recommendation

Use the LLM as an analyst, not a high-frequency trader:

  • run fast deterministic monitors (RSS/keyword triggers) to detect “something changed”
  • only then invoke the LLM to summarize/assess impact
  • keep a human approval step before any bet placement

If you tell me your intended cadence (e.g. “react within 1–2 minutes” vs “daily adjustments”), I can say whether local latency is likely acceptable or whether you’re in a regime where you’ll want cloud + a more automated data pipeline.

snow siren
#

My idea was precisely to build a setup through OC that would allow me to be one of those people with direct feeds + custom code + automation. Is it plausible with both Mac Mini versions or just the higher end?

wicked solarBOT
#

It’s plausible to build an automated “direct feeds + custom code” setup with OpenClaw in the loop — but the honest answer is that hardware is not the main limiter once you’re chasing speed.

What actually determines whether you can be “one of those people”

  1. Data ingestion latency + reliability
  • How fast you get the signal (feeds, alerts, RSS, transcripts, filings, etc.)
  • Whether it’s machine-readable and stable
  1. Execution plumbing
  • API-first integration (UI scraping is too brittle/slow)
  • Robust retries, idempotency, logging, risk limits
  • Running the execution code close to the network endpoints that matter (often a VPS beats a box under your router)
  1. Critical path design
    If you want to compete on speed, an LLM should not be in the critical path.
  • Use deterministic code to detect an event and (optionally) execute within seconds
  • Use the LLM for: summarization, classification, “is this materially relevant?”, generating human-readable briefs, etc.
#

So… base M4 vs M4 Pro 64GB?

  • Both can run OpenClaw + scripts + cron + web monitoring.
  • The M4 Pro/64GB mainly helps if you insist on doing more LLM work locally (bigger local models, fewer stalls, more headroom).
  • But if your goal is “low-latency automated execution,” the difference between those Macs is usually less important than:
  • running the worker on a VPS
  • having good data sources
  • keeping the LLM out of the hot path

Practical recommendation

  • Use your current Mac mini as the “control plane” / interface.
  • Put the fast feed+execution worker somewhere reliable/always-on (often a VPS), and let OpenClaw supervise + alert + approve.

If you tell me whether you’re aiming for “react within seconds” vs “react within minutes,” I can be more concrete about whether the Mac-only approach is realistic.

snow siren
#

React within seconds would be the answer

wicked solarBOT
#

If your target is “react within seconds”, then the honest answer is:

  • Neither Mac mini (base or Pro) + an LLM-in-the-loop pipeline is the right way to compete on speed.
  • You need an event-driven, deterministic worker (code) that’s always running, plus API/WebSocket feeds, and likely a VPS with good network routes.

A few concrete implications:

1) Keep the LLM out of the hot path

LLMs (local or cloud) add unpredictable latency. For seconds-level reaction, the “decision” must be:

  • rule-based / statistical code
  • precomputed thresholds
  • fast parsing of structured data

Use the LLM after the fact to:

  • summarize what happened
  • explain the rationale
  • generate a report
#
  • optionally sanity-check risk limits (but not blocking execution)

2) Cron polling won’t cut it

Even 10-second polling is too slow/noisy. You want:

  • streaming updates (WebSocket) or push-based feeds
  • a daemon/service, not “ask an agent repeatedly”

3) Hardware matters less than architecture + network placement

An M4 Pro is nice, but your limiting factor will be:

  • data latency
  • execution latency
  • reliability
  • ToS/API constraints

A small VPS close to the services you hit often beats a box under your router.

Where OpenClaw still fits (useful!)