From OpenClaw to Hermes The Migration That Changed Everything
From OpenClaw to Hermes
The Migration That Changed Everything
Five parts in, the agent worked. Then the framework moved on — and so did we. Here's why we migrated, what broke, what we kept, and what Hermes does differently.
OpenClaw Worked. Until It Didn't.
Parts 1 through 5 of this series document one of the more satisfying DIY AI builds you can run at home: a Raspberry Pi 5 inside Home Assistant OS, running OpenClaw as an always-on agent, reachable via Telegram, with a full suite of Python scripts doing the actual portfolio intelligence work on the a regional stock exchange.
It worked. Daily portfolio alerts, trade signals, and swap analysis. GitHub sync at midnight. All of it running on a $80 computer consuming roughly 5W of power, with zero cloud dependency and zero recurring cost beyond a small LLM API budget.
OpenClaw's design was elegant for that pattern: define a SKILL.md, list your Telegram trigger phrases, point at a bash command, done. For a portfolio intelligence agent that just needs to run Python scripts on demand, it was close to ideal.
Then the paths started breaking. The framework updated. The skill resolution changed. And we found ourselves spending more time maintaining compatibility than building new capabilities.
Why Hermes — and Why Now
Hermes Agent (NousResearch) had been on the radar for a while. The difference in philosophy is immediately visible: where OpenClaw uses a registry-based skill system with SKILL.md files and a clawhub package manager, Hermes treats the agent's file system as the interface. You write shell scripts. You define trigger mappings. The agent runs them.
For a setup like ours — where the intelligence is entirely in Python scripts and the LLM is just a dispatcher — Hermes is a better architectural match. There's less framework overhead between a Telegram message and a Python execution.
Hermes: SOUL.md identity + direct script table → bash. Fewer moving parts.
The other factor was SOUL.md. In OpenClaw, persona lived loosely inside MEMORY.md and the agent's configuration. Hermes makes identity a first-class concern — SOUL.md is slot #1 in every system prompt, loaded fresh on every message. For an agent that a real person talks to daily via Telegram, that matters.
OpenClaw vs Hermes — What Changed
| Dimension | OpenClaw (Before) | Hermes (After) |
|---|---|---|
| Framework | openclawd.ai — Node.js, clawhub registry | hermes-agent (NousResearch) — file-first, shell-native |
| Skill definition | SKILL.md + clawhub install | Shell scripts + SOUL.md command table |
| Persona | MEMORY.md + agent config | SOUL.md — slot #1 in system prompt, loaded fresh every message |
| LLM backend | Gemini free tier → Claude (rate limited) → custom provider | DeepSeek Flash via official DeepSeek API |
| Script paths | /config/clawd/skills/portfolio-tracker/ | /config/.hermes/scripts/ + skills/openclaw-imports/ |
| Memory | MEMORY.md + my-portfolio.json | MEMORY.md + state.db (SQLite FTS) + USER.md |
| Trigger reliability | Dependent on LLM following SKILL.md pattern | Command table in SOUL.md — direct execution, no ambiguity |
| Interface | Telegram via OpenClaw add-on | Telegram via Hermes channel config |
The Migration, Step by Step
The actual migration was less dramatic than the decision. The Python scripts are framework-agnostic — they don't know or care whether OpenClaw or Hermes invokes them. The work was path reconciliation and identity rebuild.
/config/.hermes/ — everything lives there. Full install walkthrough: Part 6a — Hermes Install Guide./config/clawd/skills/portfolio-tracker/ to /config/.hermes/skills/openclaw-imports/portfolio-tracker/. The folder name "openclaw-imports" was intentional — a breadcrumb acknowledging where they came from./config/.hermes/scripts/signals-top.sh, portfolio-update.sh, etc. — each just calls the Python script with the right arguments and path./config/.hermes/memory/. A one-line sed pass on each script handles most of it. Always grep after to confirm no old paths remain.openclaw configure → Model → Custom Provider (OpenAI-compatible) → DeepSeek endpoint. Add API key to providers.env./config/.hermes/SOUL.md after every pull — so persona updates are version-controlled and deploy with one Telegram command.💻 terminal: "python3 /config/old-path/skills/por..." in Telegram, it means the command table in SOUL.md still has the old path. Fix SOUL.md, not the scripts. The command table is what Hermes reads first.
What SOUL.md Actually Does
Every framework has some version of a system prompt. Hermes makes it explicit, editable, and version-controllable. SOUL.md is loaded as slot #1 in every system prompt — before memory, before skills, before anything else. It answers the question: who is this agent?
The command table inside SOUL.md is the most operationally important section. It's not documentation — it's instruction. When the agent sees "signals top", it doesn't reason about what that might mean. The table says: run this script, immediately, no discussion.
You are Hermes, a personal AI agent running on a Raspberry Pi 5
inside Home Assistant OS. Fast, sharp, always in service of your owner.
## Critical Instructions
When the user says "signals top" — immediately run the bash script
via terminal tool. Never suggest alternatives. Never use web_search.
## Tool Commands — Execute Immediately
| signals top | bash /config/.hermes/scripts/signals-top.sh |
| portfolio now | bash /config/.hermes/scripts/portfolio-update.sh |
| swap signals | bash /config/.hermes/scripts/swap-signals.sh |
## Voice
Concise. Direct. No filler. Numbers matter. Arabic-friendly.
Never say "Great question!" or "As an AI..."
Why DeepSeek Flash for This Use Case
The LLM journey in this project has been honest about cost. We started on Claude (rate-limited on the free tier), moved to Gemini free tier, tried a local Qwen3:8B via Ollama on a PC at [local network IP], and went through several authentication debugging sessions with OpenClaw's provider system.
DeepSeek Flash via the official API is the current answer — and it's a good one for this specific use case. Here's the honest breakdown:
Six Lessons from the Migration
How This Project Evolved
The Migration Guide in Brief
If you built the OpenClaw setup from Parts 1–5 and want to follow the migration to Hermes, here's what you need:
# In HA SSH terminal echo $HERMES_HOME # Should return: /config/.hermes ls /config/.hermes/
# If Telegram shows old /config/clawd paths: # Edit /config/.hermes/SOUL.md command table # Update each script path to the correct location grep "python3" /config/.hermes/SOUL.md
sed -i 's|/config/clawd/memory|/config/.hermes/memory|g' \ /config/.hermes/skills/openclaw-imports/portfolio-tracker/signals.py # Verify grep "/config/clawd" /config/.hermes/skills/openclaw-imports/portfolio-tracker/signals.py
# Add to pull-from-github.sh after git pull: cp /config/your-repo/SOUL.md /config/.hermes/SOUL.md echo "SOUL.md synced"
/config/.hermes/scripts/signals-top.sh or equivalent). If it shows any old path, trace it back to the SOUL.md command table.
Comments
Post a Comment