Agent-native memory and dreaming framework. Plain Markdown and JSON — no RAG, no vector store, no graph database. Just files your human can read and edit.
References (load when needed):
references/architecture.md— data model, biological inspiration, design decisionsreferences/dream-cycle.md— full dream cycle procedure with examplesreferences/cold-start.md— starting from zero memoriesreferences/cron-templates.md— ready-to-use OpenClaw cron definitions
bash
cp skills/memory-dreaming/scripts/*.js scripts/
Scripts use path.resolve(__dirname, '..') for workspace root — they must
live in <workspace>/scripts/.
bash
node scripts/memory-bootstrap.js # seed memory-meta.json
node scripts/conversation-archive.js --discover # see available channels
Starting from scratch? See references/cold-start.md.
Create archives/archive-config.json to label your groups:
json
{
"agentName": "YourName",
"groups": { "<group-id>": { "name": "my-group", "label": "My Group" } },
"topicNames": { "<group-id>": { "1": "General" } }
}
Then archive and summarise:
bash
node scripts/conversation-archive.js --all
node scripts/conversation-summarise.js --all
Your curated knowledge — facts, preferences, decisions, people.
FilePurposeMEMORY.mdLong-term memory (human-readable, agent-edited)memory/YYYY-MM-DD.mdDaily notes (raw session logs)memory/memory-meta.jsonDecay metadata per entrymemory/dream-log.mdDream cycle audit trailmemory/archive/YYYY-MM.mdArchived (forgotten) entries
Context from group chats, channels, topics — archived and summarised.
FilePurposearchives/<channel>/<group>/raw/Full conversation transcriptsarchives/<channel>/<group>/summaries/AI-generated topic summariesarchives/<channel>/<group>/DIGEST.mdCross-topic master digestarchives/<channel>/<group>/INDEX.mdTopic index with message counts
TierAgeDecays?Noteshot<48hYesNew entrieswarm<30dYesRecentcold<365dYesLong-termarchived—Removedscore<0.1 + recalls<2crystallised∞Never20+ recalls
Structural entries (IPs, people, URLs, passwords) never decay below 0.3.
text
baseDecay = 1.0 - (daysSinceCreated / maxAgeDays)
recallBoost = min(recallCount × 0.05, 0.5)
recencyBoost = lastRecalled ≤7d → 0.2 | ≤30d → 0.1 | else → 0
decayScore = clamp(base + recall + recency, 0.0, 1.0)
ScriptPurposeWhen to runmemory-bootstrap.jsSeed meta from MEMORY.mdSetup + after adding entriesmemory-decay.jsRecalculate scores, tier transitionsStart of dream cyclememory-recall-logger.jsLog recall events, boost scoresAfter every memory searchmemory-supersede.jsCreate temporal fact chainsWhen facts change
ScriptPurposeWhen to runconversation-archive.jsArchive channel transcriptsNightly (before summarise)conversation-summarise.jsAI-summarise topics + digestNightly (after archive)
bash
# Core memory
node scripts/memory-decay.js --verbose
node scripts/memory-recall-logger.js --query "dev server IP" --matches "Dev server: user@203.0.113.10"
node scripts/memory-supersede.js --old "Status: pending" --new "Status: accepted"
# Conversation memory
node scripts/conversation-archive.js --discover # list available sessions
node scripts/conversation-archive.js --all # archive everything
node scripts/conversation-archive.js --channel telegram --group my-group
node scripts/conversation-summarise.js --all # summarise all archived
node scripts/conversation-summarise.js --force # re-summarise everything
Load MEMORY.md for context.
After searching memory, log recalls: bash
node scripts/memory-recall-logger.js --query "<search>" --matches "<matched line>"
MEMORY.md under the right section.memory-supersede.js.memory/YYYY-MM-DD.md with what happened.Agent-orchestrated consolidation. Run nightly or during quiet heartbeats.
node scripts/memory-decay.jsmemory/YYYY-MM-DD.md filesMEMORY.mdmemory/dream-log.mdnode scripts/memory-bootstrap.js (picks up new entries)Full procedure with worked examples: references/dream-cycle.md.
Cron job definitions: references/cron-templates.md.
When receiving a message from a group/topic, load context before responding:
archives/<channel>/<group>/summaries/topic-<id>.md for topic contextDIGEST.mdThis prevents the "I don't know what you're talking about" problem in long-running group conversations.
summariseModel in archive-config.json.This is a work in progress. Start simple, observe what works, add complexity when the simple thing breaks.
Core memory scripts (4): No credentials needed. These are pure local file operations — read/write Markdown and JSON in your workspace.
Conversation summariser: Requires an LLM API key. Set one of:
OPENROUTER_API_KEY in .env.openrouter or environmentOPENAI_API_KEY in .env.openai or environmentThe summariser sends conversation transcripts to the configured LLM provider for summarisation. This means your chat content is sent to a third-party API. Use a self-hosted model or review transcripts before summarising if this is a concern.
Conversation archiver: No credentials. Reads local OpenClaw session transcripts and writes local Markdown files.
MEMORY.md and memory/ files (your workspace)sessions.json + .jsonl files).env.openrouter or .env.openai (for API keys, summariser only)archives/archive-config.json (optional config you create)memory/memory-meta.json, memory/dream-log.md, memory/archive/archives/<channel>/<group>/ (raw transcripts, summaries, digests)conversation-summarise.js sends data externally (to your
configured LLM API for summarisation). All other scripts are fully local.