---
title: OpenClaw and Hermes Agent ship the same features with different defaults
description: OpenClaw and Hermes Agent are the two big open-source agents that live on your own machine and answer you in your chat apps. By October 2026 their feature lists match and their defaults don't. An interactive comparison with the small claws (NanoClaw, nanobot, ZeroClaw, PicoClaw, IronClaw), what running both taught me, and which to pick for which situation.
date: 2026-10-16
tags: AI agents, OpenClaw, Hermes Agent, self-hosting, agent harness
---

OpenClaw and Hermes Agent do the same job: an open-source agent that lives on your own machine, answers you in Telegram, Slack or WhatsApp, runs tools, remembers you and writes its own skills. By October 2026 their feature lists mostly match. Their defaults don't. OpenClaw is built for reach: dozens of chat channels, phone apps that act as sensors, many agents behind one gateway. Hermes is built around a learning loop and a wide choice of where its commands run. Both run tools straight on your computer until you change that, and for plenty of people a smaller harness, or none at all, is the better pick.

I've run OpenClaw on a Mac mini since May, 17 agents at last count, and I ran Hermes next to it with two profiles until September. This note puts the two side by side, with the five smaller "claws" that grew up around them. The numbers come from each project's docs, README and GitHub page on October 16. The figures move or take a tap, and there's a picker at the end.

<figure class="fd-fig ah ah-stars" aria-labelledby="ah1-cap" data-desc="GitHub stars on October 16, 2026, drawn to scale. OpenClaw, TypeScript, MIT: 392,150. Hermes Agent, Python, MIT: 254,281. nanobot, Python, MIT: 49,079. ZeroClaw, Rust, Apache 2.0 or MIT: 32,983. NanoClaw, TypeScript, MIT: 30,955. PicoClaw, Go, MIT: 30,077. IronClaw, Rust, Apache 2.0: 12,659. OpenClaw shipped 2026.10.4 on October 16 and Hermes shipped v0.22.2 on October 15.">
<p class="ah-h">GitHub stars, October 16, 2026</p>
<ol class="ah-stars-list">
<li class="ah-star ah-star-big ah-w-oc"><img class="ah-logo" src="/assets/img/notes/agent-harnesses/openclaw.png" alt="" width="36" height="36" decoding="async"><p class="ah-name">OpenClaw<small>TypeScript · MIT</small></p><span class="ah-bar"><i></i></span><b>392k</b></li>
<li class="ah-star ah-star-big ah-w-he"><img class="ah-logo" src="/assets/img/notes/agent-harnesses/hermes.png" alt="" width="36" height="36" decoding="async"><p class="ah-name">Hermes Agent<small>Python · MIT</small></p><span class="ah-bar"><i></i></span><b>254k</b></li>
<li class="ah-star ah-w-nb"><img class="ah-logo" src="/assets/img/notes/agent-harnesses/nanobot.png" alt="" width="36" height="36" decoding="async"><p class="ah-name">nanobot<small>Python · MIT</small></p><span class="ah-bar"><i></i></span><b>49k</b></li>
<li class="ah-star ah-w-zc"><img class="ah-logo" src="/assets/img/notes/agent-harnesses/zeroclaw.png" alt="" width="36" height="36" decoding="async"><p class="ah-name">ZeroClaw<small>Rust · Apache 2.0 / MIT</small></p><span class="ah-bar"><i></i></span><b>33k</b></li>
<li class="ah-star ah-w-nc"><img class="ah-logo" src="/assets/img/notes/agent-harnesses/nanoclaw.png" alt="" width="36" height="36" decoding="async"><p class="ah-name">NanoClaw<small>TypeScript · MIT</small></p><span class="ah-bar"><i></i></span><b>31k</b></li>
<li class="ah-star ah-w-pc"><img class="ah-logo" src="/assets/img/notes/agent-harnesses/picoclaw.png" alt="" width="36" height="36" decoding="async"><p class="ah-name">PicoClaw<small>Go · MIT</small></p><span class="ah-bar"><i></i></span><b>30k</b></li>
<li class="ah-star ah-w-ic"><img class="ah-logo" src="/assets/img/notes/agent-harnesses/ironclaw.png" alt="" width="36" height="36" decoding="async"><p class="ah-name">IronClaw<small>Rust · Apache 2.0</small></p><span class="ah-bar"><i></i></span><b>13k</b></li>
</ol>
<p class="mp-strip"><b>This week</b><span>OpenClaw 2026.10.4 on October 16, Hermes v0.22.2 on October 15.</span></p>
<figcaption id="ah1-cap">Stars measure attention, not quality. Bars to scale; the logos are each project's own.</figcaption>
</figure>

## Two big projects and a crowd of small ones

OpenClaw is the one that started the wave. Peter Steinberger's personal assistant went from Clawd to Moltbot to OpenClaw in January. He joined OpenAI in February, and since July the project belongs to the OpenClaw Foundation, a nonprofit where, in its own words, OpenAI is a donor, not an owner. It's TypeScript under MIT, and it ships often: 2026.10.4 came out on October 16.

Hermes Agent comes from Nous Research, the lab behind the Hermes models. It's Python under MIT, first released in March, and it moves just as fast. v0.22, "The Threshold Release", landed on October 14 and cut the source from about 1.06 million lines to 698,000.

Around the two, smaller harnesses each picked one thing to do better. NanoClaw puts every agent in a container. nanobot keeps a small Python core. ZeroClaw and PicoClaw fit on cheap boards. IronClaw rebuilds OpenClaw in Rust around security.

## Both are a gateway around a loop

Strip the branding and the two have the same shape. A gateway process stays up and listens on your chat accounts. A message arrives, the gateway finds the right session, and an agent loop runs: the model asks for a tool, the tool runs, the result goes back, until the model has an answer. Along the way it writes to Markdown files the next session reads, and the reply goes back to the chat it came from.

The differences are inside the boxes. OpenClaw's gateway is one long-lived Node process with a WebSocket on `127.0.0.1:18789`, and every agent, channel and phone talks to it. Hermes runs a Python gateway, and every profile gets its own home with its own memory, skills and cron jobs. OpenClaw also wakes its agents on its own: a heartbeat runs a full agent turn every 30 minutes by default. Hermes waits for you or for cron jobs you describe in plain language, and gives a session a `/heartbeat` only when you ask for one.

<figure class="fd-fig ah ah-anat" aria-labelledby="ah2-cap" data-desc="One message through each harness, in five steps, with the current step highlighted in turn. One: a message arrives. OpenClaw takes about 30 chat channels plus apps for phones and desktops; Hermes has 25 or more platform adapters and a desktop app. Two: the gateway routes it. OpenClaw runs one Node process with a WebSocket on localhost port 18789 and every agent behind it; Hermes runs a Python gateway, and each profile is its own home. Three: the loop runs tools. Both take any model; OpenClaw can hand the loop to Claude Code or Codex, and Hermes runs local models through llama.cpp in one click since v0.22. Four: it writes things down. OpenClaw keeps MEMORY.md and daily notes and consolidates them in a scheduled Dreaming sweep; Hermes keeps a small MEMORY.md and USER.md and searches past sessions with full-text search. Five: it replies, or wakes up on its own. OpenClaw runs a heartbeat turn every 30 minutes by default; Hermes runs cron jobs written in plain language, and a per-session heartbeat only if you ask.">
<p class="ah-now" aria-hidden="true"><span>1 · A message arrives</span><span>2 · The gateway routes it</span><span>3 · The loop runs tools</span><span>4 · It writes things down</span><span>5 · It replies, or wakes up</span></p>
<div class="ah-anat-in">
<p class="ah-anat-hd"><span class="ah-anat-blank"></span><span class="ah-who"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/openclaw.png" alt="" width="20" height="20" decoding="async">OpenClaw</span><span class="ah-who"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/hermes.png" alt="" width="20" height="20" decoding="async">Hermes</span></p>
<ol class="ah-steps ah-cyc5">
<li class="ah-step"><p class="ah-step-n"><b>1</b>A message arrives</p><p class="ah-cell">About 30 chat channels, plus apps for phones and desktops</p><p class="ah-cell">25+ platform adapters and a desktop app</p></li>
<li class="ah-step"><p class="ah-step-n"><b>2</b>The gateway routes it</p><p class="ah-cell">One Node process, a WebSocket on <code>127.0.0.1:18789</code>, every agent behind it</p><p class="ah-cell">A Python gateway; each profile is its own home</p></li>
<li class="ah-step"><p class="ah-step-n"><b>3</b>The loop runs tools</p><p class="ah-cell">Any model, and Claude Code or Codex can run the loop</p><p class="ah-cell">Any model, and local llama.cpp in one click since v0.22</p></li>
<li class="ah-step"><p class="ah-step-n"><b>4</b>It writes things down</p><p class="ah-cell">MEMORY.md and daily notes, merged by a Dreaming sweep</p><p class="ah-cell">A small MEMORY.md and USER.md, plus search of past sessions</p></li>
<li class="ah-step"><p class="ah-step-n"><b>5</b>It replies, or wakes up</p><p class="ah-cell">A heartbeat turn every 30 minutes, on by default</p><p class="ah-cell">Cron in plain language; <code>/heartbeat</code> if you ask</p></li>
</ol>
</div>
<figcaption id="ah2-cap">Same five steps, different parts. The highlight walks one message through both.</figcaption>
</figure>

## Where the defaults pull apart

Feature by feature, most rows of a comparison say "both". The useful question is which way each project leans when you install it and change nothing. Switch the tabs.

Memory: OpenClaw puts a stack of workspace files into every session, AGENTS.md, SOUL.md, USER.md, MEMORY.md and the daily notes, up to 20,000 characters per file and 60,000 in total, and a scheduled Dreaming sweep consolidates them. Hermes keeps memory deliberately tiny: 2,200 characters of notes and 1,375 about you, frozen when the session starts. When it needs more, it searches its old conversations with SQLite full-text search.

Channels: OpenClaw's catalog lists about 30 chat platforms, and its apps for iOS, Android, macOS, Windows and Linux turn a device into a node with a camera, location and notifications. Hermes has more than 25 adapters and a desktop app. I didn't find a phone app.

Sandbox: both run commands on the host by default. OpenClaw's sandbox is off until you turn it on, with Docker, Podman or SSH behind it. Hermes treats where commands run as a first-class setting, local, Docker, SSH, Singularity, Modal, Daytona or Vercel Sandbox, and by default asks a second model to judge flagged commands before they run.

Models: both take any provider. OpenClaw can also hand the whole loop to Claude Code or Codex. Hermes added one-click local models through llama.cpp, and it can export trajectories for reinforcement learning, which says a lot about who builds it.

Agents: OpenClaw routes each chat account to an agent with bindings, and I run 17 agents behind one gateway. A Hermes profile is one agent with its own home, and `delegate_task` hands subtasks to child agents.

<figure class="fd-fig ah ah-vs" aria-labelledby="ah3-cap" data-desc="A tabbed comparison of OpenClaw and Hermes defaults. Memory: OpenClaw puts up to 60,000 characters of workspace files into each session, 20,000 per file and 4,000 for USER.md, and a Dreaming sweep consolidates them; Hermes keeps 3,575 characters of memory, 2,200 of notes and 1,375 about you, frozen at session start, and searches old sessions with SQLite full-text search. Channels: OpenClaw lists about 30 chat platforms plus apps that turn phones into nodes with camera, location and notifications; Hermes has 25 or more adapters and a desktop app. Sandbox: OpenClaw's sandbox is off by default, with Docker, Podman or SSH backends; Hermes defaults to the local backend, offers Docker, SSH, Singularity, Modal, Daytona and Vercel Sandbox, and lets a second model judge flagged commands. Models: both take any provider; OpenClaw can hand the loop to Claude Code or Codex, Hermes runs local models through llama.cpp and exports trajectories for reinforcement learning. Agents: OpenClaw routes chats to many agents behind one gateway, 17 in my setup; a Hermes profile is one agent with its own home, and delegate_task spawns child agents.">
<input class="fd-radio" type="radio" name="ah3" id="ah3-mem" checked>
<input class="fd-radio" type="radio" name="ah3" id="ah3-ch">
<input class="fd-radio" type="radio" name="ah3" id="ah3-sb">
<input class="fd-radio" type="radio" name="ah3" id="ah3-mod">
<input class="fd-radio" type="radio" name="ah3" id="ah3-ag">
<div class="fd-tabs ah-tabs"><label for="ah3-mem">Memory</label><label for="ah3-ch">Channels</label><label for="ah3-sb">Sandbox</label><label for="ah3-mod">Models</label><label for="ah3-ag">Agents</label></div>
<div class="ah-vs-hd"><p class="ah-who"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/openclaw.png" alt="" width="20" height="20" decoding="async">OpenClaw</p><p class="ah-who"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/hermes.png" alt="" width="20" height="20" decoding="async">Hermes</p></div>
<div class="ah-pane ah-p-mem">
<div class="ah-vs-row">
<div class="ah-col"><p class="ah-big">60,000</p><p class="ah-unit">characters of workspace files, at most, in each session</p><span class="ah-meter"><i class="ah-m-100"></i></span><ul class="ah-pts"><li>AGENTS.md, SOUL.md, USER.md, MEMORY.md, daily notes</li><li>20,000 per file, 4,000 for USER.md</li><li>A scheduled Dreaming sweep consolidates them</li></ul></div>
<div class="ah-col"><p class="ah-big">3,575</p><p class="ah-unit">characters of memory, frozen when the session starts</p><span class="ah-meter"><i class="ah-m-mem"></i></span><ul class="ah-pts"><li>MEMORY.md 2,200, USER.md 1,375</li><li>Older sessions: SQLite full-text search</li></ul></div>
</div>
<p class="mp-strip"><b>Lean</b><span>OpenClaw loads a lot every turn. Hermes keeps a small core and searches the rest.</span></p>
</div>
<div class="ah-pane ah-p-ch">
<div class="ah-vs-row">
<div class="ah-col"><p class="ah-big">~30</p><p class="ah-unit">chat channels in the catalog, plus device apps</p><span class="ah-meter"><i class="ah-m-100"></i></span><ul class="ah-pts"><li>Telegram is the suggested first one</li><li>iOS, Android, macOS, Windows and Linux apps become nodes</li><li>A node lends its camera, location and notifications</li></ul></div>
<div class="ah-col"><p class="ah-big">25+</p><p class="ah-unit">platform adapters, plus a desktop app</p><span class="ah-meter"><i class="ah-m-ch"></i></span><ul class="ah-pts"><li>Telegram, Discord, Slack, WhatsApp, Signal, SMS, email</li><li>Home Assistant, Matrix, iMessage through a bridge</li><li>No phone app that I found</li></ul></div>
</div>
<p class="mp-strip"><b>Lean</b><span>OpenClaw reaches further, and turns your phone into a sensor.</span></p>
</div>
<div class="ah-pane ah-p-sb">
<div class="ah-vs-row">
<div class="ah-col"><p class="ah-big ah-big-alert">Off</p><p class="ah-unit">sandboxing by default: the main session runs tools on the host</p><ul class="ah-pts"><li>Modes: off, non-main, all</li><li>Backends: Docker, Podman, SSH and two more</li></ul></div>
<div class="ah-col"><p class="ah-big ah-big-alert">Local</p><p class="ah-unit">terminal backend by default: commands run on the host</p><ul class="ah-pts"><li>Or Docker, SSH, Singularity, Modal, Daytona, Vercel Sandbox</li><li>Smart approvals: a second model judges flagged commands</li><li>Manual, or off, plus deny patterns</li></ul></div>
</div>
<p class="mp-strip"><b>Lean</b><span>Both start on your machine. Hermes puts the alternatives one setting away.</span></p>
</div>
<div class="ah-pane ah-p-mod">
<div class="ah-vs-row">
<div class="ah-col"><p class="ah-big">Any</p><p class="ah-unit">provider, and the harness is a plugin too</p><ul class="ah-pts"><li>Claude Code or Codex can run the agent loop</li><li>A model per agent</li></ul></div>
<div class="ah-col"><p class="ah-big">Any</p><p class="ah-unit">provider, and local models in one click</p><ul class="ah-pts"><li>llama.cpp built in since v0.22</li><li>Trajectory export for reinforcement learning</li></ul></div>
</div>
<p class="mp-strip"><b>Lean</b><span>A draw on choice. Hermes leans research, OpenClaw leans on the coding agents you already run.</span></p>
</div>
<div class="ah-pane ah-p-ag">
<div class="ah-vs-row">
<div class="ah-col"><p class="ah-big">17</p><p class="ah-unit">agents behind my one gateway</p><ul class="ah-pts"><li>Bindings route each chat account to an agent</li><li><code>sessions_spawn</code> starts sub-agents</li><li>One Telegram bot per agent, in my setup</li></ul></div>
<div class="ah-col"><p class="ah-big">1</p><p class="ah-unit">agent per profile, picked with <code>hermes -p</code></p><ul class="ah-pts"><li>Each profile: its own config, SOUL.md, memory, skills and cron</li><li><code>delegate_task</code> hands subtasks to child agents</li></ul></div>
</div>
<p class="mp-strip"><b>Lean</b><span>OpenClaw is built for a fleet. Hermes, for one agent at a time.</span></p>
</div>
<figcaption id="ah3-cap">Defaults from each project's docs on October 16. Both can be configured toward the other.</figcaption>
</figure>

## Both teach themselves, on a counter

The Hermes README calls it the only agent with a built-in learning loop. That stopped being true in April, when OpenClaw shipped Skill Workshop. Here's what actually triggers each one.

Hermes counts. Every 10 of your prompts, a forked review agent rereads the conversation and decides what to save to memory. Every 10 tool iterations inside one turn, the same kind of review decides whether to write or patch a skill. A curator marks a skill stale after 14 days without use and archives it after 30. It never deletes one.

OpenClaw counts too. After 10 model iterations in a conversation, a background review saves anything worth keeping as a learned skill, and during a turn the agent patches a learned skill that misled it. Skills nobody uses for 30 days are archived, every change keeps the previous version, and `/learn undo` reverts one.

Both have a manual trigger, `/refine` on Hermes and `/learn` on OpenClaw. The real gap is memory: Hermes reviews it on a schedule of its own, while OpenClaw leaves it to the agent and the Dreaming sweep and only automates skills.

<figure class="fd-fig ah ah-learn" aria-labelledby="ah4-cap" data-desc="Both learning loops count to ten, then run a review. Hermes counts your prompts: after 10, a forked review decides what to save to MEMORY.md. It also counts tool iterations inside one turn: after 10, a review writes or patches a skill. Its curator marks skills stale after 14 days unused and archives them after 30, never deleting. OpenClaw counts model iterations in a conversation: after 10, a background review saves a learned skill, and during a turn the agent patches a learned skill that misled it. Skills unused for 30 days are archived, every change is versioned, and /learn undo reverts one. By hand: /refine on Hermes, /learn on OpenClaw.">
<p class="ah-now ah-now-learn" aria-hidden="true"><span>Counting to ten</span><span>Ten. The review runs.</span></p>
<div class="mp-two-row">
<div class="mp-two-card">
<p class="ah-who"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/hermes.png" alt="" width="20" height="20" decoding="async">Hermes</p>
<p class="ah-ct-l">Your prompts</p>
<p class="ah-dots" aria-hidden="true"><span class="ah-dots-on"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></p>
<p class="ah-out">Review: save to MEMORY.md?</p>
<p class="ah-ct-l">Tool iterations in one turn</p>
<p class="ah-dots" aria-hidden="true"><span class="ah-dots-on"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></p>
<p class="ah-out">Review: write or patch a skill</p>
<p class="mp-two-line">Unused 14 days: stale. 30 days: archived. Never deleted.</p>
</div>
<p class="mp-two-vs">and</p>
<div class="mp-two-card">
<p class="ah-who"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/openclaw.png" alt="" width="20" height="20" decoding="async">OpenClaw</p>
<p class="ah-ct-l">Model iterations in a conversation</p>
<p class="ah-dots" aria-hidden="true"><span class="ah-dots-on"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></p>
<p class="ah-out">Review: save a learned skill</p>
<p class="ah-ct-l">During a turn</p>
<p class="ah-out ah-out-on">Patch the learned skill that misled it</p>
<p class="mp-two-line">Unused 30 days: archived. Every change versioned, <code>/learn undo</code>.</p>
</div>
</div>
<p class="mp-strip"><b>By hand</b><span><code>/refine</code> on Hermes, <code>/learn</code> on OpenClaw.</span></p>
<figcaption id="ah4-cap">Both counters reach ten, then a review decides what to keep. Only Hermes runs one for memory.</figcaption>
</figure>

## Both run tools on your computer by default

This is the part I'd want someone to tell me first. Out of the box, OpenClaw runs tools on the host for your main session. Its README says so, and its sandbox page opens with "Sandboxing is off by default." Hermes's default terminal backend is local too. So a skill you install, or a prompt injected through an email the agent reads, can reach whatever your user account can.

It's not hypothetical. In February, CVE-2026-25253 let one click on a crafted link leak an OpenClaw gateway token and run code, fixed in 2026.1.29. A scan of ClawHub, OpenClaw's skill registry, found 341 malicious skills out of 2,857. SecurityScorecard counted 40,214 OpenClaw instances exposed to the internet on February 9. Hermes has had four CVEs of its own.

Some of the smaller harnesses exist because of exactly this. NanoClaw runs each agent group in its own container, and outbound requests go through a gateway that adds the credentials, so the agent never holds a raw API key. IronClaw runs untrusted tools in a WebAssembly sandbox with an endpoint allowlist and injects secrets only at the host boundary. Pick a setup in the figure and see what a bad skill can reach.

<figure class="fd-fig ah ah-blast" aria-labelledby="ah5-cap" data-desc="What a bad skill can reach under four setups, across six things on your machine: your documents, your SSH keys, API keys, browser sessions, the agent's workspace and the internet. On the host, the default for OpenClaw's main session and for Hermes's local backend, all six are reachable. In a Docker sandbox, opt-in on both, only the mounted workspace is reachable for sure, and keys or the network only if you allow them. NanoClaw's container per agent group, its default, reaches the group's folder, and the network only if allowed; credentials stay outside the container. IronClaw's WebAssembly tools, its default for untrusted tools, reach nothing unless granted: files and endpoints must be allowed, and secrets are injected at the host boundary and scanned for leaks. Under it, OpenClaw's record: CVE-2026-25253, a one-click remote code execution fixed in 2026.1.29; 341 malicious skills out of 2,857 on ClawHub; 40,214 instances exposed to the internet on February 9.">
<input class="fd-radio" type="radio" name="ah5" id="ah5-host" checked>
<input class="fd-radio" type="radio" name="ah5" id="ah5-dock">
<input class="fd-radio" type="radio" name="ah5" id="ah5-nano">
<input class="fd-radio" type="radio" name="ah5" id="ah5-iron">
<div class="fd-tabs ah-tabs"><label for="ah5-host">On the host</label><label for="ah5-dock">Docker sandbox</label><label for="ah5-nano">NanoClaw</label><label for="ah5-iron">IronClaw</label></div>
<div class="ah-blast-in">
<div class="ah-who-pane ah-w-host"><p class="ah-blast-n">6 of 6</p><p class="ah-blast-who"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/openclaw.png" alt="" width="20" height="20" decoding="async"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/hermes.png" alt="" width="20" height="20" decoding="async">The default for OpenClaw's main session and Hermes's local backend</p></div>
<div class="ah-who-pane ah-w-dock"><p class="ah-blast-n">1, maybe 3</p><p class="ah-blast-who"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/openclaw.png" alt="" width="20" height="20" decoding="async"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/hermes.png" alt="" width="20" height="20" decoding="async">Opt-in on both: the container sees what you mount and pass in</p></div>
<div class="ah-who-pane ah-w-nano"><p class="ah-blast-n">1, maybe 2</p><p class="ah-blast-who"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/nanoclaw.png" alt="" width="20" height="20" decoding="async">The default: a container per agent group, credentials added outside it</p></div>
<div class="ah-who-pane ah-w-iron"><p class="ah-blast-n">0 unless granted</p><p class="ah-blast-who"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/ironclaw.png" alt="" width="20" height="20" decoding="async">The default for untrusted tools: WebAssembly with capability permissions</p></div>
<ul class="ah-tiles">
<li class="ah-t ah-t-docs"><b>Your documents</b><em class="ah-s-yes">reachable</em><em class="ah-s-may">only if allowed</em><em class="ah-s-no">out of reach</em></li>
<li class="ah-t ah-t-ssh"><b>SSH keys</b><em class="ah-s-yes">reachable</em><em class="ah-s-may">only if allowed</em><em class="ah-s-no">out of reach</em></li>
<li class="ah-t ah-t-keys"><b>API keys</b><em class="ah-s-yes">reachable</em><em class="ah-s-may">only if allowed</em><em class="ah-s-no">out of reach</em></li>
<li class="ah-t ah-t-web"><b>Browser sessions</b><em class="ah-s-yes">reachable</em><em class="ah-s-may">only if allowed</em><em class="ah-s-no">out of reach</em></li>
<li class="ah-t ah-t-ws"><b>The agent's workspace</b><em class="ah-s-yes">reachable</em><em class="ah-s-may">only if allowed</em><em class="ah-s-no">out of reach</em></li>
<li class="ah-t ah-t-net"><b>The internet</b><em class="ah-s-yes">reachable</em><em class="ah-s-may">only if allowed</em><em class="ah-s-no">out of reach</em></li>
</ul>
</div>
<div class="mp-stats ah-stats-alert">
<p><b>1 click</b><span>CVE-2026-25253: token leak to code execution, fixed in 2026.1.29</span></p>
<p><b>341</b><span>malicious skills out of 2,857 on ClawHub, February</span></p>
<p><b>40,214</b><span>OpenClaw instances exposed to the internet, February 9</span></p>
</div>
<figcaption id="ah5-cap">Schematic: what each setup lets a tool touch by default, from each project's docs. The numbers are OpenClaw's, because it has the biggest crowd to attack.</figcaption>
</figure>

## The small claws each pick one fight

Every small claw is partly a reaction to OpenClaw's size. NanoClaw's README puts it bluntly: OpenClaw is "nearly half a million lines of code, 53 config files, and 70+ dependencies." NanoClaw is "built to be easily understood and completely customized for your needs", and customizing it means changing code, not config.

NanoClaw runs on Anthropic's Claude Agent SDK, with a container per agent group, and you add a channel by running a skill such as `/add-telegram`. nanobot, from the Data Intelligence Lab at the University of Hong Kong, is the small Python one, with Telegram, Feishu, WeChat, Slack and Discord among its channels.

ZeroClaw and PicoClaw aim at cheap hardware. ZeroClaw is a single Rust binary that talks to about 20 model providers and can drive GPIO pins on a Raspberry Pi, an Arduino or an ESP32. PicoClaw is Go, says it boots in under a second on a 0.6 GHz single core, and is honest that recent builds use 10 to 20 MB of RAM, not the under 10 in its headline.

IronClaw, from NEAR AI, describes itself as an agent OS focused on privacy, security and extensibility: a Rust reimplementation inspired by OpenClaw, with tools in WebAssembly, secrets encrypted with AES-256-GCM, PostgreSQL for state and no telemetry. These are the projects' own claims. I haven't benchmarked any of them.

<figure class="fd-fig ah ah-small" aria-labelledby="ah6-cap" data-desc="The five small claws, each with its own pitch. NanoClaw, TypeScript, MIT, 31 thousand stars: an AI assistant that runs agents securely in their own containers; a container per agent group on the Claude Agent SDK, credentials added outside the container, channels added as skills like /add-telegram. nanobot, Python, MIT, 49 thousand stars: an ultra-lightweight, self-hosted personal AI agent framework written in Python, from the University of Hong Kong's Data Intelligence Lab, with Telegram, Feishu, WeChat, Slack and Discord. ZeroClaw, Rust, 33 thousand stars: you own the agent, you own the data, you own the machine it runs on; a single binary with about 20 model providers and GPIO on Raspberry Pi, Arduino and ESP32. PicoClaw, Go, MIT, 30 thousand stars: runs on 10-dollar hardware with under 10 MB of RAM, though recent builds may use 10 to 20 MB, and boots in under a second on a 0.6 gigahertz single core. IronClaw, Rust, Apache 2.0, 13 thousand stars: an agent OS focused on privacy, security and extensibility; tools in WebAssembly, AES-256-GCM secrets, PostgreSQL, no telemetry.">
<p class="ah-h">The small claws, in their own words</p>
<ul class="ah-cards">
<li class="ah-card"><div class="ah-card-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/nanoclaw.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-name">NanoClaw<small>TypeScript · 31k stars</small></p></div><p class="ah-quote">"Runs agents securely in their own containers."</p><p class="ah-claim"><b>The fight</b>Isolation: a container per agent group, keys added outside it</p><p class="ah-claim"><b>Change it</b>in code; channels arrive as skills like <code>/add-telegram</code></p></li>
<li class="ah-card"><div class="ah-card-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/nanobot.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-name">nanobot<small>Python · 49k stars</small></p></div><p class="ah-quote">"Ultra-lightweight, open-source, self-hosted."</p><p class="ah-claim"><b>The fight</b>A small Python core you can read and fork</p><p class="ah-claim"><b>Reach</b>Telegram, Feishu, WeChat, Slack, Discord and more</p></li>
<li class="ah-card"><div class="ah-card-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/zeroclaw.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-name">ZeroClaw<small>Rust · 33k stars</small></p></div><p class="ah-quote">"You own the agent. You own the data."</p><p class="ah-claim"><b>The fight</b>One Rust binary, about 20 model providers</p><p class="ah-claim"><b>Hardware</b>GPIO on Raspberry Pi, Arduino, ESP32</p></li>
<li class="ah-card"><div class="ah-card-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/picoclaw.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-name">PicoClaw<small>Go · 30k stars</small></p></div><p class="ah-quote">"Runs on $10 hardware with &lt;10MB RAM."</p><p class="ah-claim"><b>The fight</b>Footprint: boots in under a second on a 0.6 GHz core</p><p class="ah-claim"><b>Fine print</b>"Recent builds may use 10-20MB RAM"</p></li>
<li class="ah-card"><div class="ah-card-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/ironclaw.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-name">IronClaw<small>Rust · 13k stars</small></p></div><p class="ah-quote">"An Agent OS focused on privacy, security and extensibility."</p><p class="ah-claim"><b>The fight</b>Security: WebAssembly tools, an endpoint allowlist</p><p class="ah-claim"><b>Secrets</b>AES-256-GCM, injected at the boundary, no telemetry</p></li>
</ul>
<figcaption id="ah6-cap">Quotes from each README on October 16. Footprints are the projects' own numbers, not my measurements.</figcaption>
</figure>

## What running two harnesses taught me

OpenClaw is the one I kept: 17 agents, 16 Telegram bots, one per agent, and four MCP servers into my own apps. It's also the one that's cost me the most evenings.

On September 1, the update from 2026.7.1 to 2026.8.1 turned into a multi-hour incident. Stricter config schemas rejected settings that had worked the day before, any warning during the startup migration now stopped the gateway, and the state database moved to a schema the old version couldn't read, so there was no going back. Two weeks later, 2026.9.4 needed Node 24.16 and quietly skipped any skill without a description in its frontmatter. One of my agents lost a skill that way.

Hermes went the other way. I ran it with two profiles, updated it on August 14 across 7,183 commits, and then stopped using it. By September 14 both of its gateways were crash-looping on Telegram tokens I'd revoked, so I removed it. The catch: my OpenClaw gateway turned out to be running on the Node binary that Hermes had bundled. Deleting one harness nearly took down the other.

Shared limits bite everything at once too. My agents share one Claude login, and on October 15 its five-hour limit stalled all of them together. Nothing retried after the reset.

None of that is a reason to skip either project. It's the price of software that moves this fast: read the release notes before you update, and back up the state folder first.

<figure class="fd-fig ah ah-tl" aria-labelledby="ah7-cap" data-desc="My timeline with both harnesses, one event highlighted at a time. May 2026: OpenClaw goes on a Mac mini and grows to 17 agents, 16 Telegram bots and four MCP servers. August 14: Hermes updates from 0.18.2 to 0.20.1, across 7,183 commits, on two profiles. September 1, a break: OpenClaw 2026.8.1 brings strict config schemas, fatal migration warnings and a state database with no way back, and the update takes hours. September 14, a break: both Hermes gateways are crash-looping on revoked bot tokens and Hermes is removed, the OpenClaw gateway turns out to run on Hermes's bundled Node, and OpenClaw 2026.9.4 then needs Node 24.16 and silently skips a skill without a description. October 15, a break: one Claude login's five-hour limit stalls every agent at once, and nothing retries after the reset.">
<p class="ah-now" aria-hidden="true"><span>May · OpenClaw moves in</span><span>Aug 14 · Hermes updates</span><span>Sep 1 · A one-way update</span><span>Sep 14 · Hermes moves out</span><span>Oct 15 · One limit, every agent</span></p>
<ol class="ah-tl-list ah-cyc5">
<li class="ah-ev"><p class="ah-ev-d">May 2026</p><p class="ah-ev-t"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/openclaw.png" alt="" width="20" height="20" loading="lazy" decoding="async"><b>OpenClaw on a Mac mini</b>Grows to 17 agents, 16 Telegram bots and four MCP servers.</p></li>
<li class="ah-ev"><p class="ah-ev-d">Aug 14</p><p class="ah-ev-t"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/hermes.png" alt="" width="20" height="20" loading="lazy" decoding="async"><b>Hermes 0.18.2 to 0.20.1</b>Two profiles, one update, 7,183 commits.</p></li>
<li class="ah-ev ah-ev-break"><p class="ah-ev-d">Sep 1</p><p class="ah-ev-t"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/openclaw.png" alt="" width="20" height="20" loading="lazy" decoding="async"><b>OpenClaw 2026.8.1</b>Strict config, fatal migration warnings, a state database with no way back. Hours.</p></li>
<li class="ah-ev ah-ev-break"><p class="ah-ev-d">Sep 14</p><p class="ah-ev-t"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/hermes.png" alt="" width="20" height="20" loading="lazy" decoding="async"><b>Hermes out, 2026.9.4 in</b>Gateways looping on revoked tokens; OpenClaw ran on Hermes's Node. Then Node 24.16, and a skill silently skipped.</p></li>
<li class="ah-ev ah-ev-break"><p class="ah-ev-d">Oct 15</p><p class="ah-ev-t"><img class="ah-logo ah-logo-s" src="/assets/img/notes/agent-harnesses/openclaw.png" alt="" width="20" height="20" loading="lazy" decoding="async"><b>One limit, every agent</b>A five-hour limit stalls the fleet. Nothing retries after the reset.</p></li>
</ol>
<figcaption id="ah7-cap">My own setup, from my notes. Red marks a break.</figcaption>
</figure>

## Pick by situation

So which one? Here's how I'd choose today.

If you want many agents across many chat apps, with your phone as a sensor, take OpenClaw, and turn the sandbox on for everything except your main session.

If you want one agent that gets better at your recurring work, and you'd rather hack Python, take Hermes. If you're already on OpenClaw, `hermes claw migrate --dry-run` shows what would come across: your SOUL.md, memories, skills, allowlists and channel settings.

If you want to read every line and keep each agent in a container, take NanoClaw. For a Raspberry Pi or a cheap board, PicoClaw or ZeroClaw. If secrets and untrusted tools are your main worry, IronClaw. For a small Python agent with Chinese chat platforms, nanobot.

And if all you want is to reach a coding session from your phone, you might not need a harness at all. Claude Code's Remote Control and Channels, and Codex's remote mode in the ChatGPT app, do that while your machine stays awake.

<figure class="fd-fig ah ah-pick" aria-labelledby="ah8-cap" data-desc="A situation picker with eight choices and an answer for each. Many agents across many chat apps: take OpenClaw, for about 30 channels, phone nodes and bindings that route each chat to its own agent; the catch is a big, fast-moving codebase, so read release notes, back up first and sandbox everything but the main session. One agent that learns your routine: take Hermes, for a learning loop on by default, small memory plus session search and many places to run commands; the catch is no phone app, and smart approvals are still one model judging another. Already on OpenClaw and curious: try Hermes through hermes claw migrate with --dry-run, which imports SOUL.md, memories, skills, allowlists and channel settings; check which Node each service runs on. Read every line: NanoClaw, a small TypeScript codebase on the Claude Agent SDK with a container per agent group; customizing means changing code. A Raspberry Pi or a cheap board: PicoClaw or ZeroClaw, single Go and Rust binaries, ZeroClaw with GPIO; the footprints are their own claims. Secrets first: IronClaw, with WebAssembly tools, an endpoint allowlist and secrets injected at the boundary; it needs PostgreSQL and has the smallest community. A small Python agent: nanobot, with Chinese chat platforms; its sandbox is off by default. Just a coding session from your phone: no harness, Claude Code Remote Control or Channels, or Codex remote in the ChatGPT app; it only works while the session or machine is up, with no memory or schedule of its own.">
<input class="fd-radio" type="radio" name="ah8" id="ah8-fleet" checked>
<input class="fd-radio" type="radio" name="ah8" id="ah8-learn">
<input class="fd-radio" type="radio" name="ah8" id="ah8-move">
<input class="fd-radio" type="radio" name="ah8" id="ah8-read">
<input class="fd-radio" type="radio" name="ah8" id="ah8-board">
<input class="fd-radio" type="radio" name="ah8" id="ah8-safe">
<input class="fd-radio" type="radio" name="ah8" id="ah8-py">
<input class="fd-radio" type="radio" name="ah8" id="ah8-none">
<div class="ah-pick-in">
<div class="ah-pick-list"><p class="ah-pick-h">Your situation</p><label for="ah8-fleet">Many agents, many chat apps</label><label for="ah8-learn">One agent that learns my routine</label><label for="ah8-move">On OpenClaw, curious about Hermes</label><label for="ah8-read">I want to read every line</label><label for="ah8-board">A Raspberry Pi or a cheap board</label><label for="ah8-safe">Secrets are my main worry</label><label for="ah8-py">A small Python agent</label><label for="ah8-none">Just my coding session, from my phone</label></div>
<div class="ah-ans ah-a-fleet"><div class="ah-ans-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/openclaw.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-ans-take"><small>Take</small>OpenClaw</p></div><p class="ah-ans-why"><b>Why</b>About 30 channels, phone nodes, and bindings that route each chat to its own agent. I run 17 behind one gateway.</p><p class="ah-ans-catch"><b>Catch</b>Big and fast-moving. Read the release notes, back up first, and sandbox everything but your main session.</p></div>
<div class="ah-ans ah-a-learn"><div class="ah-ans-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/hermes.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-ans-take"><small>Take</small>Hermes Agent</p></div><p class="ah-ans-why"><b>Why</b>The learning loop is on by default, memory stays small and searchable, and commands can run in seven places.</p><p class="ah-ans-catch"><b>Catch</b>No phone app, and smart approvals are still one model judging another.</p></div>
<div class="ah-ans ah-a-move"><div class="ah-ans-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/hermes.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-ans-take"><small>Try</small>Hermes, migrated</p></div><p class="ah-ans-why"><b>How</b><code>hermes claw migrate --dry-run</code> lists what comes across: SOUL.md, memories, skills, allowlists, channel settings.</p><p class="ah-ans-catch"><b>Catch</b>Running both? Check which Node each service runs on before you delete one.</p></div>
<div class="ah-ans ah-a-read"><div class="ah-ans-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/nanoclaw.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-ans-take"><small>Take</small>NanoClaw</p></div><p class="ah-ans-why"><b>Why</b>A small TypeScript codebase on the Claude Agent SDK, a container per agent group, keys kept outside.</p><p class="ah-ans-catch"><b>Catch</b>Customizing means changing code, and it's built around Claude.</p></div>
<div class="ah-ans ah-a-board"><div class="ah-ans-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/picoclaw.png" alt="" width="48" height="48" loading="lazy" decoding="async"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/zeroclaw.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-ans-take"><small>Take</small>PicoClaw or ZeroClaw</p></div><p class="ah-ans-why"><b>Why</b>Single binaries in Go and Rust. ZeroClaw drives GPIO pins.</p><p class="ah-ans-catch"><b>Catch</b>The footprints are their own claims. PicoClaw admits 10 to 20 MB on recent builds.</p></div>
<div class="ah-ans ah-a-safe"><div class="ah-ans-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/ironclaw.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-ans-take"><small>Take</small>IronClaw</p></div><p class="ah-ans-why"><b>Why</b>WebAssembly tools with capability permissions, an endpoint allowlist, secrets injected at the boundary and scanned for leaks.</p><p class="ah-ans-catch"><b>Catch</b>It needs PostgreSQL, and its community is the smallest of the seven.</p></div>
<div class="ah-ans ah-a-py"><div class="ah-ans-top"><img class="ah-logo ah-logo-l" src="/assets/img/notes/agent-harnesses/nanobot.png" alt="" width="48" height="48" loading="lazy" decoding="async"><p class="ah-ans-take"><small>Take</small>nanobot</p></div><p class="ah-ans-why"><b>Why</b>A compact Python core, and Feishu and WeChat next to Telegram and Slack.</p><p class="ah-ans-catch"><b>Catch</b>Its sandbox is optional and off by default.</p></div>
<div class="ah-ans ah-a-none"><div class="ah-ans-top"><span class="ah-logo ah-logo-l ah-nologo" aria-hidden="true">&gt;_</span><p class="ah-ans-take"><small>Take</small>No harness</p></div><p class="ah-ans-why"><b>Why</b>Claude Code Remote Control or Channels, or Codex remote in the ChatGPT app, reach the session you already run.</p><p class="ah-ans-catch"><b>Catch</b>Only while the session or the machine is up, with no memory or schedule of its own.</p></div>
</div>
<figcaption id="ah8-cap">My picks as of October 16, 2026. Both big projects ship often, so check the release notes before you trust any row.</figcaption>
</figure>

If you want more:

- [An agent fleet at home](/talks/openclaw/), my talk on the 17-agent OpenClaw setup
- [Don't be your team's meat proxy](/notes/dont-be-your-teams-meat-proxy.html), Peter Steinberger on teammates reaching your agents
- [AI coworkers in Slack need their own identity](/notes/ai-coworkers-slack-agent-identity.html), what changes when an agent posts as itself

If you run one of these, tell me which one and what broke first. I'd like to compare notes.
