remindb

module
v0.3.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 17, 2026 License: MIT

README

remindb logo

remindb

Agentic memory in a single SQLite file.
Stop letting your agent re-read the same notes every session.

CI Latest release License Go version


remindb architecture

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, HTML, 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

Each point is a summary — the full reasoning, with the tradeoffs, lives in docs/.

A tree the agent can index, not skim. One MemoryTree call returns a typed, labeled, token-counted hierarchy — ls -la for memory instead of ls-ing a folder and reading every file to orient. → The node tree

Hot vs. cold, like a real cache. Every node has a temperature that rises when it's read and decays over time. Hot nodes rank higher in search; cold ones stop crowding the top without ever being deleted. → Temperature

Summarization that happens when it should. When a node crosses the cold threshold the server nudges the agent to compact it in place — same anchor, same history, fewer tokens. No cron, no worker; it's driven by how the memory actually gets used. → Temperature

Git-style versioning, free. Every compile or write lands a snapshot with per-node diffs. A returning agent resyncs with MemoryDelta — a tiny payload instead of a whole-file re-read. → Versioning

TOON encoding where it pays off. Arrays of uniform objects store ~40% smaller in TOON than YAML or JSON. The parser tries both per node and keeps the win only when it's real; irregular prose stays plain text. The same ≥15% rule converts MathML in HTML to compact LaTeX. → TOON encoding · MathML → LaTeX

FTS5 search, not grep. Ranked anchors in milliseconds over a porter-tokenized index — no file rescans, no regex timeouts — trimmed to exactly the token budget you pass. → Search

Knowledge graph from lateral relations. Author [[Architecture; w=2.5]] in any payload and the compiler resolves a directed weighted edge; MemoryRelated traverses it up to 5 hops, ranked by path weight. Forward references self-heal. → Knowledge graph

Portable by design. The whole memory is one .db file. Copy it to another machine, hand it to another agent, commit it into a repo, sync it across devices. No server, no daemon, no external state — any MCP-capable agent can point serve at the same file and share the same knowledge.

Install

One-line install

Linux / macOS:

curl -fsSL https://raw.githubusercontent.com/radimsem/remindb/main/install.sh | bash

By default the binary lands at ~/.local/bin/remindb. Pick a different prefix:

curl -fsSL https://raw.githubusercontent.com/radimsem/remindb/main/install.sh | bash -s -- --prefix /usr/local

Windows (PowerShell 5.1+):

iwr -useb https://raw.githubusercontent.com/radimsem/remindb/main/install.ps1 | iex

Lands at %LOCALAPPDATA%\Programs\remindb\bin\remindb.exe. Override with -Prefix:

./install.ps1 -Prefix C:\tools\remindb

From source (Go 1.26+)

git clone https://github.com/radimsem/remindb.git
cd remindb
go build -o ~/.local/bin/remindb ./cmd/remindb

Verify:

remindb --version

Updating

Two moving parts: the binary (release tags) and the agent-side skills (remind, memoize — the markdown your agent loads to learn how to call the MCP tools). They iterate on different cadences, so they update independently.

Binary

remindb update

Reads the installed version, compares it against the latest GitHub release, and re-runs the install script only when they differ. dev-builds (from go build / go install) always proceed — there's no published version to compare against. Pass --force to reinstall regardless:

remindb update --force

Skills

The public skills live under skills/remind/ and skills/memoize/. They're refreshed by vercel-labs/skills.

First-time install (or after adding a new agent):

npx skills@latest add radimsem/remindb/skills -a claude-code
# -a codex | gemini-cli | opencode | openclaw | ...

Refresh later:

npx skills@latest update

Documentation

The README is the trailer. The manual is in docs/ — each page opens with the problem it solves, in plain language.

Page What's there
Architecture The layer-by-layer map: parser → transformer → emitter → store, then query → mcp.
CLI reference Every subcommand — compile, serve, inspect, bench, doctor, update — with flags.
Configuration The .remindb/ directory: config.json feature blocks, ignore, temperatures.json.
The node tree · Temperature · Versioning · Search · TOON · MathML → LaTeX · Knowledge graph The feature deep-dives linked from What you get.

MCP tools

A Memory* tool suite, registered once, surfaced to any MCP-capable agent (Claude Code, Codex, Gemini CLI, OpenCode, OpenClaw, …). The read path is documented in the remind skill, the write path in memoize.

Tool Purpose
MemoryTree Renders the full node hierarchy with labels, types, IDs, temperatures, and token counts. The agent's cheap orientation call.
MemorySearch FTS5 full-text search over labels and content. Returns ranked anchors within a token budget.
MemoryFetch Returns one anchor plus its ancestors and children, trimmed to a token budget. The "read just this region" call.
MemoryFetchBatch Fetches many anchors in one round-trip under a shared budget — the "read every search hit at once" call. No per-call framing tax.
MemoryDelta Returns only the nodes that changed since a given snapshot cursor. Lets agents resync with a tiny payload instead of re-reading files.
MemoryDiff Compares two arbitrary snapshots git-diff-style. Point-in-time forensic comparison; both ends fixed.
MemoryHistory Browses the version history of a node — who/when/how it changed, rollback-capable via stored old content.
MemoryRelated Traverses the relations graph from an anchor — outgoing/incoming/both, up to 5 hops, ranked by summed path weight. Surfaces what an authored [[Label]] wiki-link connects to.
MemoryStats Reports DB health and shape: node/token totals with per-type breakdown, snapshot/cursor summary, temperature spread, relations, FTS row count. Read-only, single round-trip. Same data the remindb inspect CLI renders.
MemoryWrite Writes or updates content at an anchor. Creates a new snapshot and a per-node diff.
MemorySummarize Replaces a node's content with a shorter summary the agent provides. Used when the temperature tracker flags a cold node.
MemoryCompile Compiles source files or a directory into the database from inside a session. Same engine as the compile CLI.
MemoryRelate Creates a manual edge between two existing nodes. Resolves the target the same way parsed wiki-links do (id → source+label → label only). Does not create a snapshot — relations are a sideband.
MemoryForget Explicitly removes a node. Three deletion modes (including reparent, which rewires children up to the deleted node's parent).
MemoryRollback Walks the graph back to a prior snapshot, optionally pruning the history after it. Still produces exactly one snapshot.
MemoryPin Protects a node from temperature decay and the cold-summarize loop — for reference material that must not age out.
MemoryUnpin Releases a pin, returning the node to normal decay.

Agent integrations

Five plugin folders ship with the repo, one per supported coding agent. Each has a manifest matching that agent's spec, an MCP stanza, and a README with install commands, env-var conventions, and a worked example that compiles the agent's own memory folder into remindb.

Agent Folder Install docs
Claude Code plugins/claude-code/ plugins/claude-code/README.md
Gemini CLI plugins/gemini-cli/ plugins/gemini-cli/README.md
Codex plugins/codex/ plugins/codex/README.md
OpenCode plugins/opencode/ plugins/opencode/README.md
OpenClaw plugins/openclaw/ plugins/openclaw/README.md

[!TIP] Pair the plugin with the two companion skillsremind (read path) and memoize (write path). They teach the agent the MCP tool suite so you don't re-explain it each session. Per-agent install instructions live in skills/README.md.

For any other MCP-capable agent, add this to its MCP config by hand. Stdio (the default — one server per client process):

{
  "mcpServers": {
    "remindb": {
      "type": "stdio",
      "command": "remindb",
      "args": ["serve"],
      "env": {
        "REMINDB_DB": "/absolute/path/to/memory.db",
        "REMINDB_SOURCE": "/absolute/path/to/notes"
      }
    }
  }
}

Every serve flag has a REMINDB_* environment equivalent — REMINDB_DB, REMINDB_SOURCE, REMINDB_RESCAN_INTERVAL, REMINDB_TRANSPORT, REMINDB_LISTEN — so pass them via args, the env block above, or a committed .remindb/config.json. Precedence is explicit flag → .remindb/config.json → env → built-in default; see Configuration.

Or HTTP, when you want one long-running server that multiple agent sessions (a local IDE, a CI worker, a hosted session) share. Start remindb serve --transport http --db ... --source ... once, then point each client at the listen URL:

{
  "mcpServers": {
    "remindb": {
      "type": "http",
      "url": "http://127.0.0.1:7474"
    }
  }
}

On startup the agent sees the full Memory* tool suite alongside its usual toolbox. A reasonable first prompt:

/remind Call MemoryTree to orient. Then call MemorySearch for "<topic>" with budget 1000
and MemoryFetch on the top hit. Explain what you learned and which files it came from.

Benchmarks

Token counts are measured against the naive baseline an agent falls back to without a memory layer: list the directory, read every matching file, grep through it. Numbers come from ./scripts/bench-agents.sh over the five plugin fixtures in testdata/, plus a one-off compile of a real Obsidian vault (~450 markdown files across AI concepts, market briefs, security notes, and MOCs — ~3.3M naive tokens end-to-end).

The scenario suite (tree · 3 searches · fetch · delta) rolls up into three workflow categories:

  • context window — a single MemoryTree orientation call.
  • context gathering — 3 × MemorySearch + MemoryFetch + MemoryDelta, token-weighted.
  • total session — sum of both.

[!NOTE] Corpus size moves the numbers in remindb's favour. The plugin fixtures are ~3k–20k tokens each; the vault is ~3.3M. As the corpus grows, the naive baseline scales linearly (more files to list, more bytes to grep, more prose to re-read), while remindb's answers stay bounded by the token budget you pass. That's why the vault's context-gathering row hits 99.8% — every search still returns ~1k tokens, but the baseline is now ~100× larger.

The scenario list is also intentionally short. A real 30-minute agent session does dozens of orient/search/fetch/write/re-orient cycles, and the same search often fires three or four times as the agent loops on a problem. Each of those calls compounds toward 90%+ full-session savings on realistic corpora.

remindb token savings by scenario category

The obsidian vault row is a real vault: ~450 markdown files, ~3.3M naive tokens.

Reproduce the table yourself:

./scripts/bench-agents.sh

Contributing

This is a project I maintain between classes — patches, bug reports, and ideas are genuinely welcome, and an extra pair of eyes goes a long way. The full guide lives in CONTRIBUTING.md: branch naming, the pre-PR checklist, the doc-update map, and how the AI-assisted workflow is wired up. If you want to start small, the "First-time contributors" section there has good entry points.

License

MIT — see LICENSE.

Support

I'm a college student building agentic AI tooling in the evenings and weekends between classes. remindb is free, MIT-licensed, and will stay that way — no telemetry.

If this saved you tokens (or saved you from reading the same 100 files for the hundredth time), even a small tip helps a lot.

Buy Me A Coffee

Or send BTC to bc1qwyxsx7sledl4pru8y5ykd54fevsklytrv95ual.

Thanks for reading this far. If you end up using remindb in anger, I'd love to hear what you built — open an issue with a short story, or drop a star. Both matter more than you'd think.

Directories

Path Synopsis
cmd
remindb command
internal
ignore
Package ignore filters source-tree walks via a .remindb/ignore sidecar file.
Package ignore filters source-tree walks via a .remindb/ignore sidecar file.
redaction
Package redaction scrubs secrets from content on the way into the store.
Package redaction scrubs secrets from content on the way into the store.
tempfile
Package tempfile resolves pre-seeded temperatures from .remindb/temperatures.json.
Package tempfile resolves pre-seeded temperatures from .remindb/temperatures.json.
Hold the embed.FS handle so other packages can read the migrations at runtime.
Hold the embed.FS handle so other packages can read the migrations at runtime.
pkg
config
Package config loads workspace-level remindb configuration from .remindb/config.json.
Package config loads workspace-level remindb configuration from .remindb/config.json.
diff
Package diff computes minimal deltas between the current enriched AST and a previous snapshot.
Package diff computes minimal deltas between the current enriched AST and a previous snapshot.
doctor
Package doctor runs read-only integrity checks against a remindb store and applies opt-in fixes.
Package doctor runs read-only integrity checks against a remindb store and applies opt-in fixes.
emitter
Package emitter applies diff deltas to the store in a single transaction.
Package emitter applies diff deltas to the store in a single transaction.
inspect
Package inspect aggregates database statistics for the CLI and MCP surfaces.
Package inspect aggregates database statistics for the CLI and MCP surfaces.
mcp
parser
Package parser turns source files (Markdown, HTML, YAML, JSON, TOON) into a unified ContextNode tree.
Package parser turns source files (Markdown, HTML, YAML, JSON, TOON) into a unified ContextNode tree.
relations
Package relations resolves wiki-link refs into typed graph edges on top of the node tree.
Package relations resolves wiki-link refs into typed graph edges on top of the node tree.
store
Package store provides SQLite-backed persistence.
Package store provides SQLite-backed persistence.
transformer
Package transformer enriches parsed ContextNodes with anchors, labels, token counts, and compressed paths.
Package transformer enriches parsed ContextNodes with anchors, labels, token counts, and compressed paths.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL