remindb
Agentic memory in a single SQLite file.
Stop letting your agent re-read the same notes every session.
Why I built this
Coding agents already have memory. CLAUDE.md, AGENTS.md, your notes folder, that growing pile of project READMEs. Stuff persists just fine.
The problem is how the agent consumes it. Every session starts by re-reading the whole pile from scratch — every Read, every Grep, scanning raw prose the agent has already processed dozens of times. Big context windows don't fix it. A 1M-token window is still paid per call, and still can't tell yesterday's stale note from today's relevant one.
Raw markdown is the wrong shape for memory. Not because it can't hold the words — it can — but because it forces the agent to pay full freight on every read.
remindb is a single SQLite file your agent treats as long-term memory. It parses your notes (Markdown, JSON, YAML, TOON) into a structured tree, hashes every node, encodes repetitive structures compactly when it saves tokens, and surfaces the whole thing through a tight MCP tool suite.
What you get
A tree the agent can index, not skim. Instead of ls-ing a folder and reading every file to orient, the agent calls MemoryTree once. Each entry is a typed node — [heading], [list], [kv], [table], [preamble], [text], [code] — with an ID, a short label, a temperature, and a token count. Think of it as ls -la for memory: one call, a scannable index, hot stuff floats up.
A real slice (from remindb inspect --tree):
[preamble] Preamble: framework, language, project (id=3kGXxidmWBp file=CLAUDE.md temp=0.50 tok=14)
[heading] Project Instructions (id=6EuIVj5zt5j file=CLAUDE.md temp=0.75 tok=5)
[heading] Architecture (id=603qfsg4qd2 file=CLAUDE.md temp=0.88 tok=3)
[text] Next.js 15 conventions with a clear separation of data… (id=3GGuLAq3yNP file=CLAUDE.md temp=0.82 tok=111)
[list] 7-item list: app/, components/, lib/, db/, hooks/, types… (id=ITAKw5NVNPt file=CLAUDE.md temp=0.71 tok=228)
[heading] Data Model (id=FQwpXL4bm6Y file=CLAUDE.md temp=0.62 tok=3)
[list] 7-item list: products, variants, orders, carts, users, s… (id=Il8jcgTJOGt file=CLAUDE.md temp=0.55 tok=155)
[heading] Payment Integration (id=LTQZLSkPsDW file=CLAUDE.md temp=0.30 tok=5)
[text] Stripe Payment Intents; not legacy Checkout Sessions… (id=GLbXrUYs32G file=CLAUDE.md temp=0.24 tok=35)
[heading] Observability (id=2wkOdf47OjR file=CLAUDE.md temp=0.08 tok=4)
[list] 4-item list: Sentry · Vercel logs · OTel tracing · Prom… (id=C1HCYSAOkpu file=CLAUDE.md temp=0.08 tok=90)
A fresh compile starts every node at temp=0.50. The spread above is what an agent sees after a few sessions of reading. Architecture is hot because the agent keeps coming back to it. Observability has gone cold and will get flagged for summarization on the next nudge.
Hot vs. cold, like a real cache. Each node has a temperature that rises when the agent reads it and decays over time. Hot nodes rank higher in search. Cold nodes don't disappear — they just stop crowding the top of results.
Summarization that happens when it should. When a node crosses the cold threshold, the MCP server pushes a notification straight to the agent: this has gone cold, consider compacting it. The agent calls MemorySummarize with a shorter rewrite. The node shrinks in place, keeps its anchor in the tree, keeps its version history. No cron, no external worker — it happens in-band, driven by how the memory actually gets used.
Git-style versioning, free. Every compile or write lands a snapshot. Linear parent chain, fingerprinted by a cursor_hash. Per-node diffs (add / mod / rem, with old and new content) sit alongside. MemoryDelta hands the agent only what changed since its last cursor — a tiny resync instead of a whole-file re-read.