Engram
Gives coding agents a persistent, searchable project memory stored locally in SQLite
Local, file-based long-term memory for coding agents and chat clients, served over HTTP MCP
By Joshua Warren (individual) TypeScript Local · Streamable HTTP Knowledge and memory
65 popularity score ★ 232 ↓ 6.6k/wk
Opens the app, which asks before it adds the server.
claude mcp add --transport http remnic http://localhost:4318/mcp{
"mcpServers": {
"remnic": {
"url": "http://localhost:4318/mcp"
}
}
}{
"servers": {
"remnic": {
"type": "http",
"url": "http://localhost:4318/mcp"
}
}
}[mcp_servers.remnic]
url = "http://localhost:4318/mcp"gemini mcp add --scope user --transport http remnic http://localhost:4318/mcpREMNIC_AUTH_TOKEN |
Required: Bearer token clients must send; without it (or a token minted by `remnic token generate`) every request is refused. |
|---|---|
OPENAI_API_KEY |
Optional: Key for extracting memories with OpenAI; not needed with a local LLM, the OpenClaw gateway, or retrieval-only use. |
REMNIC_MEMORY_DIR |
Optional: Folder where the markdown memory files are kept. |
REMNIC_CONFIG_PATH |
Optional: Path to remnic.config.json. |
REMNIC_HOST |
Optional: Address to bind; 127.0.0.1 by default. |
REMNIC_PORT |
Optional: Port to listen on; 4318 by default. |
Remnic keeps an assistant's long-term memory on your own disk. Each memory is a markdown file with YAML frontmatter (facts, decisions, preferences, corrections, entities and a user profile) under a memory directory you choose, and a search index built from those files can be thrown away and rebuilt at any time. Recall ranks stored memories against the current context; a background step buffers conversation turns and uses a model of your choice to pull out durable facts and write them to disk.
The MCP side is a local HTTP service. You start it with `remnic-server` from @remnic/server or with `remnic daemon start` from @remnic/cli, and every MCP client (Claude Code, Codex CLI, Cursor, VS Code, Replit, Factory Droid and others) points at the same `/mcp` address with a bearer token, so one store is shared by all of them. Beyond store and recall it carries tools for correcting memories with an approval step, entity lookup, recall explanations, conversation-archive search, continuity and identity records, a small task and project board, and shared context between agents.
At v9.69.56 the source registers over 100 distinct tools, far more than the 44 listed in the connector guide, and several appear only when their feature is turned on in config (support passport, recall navigation, briefing, coding decisions, chat). The code advertises each tool as `remnic_<name>` (Anthropic tool names may not contain dots) and still accepts the `remnic.` and `engram.` forms the docs use (access-mcp-tool-names.ts).
| Runtime | Node.js 22+ |
|---|
Node.js 22.12 or newer. A running Remnic server: `npx --package @remnic/server remnic-server` (or `npm install -g @remnic/cli`, then `remnic init` and `remnic daemon start`), with a bearer token set in REMNIC_AUTH_TOKEN. Writing new memories from conversations needs a model provider: an OpenAI API key, the OpenClaw gateway model chain, or a local LLM; retrieval-only use needs none. QMD on PATH is optional for the best hybrid search.
The standalone server has no stdio launch: clients connect over HTTP to the running service. With no auth token set it starts but rejects every request (packages/remnic-server/src/index.ts). It binds to 127.0.0.1 on port 4318 unless --host/--port or REMNIC_HOST/REMNIC_PORT are given. Namespaces, at-rest encryption and lossless transcript archiving are off by default. The Relay judge verifier is supported on Linux only and fails closed elsewhere. Tool names are moving from `engram.*` to `remnic_*` during the v1.x compatibility window.
Suits a developer who uses several coding agents or MCP clients and wants one memory they can read, grep, edit and keep in git, stored on their own machine rather than with a hosted memory service. It fits people willing to run a background service and supply a model for extraction (or a local LLM to keep everything on-device). Someone who wants a single stdio command with no daemon, or only needs a scratchpad for one client, will find the setup heavy. It is a community project, not from any of the agent vendors it connects to.
engram.recallengram.recall_explainengram.recall_xrayengram.recall_tier_explainengram.observeengram.memory_storeengram.memory_getengram.memory_timelineengram.memory_searchengram.memory_correct_planengram.memory_correct_applyengram.memory_feedbackengram.memory_promoteengram.memory_profileengram.memory_entities_listengram.entity_getengram.memory_questionsengram.suggestion_submitengram.review_queue_listengram.review_listengram.review_resolveengram.set_coding_contextengram.lcm_searchengram.lcm_compaction_flushengram.lcm_compaction_recordengram.extraction_force_flushengram.day_summaryengram.briefingengram.context_checkpointengram.action_confidenceengram.contradiction_scan_runengram.memory_governance_runengram.dreams_runengram.dreams_statusengram.identity_anchor_getengram.identity_anchor_updateengram.continuity_incident_openengram.continuity_incident_closeengram.continuity_incident_listengram.continuity_audit_generateengram.work_taskengram.work_projectengram.work_boardengram.peer_listengram.peer_setengram.peer_deleteengram.shared_context_write_outputengram.graph_snapshotengram.memory_chatengram.profiling_report