Install
openclaw skills install dual-memoryRun memory-core AND external memory providers (like SuperMemory) together in one slot — with full dreaming support. OpenClaw only allows one memory plugin, so this composite proxy lets you keep local QMD search + MEMORY.md + dreaming (Light/REM/Deep) while also getting cloud persistence from SuperMemory or other providers. Searches merge across all backends, writes go to both.
openclaw skills install dual-memoryKeep memory-core + dreaming AND add external memory providers like SuperMemory — all in one memory slot. No more choosing between local and cloud.
OpenClaw only allows one plugin per kind: "memory". You have to choose between:
This plugin eliminates the choice. You get memory-core + dreaming + any external provider in a single slot. The proxy pattern means you never lose native dreaming when adding cloud memory.
The plugin legitimately holds the memory slot and delegates to both backends via a proxy pattern:
dual-memory (holds memory slot)
├── Proxy API → memory-core (local)
│ ├── QMD vector search
│ ├── MEMORY.md management
│ └── Dreaming consolidation
└── Proxy API → supermemory (cloud)
├── Cloud vector search
├── Cross-session persistence
└── Profile/entity context
npx clawhub@latest install dual-memory
# Clone to extensions
cp -r dual-memory ~/.openclaw/extensions/
cd ~/.openclaw/extensions/dual-memory
npm install
This plugin requires openclaw-supermemory as a sibling extension:
~/.openclaw/extensions/
├── dual-memory/ ← this plugin
└── openclaw-supermemory/ ← required sibling
Install supermemory from ClawdHub: npx clawhub@latest install supermemory
Add to your OpenClaw config. Disable the individual plugins — the composite replaces them:
plugins:
entries:
# Disable individual plugins (composite handles both)
memory-core:
enabled: false
openclaw-supermemory:
enabled: false
# Enable composite
dual-memory:
enabled: true
config:
supermemory:
apiKey: "${SUPERMEMORY_OPENCLAW_API_KEY}"
containerTag: "my_agent"
autoRecall: true
autoCapture: true
maxRecallResults: 5
captureMode: "everything"
memoryCore:
dreaming:
enabled: true
frequency: "30 2 * * *"
| Key | Type | Default | Description |
|---|---|---|---|
apiKey | string | env var | SuperMemory API key (supports ${ENV_VAR}) |
containerTag | string | hostname | Isolates memories per agent/machine |
autoRecall | boolean | true | Auto-inject relevant memories |
autoCapture | boolean | true | Auto-store important info |
maxRecallResults | number | 5 | Max memories per conversation (1-20) |
captureMode | string | everything | Capture mode |
profileFrequency | number | — | Profile refresh interval (1-500) |
debug | boolean | false | Verbose logging |
enableCustomContainerTags | boolean | false | Allow multiple containers |
customContainers | array | — | Custom container definitions |
| Key | Type | Default | Description |
|---|---|---|---|
dreaming.enabled | boolean | true | Enable dreaming cycles |
dreaming.frequency | string | cron expr | Dreaming schedule |
The plugin creates proxy OpenClawPluginApi objects for each sub-plugin. These proxies intercept:
registerMemoryRuntime — captures the runtime from each backendregisterMemoryPromptSection — captures prompt injection from eachregisterMemoryFlushPlan — captures flush plans (memory-core only)After both sub-plugins register, the composite builds unified versions and registers them on the real API.
| File | Purpose |
|---|---|
index.ts | Entry point — loads backends, registers composite |
composite-runtime.ts | Merged memory runtime |
composite-prompt.ts | Merged prompt section |
composite-search-manager.ts | Search merging and deduplication |
proxy-api.ts | Proxy API factory |
config.ts | Config parsing |
openclaw.plugin.json | Plugin manifest |
openclaw-supermemory extension (sibling directory)SupermemoryClient for cloud search. This makes HTTPS calls to SuperMemory's API (api.supermemory.com) to search and store memories. The client comes from the openclaw-supermemory sibling extension. No other network calls are made.SUPERMEMORY_OPENCLAW_API_KEY — needed for cloud memory. Get one at supermemory.com. No other env vars are read.../openclaw-supermemory/ because OpenClaw's extension loader requires plugins to be co-located. This is the standard pattern for composite plugins that wrap other extensions"both backends failed to load" — Check that openclaw-supermemory exists as a sibling extension and npm install was run in both directories.
"memory-core not available" — The plugin tries to resolve memory-core from OpenClaw's built-in extensions. Make sure your OpenClaw version is >= 2026.1.29.
No cloud memories appearing — Verify SUPERMEMORY_OPENCLAW_API_KEY is set in your environment or .env file.
Dreaming not running — Check that memoryCore.dreaming.enabled is true and you have a cron job configured for the dreaming schedule.
MIT