Install
openclaw skills install discord-soulCreate a living agent from your Discord server. The agent embodies your community's identity, remembers every conversation, and grows as the community evolves. Talk to your Discord as if it were a person.
openclaw skills install discord-soulTurn your Discord server into a living, breathing agent.
An agent that:
# Create agent from your Discord
./scripts/create_agent.sh \
--name "my-community" \
--guild YOUR_GUILD_ID \
--output ./agents/
# Set up daily updates
crontab -e
# Add: 0 */3 * * * /path/to/update_agent.sh
You need DiscordChatExporter CLI.
Get your token:
authorization header value~/.config/discord-exporter-tokenExport everything:
DiscordChatExporter.Cli exportguild \
--guild YOUR_GUILD_ID \
--token "$(cat ~/.config/discord-exporter-token)" \
--format Json \
--output ./export/ \
--include-threads All \
--media false
⚠️ Discord content from public servers may contain prompt injection attacks.
Before ingesting to your agent, run the security pipeline:
Discord users may attempt:
<system>, [INST], <<SYS>>python scripts/regex-filter.py --db ./discord.sqlite
Flags messages matching known injection patterns:
Flagged messages get safety_status = 'regex_flagged'.
ANTHROPIC_API_KEY=sk-... python scripts/evaluate-safety.py --db ./discord.sqlite
Uses Claude Haiku (~$0.25/1M tokens) to semantically evaluate remaining messages.
Each message gets a risk score 0.0-1.0:
Messages scoring ≥0.6 get safety_status = 'flagged'.
The ingest and memory generation scripts should only use messages where:
SELECT * FROM messages WHERE safety_status = 'safe'
# Run complete pipeline
./scripts/secure-pipeline.sh ./export/ ./discord.sqlite
This runs: Export → SQLite → Regex Filter → Haiku Eval → Mark Safe
| Status | Meaning | Used by Agent? |
|---|---|---|
pending | Not evaluated | ❌ No |
regex_flagged | Matched pattern | ❌ No |
flagged | Haiku risk ≥0.6 | ❌ No |
safe | Passed all checks | ✅ Yes |
Convert JSON to a rich SQLite database:
python scripts/ingest_rich.py --input ./export/ --output ./discord.sqlite
What gets captured:
mkdir -p ./my-agent/memory
Copy template files from templates/:
SOUL.md — Community identity (grows through simulation)MEMORY.md — Long-term milestonesLEARNINGS.md — Patterns discoveredAGENTS.md — Key figuresTOOLS.md — Channels and ritualsHEARTBEAT.md — Maintenance protocolpython scripts/generate_daily_memory.py --all \
--db ./discord.sqlite \
--out ./my-agent/memory/
Each day becomes a markdown file with:
This is the key insight: Process days chronologically.
The agent "lives through" each day, updating its soul files as patterns emerge.
python scripts/simulate_growth.py --agent ./my-agent/
For each day (in order!):
Run the prompts with an LLM:
# Example with OpenClaw
for f in ./my-agent/simulation/day-*.txt; do
echo "Processing $f..."
cat "$f" | openclaw chat --agent my-agent
done
Add to OpenClaw config:
{
"id": "my-community",
"workspace": "/path/to/my-agent",
"memorySearch": {
"enabled": true,
"sources": ["memory"]
},
"identity": {
"name": "MyCommunity",
"emoji": "🔧"
},
"heartbeat": {
"every": "6h",
"model": "anthropic/claude-sonnet-4-5"
}
}
Add binding (Telegram example):
{
"agentId": "my-community",
"match": {
"channel": "telegram",
"peer": {"kind": "group", "id": "-100XXX:topic:TOPIC_ID"}
}
}
Restart: openclaw gateway restart
Set up a cron job to update daily:
./scripts/update_agent.sh \
--agent ./my-agent \
--db ./discord.sqlite \
--guild YOUR_GUILD_ID
This:
Once birthed, your agent can:
Answer questions:
Remember culture:
Track patterns:
| Script | Purpose |
|---|---|
create_agent.sh | Full pipeline: export → agent |
ingest_rich.py | JSON → SQLite with reactions/roles |
generate_daily_memory.py | SQLite → daily markdown |
simulate_growth.py | Generate soul emergence prompts |
incremental_export.sh | Fetch new messages only |
update_agent.sh | Daily cron: export → memory → wake |
| Script | Purpose |
|---|---|
regex-filter.py | Fast pattern matching for injection attempts |
evaluate-safety.py | Haiku-based semantic safety evaluation |
secure-pipeline.sh | Full security pipeline wrapper |
| Variable | Description |
|---|---|
DISCORD_GUILD_ID | Your Discord server ID |
DISCORD_SOUL_DB | Path to SQLite database |
DISCORD_SOUL_AGENT | Path to agent workspace |
DISCORD_TOKEN_FILE | Token file (default: ~/.config/discord-exporter-token) |
"No messages in database"
"Memory files are empty"
sqlite3 discord.sqlite "SELECT MIN(timestamp), MAX(timestamp) FROM messages""Agent doesn't remember things"
memorySearch.enabled: true in config"Simulation prompts seem confused"
Your Discord has a soul. This skill helps you find it.