Show HN: Memgit, versioned memory for Claude Code across all your machines A developer using the handle code4161 released Memgit, an MIT-licensed tool that adds versioned, end-to-end encrypted memory sync for Claude Code across multiple machines and AI tools including Cursor, Codex, Windsurf, Gemini CLI and any MCP host. Memgit imports Claude Code's existing machine-local memory, stores every change as a checkpoint with `memgit diff` and `memgit rollback`, and offers optional cloud sync at $12 a month or $99 a year after a 14-day free trial, with the server storing ciphertext only. The tool requires Node and Python 3.11+ and installs via pip, Homebrew, Chocolatey, or a Claude Code plugin marketplace command. The same memory in every session, on every machine, in every tool. Versioned, so a wrong memory is one command to undo. Claude Code now remembers things on its own, on one machine. Its docs are plain about the limit: auto memory is machine-local and is not shared across machines or cloud environments. memgit is the layer on top. It imports what Claude Code already keeps and adds the three things built-in memory does not do: - Every machine. Your laptop, your desktop and a server hold the same memory, synced end-to-end encrypted. - Every tool. Claude Code, Cursor, Codex, Windsurf, Gemini CLI and any MCP host read and write one store. - History. Every change is a checkpoint. memgit diff shows what an agent changed and memgit rollback puts it back. Unedited terminal recording, regenerated from the released package on every release. Claude Code two commands inside Claude Code, nothing else to set up : /plugin marketplace add code4161/claude-plugins /plugin install memgit@memgit The plugin starts the memory server, creates the store on first use and adds the hooks that bring memory in at session start and save what a session learns. It needs Node and Python 3.11+ on the machine. Any other tool, or the full CLI: pip install memgit or: brew tap code4161/tap && brew install memgit memgit init creates the store, imports the memory Claude Code already keeps, and offers to connect every AI tool it finds on this machine That is the whole setup. Restart your AI tool: it now starts each session with your memory and saves what it learns. memgit resume shows exactly what it will see. Any MCP host by config needs Python 3.11+ on PATH; the first run installs memgit into its own environment and creates the store : { "mcpServers": { "memgit": { "command": "npx", "args": "-y", "memgit-mcp" } } } Windows: choco install memgit new versions can wait a few days in Chocolatey moderation; pip install memgit always has the latest . memgit cloud signup on the first machine: one passphrase, then it syncs on its own memgit cloud login on every other machine Every save goes up in the background and other machines' memories arrive at session start and while you work. The server stores ciphertext only; the passphrase never leaves your machine. Free for 14 days with no card, then $12 a month or $99 a year. The local engine, the store, the MCP server and every command are MIT and never gated, and a lapsed plan never locks your data: it stays on your machine, readable and exportable. Until a store is connected, memgit may show one line about this, decided on your machine and sent nowhere: when the store reaches 50 and 250 memories, when it is opened on a second machine, and after an export or a backup, each at most once, for example "214 memories are on this machine. memgit cloud signup puts them on your other machines too 14 days free, no card ." Turn it off with memgit cloud hint off or MEMGIT NO SYNC HINT=1 . memgit fsck every object verified by SHA-256 memgit stats what your context costs with and without memgit, measured on your store memgit cloud auto status whether anything leaves this machine, and when it last did With no cloud login and no licence key, memgit talks to nothing. You've probably already tried both. Here's why they hit a ceiling: | Capability | claude.md | mem-search plugin | memgit | |---|---|---|---| | Loads only relevant context | ❌ loads everything | | ✅ BM25 search — top-k per query | | Project-aware across a multi-repo life | ❌ per-file | ❌ | ✅ memories carry a project ; the current workspace ranks first | | Adopt on an existing codebase | ❌ starts blank | ❌ starts blank | ✅ memgit onboard — seed the store from the repo in one pass | | Version history | ❌ | ❌ | ✅ full commit log | | Diff between sessions | ❌ | ❌ | ✅ memgit diff | | Roll back a wrong memory | ❌ manual edit | ❌ | ✅ memgit rollback | | Works in Cursor, Windsurf, GPT | ❌ Claude only | ❌ Claude only | ✅ all via MCP / HTTP | | Team sync | ❌ copy-paste files | ❌ | ✅ memgit git push | | Scales to 10k+ sessions | ❌ file grows | ❌ search slows | ✅ memgit squash | | Measurable token savings | ❌ | ❌ | ✅ memgit stats | | Export / import standard format | ❌ | ❌ | ✅ TOON + git | Run this on your own store to see the actual numbers measured where possible; estimates labeled : bash $ memgit stats Total memories: 108 41 feedback · 23 user · 19 project · 12 reference · 8 convention · 5 lesson Priority: 3 critical · 67 medium · 38 low Context footprint measured where possible; estimates labeled Surface Tokens Full store every memory as context 12,840 Resume digest measured render 540 Recall block estimate: top-3 rules ≈ chars/4 ~60 per-session injected ≈ 600 tokens estimate vs 12,840 tokens if the full store were loaded Why such a big difference? claude.md loads all context every session. memgit injects a bounded resume digest plus BM25-matched recall — only what is relevant to this session , not everything you've ever recorded. The digest is measured by actually rendering it, and the store total is the real corpus size; nothing here is a simulated benchmark. memgit's data model maps exactly to git: | memgit | git | |---|---| | mnemonic | file | | MindState | tree | | checkpoint | commit | | thread | branch | | memgit commit | git commit | | memgit diff | git diff | | memgit log | git log | | memgit squash --keep-last 100 | git rebase -i --autosquash | | memgit git push | git push | This is not metaphorical — memgit uses a content-addressed object store SHA-256 blobs identical to git's architecture. Every memory has a stable SHA. Identical content has identical SHAs. Old state is always recoverable. Every memory is a readable .toon file under memories/ . Push your entire memory set to GitHub with standard git: memgit git init --remote git@github.com:yourteam/ai-memory.git memgit git push Teammates pull and start with your AI's learned rules from session 1: git clone git@github.com:yourteam/ai-memory.git ~/.claude/memgit-store memgit setup all You can grep , git blame , and git diff your memories just like code: grep -rl "database" ~/.claude/memgit-store/memories/ git log --follow memories/no-db-mock.toon git diff HEAD~7 memories/ Memory tools have a cold-start problem: install one halfway through a project and it knows nothing — there's no initial point, and context only trickles in from future sessions. memgit solves this with a one-time seeding pass: cd your-project memgit onboard mines the repo, prints the bootstrap brief onboard first extracts a repo digest deterministically — git history recent commit subjects, hot files/directories by churn, authors, branch, tags , detected stack from manifests, and the docs worth reading — using bounded, read-only probes that stay near-instant even on huge repositories. The brief then tells your AI agent exactly what to do with it: read only the listed files no tree crawling , extract 10–20 durable facts purpose, architecture, conventions, current state, gotchas , save each as a typed memory, and checkpoint the seed set. Paste it into a session — or don't: if the AI searches memory in a project that has none, the MCP server itself replies with the bootstrap instructions instead of a bare "no results." Memories are project-scoped, filter-by-default v0.7.0 : each carries the workspace it belongs to, and searches, recall injections, and the resume digest recent memories, checkpoints, depth hints are filtered to the current project's family plus explicitly-global memories — another project's content never leaks in. Widen deliberately with memgit search --all-projects / all projects: true every hit then carries its project label , or hard-filter one project with --project . A memory with no project is explicitly global applies everywhere : save one with memgit add --global or project: "" . A save whose project cannot be determined is never silently global — it's quarantined under unknown visible in list as ?project , flagged by lint , surfaced nowhere until you relabel it with memgit doctor --relabel . Ask an AI "can we proceed on the pending tasks?" in a fresh session and it will guess from whatever file happens to be open. memgit resume replaces the guess with the record: memgit resume last checkpoints, work in flight, recent + critical memories memgit resume --plain plain text, for piping into an AI context memgit resume --json for tooling Wire it into Claude Code so memory becomes automatic — no tool call, no judgment required: memgit setup hooks installs all six hooks ~/.claude/settings.json | Hook | What it enforces | |---|---| | SessionStart | every session opens with the resume digest in context — status board, checkpoints, critical rules, memory index | | UserPromptSubmit | each prompt is BM25-matched against the store; relevant memories are injected, ending with a "+N more on ''" depth hint when more exists silent when nothing clears the relevance bar; never repeats within a session — --no-recall to skip | | PreToolUse | a Bash or file-write call that matches a memory's triggers is refused with the rule as the reason priority-3 feedback and conventions or gets the rule as context the rest . memgit allow SLUG opens a short override window. Trigger cache only, --no-gate to skip | | PostToolUse | reading a file whose path matches a memory tag surfaces a one-line hint "6 memories tagged 'x' relate to this path" — tagmap cache only, capped 3/session, --no-ctx-recall to skip | | Stop guard | a governed call that went through without the gate, or a session that did real work but saved nothing, gets ONE block before finishing. --no-guard to skip | | Stop sync | markdown memories are checkpointed asynchronously at session end | Why hooks and not just good tool descriptions? We measured it: across 166 real sessions, hook-injected context was delivered in 100% of them while voluntary memory-tool calls happened in 6% . What a hook enforces happens. The resume digest is deliberately bounded ~350 tokens measured on a 500-memory store : rules are clipped, the critical list is capped, and full text is one get memory call away. After months of use, your checkpoint history grows. Squash compresses it, gc reclaims the disk: memgit squash --keep-last 100 keep last 100 checkpoints, squash everything older memgit squash --older-than 30 squash everything older than 30 days memgit squash --dry-run preview first memgit gc delete unreachable objects, trim reflogs memgit gc --dry-run preview memgit gc --squash-keep 200 compact history, then sweep The current memory state is always preserved — and squash is lossless-in-substance: every collapsed checkpoint leaves a one-line record time, author, diff, message in an append-only archive under .memgit/logs/archive/ that gc never touches. Benchmark on a 2,000-checkpoint store: 94% smaller 39.5 MB → 2.2 MB , fsck clean. History operations stay O 1 as the chain grows SHA resolution and checkpoint counting measured at ~0.08 ms at 2,000 checkpoints . All writes go through a git-style store lock 0.08 ms overhead , so concurrent agents can't corrupt the store or lose each other's updates. Two patterns: Shared thread — agents write concurrently; if one commits while another has work staged, the second commit auto-merges three-way, against the recorded base instead of clobbering. Set MEMGIT AUTHOR=agent-name so each checkpoint says who did it. Thread per agent — isolate, then integrate: memgit thread create agent-1 branch off for each agent ... agents work on their own threads ... memgit merge agent-1 three-way merge back common-ancestor based Conflicts same memory changed on both sides resolve to the newest version; an edit always beats a delete. Both histories are preserved. Once registered via MCP, every AI tool gets 6 tools: | Tool | When the AI uses it | |---|---| | resume session | When the request depends on prior state — "continue", "the pending tasks", session start | | search memories | Before answering anything that touches past work or preferences | | get memory | When it needs full details of a specific memory | | list memories | To browse or audit what's stored | | save memory | When it learns something worth keeping for next time | | get checkpoint log | To check when memories were last synced | The tool descriptions teach the AI judgment — "does this request depend on state you don't have in context?" — rather than keyword triggers. Measured cost of the whole tool surface: ~1,150 tokens once per session; a resume session reply is ~335. A save that arrives damaged is refused, not stored v0.13.0 . A model sometimes closes a value with a tag named after the field