Every other memory product is a database.
We're an event log with caches.
# Write a memory $ localmem write --kind preference --content "I prefer Rust for systems work" # Search for it $ localmem search "what language do I prefer" [1] I prefer Rust for systems work score=0.412 id=01K... # Now blow away every derived store $ rm -rf ~/.localmem/derived # Rebuild everything from the event log alone $ localmem replay # Search again, same result, fully recomputed from events.jsonl $ localmem search "what language do I prefer"
~/.localmem/events.jsonl is the single source of truth. DuckDB, LanceDB, Tantivy. All recomputable caches.
Narrow MCP surface. Wide CLI surface.
Auditable trust substrate underneath both.
Event log = source of truth
Append-only events.jsonl. localmem replay rebuilds every derived store deterministically. cat-able forever.
Auditable forgetting
"Delete" emits a forget event. History stays intact. localmem audit <id> traces every touch.
Bitemporal facts
Every fact has valid_from, valid_to, retired_at. Ask "what did we believe last Tuesday?" with --at-time.
Active contradiction resolution
Higher-confidence facts on the same (subject, predicate) retire the prior live fact and emit an Update event.
Container tags
Scope captures with --tags project=X. Reserved tags: retention=ephemeral, visibility=private.
Closed-core kinds
fact / preference / decision / constraint / todo / note. Per-kind recency decay: preferences age slower than todos.
MCP-native
6 tools, 2 prompts, 4 resources. Works with every MCP-compatible client. Generic config recipe for the rest.
Import wizard
First-run scan of ~/Downloads finds ChatGPT and Claude export ZIPs. One-step migration in.
CLI + server are peers
Either can run without the other. They share the filesystem using each store's native concurrency model.
Narrow on purpose.
Trust substrate underneath everything.
| Trait | localmem | Local-first peers | Cloud SaaS |
|---|---|---|---|
| Where your data lives | Your machine | Your machine | Their cloud |
| Plaintext leaving your machine | Never | Varies (some default-on telemetry) | Always |
forget is auditable | Event in the log | App-level delete | Trust the vendor |
| Recoverable from a plain-text file | Yes (localmem replay) | No | No |
| Runtime | Single static Rust binary | Node + framework deps | Cloud SaaS |
| MCP tool count | 6 (narrow + auditable) | 25–50+ (wide) | varies |
| License | Apache-2.0 (non-relicensable) | Mostly Apache-2.0 | Mixed |
| If the project dies | Your memory works | Your memory works | Your memory is gone |
One-command setup for five clients.
Generic MCP config recipe for everything else.
--client claude--client claude-code--client cursor--client cline--client windsurfgenericgenericgenericgenericgenericConcrete patterns that solve a real pain day one.
Not just "AI memory." Specific workflows.
"Stop re-explaining things to my agents"
Two or more AI agents that lose context between sessions. Install once, wire both via MCP, anything one learns is available to the other.
SHARED_MEMORY_FOR_AGENTS →Per-project memory, no cross-leak
Personal facts in ~/.localmem, per-repo facts in <project>/.localmem. Drop a .mcp.json in any repo and that project's agents see only that project's memory.
Audit what your agent knows
localmem profile <subject> synthesizes a markdown profile. localmem audit <fact_id> walks the event log to show every event that touched a fact. No black boxes.
Time-travel your memory
Bitemporal facts mean you can ask "what did I believe last Tuesday?" with --at-time RFC3339. Facts have valid_from, valid_to, retired_at.
Apache-2.0.
The Rust core, the MCP server, the event-log schema, and every importer are Apache-2.0. Your data sits in ~/.localmem/. The OSS core never makes a network call to complete a memory op.
Your content does not leave your machine. There is no path in which it does.