Automatic project memory for Claude Code. Also works with Cursor and Codex.
See the codeAutomatic project memory for Claude Code. Also works with Cursor and Codex.
https://github.com/user-attachments/assets/ed77849e-db1c-4c05-9ad8-4cab0b3968a2
JEVMEM.md, automatically.- [decision] Use Postgres 16 for the primary store; SQLite locks under load <!-- id:k3d9xq ts:2026-09-22T10:14:02.113Z conf:0.93 -->
- [constraint] Node 20 is the floor; CI runs 20 and 22 <!-- id:p1m4zt ts:2026-09-22T10:20:41.907Z conf:0.88 -->
- [superseded] Use SQLite as the primary store → id:k3d9xq <!-- id:a8s2ww ts:2026-09-20T16:02:11.000Z conf:0.81 by:k3d9xq -->
npm install -g jevmem
export TYPESAFE_API_KEY=... # https://typesafe.ai (an OpenAI or Anthropic key is optional)
cd your-project
jevmem init --tool claude
init creates JEVMEM.md, jevmem.config.json and a gitignored .jevmem/ folder, and registers two Claude Code hooks in .claude/settings.local.json, which it adds to .gitignore (details).
What is automatic and what depends on the agent:
| Tool | Setup | Capture | Recall |
|---|---|---|---|
| Claude Code | jevmem init --tool claude | Automatic, every turn, via the Stop hook | Automatic, every prompt, via UserPromptSubmit |
| Codex | jevmem init --tool codex | Automatic while jevmem watch runs (it tails Codex's session log for this project and runs the same decide → write path); otherwise agent-initiated via MCP add_memory, prompted by an AGENTS.md section | Agent-initiated: search_memory via MCP, prompted by AGENTS.md |
| Cursor | jevmem init --tool cursor | Agent-initiated: a .cursor/rules/jevmem.mdc rule tells the agent to call MCP add_memory when you state a decision. Nothing is captured if it doesn't | Agent-initiated: the rule tells it to call search_memory before non-trivial tasks |
| Claude Desktop | jevmem init --tool claude-desktop prints a config snippet to paste (one project per config, named with --root) | Manual: ask it to call add_memory (no hook, no rule file) | On request: search_memory |
MCP add_memory goes through the same gate as the hook. Client configs: docs/mcp.md.
jevmem.config.json, not in a prompt.[superseded] … → id:new and stays in the file.Tiers, questions, policy, contradictions, recall and audit: docs/how-it-works.md.
66 held-out turns, all seven deciders given the same state, 2026-09-23 (method, regression set, pricing, p95, retries):
| Decider | save/skip | save+kind | contradictions | p50 | $/decision |
|---|---|---|---|---|---|
| GPT-6 Astra | 98.5% | 98.5% | 5/5 | 3,469 ms | $0.007489 |
| GPT-6 Luna | 93.9% | 93.9% | 5/5 | 2,927 ms | $0.000089 |
| Claude Fable 5.1 | 95.5% | 95.5% | 5/5 | 4,290 ms | $0.013256 |
| Claude Opus 5.5 | 97.0% | 97.0% | 5/5 | 2,784 ms | $0.005186 |
| Gemini 3.8 Flash | 92.4% | 92.4% | 5/5 | 2,850 ms | $0.001174 |
| Grok 4.7 | 90.9% | 90.9% | 4/5 | 3,320 ms | $0.004602 |
jevmem auto | 98.5% | 95.5% | 5/5 | 300 ms | $0.000127 |
The 0.30 s is the Jev API decision; through a real Stop hook process, Node start-up included, it is 0.6 s end to end (cost and latency).
On 66 held-out turns, jevmem's median decision took 0.30 s, against 2.8–4.3 s for six current LLMs. Its accuracy was within the LLMs' range: 98.5% save/skip (tied with GPT-6 Astra for highest) and 95.5% save+kind, against 90.9–98.5% for the LLMs. GPT-6 Astra (98.5%) and Claude Opus 5.5 (97.0%) were more accurate on save+kind; Claude Fable 5.1 tied; GPT-6 Luna, Gemini 3.8 Flash and Grok 4.7 were less accurate. It found 5/5 contradictions, as did five of the six LLMs. GPT-6 Luna was cheaper ($0.000089 against $0.000127) but less accurate (93.9%) and about 10× slower. This is a single run, and differences of one or two turns are within run-to-run noise. If the most accurate decision matters most, GPT-6 Astra or Claude Opus 5.5 are better, at about 40–60× the cost per decision and 9–12× the latency. jevmem is for when you want a fast, cheap decision on every message.
*_PASSWORD= style pairs, connection-string passwords, private keys), email addresses and 16-digit numbers; names, phone numbers and addresses are not caught.zeroDataRetention: true (automatic for Vercel AI Gateway URLs); whether it applies depends on the gateway and TypeSafe's terms, and jevmem does not verify it.Exactly what is sent, stored and scrubbed: SECURITY.md.
jevmem watch runs); Cursor and Claude Desktop save only when the agent calls add_memory..jevmem/log.jsonl, not retried later.jevmem init [--tool claude|cursor|codex|claude-desktop|all] [--no-hooks] [--command "<cmd>"]
jevmem hook Hook entrypoint; reads the Claude Code hook JSON on stdin
jevmem daemon [status|start|stop] Warm Jev client used by the hook (auto-started, exits when idle)
jevmem watch [--replay] [--once] Capture turns from Codex's session log for this project
jevmem mcp [--root <dir>] Stdio MCP server
jevmem audit [--dry-run] Re-score every memory against the repo, flag [stale?]
jevmem search <query> [--limit N] Rank memories by relevance
jevmem list [--all] Print memories
jevmem add <kind> <text> Add a line by hand (secrets scrubbed; no Jev check)
jevmem why <id|hash> Every Jev answer behind a line or a skipped turn
jevmem right <id|hash> Label a decision as correct
jevmem wrong <id|hash> [--should-be <kind|none>] Label a decision as wrong
jevmem missed "<text>" [--kind <kind>] Label a turn that should have been saved
jevmem fit [--dry-run] [--force] Refit weights and thresholds from labels (needs 40+)
jevmem stats Latency p50/p95, cost per day, cache hit rate, escalation rate, labels, last fit
jevmem log Per-label latency, token and cost summary of .jevmem/log.jsonl
Every command accepts --help. Set JEVMEM_VERBOSE=1 for a one-line latency/cost summary after every hook run.
39 commits
TypeScript
84.8%
JavaScript
12.7%
Shell
2.5%
Automatic project memory for Claude Code. Also works with Cursor and Codex.
See the codeAutomatic project memory for Claude Code. Also works with Cursor and Codex.
https://github.com/user-attachments/assets/ed77849e-db1c-4c05-9ad8-4cab0b3968a2
JEVMEM.md, automatically.- [decision] Use Postgres 16 for the primary store; SQLite locks under load <!-- id:k3d9xq ts:2026-09-22T10:14:02.113Z conf:0.93 -->
- [constraint] Node 20 is the floor; CI runs 20 and 22 <!-- id:p1m4zt ts:2026-09-22T10:20:41.907Z conf:0.88 -->
- [superseded] Use SQLite as the primary store → id:k3d9xq <!-- id:a8s2ww ts:2026-09-20T16:02:11.000Z conf:0.81 by:k3d9xq -->
npm install -g jevmem
export TYPESAFE_API_KEY=... # https://typesafe.ai (an OpenAI or Anthropic key is optional)
cd your-project
jevmem init --tool claude
init creates JEVMEM.md, jevmem.config.json and a gitignored .jevmem/ folder, and registers two Claude Code hooks in .claude/settings.local.json, which it adds to .gitignore (details).
What is automatic and what depends on the agent:
| Tool | Setup | Capture | Recall |
|---|---|---|---|
| Claude Code | jevmem init --tool claude | Automatic, every turn, via the Stop hook | Automatic, every prompt, via UserPromptSubmit |
| Codex | jevmem init --tool codex | Automatic while jevmem watch runs (it tails Codex's session log for this project and runs the same decide → write path); otherwise agent-initiated via MCP add_memory, prompted by an AGENTS.md section | Agent-initiated: search_memory via MCP, prompted by AGENTS.md |
| Cursor | jevmem init --tool cursor | Agent-initiated: a .cursor/rules/jevmem.mdc rule tells the agent to call MCP add_memory when you state a decision. Nothing is captured if it doesn't | Agent-initiated: the rule tells it to call search_memory before non-trivial tasks |
| Claude Desktop | jevmem init --tool claude-desktop prints a config snippet to paste (one project per config, named with --root) | Manual: ask it to call add_memory (no hook, no rule file) | On request: search_memory |
MCP add_memory goes through the same gate as the hook. Client configs: docs/mcp.md.
jevmem.config.json, not in a prompt.[superseded] … → id:new and stays in the file.Tiers, questions, policy, contradictions, recall and audit: docs/how-it-works.md.
66 held-out turns, all seven deciders given the same state, 2026-09-23 (method, regression set, pricing, p95, retries):
| Decider | save/skip | save+kind | contradictions | p50 | $/decision |
|---|---|---|---|---|---|
| GPT-6 Astra | 98.5% | 98.5% | 5/5 | 3,469 ms | $0.007489 |
| GPT-6 Luna | 93.9% | 93.9% | 5/5 | 2,927 ms | $0.000089 |
| Claude Fable 5.1 | 95.5% | 95.5% | 5/5 | 4,290 ms | $0.013256 |
| Claude Opus 5.5 | 97.0% | 97.0% | 5/5 | 2,784 ms | $0.005186 |
| Gemini 3.8 Flash | 92.4% | 92.4% | 5/5 | 2,850 ms | $0.001174 |
| Grok 4.7 | 90.9% | 90.9% | 4/5 | 3,320 ms | $0.004602 |
jevmem auto | 98.5% | 95.5% | 5/5 | 300 ms | $0.000127 |
The 0.30 s is the Jev API decision; through a real Stop hook process, Node start-up included, it is 0.6 s end to end (cost and latency).
On 66 held-out turns, jevmem's median decision took 0.30 s, against 2.8–4.3 s for six current LLMs. Its accuracy was within the LLMs' range: 98.5% save/skip (tied with GPT-6 Astra for highest) and 95.5% save+kind, against 90.9–98.5% for the LLMs. GPT-6 Astra (98.5%) and Claude Opus 5.5 (97.0%) were more accurate on save+kind; Claude Fable 5.1 tied; GPT-6 Luna, Gemini 3.8 Flash and Grok 4.7 were less accurate. It found 5/5 contradictions, as did five of the six LLMs. GPT-6 Luna was cheaper ($0.000089 against $0.000127) but less accurate (93.9%) and about 10× slower. This is a single run, and differences of one or two turns are within run-to-run noise. If the most accurate decision matters most, GPT-6 Astra or Claude Opus 5.5 are better, at about 40–60× the cost per decision and 9–12× the latency. jevmem is for when you want a fast, cheap decision on every message.
*_PASSWORD= style pairs, connection-string passwords, private keys), email addresses and 16-digit numbers; names, phone numbers and addresses are not caught.zeroDataRetention: true (automatic for Vercel AI Gateway URLs); whether it applies depends on the gateway and TypeSafe's terms, and jevmem does not verify it.Exactly what is sent, stored and scrubbed: SECURITY.md.
jevmem watch runs); Cursor and Claude Desktop save only when the agent calls add_memory..jevmem/log.jsonl, not retried later.jevmem init [--tool claude|cursor|codex|claude-desktop|all] [--no-hooks] [--command "<cmd>"]
jevmem hook Hook entrypoint; reads the Claude Code hook JSON on stdin
jevmem daemon [status|start|stop] Warm Jev client used by the hook (auto-started, exits when idle)
jevmem watch [--replay] [--once] Capture turns from Codex's session log for this project
jevmem mcp [--root <dir>] Stdio MCP server
jevmem audit [--dry-run] Re-score every memory against the repo, flag [stale?]
jevmem search <query> [--limit N] Rank memories by relevance
jevmem list [--all] Print memories
jevmem add <kind> <text> Add a line by hand (secrets scrubbed; no Jev check)
jevmem why <id|hash> Every Jev answer behind a line or a skipped turn
jevmem right <id|hash> Label a decision as correct
jevmem wrong <id|hash> [--should-be <kind|none>] Label a decision as wrong
jevmem missed "<text>" [--kind <kind>] Label a turn that should have been saved
jevmem fit [--dry-run] [--force] Refit weights and thresholds from labels (needs 40+)
jevmem stats Latency p50/p95, cost per day, cache hit rate, escalation rate, labels, last fit
jevmem log Per-label latency, token and cost summary of .jevmem/log.jsonl
Every command accepts --help. Set JEVMEM_VERBOSE=1 for a one-line latency/cost summary after every hook run.
39 commits
TypeScript
84.8%
JavaScript
12.7%
Shell
2.5%