OpenClaw

OpenClaw runs a personal agent across your chats. Its memory is a plugin slot, and the Recall plugin fills it: before each turn the agent sees what Recall remembers, after each turn Recall learns from the conversation, and the agent has tools to search, store and forget on its own. A correction replaces the old fact, the history stays, and the agent can read memory as of any earlier time.

Why Recall here

A personal agent hears facts that change: a new address, a new job, a preference that flipped. In a search index both versions come back and the model picks one. Recall decides at write time. "I moved to Bellevue" replaces "I live in Seattle", the agent gets the current value with what it replaced, and the old statement stays readable in the history. Nothing is deleted, so memory_search with as_of answers what was believed last month.

The memories live in your own polign_db, on local disk or in your bucket. OpenClaw holds one Recall key, and the key names the namespace, so one server can hold memory for many agents without any of them reaching another's records.

Before you start

Run the memory server

  1. Start polign_db and recall serve in text mode:

    polign-server -store fs:$HOME/.local/share/polign/openclaw
    recall -url http://127.0.0.1:23000 serve -text -listen 127.0.0.1:8080 \
      -extract-model anthropic:claude-haiku-4-5-20251001

    Both listen on loopback by default. -store takes an S3, GCS or Azure URL as well as a local path; see Run polign_db.

  2. Mint a key for OpenClaw:

    recall -url http://127.0.0.1:23000 key create -namespace openclaw -expires 8760h

    It prints a key that starts with rcl_, once. That is the only credential the plugin needs.

Install the plugin

  1. openclaw plugins install clawhub:@polign/openclaw-recall

    It is listed on ClawHub as Recall by Polign, so openclaw plugins search polign finds it too. The same package is on npm; installing from there asks you to confirm, and a script needs --force --accept-capabilities. The local example runs polign_db, Recall and every step below with one script.

  2. In openclaw.json, make Recall the memory engine and allow the hooks:

    {
      "plugins": {
        "slots": { "memory": "recall" },
        "entries": {
          "recall": {
            "enabled": true,
            "hooks": { "allowConversationAccess": true },
            "config": {
              "url": "http://127.0.0.1:8080",
              "apiKey": "${RECALL_API_KEY}"
            }
          }
        }
      }
    }

    slots.memory replaces the built-in memory with Recall. hooks.allowConversationAccess lets the plugin read the prompt and the turn's messages, which auto-recall and auto-capture need; OpenClaw asks this of every plugin it did not ship. Put the key in RECALL_API_KEY, or write it in place of ${RECALL_API_KEY}.

  3. Turn off the built-in memory plugin:

    openclaw plugins disable memory-core

    OpenClaw 2026.10 keeps it loaded even when the slot points elsewhere, and it registers memory_search first. Without this step the agent's searches go to the workspace Markdown files instead of Recall.

  4. Restart the gateway and try it:

    openclaw recall status
    openclaw recall remember "I moved to Bellevue and I prefer concise answers"
    openclaw recall search "where does the user live?"

What the agent gets

ToolWhat it does
memory_searchAsks what is remembered, in words. Each answer shows when it was stated and what it replaced. as_of answers as of an earlier time.
memory_storeKeeps a preference, a fact, a decision or a correction. Recall works out the statements; a newer one replaces an older one about the same thing, and restating something known changes nothing.
memory_forgetStops believing what a description names, such as "my editor". Nothing is deleted, and remembering it again brings it back.

Two hooks are on by default. Auto-recall asks Recall about the user's message and puts up to five answers in front of the prompt, in a <relevant-memories> block; when Recall has nothing to say or does not answer, nothing is added. Auto-capture sends the latest ten user and assistant messages to Recall after a successful turn, with any injected memory block stripped first so memory never feeds itself. Captures run in the background, one at a time, because extraction can take longer than the 30 seconds OpenClaw waits for a hook. They need a process that stays up, such as the gateway; a one-shot openclaw agent --local exits before the capture finishes.

Settings

All under plugins.entries.recall.config.

SettingDefaultMeaning
url$RECALL_URL, then http://127.0.0.1:8080Where recall serve listens.
apiKey$RECALL_API_KEYA Recall key. It chooses the namespace.
autoRecalltruePut relevant memories in front of each prompt.
autoCapturetrueSend the recent conversation to Recall after each turn.
maxMemories5How many memories auto-recall injects.
captureMessages10How many of the latest messages auto-capture sends.
timeoutMs60000How long the agent's memory tools wait. Storing waits for the extraction model. Auto-recall waits at most 10 seconds.
captureTimeoutMs120000How long one background capture waits.

What works differently from the built-in memory

Built-in memoryWith Recall
Markdown files in the workspace (MEMORY.md, daily notes)Statements in polign_db. The files are neither read nor written.
Search over file contentsSearch over current beliefs, each with what it replaced. The history is kept but hidden unless asked for with as_of.
No server to runrecall serve must be running. When it is not, the hooks log a warning and add nothing, and the tools report the error to the agent.
A list of everything rememberedNo list tool. Ask a broad question with openclaw recall search, or run recall explain against the server.

If something goes wrong

What you seeWhat to do
recall: no key configured in the gateway logSet apiKey in the plugin config or RECALL_API_KEY in the gateway's environment.
unauthenticated: the key is not known or no longer validThe key was revoked, expired, or minted against another database or collection. Mint a new one with recall key create.
typed hook "before_prompt_build" blocked in openclaw plugins inspect recall --runtimeAdd "hooks": { "allowConversationAccess": true } under plugins.entries.recall.
plugin tool name conflict (recall): memory_search in the gateway logRun openclaw plugins disable memory-core and restart the gateway.
auto-capture skipped: ... aborted due to timeoutExtraction took longer than captureTimeoutMs. Raise it, or use a faster extraction model.
This server has no extraction model, so the text was kept as writtenStart recall serve with -extract-model and the provider's key in the environment.
unreachable: Recall at ... did not answerrecall serve is not listening at url. Check the address and that it was started with -listen on that port.

Source & license

The plugin is open source under the Apache License 2.0, in github.com/Polign/polign, and is written against the HTTP contract in Recall's Memory API, version 1. Bug reports and pull requests go there.