Hermes Agent (Nous Research) — research for the agent-memory demo kingdom
Purpose. Source input for the Kingdom.md demo kingdom "agent memory" — a fictional markdown corpus that authentically mimics a real advanced agent's on-disk memory + skills store. Goal: borrow the structural conventions (the agentskills.io standard is open) and author original in-world content — we are not copying Hermes' files.
Method. A basic web pass, then two parallel sub-agents: (A) usage/best-practices in the wild, and
(B) a source-fidelity deep-dive over a local clone (C:\Projects\_research-clones\hermes-agent, full
checkout). Claims below are [confirmed] (read from the repo/official docs verbatim) or [inferred]
(synthesis). Adoption stats and the "OpenClaw" rivalry are promotional/lower-confidence.
What Hermes Agent is
A self-hosted, model-agnostic, self-improving personal AI agent from Nous Research (released
Feb 25 2026; repo github.com/NousResearch/hermes-agent; MIT). One-line install, runs as a persistent
daemon + messaging gateway across 16–20+ chat platforms, provider-agnostic (any OpenAI-compatible API).
Its defining trait for us: the agent's entire "brain" — memory, user-model, skills, identity — is
human-readable markdown on disk under ~/.hermes/. It reads and writes those files itself. [confirmed]
⭐ Why this is the perfect demo target
The transparency angle is the whole design, not an afterthought: a real, popular agent stores its mind
as plain markdown a human can read. Pointing Kingdom.md at a ~/.hermes/-shaped corpus literally renders
an AI's memory as a beautifully-typeset document tree — a built-in marketing story ("read your agent's
mind"). And the structure is near-convergent with Yggdrasil itself (MEMORY.md index, typed memory,
SKILL.mds, a curator/hygiene pass that ages → archive, a usage ledger, even a dogfood skill) — which
opens a cheeky meta-seam: a demo of an AI's memory, rendered in a viewer, structured like the very agent
that would maintain it.
The ~/.hermes/ on-disk layout (the skeleton to emulate)
Profile root = HERMES_HOME (~/.hermes on POSIX, %LOCALAPPDATA%\hermes on native Windows; named
profiles at ~/.hermes/profiles/<name>). [confirmed: hermes_constants.py, hermes_cli/profiles.py]
~/.hermes/ # profile root
├── SOUL.md # agent identity/voice — system-prompt slot #1; seeded if absent
├── config.yaml # non-secret config: memory / curator / skills / auxiliary blocks
├── .env # secrets (provider keys)
├── state.db # SQLite: all sessions, FTS5 full-text search (the "recall" tier)
│
├── memories/ # the always-on markdown memory core
│ ├── MEMORY.md # agent's notes — 2,200-char cap (~800 tok)
│ └── USER.md # user profile — 1,375-char cap (~500 tok)
│
├── skills/ # single source of truth for skills (procedural memory)
│ ├── <category>/<skill>/SKILL.md # + sibling references/ templates/ scripts/ assets/
│ ├── <category>/DESCRIPTION.md # one-line category descriptor (frontmatter-only)
│ ├── .usage.json # curator telemetry sidecar (per-skill counters + state)
│ ├── .bundled_manifest # bundled skill → origin content hash
│ ├── .archive/<skill>/ # curator-archived skills (flat; recoverable, never deleted)
│ ├── .curator_backups/<utc-iso>/ # pre-run tar.gz snapshots
│ └── .hub/{lock.json, taps.json, quarantine/, audit.log} # Skills Hub state
│
├── skill-bundles/<slug>.yaml # group skills under one slash command
├── plans/ # plan dir (also: /plan writes workspace-relative .hermes/plans/)
├── logs/curator/<YYYYMMDD-HHMMSS>/ # per-run: run.json + REPORT.md
├── sessions/ cron/ skins/ workspace/ home/
├── pending/skills/<id>.json # staged writes when write_approval:true
└── profiles/<name>/ # named profiles — each a full HERMES_HOME
Plus project-local context files (not under ~/.hermes/): AGENTS.md is primary; alternates
.hermes.md/HERMES.md, CLAUDE.md, .cursorrules (first-match-wins, 20k-char cap). [confirmed: context-files.md]
File formats (with verbatim shapes)
MEMORY.md / USER.md — the memory core
Plain markdown, no frontmatter. A flat list of entries joined by the delimiter "\n§\n" (a line
containing exactly §). [confirmed: memory_tool.py — ENTRY_DELIMITER = "\n§\n"] Loaded once at
session start into a frozen snapshot injected into the system prompt (mid-session writes persist to
disk but don't re-enter the prompt until next session — prefix-cache discipline). Managed only via the
memory tool: add / replace / remove, no read (it's already in context); replace/remove
use unique-substring matching. No auto-compact — an overflowing write returns a structured error and
the agent must consolidate in-turn. [confirmed: memory.md]
Rendered system-prompt block (verbatim from docs — the banner is generated at injection, not on disk):
══════════════════════════════════════════════
MEMORY (your personal notes) [67% — 1,474/2,200 chars]
══════════════════════════════════════════════
User's project is a Rust web service at ~/code/myapi using Axum + SQLx
§
This machine runs Ubuntu 22.04, has Docker and Podman installed
§
User prefers concise responses, dislikes verbose explanations
Good-entry style (dense, multi-fact, actionable): Project ~/code/api uses Go 1.22, sqlc, chi router. Run tests with 'make test'. CI via GitHub Actions. Save: preferences, environment facts, corrections,
conventions, completed work. Skip: trivia, re-discoverable facts, raw dumps, ephemera.
SKILL.md — the skill unit
YAML frontmatter + markdown body. Verbatim real example [confirmed: skills/creative/excalidraw/SKILL.md]:
---
name: excalidraw
description: "Hand-drawn Excalidraw JSON diagrams (arch, flow, seq)."
version: 1.0.0
author: Hermes Agent
license: MIT
dependencies: []
platforms: [linux, macos, windows]
metadata:
hermes:
tags: [Excalidraw, Diagrams, Flowcharts, Architecture, Visualization, JSON]
related_skills: []
---
Optional frontmatter: homepage, required_environment_variables, and under metadata.hermes:
category, fallback_for_toolsets/requires_toolsets (conditional activation), config[]. Body section
vocabulary (de-facto): # Title, ## When to Use/## Overview, ## Workflow/## Procedure (numbered),
## Pitfalls, ## Verification, ## Tips, a ## Tools Reference table, with relative links to sibling
references/<x>.md and templates/<x>. Package = a directory; SKILL.md is the only required file;
optional siblings references/ templates/ scripts/ assets/ tests/. Every installed skill auto-becomes a
/slash-command. [confirmed: skills.md, live skill trees]
DESCRIPTION.md — category descriptor (frontmatter-only, no body)
---
description: Knowledge and Tools for Machine Learning Operations - tools and frameworks for training, fine-tuning, deploying, and optimizing ML/AI models
---
Sits at a category dir; nests (skills/mlops/DESCRIPTION.md, skills/mlops/evaluation/DESCRIPTION.md).
[confirmed: skills/mlops/DESCRIPTION.md]
SOUL.md — agent identity (plain markdown, no frontmatter)
Durable voice/tone/posture, not project facts. System-prompt slot #1; empty → built-in fallback
("You are Hermes Agent… created by Nous Research…"). Body shape: # Personality / ## Style /
## What to avoid / ## Technical posture. [confirmed: personality.md, context-files.md]
AGENTS.md — project context (plain markdown)
Body shape: # Project Context / ## Architecture / ## Conventions / ## Important Notes.
[confirmed: context-files.md]
Plans & curator reports
- Plan files:
.hermes/plans/YYYY-MM-DD_HHMMSS-<slug>.md— Goal / Context / Approach / Steps / Files / Tests / Risks. [confirmed:planSKILL.md] - Curator:
~/.hermes/logs/curator/<timestamp>/{run.json, REPORT.md}. [confirmed:curator.md]
The Curator & skill lifecycle (what sells "self-improving")
Telemetry sidecar skills/.usage.json, one entry per skill — verbatim shape [confirmed: curator.md]:
{
"my-skill": {
"use_count": 12, "view_count": 34,
"last_used_at": "2026-04-24T18:12:03Z", "last_viewed_at": "2026-04-23T09:44:17Z",
"patch_count": 3, "last_patched_at": "2026-04-20T22:01:55Z",
"created_at": "2026-03-01T14:20:00Z",
"state": "active", "pinned": false, "archived_at": null
}
}
State machine active → stale → archived, deterministic clocks (no LLM): unused 30 days → stale,
unused 90 days → archived (package moved to skills/.archive/<skill>/). Never auto-deletes;
recoverable via hermes curator restore. Runs on inactivity (default every 7 days, only after 2h idle),
takes a pre-run .curator_backups/<utc-iso>/skills.tar.gz snapshot, then a single aux-model review may
keep/patch/consolidate. Jurisdiction: only agent-created skills (created_by:"agent", set by the
background self-improvement fork) are fully curated; user-authored, hub, and protected built-ins (e.g.
plan) are left alone; pinned:true exempts a skill. [confirmed: curator.md, skill_usage.py]
The layered memory model
Two additive layers, never mutually exclusive [confirmed: memory.md, memory-providers.md]:
- Markdown core (always on) —
MEMORY.md+USER.md(bounded,§-delimited, frozen snapshot), plus session search overstate.db(SQLite + FTS5) as the unbounded on-demand recall tier. - Pluggable external provider (≤1 active, runs alongside the core) — 8 plugins in
plugins/memory/(honcho, mem0, hindsight, holographic, openviking, retaindb, byterover, supermemory), each a folder withplugin.yaml+__init__.py+README.md. Selected viamemory.provider:inconfig.yaml. Local-first (holographic = SQLite+FTS5+HRR) through cloud knowledge-graph (honcho, mem0, supermemory).
Mental model: core = small/fast/always-present curated facts; session search = unbounded raw recall; provider = optional semantic/graph long-term layer. None replaces the markdown files.
Usage & best practices in the wild
- Deployment: one-line
curl|bash(or PowerShell installer on Windows — native Windows is supported per the official FAQ, contradicting one stale third-party review). Runs local / Docker / SSH / Modal / Termux. Signature shape = long-lived gateway daemon bridging chat platforms; multi-user via allowlists + DM pairing. [confirmed:faq.md,quickstart.md] - Canonical workflows: scheduled daily-briefing bot (cron → 8am Telegram digest), GitHub PR-review agent, team chat assistant, batch trajectory generation, named "digital twin" assistants. [confirmed: guides]
- Memory discipline: keep entries dense and near the char caps for realism; consolidate above ~80%;
duplicate entries auto-rejected; a security scan blocks prompt-injection / credential / invisible-Unicode
content;
memory.write_approval:truestages background-review writes for/memory pending. [confirmed:memory.md] - Skills in practice: the agent authors its own via
skill_manage(create/patch[preferred]/edit/delete) after complex tasks, error recovery, or user corrections. Mature libraries are category-organized (mlops, creative, github, productivity, research, software-development, devops, finance, security, autonomous-ai-agents…). Sharing via "taps" (GitHub repos ofSKILL.mddirs), skills.sh,.well-known/skills/index.json; default taps includeopenai/skills,anthropics/skills,huggingface/skills,NVIDIA/skills. [confirmed:skills.md,curator.md]
Flavor & quirks (cheek fuel)
- Self-aware dogfood culture: a bundled
dogfoodskill (the agent QA-testing web apps) + andogfood-adversarial-ux-test— it literally ships skills for testing itself. [confirmed] - Personality as a swappable layer:
SOUL.md= durable identity;/personality= temporary overlay. Real presets includehelpful, concise, technical, teacherand joke ones:kawaii ★,catgirl (nya~),pirate (Captain Hermes),uwu,noir,surfer,hype. [confirmed:personality.md] - "Ralph loop"
/goal: a standing goal where an aux judge model decides done/continue each turn (20-turn budget). UI:⊙ Goal set,↻ Continuing toward goal (3/20): …,✓ Goal achieved. Openly credits Codex CLI's/goal. [confirmed:goals.md] - Curator quirk: when no agent-created skills exist, reports show
Model: (not resolved) … Duration: 0s— a cheeky empty-run line. [confirmed:curator.md] - Community rivalry with "OpenClaw" (framed: "your agent under your rules" vs. Hermes "shaped by
accumulated workflows"); there's an
openclaw-migrationskill. [inferred/promotional]
What we'll emulate for the kingdom (distilled blueprint)
A believable fictional ~/.hermes/ corpus (all original in-world content) wants:
- Root identity + config —
SOUL.md(voice),config.yaml(memory:/curator:/skills:/auxiliary:blocks),AGENTS.md(project context). A.envstub is optional flavor. memories/MEMORY.md+USER.md— plain markdown, entries split by§lines, packed dense near the 2,200 / 1,375-char feel. No frontmatter.skills/<category>/<skill>/SKILL.mdacross diverse domains, full frontmatter (metadata.hermesnest),## When to use/## Workflow/## Pitfalls/## Verificationbody, a## Tools Referencetable, and real siblingreferences//templates//scripts/. Per-categoryDESCRIPTION.md(frontmatter-only).- Curator artifacts —
skills/.usage.json(exact schema, a couple markedcreated_by:"agent"),.bundled_manifest, a.archive/<old-skill>/, a.curator_backups/<utc-iso>/stub, andlogs/curator/<ts>/REPORT.mdnarrating an active→stale→archived transition + an LLM consolidation. - Plans & bundles — a few
plans/YYYY-MM-DD_HHMMSS-<slug>.md, askill-bundles/<slug>.yaml. - Layered-memory hint —
config.yamlmemory.provider: holographic+ aplugins/memory/holographic/ plugin.yamlstub.
Believability levers: the § delimiter, the metadata.hermes frontmatter nest, the frontmatter-only
DESCRIPTION.md, and especially the dot-prefixed curator sidecars (.usage.json, .bundled_manifest,
.archive/, .curator_backups/) — the hidden-file mechanics are what make it read as a self-improving
store rather than a static skills folder.
Viewer note / open design point: Kingdom.md's tree ignores all dotfiles, so the curator sidecars (
.usage.json,.archive/,.hub/…) and.envwould be hidden in the rendered kingdom — which both (a) accurately demos the dotfile-ignore filter and (b) means the "self-improving machinery" is invisible unless we surface a visible curator artifact (e.g. thelogs/curator/<ts>/REPORT.md, which is not dotted). Decide at author time how much of the curator story to tell through visible files.
Sources
Primary (verbatim from repo main / official docs): github.com/NousResearch/hermes-agent;
website/docs/user-guide/features/{memory,skills,curator,context-files,goals,personality,kanban}.md;
website/docs/reference/faq.md; hermes-agent.nousresearch.com/docs/; and the local clone at
C:\Projects\_research-clones\hermes-agent (read directly for code paths and skill examples).
Third-party (flavor / adoption / criticism — lower confidence): turingpost.com/p/hermes;
aibuilderclub.com Hermes review; github.com/SamurAIGPT/awesome-hermes-agent.