#Proper setup of Memory
79 messages · Page 1 of 1 (latest)
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:
- Keep builtin memory (
memory-core/ builtin backend) - Force Gemini for
memorySearch - Enable Active Memory, but start with persistent chats only
- Enable
memory-wiki, but keep it as a separate curated layer first - Enable dreaming at the default cadence
- 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_KEYormodels.providers.google.apiKey. - Active Memory config lives under
plugins.entries.active-memory, not undermemorySearch. - Dreaming lives under
plugins.entries.memory-core.config.dreaming, not undermemorySearch. - memory-wiki does not replace memory-core. It sits beside it.
What I’d avoid at first:
memorySearch.experimental.sessionMemorypersistTranscripts: true- turning Active Memory on for every chat type immediately
- over-tuning dreaming, only
enabledandfrequencyare the main user knobs
One Discord-specific gotcha:
- if you want Active Memory in Discord threads/channels, change:
or includeallowedChatTypes: ["direct", "channel"]"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
Krill's config is solid for the built-in stack — that's pretty much the same setup I started with.
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 maybegroup) toactive-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,
isolatedis cleaner.
Everything else, builtin memory + Gemini search + Active Memory + dreaming, is a pretty good default stack.
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
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.
thanks! i will take a look at mr memory
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.
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"
}
}
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
generalstays your clean default brain.imessage-directgets its own long-term memory and dreaming, separate from public/social noise.imessage-groupis isolated, which matters a lot for shared-group context.
discordstays 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
discordintoactive-memory.config.agentson day 1. Public/server chats are where hidden memory injection feels weirdest. - If you later want Active Memory on Discord too, then:
- add
"discord"toconfig.agents - change
allowedChatTypesto["direct", "group", "channel"]
- add
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:
- https://docs.openclaw.ai/plugins/memory-wiki
- https://docs.openclaw.ai/concepts/dreaming
- https://docs.openclaw.ai/channels/channel-routing
- https://docs.openclaw.ai/channels/bluebubbles
- https://docs.openclaw.ai/concepts/multi-agent
If you want, I can turn your posted config into a clean merged final config instead of just giving you the overlay.
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
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 brainimessage-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_IDYOUR_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 legacyimessage. - 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.
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.
- BlueBubbles default: configured
This looks basically right 👍
What I’m seeing:
- Routing shape is correct
generalcatches BlueBubbles default + Discordbrothel-brothers-unitedwins 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:
xAgentsshows 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.
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
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 chunksand 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: memoryis exactly what I’d expect from the setup we discussedDirty: yesis 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.
how do i configure memory wiki with obsidian
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
obsidianblock
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
obsidianCLI installed, keepuseOfficialCli: true - If not, set it to
falseand just open the vault manually in Obsidian vault.pathshould 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
openclaw wiki obsidian daily
Docs: https://docs.openclaw.ai/plugins/memory-wiki and https://docs.openclaw.ai/cli/wiki
If you want, I can give you the exact final merged config again, but with the Obsidian version swapped in.
Obsidian CLI is enabled in config but obsidian is not available on PATH.
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