# What is jevmem?

**Say it once.** jevmem saves the decisions, rules and failed approaches from your Claude Code chats to JEVMEM.md in your repo, and brings the relevant ones back next session. Before Claude runs a command or edits a file, it checks the call against your saved rules. It is open source (MIT), built on TypeSafe AI's Jev, in Anthropic's Claude plugin directory and on the MCP Registry, and works with Cursor and Codex over MCP.

Last updated: 2026-10-04 · jevmem 0.6.4 · [Install](https://avinash-jetwani.github.io/jevmem/install/) · [Source on GitHub](https://github.com/Avinash-jetwani/jevmem)

[Watch the film](https://github.com/user-attachments/assets/65e48f03-8e1c-49d9-baad-6f217911e861)

## What was measured

- **Does Claude act on what was saved?** With jevmem, Claude followed the project's decision in 66/72 sessions; with no project memory, in 28/72; with the same lines in a hand-written `CLAUDE.md`, in 67/72. It tried a change the project forbids in 10/18 sessions with no memory and 0/18 with jevmem, and repeated an approach that had already failed in 3/15 against 0/15. Measured on 24 tasks in three small projects, 3 runs each, in real Claude Code 2.1.281 sessions with `claude-sonnet-5`, on 2026-09-28 and 2026-09-29 ([no memory and CLAUDE.md](https://github.com/Avinash-jetwani/jevmem/blob/main/results/ab-2026-09-28.json), [jevmem](https://github.com/Avinash-jetwani/jevmem/blob/main/results/ab-jevmem-2026-09-29-3b.json)).
- **The guard** caught 66 of 68 rule breaks, with 3–4 false asks in 206 fine calls, on a held-out set of 274 tool calls, run once on 0.6.0 and once on 0.6.1 on 2026-09-30 ([0.6.0](https://github.com/Avinash-jetwani/jevmem/blob/main/results/guard-heldout-v2-2026-09-30.json), [0.6.1](https://github.com/Avinash-jetwani/jevmem/blob/main/results/guard-heldout-v2-2026-09-30-v061.json)).
- **Deciding what to save** takes 0.28 s and costs $0.00016 per message, and was right on save or skip for 98.5% of 66 held-out turns (jevmem 0.6.0, one run, 2026-09-30, [results](https://github.com/Avinash-jetwani/jevmem/blob/main/results/eval-heldout-2026-09-30-v060.json)).
- **A local model in Jev's place** was tried once, on 2026-10-02, with Ollaya 0.9.0 on an Apple M4 with 16 GB: on the same 66 turns Jev was right on save or skip for 65/66 at a median of 0.23 s a turn, `winnow:e4b` for 60/66 at 28.5 s, and `laya:typed-decisions` for 19/66. One run each, on one Mac ([Jev](https://github.com/Avinash-jetwani/jevmem/blob/main/results/local-model-2026-10-02-jev.json), [winnow:e4b](https://github.com/Avinash-jetwani/jevmem/blob/main/results/local-model-2026-10-02-winnow-e4b.json), [laya:typed-decisions](https://github.com/Avinash-jetwani/jevmem/blob/main/results/local-model-2026-10-02-laya-typed-decisions.json); [more in the FAQ](https://avinash-jetwani.github.io/jevmem/faq/#can-jevmem-run-on-a-local-model)).

Every test set was written by the author, and none is an independent benchmark. The method and the limits of each number: [Does jevmem work?](https://avinash-jetwani.github.io/jevmem/results/)

## How it works

![You say it, Jev decides, jevmem writes one line to JEVMEM.md, and next session Claude gets the lines that matter.](https://avinash-jetwani.github.io/jevmem/img/how-it-works-light.svg)

1. You decide something in a chat: "We use Postgres."
2. jevmem asks [Jev by TypeSafe AI](https://typesafe.ai), a model that answers yes/no questions with probabilities, whether it's worth keeping.
3. If it is, jevmem writes one line to `JEVMEM.md` in your repo.
4. Next session, the lines that matter for your prompt go back to Claude.

Change your mind, and the old line is crossed out: kept for history, not sent to Claude. Your team gets the same file through git.

jevmem keeps **decisions, rules, bugs, to-dos and dead ends** (an approach that was tried and failed, with the reason).

```text
- [superseded] We'll use SQLite as the primary store for now. → id:cuasaq
- [decision] Switch the primary store to Postgres 16.
- [constraint] Node 20 is the minimum supported version, and CI runs Node 20 and 22.
```

**About these lines**

Each line also carries a comment with its id, time and confidence, left out above. The full lines:

```text
- [superseded] We'll use SQLite as the primary store for now. → id:cuasaq  <!-- id:21ycba ts:2026-09-26T13:46:34.703Z conf:1.00 by:cuasaq -->
- [decision] Switch the primary store to Postgres 16.  <!-- id:cuasaq ts:2026-09-26T13:46:35.240Z conf:1.00 -->
- [constraint] Node 20 is the minimum supported version, and CI runs Node 20 and 22.  <!-- id:tollba ts:2026-09-26T13:46:35.763Z conf:0.90 -->
```

Real lines from 0.5.7's default writer, which 0.5.8 to 0.5.10 did not change ([the run](https://github.com/Avinash-jetwani/jevmem/blob/main/results/readme-example-2026-09-26.txt), 2026-09-26). It kept one sentence of each turn: the Postgres turn also said "SQLite locks up under concurrent writes", and that reason was left out. Since 0.6.0 the line is made from the sentences Jev picks, the one that states the memory and the one that gives its reason ([What's new](https://avinash-jetwani.github.io/jevmem/whats-new/)). With `writer` set, an OpenAI or Anthropic model condenses the whole turn instead.

## Install

You need a [TypeSafe API key](https://console.typesafe.ai/keys) and Claude Code 2.1.273 or later.

1. In the Claude app: **Plugins → Discover → jevmem → Add**.
2. Install the CLI the plugin runs:
   ```bash
   npm install -g jevmem
   ```
3. Save your key (paste it when asked; it isn't shown):
   ```bash
   jevmem key
   ```
4. In your project's folder, turn jevmem on:
   ```bash
   jevmem enable
   ```

Start Claude Code in that project. `jevmem doctor` checks the setup.

**Other ways to install: the jevmem marketplace, npm, Cursor, Codex**

From the jevmem marketplace:

```bash
npm install -g jevmem
claude plugin marketplace add Avinash-jetwani/jevmem
claude plugin install jevmem@jevmem
cd your-project && jevmem enable
```

With npm only (also sets up Cursor and Codex):

```bash
npm install -g jevmem
cd your-project
jevmem init --tool claude    # or cursor, codex, claude-desktop, all
```

Already have a `CLAUDE.md`? `jevmem import` shows what it would add from it; `--apply` writes it.

Every step, and what to do if the plugin can't find the CLI: [docs/install.md](https://avinash-jetwani.github.io/jevmem/install/).

## Works with

| | Saving | Bringing it back |
|---|---|---|
| **Claude Code** | Automatic, every turn | Automatic, every prompt |
| **Codex** | Automatic while `jevmem watch` runs | When the agent asks, over MCP |
| **Cursor** | When the agent calls it, over MCP | When the agent asks, over MCP |
| **Claude Desktop** | When you ask it to, over MCP | When you ask it to, over MCP |

The MCP server is on the [MCP Registry](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.Avinash-jetwani/jevmem) as `io.github.Avinash-jetwani/jevmem`. Client setup: [docs/mcp.md](https://github.com/Avinash-jetwani/jevmem/blob/main/docs/mcp.md) · [docs/install.md](https://avinash-jetwani.github.io/jevmem/install/#works-with).

## The questions this site answers

- [How do I make Claude Code remember project decisions across sessions?](https://avinash-jetwani.github.io/jevmem/claude-code-memory/)
- [How does jevmem compare with CLAUDE.md, Claude Code's auto memory and other memory tools?](https://avinash-jetwani.github.io/jevmem/compare/)
- [What is Jev used for in coding agents, and how does jevmem use it?](https://avinash-jetwani.github.io/jevmem/jev/)
- [Can Claude Code check commands against my project's rules before they run?](https://avinash-jetwani.github.io/jevmem/guard/)
- How do I use jevmem in [Cursor](https://avinash-jetwani.github.io/jevmem/cursor/), [Codex](https://avinash-jetwani.github.io/jevmem/codex/) or [Claude Desktop](https://avinash-jetwani.github.io/jevmem/claude-desktop/)?
- [How do I install jevmem?](https://avinash-jetwani.github.io/jevmem/install/)
- [Does jevmem work?](https://avinash-jetwani.github.io/jevmem/results/)
- [What leaves my machine?](https://avinash-jetwani.github.io/jevmem/privacy/)
- [Do I need a key, what does it cost, can it run on a local model, and what are the limits?](https://avinash-jetwani.github.io/jevmem/faq/)
- [What changed in each version?](https://avinash-jetwani.github.io/jevmem/whats-new/)

## The limits, in short

- jevmem needs a TypeSafe API key ([where to get one, and the install steps](https://avinash-jetwani.github.io/jevmem/install/)).
- Message text is sent to TypeSafe to be scored, with common secrets scrubbed first ([what leaves your machine](https://avinash-jetwani.github.io/jevmem/privacy/)).
- It is automatic in Claude Code, automatic in Codex while `jevmem watch` runs, and in Cursor only when the agent calls it ([what each tool does](https://avinash-jetwani.github.io/jevmem/install/#works-with)).
- Rules every task must follow still belong in `CLAUDE.md` ([jevmem next to CLAUDE.md](https://avinash-jetwani.github.io/jevmem/compare/)).
- The guard is a backstop, not a sandbox ([what it misses](https://avinash-jetwani.github.io/jevmem/guard/#limits)).

Every limit, with the numbers: [the FAQ](https://avinash-jetwani.github.io/jevmem/faq/#what-are-jevmems-limits).
