A visualization layer for Hermes Agent's four-layer self-evolution. Watch the agent grow in real time — skills bloom as leaves, memory thickens the trunk, sessions feed the roots, and training trajectories carry the seeds of the next generation.
Read-only by design — observes ~/.hermes/ without modifying anything.
Most AI dashboards show token counts and cost charts. The Living Tree shows something different: the shape of an agent's growth.
Hermes Agent evolves across four layers. The tree maps each layer to a part of a living organism:
🌿 Canopy — Skills
the agent's learned capabilities.
Each leaf is a skill. Newest growth
sprouts closest to the trunk.
│
│
████████ Trunk — Memory
structural knowledge that holds
everything together. Thickens as
the agent remembers more.
│
│
╱ ╱╲ ╲ Roots — Sessions
past conversations that absorbed
experience from the soil of
human interaction.
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
Seeds — Training Trajectories
carried by the wind, ready to
grow the next generation.
Click any node to trace its lineage — sap-flow particles illuminate the path from root to leaf, showing exactly which conversation planted the seed for a capability.
Click Grow to replay evolution in session order. Each session appears with the memory and skills it produced, revealing how the agent became what it is.
Because growth that accumulates is what trees do. An agent that had 100 conversations is not the same as one that had 10 — not because it processed more tokens, but because each conversation left something behind. Memory. Skills. Judgment. The tree makes that residue visible.
A tree with withered leaves and a thin trunk tells a different story than one in full bloom. That difference — between an agent that is growing and one that is stagnating — is what the Living Tree exists to show.
| Layer | Tree Part | What It Tracks | Source |
|---|---|---|---|
| Context Evolution | Roots | Sessions — each conversation is a learning event | state.db |
| Memory Evolution | Trunk | MEMORY.md (agent notes) + USER.md (user profile) | ~/.hermes/memories/ |
| Skill Evolution | Canopy | Learned capabilities with health lifecycle | ~/.hermes/skills/*/SKILL.md |
| Model Evolution | Seeds | Training trajectories for next-generation fine-tuning | trajectory_samples.jsonl |
Session (conversation)
│
│ agent observes, learns
▼
Memory (stored knowledge)
│
│ knowledge crystallizes
▼
Skill (reusable capability)
│
│ successful patterns sampled
▼
Training Trajectory (seed for next generation)
Skill health states:
- Active — in use, healthy
- Stale — agent-created but unused for 30+ days
- Disabled — explicitly turned off
Skill sources:
- Bundled — shipped with the agent framework
- Agent-created — learned autonomously through conversation
Interactive SVG tree with D3.js layout and Framer Motion animations. Causal relationships are inferred by timestamp proximity between sessions, memory updates, and skill creation.
Token trends, cost breakdown by model, tool usage ranking, and activity heatmap. 7-day / 30-day toggle.
Grid view with search, health-status filtering, and drill-down into source code and frontmatter.
Side-by-side MEMORY.md and USER.md with capacity progress bars.
Paginated table with full message thread drill-down, tool call inspection, and cross-session search.
Browser-based configuration for agent model, memory limits, API keys, and channel integrations (Telegram, Discord, Slack, Signal, WhatsApp, Matrix).
- Python 3.9+
- Node.js 18+
- Hermes Agent with data in
~/.hermes/
cd backend
pip3 install -r requirements.txt
uvicorn main:app --reload --port 8000cd frontend
npm install
npm run devhttp://localhost:5173 | API docs at http://localhost:8000/api/docs
| Layer | Stack |
|---|---|
| Frontend | React 19, Vite 8, TypeScript, TailwindCSS 4 |
| Tree Visualization | D3.js (layout + zoom), Framer Motion (animations), SVG |
| Charts | Recharts |
| Data Fetching | SWR |
| Backend | FastAPI, Uvicorn, Pydantic |
| Data Source | ~/.hermes/ filesystem + SQLite (read-only) |
hermes-dashboard/
├── backend/
│ ├── main.py # FastAPI entry
│ ├── config.py # ~/.hermes/ path detection
│ ├── routers/
│ │ ├── evolution.py # /api/evolution/* (tree, timeline, summary)
│ │ ├── sessions.py # /api/sessions/* (list, detail, search)
│ │ ├── skills.py # /api/skills/*
│ │ ├── memory.py # /api/memory/*
│ │ ├── insights.py # /api/insights (analytics)
│ │ └── system.py # /api/system/* (status, settings, keys)
│ ├── services/
│ │ ├── tree_builder.py # Causal graph inference engine
│ │ ├── evolution_engine.py # Four-layer timeline aggregation
│ │ ├── session_db.py # SQLite read-only access
│ │ ├── skill_scanner.py # Filesystem skill scanner
│ │ └── memory_reader.py # MEMORY.md / USER.md parser
│ └── models/schemas.py # Pydantic response models
├── frontend/
│ ├── src/
│ │ ├── pages/ # Overview, Evolution, Skills, Memory, Sessions, Settings
│ │ ├── components/
│ │ │ └── evolution/tree/ # LivingTree, TreeNode, TreeBranch, TreeTooltip, ...
│ │ ├── hooks/useApi.ts # SWR data hooks
│ │ ├── lib/api.ts # API client
│ │ └── types/index.ts # TypeScript interfaces
│ └── package.json
└── README.md
| Method | Path | Description |
|---|---|---|
| GET | /api/evolution/tree?days=90 |
Living tree graph (nodes + causal edges) |
| GET | /api/evolution/timeline?days=90 |
Chronological event list |
| GET | /api/evolution/summary |
Four-layer aggregate stats |
| GET | /api/sessions?page=1&limit=20 |
Paginated session list |
| GET | /api/sessions/{id} |
Full session with messages |
| GET | /api/sessions/search?q=... |
Cross-session message search |
| GET | /api/skills |
All skills (summary) |
| GET | /api/skills/{name} |
Skill detail with source |
| GET | /api/memory |
Memory entries + capacity |
| GET | /api/memory/stats |
Usage statistics |
| GET | /api/insights?days=30 |
Token, cost, tool analytics |
| GET | /api/system/status |
Agent health |
| GET | /api/system/settings |
Configuration |
| PATCH | /api/system/settings |
Update configuration |
MIT
