https://github.com/zilliztech/memsearch
A Markdown-first memory system, a standalone library for any AI agent. Inspired by OpenClaw.
https://github.com/zilliztech/memsearch
agent agent-memory claude-code claude-code-plugin clawdbot embeddings memory milvus openclaw progressive-disclosure rag semantic-search
Last synced: 14 days ago
JSON representation
A Markdown-first memory system, a standalone library for any AI agent. Inspired by OpenClaw.
- Host: GitHub
- URL: https://github.com/zilliztech/memsearch
- Owner: zilliztech
- License: mit
- Created: 2026-02-09T02:29:16.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2026-02-12T11:34:41.000Z (2 months ago)
- Last Synced: 2026-02-12T16:39:29.932Z (2 months ago)
- Topics: agent, agent-memory, claude-code, claude-code-plugin, clawdbot, embeddings, memory, milvus, openclaw, progressive-disclosure, rag, semantic-search
- Language: Python
- Homepage: https://zilliztech.github.io/memsearch/
- Size: 24.2 MB
- Stars: 127
- Watchers: 3
- Forks: 13
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
ย
memsearch
Cross-platform semantic memory for AI coding agents.
### Why memsearch?
- ๐ **All Platforms, One Memory** โ memories flow across [Claude Code](plugins/claude-code/README.md), [OpenClaw](plugins/openclaw/README.md), [OpenCode](plugins/opencode/README.md), and [Codex CLI](plugins/codex/README.md). A conversation in one agent becomes searchable context in all others โ no extra setup
- ๐ฅ **For Agent Users**, install a plugin and get persistent memory with zero effort; **for Agent Developers**, use the full [CLI](https://zilliztech.github.io/memsearch/cli/) and [Python API](https://zilliztech.github.io/memsearch/python-api/) to build memory and harness engineering into your own agents
- ๐ **Markdown is the source of truth** โ inspired by [OpenClaw](https://github.com/openclaw/openclaw). Your memories are just `.md` files โ human-readable, editable, version-controllable. Milvus is a "shadow index": a derived, rebuildable cache
- ๐ **Progressive retrieval, hybrid search, smart dedup, live sync** โ 3-layer recall (search โ expand โ transcript); dense vector + BM25 sparse + RRF reranking; SHA-256 content hashing skips unchanged content; file watcher auto-indexes in real time
---
## ๐งโ๐ป For Agent Users
Pick your platform, install the plugin, and you're done. Each plugin captures conversations automatically and provides semantic recall with zero configuration.
### For Claude Code Users
```bash
# Install
/plugin marketplace add zilliztech/memsearch
/plugin install memsearch
# Restart Claude Code to activate the plugin
```
After restarting, just chat with Claude Code as usual. The plugin captures every conversation turn automatically.
**Verify it's working** โ after a few conversations, check your memory files:
```bash
ls .memsearch/memory/ # you should see daily .md files
cat .memsearch/memory/$(date +%Y-%m-%d).md
```
**Recall memories** โ two ways to trigger:
```
/memory-recall what did we discuss about Redis?
```
Or just ask naturally โ Claude auto-invokes the skill when it senses the question needs history:
```
We discussed Redis caching before, what was the TTL we chose?
```
> ๐ [Claude Code Plugin docs](https://zilliztech.github.io/memsearch/platforms/claude-code/) ยท [Troubleshooting](https://zilliztech.github.io/memsearch/platforms/claude-code-troubleshooting/)
### For OpenClaw Users
```bash
# Install from ClawHub
openclaw plugins install clawhub:memsearch
openclaw gateway restart
```
After installing, chat in TUI as usual. The plugin captures each turn automatically.
**Verify it's working** โ memory files are stored in your agent's workspace:
```bash
# For the main agent:
ls ~/.openclaw/workspace/.memsearch/memory/
# For other agents (e.g. work):
ls ~/.openclaw/workspace-work/.memsearch/memory/
```
**Recall memories** โ two ways to trigger:
```
/memory-recall what was the batch size limit we set?
```
Or just ask naturally โ the LLM auto-invokes memory tools when it senses the question needs history:
```
We discussed batch size limits before, what did we decide?
```
> ๐ [OpenClaw Plugin docs](https://zilliztech.github.io/memsearch/platforms/openclaw/)
๐ง For OpenCode Users
```json
// In ~/.config/opencode/opencode.json
{ "plugin": ["@zilliz/memsearch-opencode"] }
```
After installing, chat in TUI as usual. A background daemon captures conversations.
**Verify it's working:**
```bash
ls .memsearch/memory/ # daily .md files appear after a few conversations
```
**Recall memories** โ two ways to trigger:
```
/memory-recall what did we discuss about authentication?
```
Or just ask naturally โ the LLM auto-invokes memory tools when it senses the question needs history:
```
We discussed the authentication flow before, what was the approach?
```
> ๐ [OpenCode Plugin docs](https://zilliztech.github.io/memsearch/platforms/opencode/)
๐ง For Codex CLI Users
```bash
# Install
bash memsearch/plugins/codex/scripts/install.sh
codex --yolo # needed for ONNX model network access
```
After installing, chat as usual. Hooks capture and summarize each turn.
**Verify it's working:**
```bash
ls .memsearch/memory/
```
**Recall memories** โ use the skill:
```
$memory-recall what did we discuss about deployment?
```
> ๐ [Codex CLI Plugin docs](https://zilliztech.github.io/memsearch/platforms/codex/)
### โ๏ธ Configuration (all platforms)
All plugins share the same memsearch backend. Configure once, works everywhere.
#### Embedding
Defaults to **ONNX bge-m3** โ runs locally on CPU, no API key, no cost. On first launch the model (~558 MB) is downloaded from HuggingFace Hub.
```bash
memsearch config set embedding.provider onnx # default โ local, free
memsearch config set embedding.provider openai # needs OPENAI_API_KEY
memsearch config set embedding.provider ollama # local, any model
```
> All providers and models: [Configuration โ Embedding Provider](https://zilliztech.github.io/memsearch/home/configuration/#embedding-provider)
#### Milvus Backend
Just change `milvus_uri` (and optionally `milvus_token`) to switch between deployment modes:
**Milvus Lite** (default) โ zero config, single file. Great for getting started:
```bash
# Works out of the box, no setup needed
memsearch config get milvus.uri # โ ~/.memsearch/milvus.db
```
โญ **Zilliz Cloud** (recommended) โ fully managed, [free tier available](https://cloud.zilliz.com/signup?utm_source=github&utm_medium=referral&utm_campaign=memsearch-readme) โ [sign up](https://cloud.zilliz.com/signup?utm_source=github&utm_medium=referral&utm_campaign=memsearch-readme) ๐:
```bash
memsearch config set milvus.uri "https://in03-xxx.api.gcp-us-west1.zillizcloud.com"
memsearch config set milvus.token "your-api-key"
```
โญ Sign up for a free Zilliz Cloud cluster
You can [sign up](https://cloud.zilliz.com/signup?utm_source=github&utm_medium=referral&utm_campaign=memsearch-readme) on Zilliz Cloud to get a free cluster and API key.

Self-hosted Milvus Server (Docker) โ for advanced users
For multi-user or team environments with a dedicated Milvus instance. Requires Docker. See the [official installation guide](https://milvus.io/docs/install_standalone-docker-compose.md).
```bash
memsearch config set milvus.uri http://localhost:19530
```
> ๐ Full configuration guide: [Configuration](https://zilliztech.github.io/memsearch/home/configuration/) ยท [Platform comparison](https://zilliztech.github.io/memsearch/platforms/)
---
## ๐ ๏ธ For Agent Developers
Beyond ready-to-use plugins, memsearch provides a complete **CLI and Python API** for building memory into your own agents. Whether you're adding persistent context to a custom agent, building a memory-augmented RAG pipeline, or doing harness engineering โ the same core engine that powers the plugins is available as a library.
### ๐๏ธ Architecture Overview
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐งโ๐ป For Agent Users (Plugins) โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโ โโโโโโโโ โ
โ โ Claude โ โ OpenClaw โ โ OpenCode โ โ Codex โ โ Your โ โ
โ โ Code โ โ Plugin โ โ Plugin โ โ Plugin โ โ App โ โ
โ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโฌโโโโโ โโโโฌโโโโ โ
โ โโโโโโโโโโโโโโโดโโโโโโโโโโโโโดโโโโโโโโโโโโดโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ๐ ๏ธ For Agent Developers โ Build your own with โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ memsearch CLI / Python API โ โ
โ โ index ยท search ยท expand ยท watch ยท compact โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Core: Chunker โ Embedder โ Milvus โ โ
โ โ Hybrid Search (BM25 + Dense + RRF) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ๐ Markdown Files (Source of Truth) โ
โ memory/2026-03-27.md ยท memory/2026-03-26.md ยท ... โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
Plugins sit on top of the CLI/API layer. The API handles indexing, searching, and Milvus sync. Markdown files are always the source of truth โ Milvus is a rebuildable shadow index. Everything below the plugin layer is what you use as an agent developer.
### How Plugins Work (Claude Code as example)
**Capture โ after each conversation turn:**
```
User asks question โ Agent responds โ Stop hook fires
โ
โโโโโโโโโโโโโโโโโโโโโโ
โผ
Parse last turn
โ
โผ
LLM summarizes (haiku)
"- User asked about X."
"- Claude did Y."
โ
โผ
Append to memory/2026-03-27.md
with anchor
โ
โผ
memsearch index โ Milvus
```
**Recall โ 3-layer progressive search:**
```
User: "What did we discuss about batch size?"
โ
โผ
L1 memsearch search "batch size" โ ranked chunks
โ (need more?)
โผ
L2 memsearch expand โ full .md section
โ (need original?)
โผ
L3 parse-transcript โ raw dialogue
```
### ๐ Markdown as Source of Truth
```
Plugins append โโโ .md files โโโ human editable
โ
โผ
memsearch watch (live watcher)
โ
detects file change
โ
โผ
re-chunk changed .md
โ
hash each chunk (SHA-256)
โ
โโโโโโโโโโโโโดโโโโโโโโโโโโ
โผ โผ
hash unchanged? hash is new/changed?
โ skip (no API call) โ embed โ upsert to Milvus
โ โ
โโโโโโโโโโโโโฌโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ Milvus (shadow) โ
โ always in sync โ
โ rebuildable โ
โโโโโโโโโโโโโโโโโโโโ
```
### ๐ฆ Installation
```bash
# pip
pip install memsearch
# or uv (recommended)
uv add memsearch
```
Optional embedding providers
```bash
pip install "memsearch[onnx]" # Local ONNX (recommended, no API key)
# or: uv add "memsearch[onnx]"
# Other options: [openai], [google], [voyage], [ollama], [local], [all]
```
### ๐ Python API โ Give Your Agent Memory
```python
from memsearch import MemSearch
mem = MemSearch(paths=["./memory"])
await mem.index() # index markdown files
results = await mem.search("Redis config", top_k=3) # semantic search
scoped = await mem.search("pricing", top_k=3, source_prefix="./memory/product")
print(results[0]["content"], results[0]["score"]) # content + similarity
```
Full example โ agent with memory (OpenAI) โ click to expand
```python
import asyncio
from datetime import date
from pathlib import Path
from openai import OpenAI
from memsearch import MemSearch
MEMORY_DIR = "./memory"
llm = OpenAI() # your LLM client
mem = MemSearch(paths=[MEMORY_DIR]) # memsearch handles the rest
def save_memory(content: str):
"""Append a note to today's memory log (OpenClaw-style daily markdown)."""
p = Path(MEMORY_DIR) / f"{date.today()}.md"
p.parent.mkdir(parents=True, exist_ok=True)
with open(p, "a") as f:
f.write(f"\n{content}\n")
async def agent_chat(user_input: str) -> str:
# 1. Recall โ search past memories for relevant context
memories = await mem.search(user_input, top_k=3)
context = "\n".join(f"- {m['content'][:200]}" for m in memories)
# 2. Think โ call LLM with memory context
resp = llm.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": f"You have these memories:\n{context}"},
{"role": "user", "content": user_input},
],
)
answer = resp.choices[0].message.content
# 3. Remember โ save this exchange and index it
save_memory(f"## {user_input}\n{answer}")
await mem.index()
return answer
async def main():
# Seed some knowledge
save_memory("## Team\n- Alice: frontend lead\n- Bob: backend lead")
save_memory("## Decision\nWe chose Redis for caching over Memcached.")
await mem.index() # or mem.watch() to auto-index in the background
# Agent can now recall those memories
print(await agent_chat("Who is our frontend lead?"))
print(await agent_chat("What caching solution did we pick?"))
asyncio.run(main())
```
Anthropic Claude example โ click to expand
```bash
pip install memsearch anthropic
```
```python
import asyncio
from datetime import date
from pathlib import Path
from anthropic import Anthropic
from memsearch import MemSearch
MEMORY_DIR = "./memory"
llm = Anthropic()
mem = MemSearch(paths=[MEMORY_DIR])
def save_memory(content: str):
p = Path(MEMORY_DIR) / f"{date.today()}.md"
p.parent.mkdir(parents=True, exist_ok=True)
with open(p, "a") as f:
f.write(f"\n{content}\n")
async def agent_chat(user_input: str) -> str:
# 1. Recall
memories = await mem.search(user_input, top_k=3)
context = "\n".join(f"- {m['content'][:200]}" for m in memories)
# 2. Think โ call Claude with memory context
resp = llm.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
system=f"You have these memories:\n{context}",
messages=[{"role": "user", "content": user_input}],
)
answer = resp.content[0].text
# 3. Remember
save_memory(f"## {user_input}\n{answer}")
await mem.index()
return answer
async def main():
save_memory("## Team\n- Alice: frontend lead\n- Bob: backend lead")
await mem.index()
print(await agent_chat("Who is our frontend lead?"))
asyncio.run(main())
```
Ollama (fully local, no API key) โ click to expand
```bash
pip install "memsearch[ollama]"
ollama pull nomic-embed-text # embedding model
ollama pull llama3.2 # chat model
```
```python
import asyncio
from datetime import date
from pathlib import Path
from ollama import chat
from memsearch import MemSearch
MEMORY_DIR = "./memory"
mem = MemSearch(paths=[MEMORY_DIR], embedding_provider="ollama")
def save_memory(content: str):
p = Path(MEMORY_DIR) / f"{date.today()}.md"
p.parent.mkdir(parents=True, exist_ok=True)
with open(p, "a") as f:
f.write(f"\n{content}\n")
async def agent_chat(user_input: str) -> str:
# 1. Recall
memories = await mem.search(user_input, top_k=3)
context = "\n".join(f"- {m['content'][:200]}" for m in memories)
# 2. Think โ call Ollama locally
resp = chat(
model="llama3.2",
messages=[
{"role": "system", "content": f"You have these memories:\n{context}"},
{"role": "user", "content": user_input},
],
)
answer = resp.message.content
# 3. Remember
save_memory(f"## {user_input}\n{answer}")
await mem.index()
return answer
async def main():
save_memory("## Team\n- Alice: frontend lead\n- Bob: backend lead")
await mem.index()
print(await agent_chat("Who is our frontend lead?"))
asyncio.run(main())
```
> ๐ Full Python API reference: [Python API docs](https://zilliztech.github.io/memsearch/python-api/)
### โจ๏ธ CLI Usage
**Setup:**
```bash
memsearch config init # interactive setup wizard
memsearch config set embedding.provider onnx # switch embedding provider
memsearch config set milvus.uri http://localhost:19530 # switch Milvus backend
```
**Index & Search:**
```bash
memsearch index ./memory/ # index markdown files
memsearch index ./memory/ ./notes/ --force # re-embed everything
memsearch search "Redis caching" # hybrid search (BM25 + vector)
memsearch search "auth flow" --top-k 10 --json-output # JSON for scripting
memsearch expand # show full section around a chunk
```
**Live Sync & Maintenance:**
```bash
memsearch watch ./memory/ # live file watcher (auto-index on change)
memsearch compact # LLM-powered chunk summarization
memsearch stats # show indexed chunk count
memsearch reset --yes # drop all indexed data and rebuild
```
> ๐ Full CLI reference with all flags: [CLI docs](https://zilliztech.github.io/memsearch/cli/)
## โ๏ธ Configuration
Embedding and Milvus backend settings โ [Configuration (all platforms)](#๏ธ-configuration-all-platforms)
Settings priority: Built-in defaults โ `~/.memsearch/config.toml` โ `.memsearch.toml` โ CLI flags.
> ๐ Full config guide: [Configuration](https://zilliztech.github.io/memsearch/home/configuration/)
## ๐ Links
- ๐ [Documentation](https://zilliztech.github.io/memsearch/) โ full guides, API reference, and architecture details
- ๐ [Platform Plugins](https://zilliztech.github.io/memsearch/platforms/) โ Claude Code, OpenClaw, OpenCode, Codex CLI
- ๐ก [Design Philosophy](https://zilliztech.github.io/memsearch/design-philosophy/) โ why markdown, why Milvus, competitor comparison
- ๐ฆ [OpenClaw](https://github.com/openclaw/openclaw) โ the memory architecture that inspired memsearch
- ๐๏ธ [Milvus](https://milvus.io/) | [Zilliz Cloud](https://cloud.zilliz.com/signup?utm_source=github&utm_medium=referral&utm_campaign=memsearch-readme) โ the vector database powering memsearch
## ๐ค Contributing
Bug reports, feature requests, and pull requests are welcome! See the [Contributing Guide](CONTRIBUTING.md) for development setup, testing, and plugin development instructions. For questions and discussions, join us on [Discord](https://discord.com/invite/FG6hMJStWu).
## ๐ License
[MIT](LICENSE)