Every Claude session starts from zero.
You spend an hour explaining your architecture, your naming conventions, the three decisions you already made and don't want re-litigated. You close the tab. Next morning you open a new chat and Claude greets you like a stranger. You explain it all again.
After the fortieth time, I stopped re-explaining and built a fix. It's open source, MIT-licensed, and installs with one command. This post is the 5-minute version of how it works and how to run it yourself.
The actual problem
LLMs are stateless. Each conversation is a clean slate — by design. "Memory" features that do exist usually mean one of two things:
A Redis/Valkey server you have to stand up and keep running, or
A managed cloud service where you sign up, get an API key, and your context lives on someone else's infrastructure.
Both work. But both mean your project decisions, code snippets, and the occasional credential you pasted while debugging now sit on a server you don't control. For a tool whose entire job is to remember everything you tell your AI, that tradeoff bothered me.
I wanted memory that stays on my disk.
The approach: your notes are the database
Bastra Recall is an MCP server (Model Context Protocol — the open standard Claude uses to talk to external tools). Instead of a database, it writes memories as plain Markdown into a local Obsidian vault — a folder of .md files on your machine.
That design choice does a few things at once:
The data is yours and it's readable. Open any memory in a text editor. No export tool, no lock-in. If you delete the vault folder, the memory is gone — fully under your control.
One daemon, every tool. The same daemon feeds Claude Code, Claude Desktop, and Cursor. A decision you store in one shows up in the others.
No server to babysit. No Redis, no cloud account, no API key.
When you tell Claude "remember that we use Drizzle, not Prisma, on this project," that fact lands as a Markdown note. Next session — new tab, days later — Claude retrieves it automatically before answering.
Install it (the whole thing)
One command patches the MCP config for every AI tool it detects, idempotently and with a backup:
bashnpx bastra-recall install all --vault /absolute/path/to/your/vault
Then verify the registrations:
bashnpx bastra-recall doctor
Restart Claude Code / Desktop / Cursor, and memory is live. That's it.
Honest constraints, up front:
macOS, Apple Silicon, Node 22+ for now. Linux/Windows are on the roadmap.
It's early — currently 0.7.0-beta.1. Working, in daily use by me, but beta.
Expect rough edges, including during install. This is genuinely early software and something may break on your setup that never broke on mine. If it does, that's useful to me — please tell me exactly what went wrong, either as a comment on this post or as a GitHub issue. The more precise (OS version, Node version, the command you ran, the error you saw), the faster I can fix it.
How retrieval works (the 30-second version)
Storing is easy — anything is a file. The hard part is pulling the right memory back without flooding Claude's context with junk. Recall ranks stored memories by relevance to the current conversation and injects only the top matches, so you get the decision you need without burning your context window on everything you've ever said.
If you want to go deeper on the retrieval and benchmarking, that's the next post. This one is just: here's the problem, here's a thing that fixes it, here's how to run it.
Try it / tear it apart
Repo (MIT): github.com/n0mad-ai/bastra-recall
If you've solved AI memory a different way, I want to hear it — especially if you think the local-Markdown approach is wrong. And if it saves you from explaining your stack for the forty-first time, a star helps other people find it.
It works the same in Cursor and any other MCP client, not just Claude. But Claude is where I felt the problem first.
Top comments (0)