coldframe
Your agent forgets everything between sessions. coldframe gives it a memory that lives in one
local file (~/.cold-frame/memory.db) — with full-text + vector search, version history, automatic
forgetting, and the ability to rewind what was true when. No server, no account, no key.
Quickstart
In Claude Code — one install, then it remembers automatically:
claude plugin marketplace add coldzero94/cold-frame
claude plugin install coldframeRecall is injected at the start of every session; durable facts you state are captured as you work (using the Claude you already pay for — no extra key or cost). Nothing to configure.
On the command line — offline, instant:
cold-frame add "I prefer dark roast coffee."
cold-frame search "dark roast coffee"
cold-frame list # each memory with its strength band
cold-frame doctor # health: counts, integrity, embedder(Install: brew install coldzero94/coldframe/cold-frame (Apple Silicon macOS + Linux x86_64), or
download the self-contained binary for your platform from the
latest release — CLI + MCP in one file,
no Python needed. The optional [local-llm] (semantic recall) extra isn't in the binary; install
from source for that — see examples/.)
Why coldframe
🗃️ One file you own — everything is
~/.cold-frame/memory.db. Copy it to back up, delete it to forget. No server, no account.🔌 Offline by default —
add→searchworks with zero keys, zero network.🤖 Automatic in Claude Code — recalls what matters, captures durable facts as you work — and the engine keeps it lean instead of hoarding everything.
⏪ Rewindable belief — facts are corrected and superseded, never silently overwritten. Ask "what did I believe back in March?" and get the answer as of that date.
🧭 Conflict resolution — supersession is always deterministic (code decides by
valid_at, never the LLM). Detecting that two facts contradict needs a model: thecold-frame worker(andCOLD_FRAME_LLM=claude, using your Claude session — no API key) turn it on; the zero-key offline default still does exact/near-duplicate merging and honors explicitcorrect/supersede.
How the memory works
Recall — a SessionStart hook injects your strongest durable memories; a UserPromptSubmit hook adds ones relevant to the current prompt (gated so it adds signal, not noise).
Capture — Claude itself extracts durable facts and calls
add_memoryduring your session (a bundled skill), with a keyless deterministic backstop so nothing is missed; dedup merges them.Stays lean — every ~20 facts a consolidation pass decays, rolls up, and archives the weakest (per-scope caps), so the active set never grows without bound. Forgetting archives — nothing is truly deleted, and obvious secrets (API keys, tokens, private keys) are blocked before they ever touch disk. PII redaction (email/phone/card/ssn) is available opt-in (
add --redact-pii, orMemory(pii_redact=…)) — off by default so a personal store keeps your own contact facts. For at-rest protection, the DB is a single local file — put it on an OS-encrypted disk (FileVault / LUKS), which covers the stolen-laptop threat without a second key to manage.Per-project + global — facts are tagged by git project; clear personal facts go to a global tier recalled everywhere.
Semantic recall (opt-in) — the zero-config default recall is lexical (offline
HashEmbedder, no download). For semantic recall, install from source with the[local-llm]extra and setCOLD_FRAME_EMBEDDER=local(a small localbge-smallmodel, downloaded once — nothing leaves the machine). After switching on an existing DB, runcold-frame reembedto re-index.
It's a standard stdio MCP server, so it works with any MCP client — not just Claude Code.
Use it as a library
from datetime import UTC, datetime
from cold_frame import Memory, Scope
mem = Memory() # ~/.cold-frame/memory.db, offline
me = Scope(user_id="coby")
mem.add("I switched jobs to Anthropic in 2026.", scope=me)
print(mem.search("where do I work?", scope=me).hits[0].note.content)
past = mem.search("where do I work?", scope=me, as_of=datetime(2026, 3, 1, tzinfo=UTC)) # rewindSee and edit your memory anytime: cold-frame ui — a local dashboard at 127.0.0.1:27182 where
you can browse facts and pin / correct / forget them (writes are CSRF-guarded and localhost-only).
More
Install & distribution —
packaging/(plugin, Homebrew, standalone binary)Design & spec —
docs/(the spec, decisions, and the analysis of mem0 / Letta / Zep-Graphiti / Cognee / MemOS / A-MEM / LangMem that informed it)Back up / move —
cold-frame export backup.dbthenimportit elsewhere.
Status
The engine, CLI, MCP server, Claude Code plugin, deterministic pre-disk secret-blocking +
grep-verified hard-purge, opt-in PII redaction, an admission confidence-gate + opt-in consent hold,
idempotent event-log replay import, and a local web UI are built and tested end-to-end on a fully
offline gate (ruff + mypy --strict + ~420 deterministic mock-LLM tests green on a 3.12/3.13 CI
matrix). The automatic
recall + capture loop is verified end-to-end against real Claude Code. Distributed as a self-contained
binary via Homebrew + GitHub Releases (not PyPI).
Apache-2.0.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/coldzero94/cold-frame'
If you have feedback or need assistance with the MCP directory API, please join our Discord server