An agent fleet at home

17 agents on a Mac mini

How I decide what runs on my machine and what goes to the cloud, what it really costs, and the four things it taught me.

EN · FR

The setting

A Mac mini on a shelf. A Telegram thread on my phone. In between, seventeen agents that each do one thing.

It's not a chatbot

Each agent has a role, a memory, tools and its own chat thread. You don't "change the prompt": you talk to someone else.

It's not in the cloud

The gateway, the agents, the memory and the tools run at home. Only inference leaves — sometimes.

It's not a prototype

4,448 agent turns since May 2026. It runs, it breaks, it gets fixed on a Sunday evening.

This talk is about the one decision that shapes everything else: what is allowed to leave the house.

Part 1

The setup

A gateway, channels, agents, tools. Nothing exotic — which is what makes it copyable.

The centrepiece: the gateway

OpenClaw holds together three things that would otherwise be three separate projects:

Channels

Telegram, Signal. One account per agent, so one chat thread per agent. That's the interface: I don't open a terminal to talk to an agent.

16 Telegram accounts

Agents

A folder, an identity, a memory, a model, a tool policy. Adding an agent means adding a folder — not deploying a service.

17 active agents

Tools

Home-made MCP servers that expose my own apps, plus the built-in tools: shell, files, browser, scheduled tasks.

4 MCP servers

The right way to think about it: it's not "an AI". It's a switchboard that connects a channel, an agent, a model and tools.

The hardware, and what it allows

The machine

Mac mini M4 Pro — 64 GB unified memory

About 273 GB/s of memory bandwidth. That bandwidth, not the core count, decides how fast a local model runs.

It holds a 21 GB model in memory and keeps running containers, a database, web apps.

What it allows — and what it doesn't

The real ceiling isn't model size

A 35-billion-parameter model runs comfortably. The ceiling is throughput: only one local agent at a time works properly.

Hence the direct consequence: local is a scarce resource, to keep for what justifies it.

That's what I hadn't understood at first. I thought I was choosing between "free" and "paid". I was actually choosing between two different scarce resources: my machine, or my budget.

Part 2

The decision that shapes everything

For each agent, one question: is this conversation allowed to leave the house?

Two routes, one boundary

🏠 THE HOUSE — MAC MINI M4 PRO 📱 Telegram my phone Gateway routes to the agent 🔒 Private agent personal data 🕺 Nova generalist ⚡ Spark coder 🏠 Ollama qwen3.6:35b — 21 GB ☁ API claude-sonnet-5 🏠 never leaves ☁ crosses the boundary

Everything runs at home — the gateway, the agents, the memory, the tools. The only thing that leaves, when it leaves, is the content of the conversation sent to the model. That's the whole decision.

🔒  The private agent  —  local

What it does

Personal data

Personal notes and day-to-day tracking: everything about my private life rather than my work or my code.

ollama/qwen3.6:35b-mlx21 GB in memory

Why local

One reason, and it's enough

This data must not leave the house. Not because a provider would be malicious — because the question shouldn't have to come up.

Zero cost and stable latency are bonuses. They wouldn't have justified the choice on their own.

The price of accepting it

This agent is worse than the cloud agents. It follows long instructions less well, it gets lost faster in a chain of tool calls, and it holds 21 GB of memory permanently. I accepted those three things in exchange for one: the text stays here.

🕺  Nova  —  cloud

What it does

Generalist, and the default entry point

Open questions, research, writing, running the fleet itself. It's the agent I talk to when I don't yet know who to talk to.

anthropic/claude-sonnet-5

Why cloud

It has to be good, and nothing it sees is sensitive

A generalist spends its time on open, long tasks with lots of tools. That's exactly where a local model falls behind.

And the content — docs, public code, general questions — has no reason to stay at home.

The test I apply: "if this message leaked tomorrow, would that be a problem for me?" If the answer is no, local isn't even a question — you take the best model.

⚡  Spark  —  cloud, the coder

What it does

Prototypes, fixes in my repos, technical explorations. It works in a dedicated git worktree and its deliverable is always the same thing: a pull request.

Why cloud, without hesitation

Code is the most demanding use there is: long context, chained tools, zero tolerance for approximation. A local model fails there expensively — it writes plausible, wrong code.

Why it isn't a risk

These are my personal repos, public or meant to be. No client code goes through it — that's a rule, not an intention.

The constraint that made it usable: a deliverable, not a result

As long as Spark was "fixing things", I couldn't trust it. Since it has to produce a branch, a worktree, a PR — something I review before merging — I can let it work unsupervised. The constraint isn't in the model, it's in the process.

The rule, on one slide

 🏠 Local☁ Cloud
The criterionThe content must not leaveThe content may leave, the task is demanding
Model qualityFine for dialogue, fragile on chained tool callsThe best available
Marginal costZero eurosBilled — or included in a subscription
Real cost21 GB of memory tied up, one agent at a timeA network dependency and a provider
LatencyStable, predictableVariable, depends on a third party
When it failsIt fails with the machineIt fails with the provider

Of 17 agents, 4 run locally and the rest in the cloud. The ratio isn't a target: it's simply the number of agents that touch private data.

Part 3

What it costs

The real numbers, including the one I can no longer measure.

The bill, unrounded

4448
agent turns since May 2026
75 €
in pay-as-you-go billing, over the whole period
23 €
a month today, on a subscription, for most of the fleet

The admission that goes with it

Since the fleet moved to a subscription, my spending dashboard is blind: the subscription reports no cost per token. I can tell you what I paid before, and what I pay now. I can't tell you what the same activity would cost today pay-as-you-go — that would be an extrapolation, not a measurement.

€75 over five months is little. It wasn't the cost that moved me to a subscription: it was not having to think about it at every experiment.

What "free" means

Local costs no euros. It costs three other things, and you need them in mind before choosing.

Memory, permanently

21 GB tied up while the model is loaded. On a machine that also runs containers and databases, that's not neutral.

Throughput, not time

One local agent at a time works properly. Two local conversations at once, and both slow down. The cloud is parallel by nature.

Quality

The highest cost and the least visible. A local model is wrong differently: it stays plausible for longer.

The trap I fell into

I moved a local agent to a bigger model, thinking "more parameters, better agent". It was a dense model: it activated every parameter on every token. Turns went up to about twenty minutes and the fans never stopped. The model I use today looks smaller but is sparsely activated: it activates only a fraction of its parameters, and it's several times faster.

The general lesson: for a local agent, the question isn't "how many parameters", it's how many active parameters per token.

Part 4

What it taught me

Four lessons paid for in real outages, on a Sunday evening, with the agents down.

Lesson 1  —  A local model with no safety net loops

What happened

A local agent had to create a note. The tool succeeded — twenty times. The model couldn't read its own tool results: it called again, got a success, didn't recognise it, and started over. I found twenty identical notes.

The cause

Not the model alone: the model with no fallback. This agent had no backup model. When local drops off, it drops off all the way.

What I changed

  • A fallback model declared on every agent.
  • Tools that fail loudly rather than return a success that did nothing.
  • A turn limit per session, so a loop costs 3 attempts, not 20.

It's the same lesson as for tool servers: a success that changes nothing is worse than an error. Local, with no net, you pay for it twenty times.

Lesson 2  —  The outage is almost never the model

Months of incidents. Here's what actually failed:

The symptomThe real cause
"The agent stopped answering"A stuck gateway process. Kill it, don't restart everything.
"The tool returns fetch failed"The service listened on one interface, the URL pointed at another.
"Everything broke after the update"Desktop app and gateway on two incompatible versions.
"The scheduled task stopped firing"A renamed agent id, and three config files still on the old name.
"The agent errors out immediately"Node below the minimum required version. Nothing to do with AI.

In other words: it's operations. Networking, versions, processes, naming. The skills that matter here are the ones you already have — not "AI" skills.

Lesson 3  —  Agents are only as good as their tools

Before

A "smart" agent I asked to look up my data. It suggested commands, I copied them, I pasted the output back. I had become its terminal.

After

Four home-made MCP servers that expose my own apps. The agent calls a typed tool, gets a computed result, and acts. I'm out of the loop.

4 MCP servershome-made apps

The rule I take from it

The jump in quality never came from a better model. It came, every time, from a better tool: one that answers a business intent instead of exposing a table, and refuses invalid input instead of ignoring it.

Lesson 4  —  One more agent isn't free

The attention cost

Seventeen chat threads are seventeen places where something can be waiting for an answer. I deleted several that were no longer used — the best maintenance decision I've made.

The drift cost

Every agent has instructions, a memory, skills. They age. An agent you never review ends up applying rules that are no longer true.

The renaming cost

Renaming an agent touches its configuration, its scheduled tasks, its sessions and every script that hard-codes its id. It cost me a whole evening, once.

The right reflex: before adding an agent, ask whether an existing agent should just get one more tool. The answer is yes more often than you'd think.

What I wouldn't do again

Multiply agents before tools

I created agents hoping specialisation would be enough. What was missing was tools — not personalities.

Pick a local model by its size

"Bigger" cost me twenty-minute turns. The right question was activation per token, not parameter count.

Automate too early

Several scheduled tasks produced noise I no longer read. I deleted them. An automation you ignore is debt, not a gain.

Believe local was a cost decision

It's a privacy decision. Sold as savings, it disappoints — because you pay in quality what you save in euros.

Part 5

What it's worth elsewhere

A personal lab isn't an enterprise architecture. Three things carry over anyway.

Three things that carry over

1  ·  The boundary before the model

The first question isn't "which model", it's "what is allowed to leave". Once that boundary is drawn, the model choice becomes a consequence, not a debate.

2  ·  The deliverable rather than trust

An agent becomes acceptable when its output goes into a review process that already exists. You can review a PR. You can't review "done".

3  ·  Tools are the real work

The budget of an agent project goes into exposing existing systems cleanly, not into choosing the model. It's API work, and it compounds.

And one thing that doesn't carry over

At home, when it breaks, it only breaks for me. An agent fleet at a company needs monitoring, on-call, traceability and identity management — that is, everything I allowed myself not to do.

Takeaways

🏠 Local is a privacy decision

Not a cost decision. You pay in quality, memory and throughput for what you gain by not moving the text.

☁ Cloud is a capability decision

For anything whose leak wouldn't be a problem, taking the best model is the obvious call.

Tools make the agent

No jump in quality came from a model. They all came from a better tool, better typed, closer to the intent.

It's operations

Networking, versions, processes, naming. The skills you need are the ones you already have — not "AI" skills.

Thank you

The slides and speaker notes are online.

heybrahim.com/talks/openclaw

OpenClaw

The gateway that holds it all together.

On tools

heybrahim.com/talks/mcp — why MCP changes the game (in French).

Questions

Brahim Bousnguar

EN · FR