Keep 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:
text
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
bash
npx clawhub@latest install dual-memory
bash
# 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:
text
~/.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:
yaml
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 * * *"
KeyTypeDefaultDescriptionapiKeystringenv varSuperMemory API key (supports ${ENV_VAR})containerTagstringhostnameIsolates memories per agent/machineautoRecallbooleantrueAuto-inject relevant memoriesautoCapturebooleantrueAuto-store important infomaxRecallResultsnumber5Max memories per conversation (1-20)captureModestringeverythingCapture modeprofileFrequencynumber—Profile refresh interval (1-500)debugbooleanfalseVerbose loggingenableCustomContainerTagsbooleanfalseAllow multiple containerscustomContainersarray—Custom container definitions
KeyTypeDefaultDescriptiondreaming.enabledbooleantrueEnable dreaming cyclesdreaming.frequencystringcron exprDreaming 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.
FilePurposeindex.tsEntry point — loads backends, registers compositecomposite-runtime.tsMerged memory runtimecomposite-prompt.tsMerged prompt sectioncomposite-search-manager.tsSearch merging and deduplicationproxy-api.tsProxy API factoryconfig.tsConfig parsingopenclaw.plugin.jsonPlugin 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