Zero-install persistent memory brain for Claude Code and Claude Desktop. Stops re-asking and re-deriving across sessions.
Project description
Gr0m_Mem
Zero-install persistent memory brain for any LLM runtime (Claude Code, Claude Desktop, Cursor, Gemini CLI, Continue, Cline, Zed, OpenAI Codex CLI, Aider, raw OpenAI / Anthropic / Gemini APIs, or a local Llama) that stops the model from re-asking and re-deriving across sessions.
This is the
mainbranch — the zero-install core. No ChromaDB, no Ollama, no 1 GB embedding model. Pure CPython stdlib + a couple of pure-Python wheels.pip install gr0m-memand it just works.For semantic retrieval (ChromaDB HNSW + Ollama embeddings) switch to the
semanticbranch.
Works with any LLM
Gr0m_Mem is universally compatible through three integration paths:
- MCP server — Claude Code, Claude Desktop, Cursor, Gemini CLI, Continue, Cline, Zed, OpenAI Codex CLI, and any other Model Context Protocol client. Setup snippets for every major client in
docs/integrations.md. - CLI shell-out — any agent framework that can run shell commands (OpenAI Agents SDK, LangChain, LlamaIndex, Aider, raw API callers): wrap
gr0m_mem wakeup,gr0m_mem remember, andgr0m_mem searchas tools. - Paste-into-system-prompt — models with no MCP and no tool calling at all: copy
UNIVERSAL_PROMPT.mdinto your system prompt and the model will drive the CLI via shell.
The loop-prevention protocol is the same across all three paths.
The problem
Claude forgets everything when a session ends. Next time you talk to it:
- It re-introduces itself.
- It asks what you're working on — again.
- It re-derives the same architectural decision you already locked in yesterday.
- It loses track of which features shipped and re-suggests them.
Other memory systems try to fix this with "let an LLM decide what to remember." That path is expensive, loses context, and still leaks reasoning. Gr0m_Mem takes the other path: record everything important explicitly, surface it at session start, and refuse to contradict it without you saying so.
How it fixes the loop
Four tools (and two Claude Code hooks) are the entire product:
| When | Tool | Effect |
|---|---|---|
| Session start | mem_wakeup |
Returns a token-budgeted snapshot of identity / preferences / projects / decisions / open questions. Claude inlines it and stops re-introducing. |
| After a decision | mem_record_decision |
Persists the decision + rationale against a subject. |
| Before asking a familiar question | mem_recall_decisions |
Retrieves prior decisions on that subject. If any exist, Claude uses them instead of re-asking. |
| Learning anything durable | mem_remember |
Stores a preference, project, milestone, context fact, or open question. |
The plugin's Stop and PreCompact hooks flush a milestone after every session and before every context compaction, so nothing high-value is lost to /clear or window compression. Session ids are whitelisted (tr -cd 'a-zA-Z0-9_-') before any path touch — the shell-injection bug MemPalace had to patch (Issue #110) is fixed by design here.
Zero-install promise
pip install gr0m-mem always produces a working brain. The main branch has exactly one backend:
sqlite_fts— SQLite FTS5 BM25 full-text search. Ships with CPython's stdlibsqlite3on every mainstream platform. No compiled extras, no embedding model, no Ollama, no network. Lexical-only, butmem_wakeup+mem_record_decisiondon't care about the backend — they use their own SQLite table.
Run gr0m_mem doctor to verify.
Want semantic retrieval too?
Switch to the semantic branch. It adds two more backends with auto-selection:
chromadb— HNSW cosine over ChromaDB, best retrieval qualitysqlite_vec— pure-Python cosine over SQLite rows, using Ollama for embeddings
Both require either the chromadb optional extra or a running Ollama with mxbai-embed-large (~1 GB). The semantic branch is a drop-in replacement — same tools, same API, richer retrieval.
Also in the box
- Temporal knowledge graph with mandatory
as_offiltering.TemporalEdgecarriesvalid_from/valid_to, SQLite persistence with partial indexes onvalid_to IS NULL, andactive_view()that refuses to run without an explicit temporal decision. TheFactCheckerruns on everyadd_tripleand rejects contradictions in strict mode (the thing MemPalace'sfact_checker.pyadvertised but never wired). - Per-corpus isolation. Every corpus is its own FTS5 table — documents from different projects are never mixed. All tools require an explicit
corpusargument; there is no default tenant. - Reproducible benchmarks. The loop-prevention benchmark (8 scenarios, 15 probes) runs in CI on every push and must stay at 100%. First committed result:
benchmarks/results/2026-04-08-loop-prevention.json.
Install
As a Claude Code plugin (preferred)
claude plugin marketplace add MichaelAdamGroberman/gr0m_mem
claude plugin install --scope user gr0m_mem
The plugin registers the MCP server plus the Stop / PreCompact hooks in one step.
From PyPI
pip install gr0m-mem # zero-install core (this branch)
pip install "gr0m-mem[tokens]" # + real tiktoken token counts
Then point your MCP client at python -m gr0m_mem.mcp_server.
Quick start
gr0m_mem doctor
gr0m_mem remember --kind identity --text "Michael, software engineer, macOS"
gr0m_mem remember --kind preference --text "terse responses, no trailing summaries"
gr0m_mem wakeup --tokens 200
Now open Claude Code. It calls mem_wakeup at session start and sees you before the first message.
Requirements
- CPython 3.10, 3.11, or 3.12. 3.13+ blocked until chromadb and the MCP SDK publish compatible wheels (affects the
semanticbranch; not an issue here).
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gr0m_mem-0.1.0.tar.gz.
File metadata
- Download URL: gr0m_mem-0.1.0.tar.gz
- Upload date:
- Size: 54.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d591b625ab8c41c32128d6155fcc103b1b133db3a482503971ccd60c554d2d4
|
|
| MD5 |
b36104f6ab4ee8a9d0976da0741aae89
|
|
| BLAKE2b-256 |
ada4fff81c1f23a2b1745cb567ecb128d52e5521e02ffdb9cde6bac98069557b
|
Provenance
The following attestation bundles were made for gr0m_mem-0.1.0.tar.gz:
Publisher:
release.yml on MichaelAdamGroberman/gr0m_mem
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gr0m_mem-0.1.0.tar.gz -
Subject digest:
0d591b625ab8c41c32128d6155fcc103b1b133db3a482503971ccd60c554d2d4 - Sigstore transparency entry: 1258759485
- Sigstore integration time:
-
Permalink:
MichaelAdamGroberman/gr0m_mem@9a669944e647af3edad401c20a00335a319bbd01 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/MichaelAdamGroberman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9a669944e647af3edad401c20a00335a319bbd01 -
Trigger Event:
push
-
Statement type:
File details
Details for the file gr0m_mem-0.1.0-py3-none-any.whl.
File metadata
- Download URL: gr0m_mem-0.1.0-py3-none-any.whl
- Upload date:
- Size: 42.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5278bd56fca3f8317f249c0fca0fe5405147d225b4e39561b68617b74f85105b
|
|
| MD5 |
54980d5987285cb114603b5cd1392705
|
|
| BLAKE2b-256 |
7e52710d1cfefc277f6570725fff3f61fb200cf073721e7f75d1700a3e2db848
|
Provenance
The following attestation bundles were made for gr0m_mem-0.1.0-py3-none-any.whl:
Publisher:
release.yml on MichaelAdamGroberman/gr0m_mem
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gr0m_mem-0.1.0-py3-none-any.whl -
Subject digest:
5278bd56fca3f8317f249c0fca0fe5405147d225b4e39561b68617b74f85105b - Sigstore transparency entry: 1258759577
- Sigstore integration time:
-
Permalink:
MichaelAdamGroberman/gr0m_mem@9a669944e647af3edad401c20a00335a319bbd01 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/MichaelAdamGroberman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9a669944e647af3edad401c20a00335a319bbd01 -
Trigger Event:
push
-
Statement type: