The headline. The thing the rest of the library compounds back into.
Save once. Recall stays sub-620 ms p95 at 50,000 notes. Zero standing tool-schema tax. Your notes stay plain markdown in your own folder (Obsidian-compatible - open them in any editor, in any tool, on any device) - Claude reads them verbatim, not as LLM-extracted summaries.
Save once
savestore copper deposits a decision into your local markdown vault (Obsidian-compatible). metalmind proposes the path, wikilinks, and frontmatter; you approve; it writes.
Recall, no MCP tax
recalltap copper is a Bash call, not an MCP tool. Zero schema bloat per session. A loopback HTTP server inside the watcher handles calls in sub-100 ms; stdio MCP is the always-on fallback.
Session-start awareness
A SessionStart hook plus a stamped block in ~/.claude/CLAUDE.md teach Claude when to recall - no "did you check memory?" prompting, ever.
Vault writes without drift
notescribe is the CRUD interface agents use instead of raw Write. Nine verbs - create, update, patch, supersede, delete, archive, rename, list, show. It stamps frontmatter, picks the right folder, auto-links the project MOC, and rewrites [[wikilinks]] across the vault on rename.
Decisions that supersede, not vanish
note supersedescribe supersede <old> <new> marks a decision replaced by its successor. Recall drops the old note to 0.4x and every hit from it carries superseded_by, so an agent lands on current truth without the history being deleted.
Claims checked against the code
A note can carry code: ["repo#symbol"] refs. --verify-code and doctor flag refs whose symbol no longer exists in your forge-registered repos - the decision outlives the code, but you find out when it does.
Native memory as a feeder
metalmind ingest auto-memory imports Claude Code's own auto-memory topic files into the vault as Memory/ notes - hash-guarded and idempotent, and it reports a conflict rather than clobbering a note you edited.
Fusion that reads the query
Exact-match tokens (UUIDs, ticket IDs, hostnames) raise the keyword leg automatically. Fused scores are folder-weighted - Archive/ 0.4x, Inbox/ 0.7x - so stale notes re-rank below in-flight work instead of being excluded.
Quality holds at scale.
Hybrid retrieval (semantic + BM25 fused via RRF, with optional cross-encoder rerank). Two benches: a hand-authored fixture for precision, and a 50,000-note corpus for scale.
| vault size | hybrid hit@1 | hybrid hit@5 | +rerank hit@1 | +rerank hit@5 |
|---|---|---|---|---|
| 12 notes | 90% | 95% | 90% | 95% |
| 100 notes | 85% | 95% | 90% | 95% |
| 500 notes | 85% | 90% | 90% | 95% |
| 1,000 notes | 85% | 85% | 90% | 95% |
And on a corpus of 50,000 Hacker News comments, hybrid, no rerank - the run that decided whether the in-process backend could stand alone:
| vault size | hit@1 | hit@3 | hit@5 | index | p95 |
|---|---|---|---|---|---|
| 1,000 notes | 100% | 100% | 100% | 35 s | 37 ms |
| 10,000 notes | 100% | 100% | 100% | 7.5 min | 160 ms |
| 50,000 notes | 95% | 100% | 100% | 68 min | 617 ms |
Zero misses at k=5 at every scale. 50× the corpus costs ~15× the query latency, with no server and no daemon. Reproduce with node bench/recall-at-scale/run.mjs.