PMB - Stop re-explaining your project to AI coding agents

PMB gives Claude Code, Cursor, Codex and Zed persistent project memory through MCP. It stores decisions, lessons, goals, recent work, project facts and docs in one SQLite workspace on your disk. No cloud, no API keys, no LLM call on the read path. It is open source, offline-first, inspectable/exportable, with a local dashboard and honest impact tracking so you can see which memories actually help.

Add a comment

Replies

Best

PMB’s local SQLite + no read-path LLM claim is the part I’d test first. The hard bit with project memory is not storing more facts; it’s deciding when an old fact should lose authority.

Do you track expiry or conflict per memory item? For example, if a repo switches from REST to GraphQL, I’d want the old REST decision preserved as history but not injected into a fresh coding-agent context unless the current file still touches that path. The dashboard would be more useful if it shows not just “this memory helped”, but “this memory was skipped because it conflicted with newer evidence.”

 Please do test it first - it's open source, so you can inspect the SQLite and confirm the read path makes zero network calls. And you've named the real problem: it's not storage, it's when a fact should lose authority. Today that's soft (recency + forgetting-curve decay) plus hard latest-wins for keyed facts, but there's no explicit per-item expiry or conflict flag for free-text decisions yet - so a REST decision after a GraphQL switch loses weight, but isn't hard-suppressed.

Both your ideas are spot on and going on the list: locality-scoped authority - injecting an old decision only if the current file still touches that path - maps directly onto PMB's code-entity graph (today it's emergent from ranking, not a hard gate); and the dashboard showing "skipped because it conflicted with newer evidence," not just "this memory helped," is the version that makes it auditable instead of trust-me.

Repo if you want to follow along:

the "no LLM call on the read" part is a nice detail. most memory solutions make an API call every time the agent needs context, which adds latency and cost to every single interaction. storing it in local SQLite and letting the agent pull what it needs without a round trip makes way more sense for coding workflows where speed matters. does it handle memory conflicts though? like when two sessions produce contradicting decisions about the same part of the codebase.

 Thanks - and you've got the reasoning exactly right: the read path is pure local retrieval, so context costs you milliseconds, not an API call per interaction.

On conflicts: partially. For facts with a clean key it's resolved - latest-wins, old value archived. For two free-text decisions that contradict on the same part of the codebase, it's honest-partial today: both are stored as events, recency decay and relevance ranking push the newer one up, but there's no semantic detection that says "these two conflict" and hard-suppresses the stale one - so worst case both stay retrievable until one is corrected or archived. The hook for fixing it is already there, though: decisions about the same code cluster on the same entities in the graph, so detecting a conflict on a shared entity and flagging it for supersede/review is the next build.

Repo if you want to follow along:

Keeping agent memory in one local SQLite file is a clean approach. Re-explaining project decisions across Claude Code, Cursor, and Codex gets old fast, so shared MCP memory could make coding sessions feel much less repetitive.

 Thanks - shared across tools is the whole point: the memory follows you from Claude Code to Cursor to Codex, so you explain a decision once, not once per tool.

Everything staying right here on my own machine is the part that lands for me, Oleksii. Repeating myself over and over has quietly been one of my least favorite parts of the day, so this feels like a real relief.

 That "least favorite part of the day" line is exactly why I built it. Quietly repeating yourself all day is the thing I wanted gone - thank you.

Congrats on shipping! What is next on the roadmap after launch day?

 Thanks! A few things, shaped largely by the questions in this very thread:

  • Memory lifecycle: first-class active / superseded / needs-review states for decisions, with auto-detection when a newer decision reverses an older one, so stale context loses authority instead of lingering.

  • Conflict surfacing: a dashboard view showing not just "this memory helped" but "this was skipped because it conflicted with newer evidence," plus a per-session memory diff (what was added, updated, and what influenced a suggestion).

  • Locality-scoped recall: lean harder on the code-entity graph so a decision only surfaces when the file you're touching still relates to it.

  • A reproducible benchmark harness in the repo (with/without PMB, N runs, tokens + pass/fail + quality), so the speed and quality claims are verifiable, not trust-me.

On direction: PMB stays local-first and fully open source. I'm not planning paid features - if anything ever gets added behind a flag it'll only be by explicit request from people who need it, and the core stays free and open for everyone. The goal is a tool you own, not a funnel into a subscription.

Repo:

the "no cloud, on your disk" call is the whole thing for me — local-first genuinely changes what people will put in their memory. building healthos on the same constraint. how's retrieval holding up as the graph grows into thousands of entities?

 Exactly. “Local-first” is not just a privacy feature here, it changes what users are willing to let the agent remember. For retrieval: it’s holding up well so far. My own PMB workspace is already at thousands of entities and tens of thousands of graph connections, and warm recall is still fast because SQLite stays the source of truth, while BM25 + vector search + graph expansion are used as retrieval/ranking layers. The biggest challenge has not been raw speed, but precision: making sure the agent gets the few memories that matter, not a huge context dump. So PMB is intentionally conservative about what it surfaces, especially for lessons/rules. HealthOS sounds like a perfect use case for the same constraint btw - health memory is exactly the kind of data people should not have to put in a cloud just to make it useful.

So if I have a session in Claude, it will have the memory to store the chat from claude and when I switch to chatgpt or others llms it wil pick up the left over work from claude?

 Yes, that’s exactly the idea, with one important nuance: PMB does not just dump the entire raw chat history into memory.

It stores the durable stuff that should survive between sessions: project decisions, lessons, bugs, goals, files touched, constraints, and “don’t do this again” rules.

So you can work in Claude Code, then later open Codex / Cursor / another MCP-aware agent connected to the same PMB workspace, and it can pick up the relevant context instead of starting from zero.

For plain ChatGPT, it depends on whether the client has a way to connect to PMB/MCP. But across MCP-compatible coding agents, yes - that is the workflow PMB is built for.

this solves a real problem. the context re-explanation tax is probably the single biggest friction point in AI-assisted coding right now — you lose 10-15 minutes at the start of every session just getting the agent back up to speed on decisions you already made.

curious about the memory graph structure. how does it handle conflicting decisions? like if you stored "never use ORM" as a lesson but then later decided to add one for a specific service?

 That’s exactly the hard part: memory is only useful if it has scope and authority, not just storage.

PMB already does a few things here. Recall is not a flat keyword search: memories are ranked with multiple signals - lexical/vector match, importance, recency, graph/entity proximity, and follow-through history for lessons. The graph links decisions, lessons, files, projects, and entities, so a newer decision tied to a specific service/file can win in that context over a broader older rule.

So in your example, “never use ORM” would be treated as a general lesson. If later we store “use ORM for this billing service”, that newer and more specific decision should surface for billing-service work because of recency, entity scope, and graph relevance. The older lesson can still be useful elsewhere, but it should not have infinite authority.

The honest answer: PMB already has weighting, scoped recall, and conflict detection for factual state. The next step is making lifecycle explicit for decisions/lessons too - active / superseded / needs-review - and showing those conflicts in the dashboard instead of hiding them.

The goal is not “remember everything forever”. It’s memory with weight, scope, and aging.

Love the local SQLite take. The staleness thing Dipankar raised kept biting me with Claude Code. Old assumptions resurfacing two refactors later, no way to tell whether the agent pulled them from memory or made them up. When a newer event reverses an older one without a clean key, does the dashboard surface "skipped because of X" or do I dig into events myself?

 That is exactly the failure mode I care about too: stale memory is worse than no memory if you cannot see where it came from.

Today PMB already gives attribution for the lesson path. When a lesson is surfaced, it gets a surface_id; later agent actions can be linked back to that surface, and PMB tracks whether it was followed, ignored, or not applicable. The Earned Memory layer then connects surfaced lessons to outcomes like tests passing, builds, deploys, red-to-green fixes, and churn.

For clean factual state, PMB also has validity/supersession mechanics: newer keyed facts can supersede older ones while keeping history and provenance.

The honest answer on your exact “newer event reverses an older one without a clean key” case: today, you can inspect the events and attribution trail, but the dashboard does not yet give a universal “skipped because of X” explanation for every memory type. That is the direction I want to take it: explicit active / superseded / needs-review states, plus a dashboard view that shows why a memory was used, skipped, or considered stale.

I agree with your framing: context without provenance is noise. PMB should make memory accountable, not just persistent.

Repo is here if you want to take a look or follow the work:

How does this work on projects you work on together with others? Is the data stored in the git repository or only on my machine? If only on my machine, is it possible to get the memory to be used by my team as well and the other way around?