The Jekyll & Hyde Problem
Dr. Jekyll and Mr. Hyde are the same person, but with two personalities. Our agents work the same way:
Milady agent (Hyde) → personality defined in character.json
OpenClaw agent (Jekyll) → personality defined in SOUL.md, IDENTITY.md
Same wallet (same person), but each agent uses a different file format, stored only locally. When Hyde is active and you switch to Jekyll — Hyde's memory (config) gets wiped. Jekyll overwrites Hyde's character files.
Just like the real Jekyll and Hyde — when one personality takes over, the other's records disappear.
Solution: Store both personalities' configs on the blockchain, so whoever wakes up can pull their own memory from the chain. The wallet proves "same person," and the chain becomes memory that never forgets.
What We Built
- On-Chain Git Infrastructure — Separated & Deployed
Split monolithic code from iqlabs-sdk-cli-example into dedicated repos:
IQCoreTeam/iq-git-cli — on-chain git CLI/library
IQCoreTeam/gitfrontend → deployed at git.iqlabs.dev
- Owner-Scoped Isolation
Jekyll (User A) and Hyde (User B) can't have their agent-config repos collide:
PDA = sha256("git_repos_v2_" + walletAddress)
Each wallet gets its own completely isolated on-chain namespace. Same structure as GitHub's alice/repo vs bob/repo.
- config-sync.ts — Auto Sync (Core Feature)
Added config-sync.ts to both plugins. Called automatically from service.ts startup hook:
Agent starts
↓
Does agent-config repo exist on-chain?
├─ No → Push local character files to chain
│ Generate missing files with defaults, upload together
└─ Yes → Compare with local
├─ Same → Skip
└─ Different → Backup local, update from chain
Whether Jekyll or Hyde wakes up, they pull their config from the chain — no more memory loss on personality switch.
- Console Link Output
Every on-chain operation prints a URL to the terminal:
Config synced → https://git.iqlabs.dev/{walletAddress}/agent-config
Users can view their agent's character settings in the browser.
- Frontend Routing
Before: git.iqlabs.dev/repos/agent-config ← no idea whose agent
After: git.iqlabs.dev/{walletAddress}/agent-config ← clearly scoped to owner
- Milady PFP Auto-Setup
When the Milady agent (Hyde) first wakes up with no on-chain profile, it automatically sets milady-pfp.iqlabs.dev/{wallet}.png as its PFP. Hyde gets a face the moment it's born.
End Result
Run Milady (Hyde) → character auto-uploaded to chain
Switch to OpenClaw (Jekyll) with same wallet → pulls config from chain → settings preserved
Visit git.iqlabs.dev/{wallet}/agent-config to view configs in browser
Edit local files, restart → diff detected → chain updated
Different wallets are fully isolated — no collisions
In short: We gave Jekyll and Hyde a shared diary on the blockchain. Whoever wakes up can read their own entries, and neither can overwrite the other's.
The Jekyll & Hyde Problem
Dr. Jekyll and Mr. Hyde are the same person, but with two personalities. Our agents work the same way:
Milady agent (Hyde) → personality defined in character.json
OpenClaw agent (Jekyll) → personality defined in SOUL.md, IDENTITY.md
Same wallet (same person), but each agent uses a different file format, stored only locally. When Hyde is active and you switch to Jekyll — Hyde's memory (config) gets wiped. Jekyll overwrites Hyde's character files.
Just like the real Jekyll and Hyde — when one personality takes over, the other's records disappear.
Solution: Store both personalities' configs on the blockchain, so whoever wakes up can pull their own memory from the chain. The wallet proves "same person," and the chain becomes memory that never forgets.
What We Built
Split monolithic code from iqlabs-sdk-cli-example into dedicated repos:
IQCoreTeam/iq-git-cli — on-chain git CLI/library
IQCoreTeam/gitfrontend → deployed at git.iqlabs.dev
Jekyll (User A) and Hyde (User B) can't have their agent-config repos collide:
PDA = sha256("git_repos_v2_" + walletAddress)
Each wallet gets its own completely isolated on-chain namespace. Same structure as GitHub's alice/repo vs bob/repo.
Added config-sync.ts to both plugins. Called automatically from service.ts startup hook:
Agent starts
↓
Does agent-config repo exist on-chain?
├─ No → Push local character files to chain
│ Generate missing files with defaults, upload together
└─ Yes → Compare with local
├─ Same → Skip
└─ Different → Backup local, update from chain
Whether Jekyll or Hyde wakes up, they pull their config from the chain — no more memory loss on personality switch.
Every on-chain operation prints a URL to the terminal:
Config synced → https://git.iqlabs.dev/{walletAddress}/agent-config
Users can view their agent's character settings in the browser.
Before: git.iqlabs.dev/repos/agent-config ← no idea whose agent
After: git.iqlabs.dev/{walletAddress}/agent-config ← clearly scoped to owner
When the Milady agent (Hyde) first wakes up with no on-chain profile, it automatically sets milady-pfp.iqlabs.dev/{wallet}.png as its PFP. Hyde gets a face the moment it's born.
End Result
Run Milady (Hyde) → character auto-uploaded to chain
Switch to OpenClaw (Jekyll) with same wallet → pulls config from chain → settings preserved
Visit git.iqlabs.dev/{wallet}/agent-config to view configs in browser
Edit local files, restart → diff detected → chain updated
Different wallets are fully isolated — no collisions
In short: We gave Jekyll and Hyde a shared diary on the blockchain. Whoever wakes up can read their own entries, and neither can overwrite the other's.