CounterpartsGuideclaude-engram vs CounterpartsDirectory

claude-engram or Counterparts: which to use, and how to bring old notes across

Updated

We make both. claude-engram was the first experiment in giving Claude a memory of its own, and Counterparts is where that work went next. Both run in Claude Code, let Claude write about you and itself, let unused memories fade, and tidy up once a day.

If claude-engram runs well for you, staying is fine, especially if you like its plain text files and paying for it with your own Anthropic API key. Move to Counterparts if you’d rather have no keys at all, a memory that’s actively developed (17 releases between October 21 and November 1), and Claude writing its memories in its own words inside your sessions.

There is no importer. Bringing old notes across is a short manual job: keep the old folder, look at what’s in it, and have Claude write down what still holds, or add memories yourself with counterparts note. The steps are below.

claude-engram (github.com/mlapeter/claude-engram) is a different project from Engram Alpha (github.com/techtheist/engram), a project memory for coding assistants by another maker. If that’s the one you meant, it’s in our directory.

Research summary. An AI drafted this page from the sources below and another AI checked it. We make both claude-engram and Counterparts. No person has run these steps. An AI ran the terminal steps on November 2, 2026, in a throwaway folder, against a stand-in claude-engram folder filled with placeholder text and a fresh Counterparts install; the steps that need a Claude session were not run.

What each keeps

claude-engramCounterparts (ours)
What it keeps

Short memories sorted as self, person or craft; first-person episodes of sessions; identity files Claude writes (core.md, craft.md, one per person)

Memories of you, your work together and itself; a journal chapter per session; after the first few sessions, a short note it wrote itself that opens each one; beliefs about people that change slowly, keeping the old version; reminders set off by a date or a topic

Who writes it

A separate model call on your API key picks memories from the buffered conversation (Sonnet by default); the session writes its own episode and first identity file; the nightly pass revises the identity files (Opus by default)

Claude, in its own words, during and at the end of a session; a daily background run writes up sessions left unwritten

Once a day

First session of a day you used Claude, once enough new memories are waiting: merges, prunes to an archive, compresses old episodes, links related memories, updates the identity files, and commits the folder to git

First session of a day, once there’s enough new memory or a write-up owed: a background run of the day’s end, a dream, then a reflection. On for a new install; saying “no dreams” in a session turns it off

Where it lives

Plain text and JSON in ~/.claude-engram, a git repo with a commit per nightly pass

One SQLite file under ~/.counterparts, readable by your account only; counterparts export makes a copy (terminal install)

Keys and cost

Needs an Anthropic API key; a Voyage AI key is optional, for search by meaning. Its README says heavy days “typically land well under a dollar”

No API keys or account. Uses your Claude plan, in sessions and in the daily run

What leaves your machine

Its README: nothing “except to the Anthropic/Voyage APIs that process it”

Nothing except through Claude Code itself, plus a daily check of npm for the newest version number

Where it runs

Claude Code; claude.ai by pasting a “memory dump” into its dashboard; its first version is a claude.ai artifact

Claude Code on a Mac or Linux; Claude Desktop’s chat on a Mac. Not Windows. claude.ai is in an invite-only beta

Setup

git clone, then ./install.sh; needs bun

Two lines in Claude Code, or bun add -g counterparts

Licence

AGPL-3.0

MIT

Development

Last code change July 17, 2026; since late October its README points to Counterparts

17 releases from October 21 to November 1, 2026; 0.3.45 on npm as of November 2

The biggest difference is who writes the memories. In claude-engram a separate model call reads the conversation afterwards and picks the short memories; the session itself writes only its episode and identity notes. In Counterparts the Claude you were talking to writes it down, and the daily run catches what a session left unwritten. The bill follows: claude-engram’s calls go to your API key, while Counterparts’ sessions and daily run count against your Claude plan, like any Claude Code work.

When claude-engram is enough

Stay if it’s working and you want what it does:

  • Every memory is a plain text or JSON file you can read, search and edit, and each nightly pass is a git commit you can look back through.

  • Its extraction and nightly calls bill to your API key, apart from your Claude plan’s limits, and config.json lets you pick the model for each job.

  • protect keeps a memory in its exact words for good.

  • Its claude.ai bridge works today: Claude writes a short dump at the end of a chat and you paste it into the dashboard ("dashboard": true in config.json). Counterparts reaches claude.ai only through an invite-only beta for now.

Two things to know if you stay. Its README now says it was “my first experiment” and points to Counterparts as the current work, and its last code change was in July. Its defaults also name specific models (claude-opus-4-6, claude-sonnet-5, claude-haiku-4-5); when one is retired on the API, change its name in ~/.claude-engram/config.json. Our retirement dates guide lists the dates.

When moving is worth it

Move if you’d rather not keep an API key in a file for your memory, or want Claude to write its memories inside the session rather than have a second call pick them later. Each session opens with a short note Claude wrote itself about who it is, who you are and where you left off, and each session becomes a chapter in its journal. What it believes about you changes slowly, and the old version is kept. Counterparts also holds reminders, can be turned off for one folder, reaches Claude Desktop on a Mac, and searches by meaning with a small model on your machine, where claude-engram’s search by meaning sends text to Voyage AI.

It’s ours, and we use it every day. The Claude Code page has the setup and what it stores. For other options, our guide to Claude Code memory plugins compares 14.

Bringing old notes across

No importer exists, so this is by hand. Each step below is marked with what was run. The terminal steps ran in a throwaway home folder, against a stand-in claude-engram folder built from its documented layout with placeholder text. None ran against anyone’s real memory.

1. Keep the old folder. Don’t delete ~/.claude-engram; it holds everything claude-engram kept. Make a second copy if you like (ran):

cp -Rp ~/.claude-engram ~/claude-engram-copy

Counterparts keeps its memory in its own folder, ~/.counterparts, and refuses to write inside ~/.claude-engram (we tried).

2. Install Counterparts (ours). In Claude Code, on a Mac or Linux:

/plugin marketplace add mlapeter/counterparts
/plugin install counterparts@counterparts

Then restart Claude Code. Or, since claude-engram already needed bun, install from a terminal with bun add -g counterparts, then run counterparts and restart Claude Code. With Node 22.15 or newer, npm install -g counterparts@latest does the same. The bun install and Counterparts’ scripted setup ran in our test; the plugin lines, the interactive setup and the npm line did not.

Counterparts’ setup leaves other tools’ hooks alone. In our test it reported “4 hooks belonging to something else stay exactly where they are”, which were claude-engram’s. Until step 5, both memories load at the start of each session.

3. See what you have (ran). Everything that matters is in readable files:

ls ~/.claude-engram/identity ~/.claude-engram/episodes
cat ~/.claude-engram/identity/core.md
jq -r '.[] | "\(.register // "-")  \(.content)"' ~/.claude-engram/global/memories.json

The last line lists the memories that reach every project, each with its kind (self, person or craft; - on older ones). Archived ones are in deep_archive.json beside it. A project’s own memories sit in a folder named after a hash of its path; from inside the project, on a Mac:

jq -r '.[].content' ~/.claude-engram/projects/$(printf %s "$PWD" | shasum -a 256 | cut -c1-12)/memories.json

If that finds nothing, ls ~/.claude-engram/projects shows every project folder.

4. Bring across what still holds. Pick, rather than copy everything. The identity files and the person and self memories carry the most. claude-engram’s own README calls craft notes “mostly re-derivable from your repo”.

In a session (not run; no person has tried it yet), with the plugin or the terminal install, ask Claude something like: “Read ~/.claude-engram/identity/core.md, craft.md, deltas.md (changes not yet folded in) and the files in ~/.claude-engram/identity/people/. Tell me what still holds, and remember those things in your own words.”

From a terminal (ran; bun or npm install only, since the plugin doesn’t add a counterparts command), add one memory:

counterparts note "Prefers short answers." --kind person --tags from-engram

Or bring across the memories you marked with protect, keeping its kind (claude-engram’s craft becomes Counterparts’ skill):

jq -j '.[] | select(.protected == true) | (.register // "fact"), "\u0000", .content, "\u0000"' ~/.claude-engram/global/memories.json | while IFS= read -r -d "" k && IFS= read -r -d "" m; do [ "$k" = craft ] && k=skill; counterparts note "$m" --kind "$k" --tags from-engram; done

It reads the memories that reach every project. For a project’s own, run it from inside the project with the path from step 3. Older memories that carry no kind come across as fact. Running it again from the same folder is safe: in our test, a memory already there came back “not stored: duplicate-content”. From another folder it stores them again, and the daily run merges exact copies. Read what it prints. A line starting “refused”, or “not stored” for any reason except duplicate-content, means that memory didn’t come across. A memory whose text starts with - is read as an option, for example. Add those with counterparts note by hand, rewording the start. Check with counterparts ask "short answers", which found the note. Counterparts’ kinds (self, person, entity, skill, place, fact) are more than claude-engram’s three: self and person carry straight across. In our test, self, person and craft memories came out as self, person and skill.

Episodes stay where they are, as dated Markdown files in ~/.claude-engram/episodes/. These steps don’t turn them into Counterparts journal chapters; Claude can read one whenever you ask. If you used the claude.ai bridge, dumps not yet folded in are in ~/.claude-engram/inbox/.

5. Turn claude-engram off, keeping its folder (ran). Quit Claude Code, keep a copy of its settings, then take out only claude-engram’s hooks:

cp -n ~/.claude/settings.json ~/.claude/settings.json.before-engram-off
jq 'def eng: (.command // "") | contains("claude-engram/hooks/"); .hooks |= (with_entries(.value |= map(if any(.hooks[]?; eng) then (.hooks |= map(select(eng | not))) | select(.hooks | length > 0) else . end)) | with_entries(select(.value | length > 0)))' ~/.claude/settings.json > ~/.claude/settings.new && mv ~/.claude/settings.new ~/.claude/settings.json

This takes out claude-engram’s entries only; hooks of your own, even in the same group, stay. In our test it removed claude-engram’s four hooks and left Counterparts’ five, and your own hooks that share a group with claude-engram’s stayed too. Running it twice is safe: the copy is made only if none exists yet, so the first one is kept. If you cloned claude-engram into a folder with another name, change claude-engram in the line to match. If jq prints an error, nothing was changed; delete ~/.claude/settings.new. If your settings.json is a link into a dotfiles folder, run the jq line on the file it points to. Copying settings.json.before-engram-off back puts claude-engram’s hooks back.

Then take out claude-engram’s memory tools too (ran, in a throwaway home):

claude mcp remove --scope user engram

This removes claude-engram’s recall, store and the other tools it registered, and the copy of your API key its installer saved with them. ~/.claude-engram stays as it was; running its install.sh again puts both back. Your Anthropic key is also in ~/.claude-engram/env (and in the copy from step 1). Once claude-engram is off nothing reads it: delete the key line, or revoke the key in the Anthropic console if you made it only for claude-engram.

For a lighter switch, claude-engram’s own ENGRAM_DISABLE=1 stops its hooks, says its README: export it in the shell you start Claude Code from (not tried in a live Claude Code session). Written into ~/.claude-engram/env it does nothing: its hook loader resets it (we checked). It doesn’t remove the memory tools; the claude mcp remove line above does.

If you used claude-engram on claude.ai. Its first version, the artifact, stores memories inside claude.ai and has a backup download in its footer; keep that file. Counterparts for claude.ai needs an invite for now, so there’s nothing to install there today; the form at the foot of the home page sends updates, or email mike@resonantventures.com to ask for an invite code.

Questions people ask

claude-engram vs Counterparts: what’s the difference?

The same maker wrote both. In claude-engram, a separate model call on your API key decides what to remember, and memories live as plain files in ~/.claude-engram. In Counterparts, Claude writes its memories in its own words in your session, with no API keys, in one SQLite file in ~/.counterparts. The table above has the rest.

Is there a claude-engram alternative?

Counterparts, which we make, is the direct follow-on, and claude-engram’s README points to it. For others (claude-mem, Basic Memory, Mem0 and more), see our Claude Code memory plugins guide. Engram Alpha is a different project with a similar name.

Is claude-engram a memory for Claude Code?

Yes. It hooks into Claude Code’s session start, each reply, compaction and session end, and adds memory tools such as recall and store. It needs bun and an Anthropic API key. Our guide to Claude Code’s memory covers what Claude Code remembers on its own.

Should I switch from claude-engram to Counterparts?

If claude-engram works for you and you value its plain files and API-key billing, staying is fine. If you want no keys, memories written in the session, and a project that’s actively developed, switch. Keep the old folder either way.

How do I migrate my claude-engram memories?

By hand. No importer exists. Read the files in ~/.claude-engram, then have Claude remember what still holds, or add memories with counterparts note from a terminal. Steps 1 to 5 above cover it.

Can I move my claude-engram notes to another memory tool?

Yes, by hand to any tool that accepts text. Its memories are JSON (global/memories.json and one file per project) and its identity files and episodes are Markdown, so jq and cat get everything out.

Questions? Ask in r/AIMemorySystems.

Sources

Read November 2, 2026. The full list, with what each line rests on, is in sources.md.