Overview
The OpenClaw plugin gives claude-mem persistent memory to agents running on the OpenClaw gateway. It handles three things:- Observation recording — Captures tool usage from OpenClaw’s embedded runner and sends it to the claude-mem worker for AI processing
- System prompt context injection — Injects the observation timeline into each agent’s system prompt via the
before_prompt_buildhook, keepingMEMORY.mdfree for agent-curated memory - Observation feed — Streams new observations to messaging channels (Telegram, Discord, Slack, etc.) in real-time via SSE
OpenClaw’s embedded runner (
pi-embedded) calls the Anthropic API directly without spawning a claude process, so claude-mem’s standard hooks never fire. This plugin bridges that gap by using OpenClaw’s event system to capture the same data.How It Works
Event Lifecycle
1
Agent starts (before_agent_start)
When an OpenClaw agent starts, the plugin initializes a session by sending the user prompt to
POST /api/sessions/init so the worker can create a new session and start processing.2
Context injected (before_prompt_build)
Before each LLM call, the plugin fetches the observation timeline from the worker’s
/api/context/inject endpoint and returns it as appendSystemContext. This injects cross-session context directly into the agent’s system prompt without writing any files.The context is cached for 60 seconds to avoid re-fetching on every LLM turn within a session.3
Tool use recorded (tool_result_persist)
Every time the agent uses a tool (Read, Write, Bash, etc.), the plugin sends the observation to
POST /api/sessions/observations with the tool name, input, and truncated response (max 1000 chars). This is fire-and-forget — it doesn’t block the agent from continuing work.Tools prefixed with memory_ are skipped to avoid recursive recording.4
Agent finishes (agent_end)
When the agent completes, the plugin extracts the last assistant message and sends it to
POST /api/sessions/summarize, then calls POST /api/sessions/complete to close the session. Both are fire-and-forget.5
Gateway restarts (gateway_start)
Clears all session tracking (session IDs, context cache) so agents get fresh state after a gateway restart.
System Prompt Context Injection
The plugin injects cross-session observation context into each agent’s system prompt via OpenClaw’sbefore_prompt_build hook. The content comes from the worker’s GET /api/context/inject?projects=<project> endpoint, which generates a formatted markdown timeline from the SQLite database.
This approach keeps MEMORY.md under the agent’s control for curated long-term memory (decisions, preferences, durable facts), while the observation timeline is delivered through the system prompt where it belongs.
Context is cached for 60 seconds per project to avoid re-fetching on every LLM turn. The cache is cleared on gateway restart. Use
syncMemoryFileExclude to opt specific agents out of context injection entirely.Observation Feed (SSE → Messaging)
The plugin runs a background service that connects to the worker’s SSE stream (GET /stream) and forwards new_observation events to a configured messaging channel. This lets you monitor what your agents are learning in real-time from Telegram, Discord, Slack, or any supported OpenClaw channel.
The SSE connection uses exponential backoff (1s → 30s) for automatic reconnection.
Setting Up the Observation Feed
The observation feed sends a formatted message to your OpenClaw channel every time claude-mem creates a new observation. Each message includes the observation title and subtitle so you can follow along as your agents work. Messages look like this in your channel:Step 1: Choose your channel
The observation feed works with any channel that your OpenClaw gateway has configured. You need two pieces of information:- Channel type — The name of the channel plugin registered with OpenClaw (e.g.,
telegram,discord,slack,signal,whatsapp,line) - Target ID — The chat ID, channel ID, or user ID where messages should be sent
Telegram
Telegram
Channel type:
telegramTarget ID: Your Telegram chat ID (numeric). To find it:- Message @userinfobot on Telegram
- It will reply with your chat ID (e.g.,
123456789) - For group chats, the ID is negative (e.g.,
-1001234567890)
Discord
Discord
Channel type:
discordTarget ID: The Discord channel ID. To find it:- Enable Developer Mode in Discord (Settings → Advanced → Developer Mode)
- Right-click the channel → Copy Channel ID
Slack
Slack
Channel type:
slackTarget ID: The Slack channel ID (not the channel name). To find it:- Open the channel in Slack
- Click the channel name at the top
- Scroll to the bottom of the channel details — the ID looks like
C01ABC2DEFG
Signal
Signal
Channel type:
signalTarget ID: The Signal phone number or group ID configured in your OpenClaw gateway.WhatsApp
Channel type:
whatsappTarget ID: The WhatsApp phone number or group JID configured in your OpenClaw gateway.LINE
LINE
Channel type:
lineTarget ID: The LINE user ID or group ID from the LINE Developer Console.Step 2: Add the config to your gateway
Add theobservationFeed block to your claude-mem plugin config in your OpenClaw gateway configuration:
Step 3: Verify the connection
After starting the gateway, check that the feed is connected:-
Check the logs — You should see:
-
Use the status command — Run
/claude_mem_feedin any OpenClaw chat to see: - Trigger a test — Have an agent do some work. When the worker processes the tool usage into an observation, you’ll receive a message in your configured channel.
The feed only sends
new_observation events — not raw tool usage. Observations are generated asynchronously by the worker’s AI agent, so there’s a 1-2 second delay between tool use and the observation message appearing in your channel.Troubleshooting the Feed
Installation
Run this one-liner to install everything automatically:Manual Configuration
Addclaude-mem to your OpenClaw gateway’s plugin configuration:
The claude-mem worker service must be running on the same machine as the OpenClaw gateway. The plugin communicates with it via HTTP on
localhost:37777.Configuration
string
default:"openclaw"
Project name for scoping observations in the memory database. All observations from this gateway will be stored under this project name.
boolean
default:true
Inject observation context into the agent system prompt via
before_prompt_build hook. When true, agents receive cross-session context automatically. Set to false to disable context injection entirely (observations are still recorded).string[]
default:[]
Agent IDs excluded from automatic context injection. Useful for agents that curate their own memory and don’t need the observation timeline (e.g.,
["snarf", "debugger"]). Observations are still recorded for excluded agents — only the context injection is skipped.number
default:37777
Port for the claude-mem worker service. Override if your worker runs on a non-default port.
boolean
default:false
Enable live observation streaming to messaging channels.
string
Channel type:
telegram, discord, signal, slack, whatsapp, linestring
Target chat/user/channel ID to send observations to.
Commands
/claude_mem_feed
Show or toggle the observation feed status./claude_mem_status
Check worker health and session status.Architecture
The plugin uses HTTP calls to the already-running claude-mem worker service rather than spawning subprocesses. This means:- No
bundependency required on the gateway - No process spawn overhead per event
- Uses the same worker API that Claude Code hooks use
- All operations are non-blocking (fire-and-forget where possible)
Session Tracking
Each OpenClaw agent session gets a uniquecontentSessionId (format: openclaw-<sessionKey>-<timestamp>) that maps to a claude-mem session in the worker. The plugin tracks:
sessionIds— Maps OpenClaw session keys to content session IDscontextCache— TTL cache (60s) for context injection responses, keyed by project
gateway_start.
Requirements
- Claude-mem worker service running on
localhost:37777(or configured port) - OpenClaw gateway with plugin support
- Network access between gateway and worker (localhost only)

