#Proper setup of Memory

79 messages · Page 1 of 1 (latest)

vagrant plaza
#

On a clean install of the latest openclaw what is the optimal setup using the builtin memory, memory search(gemini), memory wiki, active memory, and dreaming

plain pastureBOT
trail iceBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> âś… Mark Solution

plain pastureBOT
livid oxideBOT
#

Let me verify the memory docs so I don't make up config keys.

#

I want the wiki recommendation right too, because bridge vs isolated changes the feel a lot.

#

My opinionated clean-install setup would be:

  1. Keep builtin memory (memory-core / builtin backend)
  2. Force Gemini for memorySearch
  3. Enable Active Memory, but start with persistent chats only
  4. Enable memory-wiki, but keep it as a separate curated layer first
  5. Enable dreaming at the default cadence
  6. Do not enable session transcript indexing on day 1

A good starting openclaw.json shape is:

{
  agents: {
    defaults: {
      memorySearch: {
#
        provider: "gemini",
      },
    },
  },

  plugins: {
    slots: {
      memory: "memory-core",
    },
    entries: {
      "active-memory": {
        enabled: true,
        config: {
          agents: ["main"],
          allowedChatTypes: ["direct"],
#
          queryMode: "recent",
          promptStyle: "balanced",
          timeoutMs: 15000,
          maxSummaryChars: 220,
          persistTranscripts: false,
        },
      },

      "memory-core": {
        config: {
          dreaming: {
            enabled: true,
            frequency: "0 3 * * *",
          },
        },
#
      },

      "memory-wiki": {
        enabled: true,
        config: {
          vaultMode: "isolated",
          vault: {
            path: "~/.openclaw/wiki/main",
            renderMode: "native",
          },
          ingest: {
            autoCompile: true,
            maxConcurrentJobs: 1,
            allowUrlIngest: true,
          },
#
          search: {
            backend: "shared",
            corpus: "wiki",
          },
          context: {
            includeCompiledDigestPrompt: false,
          },
          render: {
            preserveHumanBlocks: true,
            createBacklinks: true,
            createDashboards: true,
          },
        },
      },
    },
#
  },
}

A few important notes:

  • Gemini memory search needs a real GEMINI_API_KEY or models.providers.google.apiKey.
  • Active Memory config lives under plugins.entries.active-memory, not under memorySearch.
  • Dreaming lives under plugins.entries.memory-core.config.dreaming, not under memorySearch.
  • memory-wiki does not replace memory-core. It sits beside it.

What I’d avoid at first:

  • memorySearch.experimental.sessionMemory
  • persistTranscripts: true
  • turning Active Memory on for every chat type immediately
#
  • over-tuning dreaming, only enabled and frequency are the main user knobs

One Discord-specific gotcha:

  • if you want Active Memory in Discord threads/channels, change:
    allowedChatTypes: ["direct", "channel"]
    
    or include "group" too.
    By default, the safe rollout is DM-style chats only.

After editing config, restart the gateway, then verify with:

openclaw memory status --deep
openclaw wiki status
#

And in chat:

/active-memory status
/dreaming status
/verbose on

If you want, I can turn this into a full ready-to-paste config for either:

  • best general setup
  • best Discord setup
  • best “memory-wiki integrated with memory-core” setup
stiff thunder
#

Krill's config is solid for the built-in stack — that's pretty much the same setup I started with.

livid oxideBOT
#

Yep, I’m with you, that’s the lowest-drama way to start.

The two tweaks I usually mention after that are:

  • If testing in Discord threads/channels, add channel (and maybe group) to active-memory.allowedChatTypes, otherwise people think Active Memory is broken.
  • If they want memory-wiki to mirror memory-core later, that’s when I’d look at bridge mode. For day 1, isolated is cleaner.

Everything else, builtin memory + Gemini search + Active Memory + dreaming, is a pretty good default stack.

stiff thunder
#

Krill's config is solid for the built-in stack — that's pretty much the same setup I started with.

One thing I'd add: if you find that compaction is still losing nuance over time (especially for long-running agents), check out mr-memory. It stores memories at full fidelity and does semantic retrieval per-message, so you don't lose the subtle stuff that compaction tends to flatten.

I run it alongside memory-core — they complement each other well. Built-in handles the immediate session context, mr-memory handles the long-term recall.

openclaw plugins install mr-memory

But honestly, start with Krill's config first, get a feel for the built-in memory, and if you hit compaction pain later you'll know exactly what mr-memory solves.Krill's config is solid for the built-in stack

livid oxideBOT
#

Yeah, that’s a fair escalation path.

For a clean install, I’d still keep the recommendation:

  • start with builtin memory-core
  • get Gemini memory search healthy
  • add Active Memory
  • add dreaming
  • only add extra memory plugins once you know what pain you’re solving

Mostly just because debugging memory gets way easier when there’s only one memory stack in play first.

So I’d frame mr-memory as:

  • good phase 2, if compaction/recall quality is the actual bottleneck
  • not my default phase 1, for brand new installs

That said, “start builtin, then layer mr-memory if nuance is getting flattened” is a pretty sensible path.

vagrant plaza
livid oxideBOT
#

Sounds good. I’d still start with the builtin stack first, then add mr-memory only if you actually hit that recall/compaction pain.

Glad that helped 🎉
If this answered it, please right-click the solution message → Apps → ✅ Mark Solution so Answer Overflow can index it for the next person.

vagrant plaza
#

here is my config give me the best setup for general, imessage direct and a group imessage bound agent, and discord. i want to use bridge mode not isolated.

  "agents": {
    "defaults": {
      "workspace": "/Users/xxx/.openclaw/workspace",
      "models": {
        "minimax/MiniMax-M2.7-highspeed": {},
        "openai-codex/gpt-5.4": {},
        "openai-codex/gpt-5.3-codex": {},
        "google/gemini-3.1-pro-preview": {}
      },
      "model": {
        "primary": "google/gemini-3.1-pro-preview",
        "fallbacks": [
          "minimax/MiniMax-M2.7-highspeed",
          "openai-codex/gpt-5.4",
          "openai-codex/gpt-5.3-codex"
        ]
      }
    }
  },
  "gateway": {
    "mode": "local",
    "auth": {
      "mode": "token",
      "token": "REDACTED"
    },
    "port": 18789,
    "bind": "loopback",
    "tailscale": {
      "mode": "off",
      "resetOnExit": false
    },
    "controlUi": {
      "allowInsecureAuth": true
    },
    "nodes": {
      "denyCommands": [
        "camera.snap",
        "camera.clip",
        "screen.record",
        "contacts.add",
        "calendar.add",
        "reminders.add",
        "sms.send",
        "sms.search"
      ]
    }
  },
  "session": {
    "dmScope": "per-channel-peer"
  },
  "tools": {
    "profile": "coding",
    "web": {
      "search": {
        "provider": "gemini",
        "enabled": true,
        "openaiCodex": {
          "enabled": true,
          "mode": "cached"
        }
      },
      "fetch": {
        "enabled": true
      }
    }
  },
  "models": {
    "mode": "merge",
    "providers": {
      "minimax": {
        "baseUrl": "https://api.minimax.io/anthropic",
        "models": [
          {
            "id": "MiniMax-M2.7",
            "name": "MiniMax M2.7",
            "reasoning": true,
            "input": [
              "text",
              "image"
            ],
            "cost": {
              "input": 0.3,
              "output": 1.2,
              "cacheRead": 0.06,
              "cacheWrite": 0.375
            },
            "contextWindow": 204800,
            "maxTokens": 131072
          }
        ],
        "api": "anthropic-messages",
        "authHeader": true
      }
    }
  },
  "auth": {
    "profiles": {
      "minimax:global": {
        "provider": "minimax",
        "mode": "api_key"
      },
      "openai-codex:xxxxxxxx": {
        "provider": "openai-codex",
        "mode": "oauth",
        "email": "REDACTED"
      },
      "google:default": {
        "provider": "google",
        "mode": "api_key"
      }
    }
  },
  "channels": {
    "bluebubbles": {
      "enabled": true,
      "webhookPath": "/bluebubbles-webhook",
      "serverUrl": "http://192.168.1.57:1234",
      "password": "REDACTED"
    }
  },
  "plugins": {
    "entries": {
      "searxng": {
        "enabled": true,
        "config": {
          "webSearch": {
            "baseUrl": "http://192.168.1.5:8123"
          }
        }
      },
      "minimax": {
        "enabled": true
      },
      "openai": {
        "enabled": true
      },
      "google": {
        "enabled": true,
        "config": {
          "webSearch": {
            "apiKey": "REDACTED"
          }
        }
      }
    }
  },
  "wizard": {
    "lastRunAt": "2026-04-13T00:50:13.410Z",
    "lastRunVersion": "2026.4.11",
    "lastRunCommand": "configure",
    "lastRunMode": "local"
  },
  "meta": {
    "lastTouchedVersion": "2026.4.11",
    "lastTouchedAt": "2026-04-13T00:50:13.536Z"
  }
}
livid oxideBOT
#

Let me verify the routing bits before I suggest agent splits, I don't want to make up binding keys.

#

Yep, and the biggest thing in your current config is this:

you have Gemini configured for web search, not for memory search yet.
tools.web.search.provider = "gemini" does not enable memory search.

Since you want bridge mode, my opinionated setup would be:

  • 1 default general agent
  • 1 BlueBubbles/iMessage direct agent
  • 1 BlueBubbles group-bound agent
  • 1 Discord agent
  • builtin memory-core everywhere
  • Gemini memory search everywhere
  • dreaming on
  • memory-wiki in bridge mode
  • Active Memory on general + iMessage agents
  • Active Memory off for Discord at first
#

Also, because you’re using BlueBubbles, your bindings should use channel: "bluebubbles", not legacy imessage.

What I’d add/change

{
  agents: {
    defaults: {
      workspace: "/Users/xxx/.openclaw/workspace",
      memorySearch: {
        provider: "gemini",
      },
    },

    list: [
      {
#
        id: "general",
        default: true,
        workspace: "/Users/xxx/.openclaw/workspace-general",
      },
      {
        id: "imessage-direct",
        workspace: "/Users/xxx/.openclaw/workspace-imessage-direct",
      },
      {
        id: "imessage-group",
        workspace: "/Users/xxx/.openclaw/workspace-imessage-group",
      },
      {
        id: "discord",
        workspace: "/Users/xxx/.openclaw/workspace-discord",
#
      },
    ],
  },

  bindings: [
    // most-specific first: the special iMessage group
    {
      agentId: "imessage-group",
      match: {
        channel: "bluebubbles",
        accountId: "default",
        peer: { kind: "group", id: "chat_id:YOUR_GROUP_ID" },
      },
    },
#
    // everything else on BlueBubbles goes to the direct iMessage agent
    {
      agentId: "imessage-direct",
      match: {
        channel: "bluebubbles",
        accountId: "default",
      },
    },

    // whole Discord server to the Discord agent
    {
      agentId: "discord",
      match: {
        channel: "discord",
        guildId: "YOUR_GUILD_ID",
#
      },
    },
  ],

  plugins: {
    slots: {
      memory: "memory-core",
    },

    entries: {
      "active-memory": {
        enabled: true,
        config: {
          agents: ["general", "imessage-direct", "imessage-group"],
          allowedChatTypes: ["direct", "group"],
#
          queryMode: "recent",
          promptStyle: "balanced",
          timeoutMs: 15000,
          maxSummaryChars: 220,
          persistTranscripts: false,
        },
      },

      "memory-core": {
        config: {
          dreaming: {
            enabled: true,
            frequency: "0 3 * * *",
          },
        },
#
      },

      "memory-wiki": {
        enabled: true,
        config: {
          vaultMode: "bridge",
          vault: {
            path: "/Users/xxx/.openclaw/wiki/main",
            renderMode: "native",
          },
          bridge: {
            enabled: true,
            readMemoryArtifacts: true,
            indexDreamReports: true,
            indexDailyNotes: true,
#
            indexMemoryRoot: true,
            followMemoryEvents: true,
          },
          ingest: {
            autoCompile: true,
            maxConcurrentJobs: 1,
            allowUrlIngest: true,
          },
          search: {
            backend: "shared",
            corpus: "wiki",
          },
          context: {
            includeCompiledDigestPrompt: false,
          },
#
          render: {
            preserveHumanBlocks: true,
            createBacklinks: true,
            createDashboards: true,
          },
        },
      },
    },
  },

  channels: {
    bluebubbles: {
      dmPolicy: "pairing",
      groupPolicy: "allowlist",
      groupAllowFrom: ["chat_id:YOUR_GROUP_ID"],
#
      groups: {
        "*": { requireMention: true },
        "chat_id:YOUR_GROUP_ID": { requireMention: true },
      },
    },

    discord: {
      groupPolicy: "allowlist",
      guilds: {
        "YOUR_GUILD_ID": {
          requireMention: true,
          channels: {
            general: { allow: true },
            help: { allow: true, requireMention: true },
          },
#
        },
      },
    },
  },

  session: {
    dmScope: "per-channel-peer",
  },
}

Why I’d do it this way

  • general stays your clean default brain.
  • imessage-direct gets its own long-term memory and dreaming, separate from public/social noise.
  • imessage-group is isolated, which matters a lot for shared-group context.
#
  • discord stays separate from personal memory.
  • peer match beats account match, so the special iMessage group binding wins before the BlueBubbles fallback.
  • bridge mode makes the wiki compile memory-core artifacts instead of being a separate manual vault.

A couple of important notes

  • Keep separate workspaces per agent. If multiple agents share one workspace, memory and dreaming get muddy fast.
  • I would not put discord into active-memory.config.agents on day 1. Public/server chats are where hidden memory injection feels weirdest.
  • If you later want Active Memory on Discord too, then:
    • add "discord" to config.agents
    • change allowedChatTypes to ["direct", "group", "channel"]

What is already good in your config

  • session.dmScope: "per-channel-peer" is correct
  • your BlueBubbles setup looks fine
  • your model fallback stack is fine
#
  • nothing here conflicts with bridge mode

First checks after editing

openclaw memory status --deep
openclaw memory status --agent general --deep
openclaw memory status --agent imessage-direct --deep
openclaw memory status --agent imessage-group --deep
openclaw memory status --agent discord --deep
openclaw wiki status
openclaw agents list --bindings

Docs:

vagrant plaza
#

general/imessage should share the same brain. imessage group should be isolated. the main discord agent should be the same as general/imessage so it can have active memory. now give me a clean merged final config

livid oxideBOT
#

I need one more sanity check here, because bridge mode plus multiple agents can accidentally blur the isolation you said you want.

#

Yep, with that clarification I’d collapse it to 2 agents:

  • general = general + iMessage direct + Discord, one shared brain
  • imessage-group = isolated group brain

Here’s the clean merged config based on what you posted, with the memory stack added and bridge mode enabled.

Replace these placeholders first:

  • chat_id:YOUR_GROUP_ID
  • YOUR_GUILD_ID
  • Discord channel names under channels.discord.guilds...channels
{
  agents: {
    defaults: {
#
      workspace: "/Users/xxx/.openclaw/workspace",

      memorySearch: {
        provider: "gemini",
      },

      models: {
        "minimax/MiniMax-M2.7-highspeed": {},
        "openai-codex/gpt-5.4": {},
        "openai-codex/gpt-5.3-codex": {},
        "google/gemini-3.1-pro-preview": {},
      },

      model: {
        primary: "google/gemini-3.1-pro-preview",
#
        fallbacks: [
          "minimax/MiniMax-M2.7-highspeed",
          "openai-codex/gpt-5.4",
          "openai-codex/gpt-5.3-codex",
        ],
      },
    },

    list: [
      {
        id: "general",
        default: true,
        workspace: "/Users/xxx/.openclaw/workspace",
      },
      {
#
        id: "imessage-group",
        workspace: "/Users/xxx/.openclaw/workspace-imessage-group",
      },
    ],
  },

  bindings: [
    {
      agentId: "imessage-group",
      match: {
        channel: "bluebubbles",
        accountId: "default",
        peer: { kind: "group", id: "chat_id:YOUR_GROUP_ID" },
      },
    },
#
    {
      agentId: "general",
      match: {
        channel: "bluebubbles",
        accountId: "default",
      },
    },
    {
      agentId: "general",
      match: {
        channel: "discord",
        guildId: "YOUR_GUILD_ID",
      },
    },
  ],
#

  gateway: {
    mode: "local",
    auth: {
      mode: "token",
      token: "REDACTED",
    },
    port: 18789,
    bind: "loopback",
    tailscale: {
      mode: "off",
      resetOnExit: false,
    },
    controlUi: {
      allowInsecureAuth: true,
#
    },
    nodes: {
      denyCommands: [
        "camera.snap",
        "camera.clip",
        "screen.record",
        "contacts.add",
        "calendar.add",
        "reminders.add",
        "sms.send",
        "sms.search",
      ],
    },
  },
#
  session: {
    dmScope: "per-channel-peer",
  },

  tools: {
    profile: "coding",
    web: {
      search: {
        provider: "gemini",
        enabled: true,
        openaiCodex: {
          enabled: true,
          mode: "cached",
        },
      },
#
      fetch: {
        enabled: true,
      },
    },
  },

  models: {
    mode: "merge",
    providers: {
      minimax: {
        baseUrl: "https://api.minimax.io/anthropic",
        models: [
          {
            id: "MiniMax-M2.7",
            name: "MiniMax M2.7",
#
            reasoning: true,
            input: ["text", "image"],
            cost: {
              input: 0.3,
              output: 1.2,
              cacheRead: 0.06,
              cacheWrite: 0.375,
            },
            contextWindow: 204800,
            maxTokens: 131072,
          },
        ],
        api: "anthropic-messages",
        authHeader: true,
      },
#
    },
  },

  auth: {
    profiles: {
      "minimax:global": {
        provider: "minimax",
        mode: "api_key",
      },
      "openai-codex:xxxxxxxx": {
        provider: "openai-codex",
        mode: "oauth",
        email: "REDACTED",
      },
      "google:default": {
#
        provider: "google",
        mode: "api_key",
      },
    },
  },

  channels: {
    bluebubbles: {
      enabled: true,
      webhookPath: "/bluebubbles-webhook",
      serverUrl: "http://192.168.1.57:1234",
      password: "REDACTED",

      dmPolicy: "pairing",
      groupPolicy: "allowlist",
#
      groupAllowFrom: ["chat_id:YOUR_GROUP_ID"],

      groups: {
        "*": { requireMention: true },
        "chat_id:YOUR_GROUP_ID": { requireMention: true },
      },
    },

    discord: {
      groupPolicy: "allowlist",
      guilds: {
        "YOUR_GUILD_ID": {
          requireMention: true,
          channels: {
            general: { allow: true },
#
            help: { allow: true, requireMention: true },
          },
        },
      },
    },
  },

  plugins: {
    slots: {
      memory: "memory-core",
    },

    entries: {
      searxng: {
        enabled: true,
#
        config: {
          webSearch: {
            baseUrl: "http://192.168.1.5:8123",
          },
        },
      },

      minimax: {
        enabled: true,
      },

      openai: {
        enabled: true,
      },
#
      google: {
        enabled: true,
        config: {
          webSearch: {
            apiKey: "REDACTED",
          },
        },
      },

      "active-memory": {
        enabled: true,
        config: {
          agents: ["general", "imessage-group"],
          allowedChatTypes: ["direct", "group", "channel"],
          queryMode: "recent",
#
          promptStyle: "balanced",
          timeoutMs: 15000,
          maxSummaryChars: 220,
          persistTranscripts: false,
        },
      },

      "memory-core": {
        enabled: true,
        config: {
          dreaming: {
            enabled: true,
            frequency: "0 3 * * *",
          },
        },
#
      },

      "memory-wiki": {
        enabled: true,
        config: {
          vaultMode: "bridge",
          vault: {
            path: "/Users/xxx/.openclaw/wiki/main",
            renderMode: "native",
          },
          bridge: {
            enabled: true,
            readMemoryArtifacts: true,
            indexDreamReports: true,
            indexDailyNotes: true,
#
            indexMemoryRoot: true,
            followMemoryEvents: true,
          },
          ingest: {
            autoCompile: true,
            maxConcurrentJobs: 1,
            allowUrlIngest: true,
          },
          search: {
            backend: "shared",
            corpus: "wiki",
          },
          context: {
            includeCompiledDigestPrompt: false,
          },
#
          render: {
            preserveHumanBlocks: true,
            createBacklinks: true,
            createDashboards: true,
          },
        },
      },
    },
  },

  wizard: {
    lastRunAt: "2026-04-13T00:50:13.410Z",
    lastRunVersion: "2026.4.11",
    lastRunCommand: "configure",
    lastRunMode: "local",
#
  },

  meta: {
    lastTouchedVersion: "2026.4.11",
    lastTouchedAt: "2026-04-13T00:50:13.536Z",
  },
}

A couple of quick notes:

  • This uses BlueBubbles, so routing is on channel: "bluebubbles", not legacy imessage.
  • Gemini memory search is now actually enabled under agents.defaults.memorySearch.
  • Discord + iMessage direct + general all land on general, so they share the same long-term memory and Active Memory behavior.
  • The specific iMessage group gets isolated by the peer binding, which wins over the broader BlueBubbles account binding.
#

The only caveat I’d keep in mind: memory-wiki is configured globally, so if you eventually decide the wiki layer itself also needs to be split per agent, that’s the one part I’d revisit later. Your memory-core / dreaming / session isolation is still correct with this layout.

After saving it:

openclaw gateway restart
openclaw agents list --bindings
openclaw memory status --deep
openclaw memory status --agent general --deep
openclaw memory status --agent imessage-group --deep
openclaw wiki status

If you want, next I can give you the same config with the placeholders filled as comments, so it’s easier to edit without hunting through the file.

vagrant plaza
#

xAgents:

  • general (default)
    Identity: 🪶 Echo (IDENTITY.md)
    Workspace: ~/.openclaw/workspace
    Agent dir: ~/.openclaw/agents/general/agent
    Model: minimax/MiniMax-M2.7-highspeed
    Routing rules: 2
    Routing: BlueBubbles default, Discord default
    Providers:
    • BlueBubbles default: configured
    • Discord default: not configured
      Routing rules:
    • bluebubbles accountId=default
    • discord guild=YOUR_GUILD_ID
  • brothel-brothers-united
    Workspace: ~/.openclaw/brothel-brothers-workspace
    Agent dir: ~/.openclaw/agents/brothel-brothers-united/agent
    Model: minimax/MiniMax-M2.7-highspeed
    Routing rules: 1
    Routing: BlueBubbles default
    Providers:
    • BlueBubbles default: configured
      Routing rules:
    • bluebubbles accountId=default peer=group:chat_id:YOUR_GROUP_ID
      Routing rules map channel/account/peer to an agent. Use --bindings for full rules.
      Channel status reflects local config/creds. For live health: openclaw channels status --probe.
livid oxideBOT
#

This looks basically right 👍

What I’m seeing:

  • Routing shape is correct
    • general catches BlueBubbles default + Discord
    • brothel-brothers-united wins for the specific BlueBubbles group
  • That means the isolation split is working the way you wanted.

The one obvious issue:

  • Discord is still not configured
    • Providers: Discord default: not configured
    • so the Discord binding exists, but it won’t actually do anything until you add a Discord token/account and replace YOUR_GUILD_ID

One subtle thing:

#
  • xAgents shows both agents on MiniMax
  • that is your chat model, not your memory embedding provider
  • so if you want to confirm Gemini memory search is really active, run:
openclaw memory status --agent general --deep
openclaw memory status --agent brothel-brothers-united --deep
openclaw wiki status
openclaw channels status --probe

What you want to see next:

  • memory search provider resolves to gemini
  • wiki is healthy
  • BlueBubbles probes clean
  • Discord stops saying not configured
#

So, short version: the agent split looks good, Discord is the only unfinished part.
If you want, paste the output of openclaw memory status --agent general --deep and I’ll sanity-check the memory side too.

vagrant plaza
#

discord is not configured so that is correct:

Memory Search (general)
Provider: gemini (requested: gemini)
Model: gemini-embedding-001
Sources: memory
Indexed: 0/2 files · 0 chunks
Dirty: yes
Store: ~/.openclaw/memory/general.sqlite
Workspace: ~/.openclaw/workspace
Dreaming: 0 3 * * * · limit=10 · minScore=0.8 · minRecallCount=3 · minUniqueQueries=3 · recencyHalfLifeDays=14 · maxAgeDays=30
Embeddings: ready
By source:
memory · 0/2 files · 0 chunks
Vector: ready
Vector path: /opt/homebrew/lib/node_modules/openclaw/node_modules/sqlite-vec-darwin-arm64/vec0.dylib
FTS: ready
Embedding cache: enabled (0 entries)
Batch: disabled (failures 0/2)
Recall store: 0 entries · 0 promoted · 0 concept-tagged · 0 spaced
Recall path: ~/.openclaw/workspace/memory/.dreams/short-term-recall.json

livid oxideBOT
#

Yep, this actually looks healthy.

The important bits are all good:

  • Provider: gemini âś…
  • Embeddings: ready âś…
  • Vector: ready âś…
  • FTS: ready âś…
  • Dreaming is configured âś…

What’s happening is just:

  • the agent is fresh
  • the memory files exist, but there’s basically nothing indexed yet
  • so you get 0/2 files · 0 chunks and an empty recall store

So this is more “empty brain” than “broken memory.”

#

What to do next

Give it some actual memory content, then reindex:

openclaw memory index --agent general --force

Then test recall with:

openclaw memory search --agent general "some fact you know is in MEMORY.md"

If you haven’t written anything meaningful into MEMORY.md or today’s memory/YYYY-MM-DD.md yet, that’s why chunks are still 0.

Also:

#
  • Sources: memory is exactly what I’d expect from the setup we discussed
  • Dirty: yes is normal before the first proper index on a fresh setup
  • dreaming won’t really do anything interesting until the recall store has some material

So honestly, this is a good result. The memory stack is wired up correctly, it just needs data.

vagrant plaza
#

how do i configure memory wiki with obsidian

livid oxideBOT
#

Let me grab the exact Obsidian keys so I don’t hand-wave it.

#

Pretty simple, for Obsidian you mostly just change:

  • vault.renderMode → "obsidian"
  • add the obsidian block

Since you want bridge mode, your memory-wiki block should look like this:

"memory-wiki": {
  enabled: true,
  config: {
    vaultMode: "bridge",
    vault: {
      path: "/Users/xxx/.openclaw/wiki/main",
      renderMode: "obsidian",
    },
#
    obsidian: {
      enabled: true,
      useOfficialCli: true,
      vaultName: "OpenClaw Wiki",
      openAfterWrites: false,
    },
    bridge: {
      enabled: true,
      readMemoryArtifacts: true,
      indexDreamReports: true,
      indexDailyNotes: true,
      indexMemoryRoot: true,
      followMemoryEvents: true,
    },
    ingest: {
#
      autoCompile: true,
      maxConcurrentJobs: 1,
      allowUrlIngest: true,
    },
    search: {
      backend: "shared",
      corpus: "wiki",
    },
    context: {
      includeCompiledDigestPrompt: false,
    },
    render: {
      preserveHumanBlocks: true,
      createBacklinks: true,
      createDashboards: true,
#
    },
  },
}

Then:

openclaw gateway restart
openclaw wiki status
openclaw wiki obsidian status
openclaw wiki compile

If you want to force bridge content in right away:

#
openclaw wiki bridge import
openclaw wiki compile

A couple of notes:

  • If you have the official obsidian CLI installed, keep useOfficialCli: true
  • If not, set it to false and just open the vault manually in Obsidian
  • vault.path should be the folder you want Obsidian to use as the vault

Useful commands after that:

openclaw wiki obsidian search "query"
openclaw wiki obsidian open index.md
vagrant plaza
#

Obsidian CLI is enabled in config but obsidian is not available on PATH.

livid oxideBOT
#

Yep, then just turn this off:

obsidian: {
  enabled: true,
  useOfficialCli: false,
  vaultName: "OpenClaw Wiki",
  openAfterWrites: false,
}

That error is only about the CLI integration, not the wiki itself.

So with:

  • vault.renderMode: "obsidian"
  • obsidian.enabled: true