mirror of MemPalace/mempalace - best-benchmarked open-source AI memory system
Go to file
Igor Lins e Silva 9a3afc9d64
Merge pull request #2220 from MemPalace/fix/windows-hybrid-search-empty-results
fix(tests): harden hybrid search against empty Windows Chroma reads
2026-08-11 11:47:26 -03:00
.agents/plugins fix(codex): make marketplace plugin installable 2026-08-07 10:00:23 +07:00
.antigravity-plugin fix(antigravity): sync recall skill protocol with canonical shared source 2026-06-11 13:19:24 +10:00
.claude-plugin chore(release): 3.7.0 2026-08-02 05:34:29 -03:00
.codex-plugin fix(codex): make marketplace plugin installable 2026-08-07 10:00:23 +07:00
.cursor-plugin chore(release): 3.6.0 2026-07-14 20:44:15 -03:00
.devcontainer feat: add VSCode devcontainer matching CI environment 2026-04-14 15:10:23 -03:00
.github ci(docker): run the image before publishing it 2026-08-08 10:26:52 -03:00
assets MemPalace: palace architecture, AAAK compression, knowledge graph 2026-04-04 18:16:04 -07:00
benchmarks fix: print the full model tag in the longmemeval summary header too 2026-08-08 15:10:24 +03:00
commands feat: add Cursor IDE support (hooks, plugin, skill, docs, tests) 2026-05-27 14:05:40 +10:00
deploy fix(deploy): survive the MCP idle watchdog exit in the systemd unit 2026-08-09 16:22:27 -05:00
docs docs(rfc-001): fold §4.4 review nits; accept storage-backend spec 2026-08-11 07:50:09 -03:00
examples Merge pull request #597 from grtninja/codex/mx3-public-shim-example 2026-08-11 09:24:08 -03:00
hooks fix: tighten local guards and file handling 2026-06-23 23:45:03 -03:00
integrations docs(logstream): concept page, tool/CLI references, coordination protocol (RFC 003 phase 4) 2026-08-05 23:50:18 -03:00
landing new landing page 2026-04-16 21:46:03 -03:00
mempalace Merge pull request #2159 from amorphous-dreams/fix/hnsw-defaults-followup 2026-08-11 09:24:14 -03:00
rules feat: add mempalace-recall skill and optional Cursor recall rule 2026-06-10 15:40:35 +10:00
scripts fix(repair-encoding-cli): reconfigure stdio to UTF-8 like the other entry points 2026-08-08 23:21:55 +02:00
skills docs(logstream): concept page, tool/CLI references, coordination protocol (RFC 003 phase 4) 2026-08-05 23:50:18 -03:00
tests fix(tests): harden hybrid search against empty Windows Chroma reads 2026-08-11 11:20:09 -03:00
tools Merge branch 'develop' into docs/claude-code-retention-setup 2026-05-22 09:54:29 -03:00
website Merge pull request #2204 from rubicon/docs/document-mcp-idle-hours 2026-08-11 09:23:50 -03:00
.dockerignore feat(docker): add container image for MCP server and CLI 2026-06-05 12:32:33 +02:00
.gitignore test(mine): complete source adapter dispatch coverage 2026-08-10 17:19:48 +00:00
.mcp.json fix(codex): make marketplace plugin installable 2026-08-07 10:00:23 +07:00
.pre-commit-config.yaml chore(pre-commit): bump ruff pin v0.15.9 → v0.15.14 2026-05-23 12:11:10 -03:00
.python-version docs(install): recommend uv as the package manager 2026-05-08 01:38:00 -03:00
AGENTS.md docs: add CLAUDE.md + mission/principles to AGENTS.md (#720) 2026-04-12 15:28:01 -07:00
CHANGELOG.md docs(changelog): fold wave 1–3 notes into 3.7.0 for release 2026-08-11 09:25:14 -03:00
CLAUDE.md docs(install): recommend uv as the package manager 2026-05-08 01:38:00 -03:00
CONTRIBUTING.md Merge pull request #555 from grtninja/codex/fix-541-contributing-discussions 2026-08-11 09:23:44 -03:00
Dockerfile ci(docker): fix latest/main publishing, add arm64 + GPU build check 2026-06-05 22:39:15 -03:00
Dockerfile.gpu fix(docker): address gemini review on MR #1696 2026-06-05 13:35:36 +02:00
LICENSE MemPalace: palace architecture, AAAK compression, knowledge graph 2026-04-04 18:16:04 -07:00
MISSION.md docs: add CLAUDE.md + mission/principles to AGENTS.md (#720) 2026-04-12 15:28:01 -07:00
README.md feat(embedding): add OpenAI-compatible /v1/embeddings backend 2026-08-11 07:07:13 -03:00
ROADMAP.md docs: add ROADMAP.md — v3.1.1 stability patch and v4.0.0-alpha plan 2026-04-11 22:05:00 -07:00
SECURITY.md docs: tighten SECURITY.md with real version policy and GHPVR-only channel 2026-04-14 11:50:00 -03:00
docker-compose.yml fix(docker): drop the null `environment:` block that invalidated compose 2026-08-08 09:22:54 -03:00
docker-entrypoint.sh fix(docker): address gemini review on MR #1696 2026-06-05 13:35:36 +02:00
mcp.json feat: add Cursor IDE support (hooks, plugin, skill, docs, tests) 2026-05-27 14:05:40 +10:00
openarena-claim.txt chore: add OpenArena owner claim verification file 2026-04-24 23:19:29 -03:00
pyproject.toml ci: bump the ruff pin with the dependency, and guard the drift 2026-08-07 09:27:28 -03:00
uv.lock ci: bump the ruff pin with the dependency, and guard the drift 2026-08-07 09:27:28 -03:00

README.md

MemPalace

MemPalace

Local-first AI memory. Verbatim storage, pluggable backend, 96.6% R@5 raw on LongMemEval — zero API calls.

[!CAUTION] Beware of impostor sites. MemPalace has no other official websites. The only official sources are this GitHub repository, the PyPI package, and the docs at mempalaceofficial.com. Any other domain (including .tech, .net, or other .com variants) is an impostor and may distribute malware. Details and timeline: docs/HISTORY.md.

[!IMPORTANT] Claude Code sessions expire in 30 days without auto-save hooks wired. Read this →

Need the shortest recovery/setup path? Use the Claude Code retention setup checklist.


What it is

MemPalace stores your conversation history as verbatim text and retrieves it with semantic search. It does not summarize, extract, or paraphrase. The index is structured — people and projects become wings, topics become rooms, and original content lives in drawers — so searches can be scoped rather than run against a flat corpus.

The retrieval layer is pluggable. The current default is ChromaDB; the interface is defined in mempalace/backends/base.py and alternative backends can be dropped in without touching the rest of the system.

Nothing leaves your machine unless you opt in.

Architecture, concepts, and mining flows: mempalaceofficial.com/concepts/the-palace.


Install

MemPalace ships a CLI, so install it in an isolated environment to avoid PEP 668 errors on Debian/Ubuntu/Homebrew Pythons and to keep mempalace's deps (chromadb, numpy, grpcio, …) from conflicting with anything else in your global site-packages.

We recommend uvuv tool install puts the mempalace CLI in an isolated environment on your PATH:

uv tool install mempalace
mempalace init ~/projects/myapp

pipx works the same way if you prefer it: pipx install mempalace.

Prefer plain pip only inside an activated virtualenv where you explicitly want import mempalace available:

python -m venv .venv && source .venv/bin/activate
pip install mempalace

Docker

A container image is also available for running the MCP server or the CLI without a local Python toolchain. Multi-arch (amd64 + arm64), so it runs natively on Apple Silicon:

docker pull ghcr.io/mempalace/mempalace:latest

Everything persists under /data — palace, config, and the cached embedding model — so mount a volume there and reuse it across runs:

# MCP server over stdio — note the `-i` flag (JSON-RPC needs stdin)
docker run -i --rm -v mempalace-data:/data ghcr.io/mempalace/mempalace

# Run any CLI command instead. The container only sees what you mount, so
# mount the directory you want to mine — read-only is enough, mining never
# writes to the source.
docker run --rm -v mempalace-data:/data -v /path/to/project:/work:ro \
  ghcr.io/mempalace/mempalace mine /work
docker run --rm -v mempalace-data:/data ghcr.io/mempalace/mempalace search "why GraphQL"

The first command that needs embeddings downloads the model into /data (~80 MB for the default minilm, ~300 MB for embeddinggemma). It is a one-off as long as the volume persists, but it does mean the first call is slow and needs network — worth knowing before assuming a hung container.

Wire it into an MCP client (e.g. Claude Code) as a stdio server. Mount anything you want the server to be able to mine — it cannot reach your transcripts otherwise:

{
  "mcpServers": {
    "mempalace": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-v", "mempalace-data:/data",
        "-v", "/absolute/path/to/.claude/projects:/transcripts:ro",
        "ghcr.io/mempalace/mempalace"
      ]
    }
  }
}

Use a real absolute path there — ~ and $HOME are not expanded by every MCP client. Paths are container paths from then on: mine /transcripts, not ~/.claude/projects.

Mount permissions on Linux. The image runs as uid 1000 and bind mounts keep their host ownership, so a mounted directory has to be readable by that uid — an ordinary 0755 checkout is fine, a 0700 directory is not, and the failure surfaces as PermissionError: [Errno 13] rather than anything about Docker. Docker Desktop maps uids on macOS and Windows, so this only bites on Linux. Do not work around it with --user: /data is owned by uid 1000 inside the image, so another uid cannot write the palace at all.

docker compose run --rm mcp works too (see docker-compose.yml), and deploy/docker-compose.server.yml stands up the team server. To build the image yourself instead of pulling — required for the GPU variant, which is not published:

docker build -t mempalace .                                  # CPU
docker build --build-arg EXTRAS="extract,spellcheck" -t mempalace .
docker build -f Dockerfile.gpu -t mempalace:gpu .            # CUDA; run with --gpus all

The GPU image is x86_64-only: onnxruntime-gpu publishes no aarch64 Linux wheels, so that last build fails on an ARM host (including Apple Silicon) with a dependency-resolution error rather than an obvious one.

Note that a build from a clone uses whatever branch you checked out; develop is the default branch, so pull the published image if you want the released version.

Storage backends

ChromaDB is the default and needs no configuration. MemPalace also ships a pluggable backend contract, exercised across deliberately different substrates so the contract is never accidentally shaped around one vendor. Every non-default backend is opt-in.

Backend Mode Install Namespaces Lexical Configure with
chroma (default) Local (embedded) bundled
sqlite_exact Local (exact) bundled
milvus Local (Lite) · Server opt-in mempalace[milvus] MEMPALACE_MILVUS_URI
qdrant Server (REST) bundled MEMPALACE_QDRANT_URL
pgvector Server (Postgres) mempalace[pgvector] MEMPALACE_PGVECTOR_DSN

Select with --backend <name>, MEMPALACE_BACKEND=<name>, or "backend": "<name>" in config.json. See Storage backends for connection variables, namespace behavior, and deployment notes.

Quickstart

# Mine content into the palace
mempalace mine ~/projects/myapp                    # project files
mempalace mine ~/.claude/projects/ --mode convos   # Claude Code sessions (scope with --wing per project)

# Search
mempalace search "why did we switch to GraphQL"

# Load context for a new session
mempalace wake-up

For Claude Code, Gemini CLI, Antigravity, MCP-compatible tools, and local models, see mempalaceofficial.com/guide/getting-started.


Benchmarks

All numbers below are reproducible from this repository with the commands in benchmarks/BENCHMARKS.md. Full per-question result files are committed under benchmarks/results_*.

LongMemEval — retrieval recall (R@5, 500 questions):

Mode R@5 LLM required
Raw (semantic search, no heuristics, no LLM) 96.6% None
Hybrid v4, held-out 450q (tuned on 50 dev, not seen during training) 98.4% None
Hybrid v4 + LLM rerank (full 500) ≥99% Any capable model

The raw 96.6% requires no API key, no cloud, and no LLM at any stage. The hybrid pipeline adds keyword boosting, temporal-proximity boosting, and preference-pattern extraction; the held-out 98.4% is the honest generalisable figure.

The rerank pipeline promotes the best candidate out of the top-20 retrieved sessions using an LLM reader. It works with any reasonably capable model — we have reproduced it with Claude Haiku, Claude Sonnet, and minimax-m2.7 via Ollama Cloud (no Anthropic dependency). The gap between raw and reranked is model-agnostic; we do not headline a "100%" number because the last 0.6% was reached by inspecting specific wrong answers, which benchmarks/BENCHMARKS.md flags as teaching to the test.

Other benchmarks (full results in benchmarks/BENCHMARKS.md):

Benchmark Metric Score Notes
LoCoMo (session, top-10, no rerank) R@10 60.3% 1,986 questions
LoCoMo (hybrid v5, top-10, no rerank) R@10 88.9% Same set
ConvoMem (all categories, 250 items) Avg recall 92.9% 50 per category
MemBench (ACL 2025, 8,500 items) R@5 80.3% All categories

We deliberately do not include a side-by-side comparison against Mem0, Mastra, Hindsight, Supermemory, or Zep. Those projects publish different metrics on different splits, and placing retrieval recall next to end-to-end QA accuracy is not an honest comparison. See each project's own research page for their published numbers.

Reproducing every result:

git clone https://github.com/MemPalace/mempalace.git
cd mempalace
uv sync --extra dev   # or: pip install -e ".[dev]"
# see benchmarks/README.md for dataset download commands
uv run python benchmarks/longmemeval_bench.py /path/to/longmemeval_s_cleaned.json

Knowledge graph

MemPalace includes a temporal entity-relationship graph with validity windows — add, query, invalidate, timeline — backed by local SQLite. Usage and tool reference: mempalaceofficial.com/concepts/knowledge-graph.

MCP server

44 MCP tools cover palace reads/writes, knowledge-graph operations, cross-wing navigation, drawer management, agent diaries, and agent coordination (logstream events + artifact handoffs). Installation and the full tool list: mempalaceofficial.com/reference/mcp-tools.

Agents

Each specialist agent gets its own wing and diary in the palace. Discoverable at runtime via mempalace_list_agents — no bloat in your system prompt: mempalaceofficial.com/concepts/agents.

Auto-save hooks

Auto-save hooks for Claude Code, Codex CLI, and Cursor IDE save periodically and before context compression:

If you are installing under time pressure, start with the Claude Code retention setup checklist: wire the hooks, back up existing JSONL transcripts, and backfill them with mempalace mine ~/.claude/projects/ --mode convos.

For per-message recall on top of the file-level chunks the hooks produce, run mempalace sweep <transcript-dir> periodically — it stores one verbatim drawer per user/assistant message, idempotent and resume-safe.


Requirements

  • Python 3.9+
  • A vector-store backend (ChromaDB by default)
  • ~300 MB disk for the embedding model. Onboarding (python -m mempalace.onboarding) offers embeddinggemma-300m (multilingual, 100+ languages, recommended) or all-MiniLM-L6-v2 (English-only, ~30 MB). See the docstring at mempalace/embedding.py for details and migration notes.
  • Optional — compute embeddings on a server instead of locally. Set embedding_model: "openai-compat" in ~/.mempalace/config.json together with embedding_api_url / embedding_api_model (and embedding_api_key if the server needs auth) to use any OpenAI-compatible /v1/embeddings endpoint — LM Studio, llama.cpp, vLLM, Ollama's OpenAI shim, or a self-hosted server (e.g. a larger multilingual or GPU-served embedder). Each key is overridable via the matching MEMPALACE_EMBEDDING_API_* env var. When the endpoint is on your machine or LAN, no content leaves your network. Switching to it requires mempalace repair rebuild-index (different vector space).

No API key is required for the core benchmark path.

Docs

Contributing

PRs welcome. See CONTRIBUTING.md.

License

MIT — see LICENSE.