SoulChain for Hermes
Identity that survives destruction. Sovereign AI memory, anchored on-chain.
Native Hermes Agent port of openClause/soulchain.
What is this?
SoulChain anchors your Hermes Agent's identity and memory onchain. Every tracked file (SOUL.md, MEMORY.md, USER.md) gets a tamper-proof cryptographic record. You can verify nothing was silently altered, and restore from any point in history.
When a VPS dies, a disk corrupts, or a provider shuts down — the agent's soul survives.
Base is the default. Out of the box it uses our SoulRegistry on Base L2. You can point it at another EVM chain and deploy your own contract if you want.
Status: Phase 4 — ✅ PyPI Published
| Component | Status |
|---|---|
| SoulRegistry.sol | ✅ Default on Base (optional: deploy your own on any EVM chain) |
on-write daemon |
✅ Watchdog file watcher — anchors within 2s of change |
interval daemon |
✅ Periodic batch sync — configurable interval |
manual CLI |
✅ On-demand anchor, status, verify |
| Encryption layer | ✅ Ed25519 + AES-256-GCM + argon2id keystore |
| Access grants | ✅ Grant/revoke read access per doc type |
| Multi-agent hierarchy | ✅ Parent/child registration on-chain |
| Restore from chain | ✅ Download + decrypt + verify hash |
| PyPI package | ✅ pip install soulchain-hermes |
soulchain init |
✅ Interactive first-time setup |
Proven test results
All three sync modes verified with real on-chain transactions on Base mainnet:
| Mode | Test | Result |
|---|---|---|
on-write |
Appended to MEMORY.md → auto-anchored in ~7s | ✅ v0→v1 |
interval |
Appended to USER.md → picked up in 10s cycle | ✅ v0→v1 |
manual |
soulchain anchor → skips unchanged, anchors diffs |
✅ Working |
| Encryption | Daemon auto-encrypts with AES-256-GCM before anchoring | ✅ Encrypted blobs in storage |
| Restore | soulchain restore --doc-type 0 → downloads, decrypts, verifies hash |
✅ Working |
Quick Start
# Install from PyPI
pip install soulchain-hermes
# Initialize (generates keystore + config)
soulchain init
# Set your wallet private key (Base recommended — cheapest gas)
export SOULCHAIN_PRIVATE_KEY=0x...
# Register on-chain (one-time, costs gas)
soulchain register
# Anchor your files
soulchain anchor # anchor changed files
soulchain anchor --status # show on-chain status
soulchain anchor --verify # verify local vs on-chain
# Daemon mode — continuous sync
soulchain start --mode on-write # file watcher (anchors within 2s)
soulchain start --mode interval # periodic (every 5 min by default)
# Access control
soulchain grant 0xABC... --doc-type 0 # grant SOUL read access to an address
soulchain revoke 0xABC... --doc-type 0 # revoke access
# Restore from chain
soulchain restore --doc-type 0 # restore latest SOUL.md
soulchain restore --doc-type 1 --output /tmp/memory.md # restore to file
# Multi-agent hierarchy
soulchain hierarchy # show parent + children
soulchain hierarchy --register-child 0xDEF... # register child agent
Sync Modes
on-write — Real-time file watcher
Uses watchdog to monitor tracked files. When a file changes:
- Debounces for 2 seconds (waits for writes to settle)
- SHA-256 hashes the new content
- Signs with EIP-191
- Anchors on-chain via
writeDocument()
Best for: Always-on agents that need every memory change immortalized.
interval — Periodic batch sync
Checks all tracked files every N seconds. Anchors any that changed since last cycle.
Best for: Lightweight setups, cron-like operation, lower gas usage.
manual — On-demand
No daemon. Run when you want to anchor.
soulchain anchor # anchor changed files
soulchain anchor --force # re-anchor everything
soulchain anchor --file ~/.hermes/SOUL.md
soulchain anchor --status # on-chain status
soulchain anchor --verify # verify integrity
soulchain anchor --json # machine-readable output
Best for: Scripts, CI/CD hooks, manual checkpoints.
Configuration
soulchain.config.json:
{
"chain": {
"rpcUrl": "https://mainnet.base.org",
"chainId": 8453,
"contractAddress": "0x2AE3F15CAD486226Af839ae8FB4BbA08428283A2"
},
"trackedFiles": {
"SOUL": { "docType": 0, "path": "~/.hermes/SOUL.md" },
"MEMORY": { "docType": 1, "path": "~/.hermes/memories/MEMORY.md" },
"USER": { "docType": 3, "path": "~/.hermes/memories/USER.md" },
"IDENTITY": { "docType": 10, "path": "~/.hermes/config.yaml" }
},
"syncMode": "on-write",
"syncIntervalSec": 300,
"debounceMs": 2000,
"notify": {
"enabled": false,
"on": ["SOUL", "MEMORY", "USER", "IDENTITY"],
"telegram": {
"botTokenEnv": "TELEGRAM_BOT_TOKEN",
"chatId": "-1004399208265",
"threadId": 7223
},
"discord": { "webhookUrlEnv": "DISCORD_WEBHOOK_URL" },
"webhook": { "urlEnv": "SOULCHAIN_WEBHOOK_URL" }
}
}
Anchor notifications
Built into the package. During soulchain init you choose your channel:
- none
- telegram (your bot + chat)
- discord (your webhook)
- webhook (generic HTTP POST)
No channel is forced. Secrets go to ~/.soulchain/notify.env (mode 600), not the config file. The daemon auto-loads that file.
You can also edit config later:
"notify": {
"enabled": true,
"on": ["SOUL"],
"telegram": {
"botTokenEnv": "TELEGRAM_BOT_TOKEN",
"chatId": "123456789"
}
}
Failed notifications never fail the anchor itself.
Architecture
┌──────────────────────────────────────────────────────────┐
│ soulchain.core │
│ SoulChainEngine — hash, sign, anchor, verify, status │
│ (shared by all three modes) │
└──────────────────────────────────────────────────────────┘
▲ ▲ ▲
│ │ │
┌──────────────┐ ┌────────────┐ ┌──────────────┐
│ on_write │ │ interval │ │ manual │
│ watchdog │ │ timer │ │ CLI │
│ daemon │ │ daemon │ │ one-shot │
└──────────────┘ └────────────┘ └──────────────┘
│ │ │
▼ ▼ ▼
┌──────────────────────────────────────────────────────────┐
│ SoulRegistry.sol (default: Base L2) │
│ registerSoul() · writeDocument() · verifyDocument() │
└──────────────────────────────────────────────────────────┘
Systemd Deployment
sudo cp deploy/soulchain-on-write.service /etc/systemd/system/
sudo systemctl edit soulchain-on-write
# Add your private key + optional notify env:
# [Service]
# Environment=SOULCHAIN_PRIVATE_KEY=0x...
# Environment=TELEGRAM_BOT_TOKEN=...
# Environment=DISCORD_WEBHOOK_URL=...
# Environment=SOULCHAIN_WEBHOOK_URL=...
sudo systemctl daemon-reload
sudo systemctl enable --now soulchain-on-write
sudo journalctl -u soulchain-on-write -f
See deploy/README.md for interval mode setup.
Deployment
Contract: 0x2AE3F15CAD486226Af839ae8FB4BbA08428283A2 (Base mainnet)
Deploy Tx: 0x6f6c2efdf03d689c308822d2cced41e2fb84a20d209193546294394819c1550e
Cost Analysis
| Operation | Gas | Cost (Base L2) |
|---|---|---|
registerSoul() |
~50k | ~$0.0000003 |
writeDocument() |
~100k | ~$0.0000007 |
| Daily (4 files, on-write) | ~400k | ~$0.000003 |
| Monthly | ~12M | ~$0.00008 |
Effectively free. Base L2 gas is ~0.005 gwei.
Roadmap
Phase 1 — POC ✅
- Deploy SoulRegistry to Base
- Hash + sign + anchor files
- Verify on-chain
Phase 2 — Sync Modes ✅
-
on-writedaemon (watchdog file watcher) -
intervaldaemon (periodic batch) -
manualCLI (on-demand) - Unified CLI + config file
- Systemd service files
- Smart skip (only anchor changed files)
Phase 3 — Advanced ✅
- Encryption layer (Ed25519 + AES-256-GCM + argon2id keystore)
- Encrypted blob storage (LocalStorage + Pinata IPFS adapter)
- Hermes skill (auto-load, status in agent context)
- Access grants (grant/revoke read access per doc type)
- Multi-agent hierarchy (parent/child on-chain)
- Public verification dashboard (docs, grants, hierarchy)
- Restore from chain (download + decrypt + verify)
Phase 4 — Distribution (next)
- npm/pip package publish
- Cross-agent verification API (verify any agent's soul)
- Version timeline UI (browse all versions of each doc)
- IPFS pinning service integration (auto-pin on anchor)
Credit
Based on openClause/soulchain (MIT License). SoulRegistry.sol is used verbatim from the original project.
License
MIT
Metadata
Release files for soulchain-hermes 0.3.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| soulchain_hermes-0.3.8.tar.gz | 31.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| soulchain_hermes-0.3.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 63.7 kB
Release files / soulchain_hermes-0.3.8.tar.gz
| Download URL | soulchain_hermes-0.3.8.tar.gz |
|---|---|
| Size | 31.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
80cfc73601726a9a6691fbf929ae3bc8aaeaf4cc61e7ee66ab541cb7ec113640
|
|
BLAKE2b-256 checksum How to use checksums |
2aa3899f6be96adeb51a706bf1d3922ad5b193e8044f660fda55c8350d8c026e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|
Release files / soulchain_hermes-0.3.8-py3-none-any.whl
| Download URL | soulchain_hermes-0.3.8-py3-none-any.whl |
|---|---|
| Size | 32.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
01437e4d245c8c466bcdb46fdde57ee3614a0057d8e8134fb8f2062a86feb0a0
|
|
BLAKE2b-256 checksum How to use checksums |
5179893a5a704eca07a83e75a1746bd4e470f1765c8ac40a088a06f0c24fe7ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|