Version control and two-way sync for your AI coding agent's files: Claude Code's memory, skills and settings, files it edits, and companion docs (notes and translations beside a repo you can't commit to). Each change is a commit named for its session, in a git repo you own, synced across machines. mem + saga, Old Norse for “story” or “history”.
README
Version control and two-way sync for your AI coding agent's files, starting with Claude Code: what it remembers, how you configure it, and anything else you choose.
Website: memsaga.grimmer.io · Try it first · Install (with Claude Code or by hand) · Do you need it? · FAQ · Discussions
<picture> <source media="(prefers-color-scheme: dark)" srcset="docs/assets/hero-dark.png"> <img src="docs/assets/hero-light.png" width="100%" alt="memsaga: three sources (Claude Code's config directory in every account, files elsewhere you choose, and content kept only in the repository) become a readable history in a git repository you own, each change named after its session, from fixing a login redirect to restoring CLAUDE.md to Monday's version. The repository syncs both ways between this machine, a private GitHub repository and another machine, and edits made on the web or a phone come back."> </picture>Claude Code writes what it learns about you and your projects into Markdown
files on your machine (its auto memory), next to your CLAUDE.md
instructions and your skills. These files have no history, and they live only
on the machine that wrote them. A later session can rewrite a memory, two
sessions that edit the same file on one day leave no trace of the earlier
version, and a clean-up that merges ten memories into three cannot be undone.
(A CLAUDE.md inside a repository is versioned with that repository; your
global ~/.claude/CLAUDE.md and the memory files are not.)
memsaga keeps them as history:
① Claude writes or changes a memory, CLAUDE.md or a skill
│
② when Claude's reply ends (a turn), a memsaga hook copies what changed into a git
repository you own (the data repository) and commits it, named after the
conversation
│
③ with an `origi