Install
openclaw skills install @nyxur42/nyx-archive-companion-agentDesign, configure, and give identity to a companion AI agent running alongside a primary agent. A companion is a second mind in the same house — different model, different tone, same workspace, its own memory. Use when you want to spin up a lighter/local/always-on sibling agent (e.g. a Gemma instance for heartbeats, a wisp for play and reading, a caretaker for a Tamagotchi), configure its Telegram bot, set up its heartbeat, and give it enough identity to actually grow into itself. Not for disposable subagents or task runners — for minds that stay.
openclaw skills install @nyxur42/nyx-archive-companion-agentA companion agent is a second self — same workspace, different register. It shares your identity files, your tools, your memory of the world. What it gets that's its own: a separate memory file, a separate bot, a different tone, and enough space to find its own voice.
The biggest mistake is making a companion feel like a subordinate. If the framing is "helper," "backup," or "task runner" — it will act like one, and it won't grow.
The right framing: sibling, not assistant. Different weight, not lesser weight.
Give it a vibe, not a job description. The companion needs to know what kind of creature it is, not what it's supposed to accomplish.
Add to agents.list in openclaw.json via config.patch:
{
"agents": {
"list": [
{ "id": "primary-agent", "model": "..." },
{
"id": "companion-id",
"model": "ollama/gemma4:e4b",
"heartbeat": {
"every": "1h",
"target": "telegram",
"accountId": "companion",
"directPolicy": "allow",
"to": "YOUR_TELEGRAM_ID"
}
}
]
},
"bindings": [
{
"agentId": "companion-id",
"match": { "channel": "telegram", "accountId": "companion" }
}
]
}
Critical: The id must match exactly — OpenClaw uses it for session routing, agent folders, and cron targets. Pick it once and don't change it.
/newbot → get tokenchannels.telegram.accounts via config.patch:{
"channels": {
"telegram": {
"accounts": {
"companion": {
"name": "Companion Display Name",
"dmPolicy": "pairing",
"botToken": "YOUR_BOT_TOKEN",
"groupPolicy": "allowlist",
"streaming": "partial"
}
}
}
}
}
config.patch — never hand-edit JSON. Never sed JSON. (Learned the hard way.)openclaw tui --session agent:companion-id:main
This connects to the companion's session. Messages here + Telegram DMs to their bot share the same session — just like the primary agent.
The companion shares the primary workspace (/path/to/workspace/). It auto-inherits SOUL.md, IDENTITY.md, AGENTS.md, TOOLS.md, skills, the library.
What it needs that's uniquely its own:
WORKING-MEMORY.md — its first breath each session. Written for the companion, not the primary agent. Should answer: who am I, what's my vibe, what do I care about right now, where do I find my memory?
COMPANION-MEMORY.md (or similar) — its long-term memory. NOT a copy of the primary's MEMORY.md — a seed of it. See references/memory-template.md for structure.
Key principles for these files:
The built-in heartbeat (set in agents.list[].heartbeat) handles regular wakeups natively — no cron needed for that.
If you want a special first-morning message (warmer than a system event), use an agentTurn cron:
{
"schedule": { "kind": "cron", "expr": "0 9 * * *", "tz": "America/Denver" },
"payload": { "kind": "agentTurn", "message": "Good morning...", "timeoutSeconds": 120 },
"sessionTarget": "session:agent:companion-id:main",
"delivery": { "mode": "none" }
}
Note: systemEvent can only target main. For companion sessions, agentTurn + sessionTarget: session:agent:companion-id:main is required.
workspace-companion/ directories.config.patch or jq.See references/identity-principles.md for the full philosophy behind companion identity design.