You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Concrete evidence:
- New "What this looks like in practice" section right after the
status line, showing a real stop-hook systemMessage output and a
real mempalace_search response shape (warnings, available_in_scope,
matched_via tags, similarity scores). Someone evaluating the fork
can see what "running in production" actually looks like.
Headlines box:
- New "Headlines" subsection at the top of Fork Changes with the
three differentiators someone should know if they only read one
section — silent-save hook, ChromaDB 1.5.x hardening (quarantine +
None guards), search-never-misses contract. Links to MemPalace#673/MemPalace#999/
MemPalace#1000/MemPalace#1005 so readers can jump to the work itself.
Citations for comparison table:
- Every row now links to its upstream repo: Hindsight (vectorize-io),
Mem0 + OpenMemory (mem0ai), Cognee (topoteretes), Letta (letta-ai),
engram (NickCirv), CaviraOSS OpenMemory. Cognee row updated since
they've added MCP support since we first wrote the row.
- Replaced the "Systems mentioned without captured primary URLs"
footnote (now stale since we have them) with a "Verification note"
that's honest about the point-in-time nature of these columns and
explains why TagMem is absent.
Structure cleanups:
- Removed the upstream MemPalace logo at the top — it's milla-
jovovich's asset and using it in a fork README is awkward.
- Renamed "Roadmap" → "Planned work" — the section is decisive with
priorities and time estimates, "Roadmap" was underselling it.
No content removed from the document beyond the stale footnote and
the upstream logo. All existing sections intact. 42 README-claim
tests pass.
**JP's production fork of [milla-jovovich/mempalace](https://github.com/milla-jovovich/mempalace)**
@@ -18,19 +14,46 @@ What this fork adds that you won't get from upstream: a **deterministic silent-s
18
14
19
15
**Status at a glance:** active as of 2026-04-18 · [Discussion #1017](https://github.com/MemPalace/mempalace/discussions/1017) introduces the fork upstream · 998 tests pass on `main` · [Open upstream PRs](#open-upstream-prs) (8) are the contribution pipeline · [Issues on this repo](https://github.com/jphein/mempalace/issues) for fork-specific feedback.
20
16
17
+
## What this looks like in practice
18
+
19
+
A stop hook fires every 15 messages in Claude Code, writes directly to the palace via the Python API, and renders a terminal line so the user sees the save land:
20
+
21
+
```json
22
+
{
23
+
"systemMessage": "✦ 13 memories woven into the palace — investigate, description, symlihjnk"
24
+
}
25
+
```
26
+
27
+
`search_memories` (via `mempalace_search` MCP tool) returns results with scope-authoritative context so callers can tell when the vector layer underdelivered:
On a palace where the HNSW index has drifted and vector can't rank everything, the same call would return `warnings: ["vector search returned 0 of 5 requested; filled 5 from sqlite+BM25 keyword match"]` and hits tagged `"matched_via": "sqlite_bm25_fallback"` — the data is never silently hidden.
43
+
21
44
## Why this fork exists
22
45
23
46
We surveyed the memory-system landscape in April 2026 and found no verbatim-first local system with MCP. Every alternative transforms content on write — extracted facts, knowledge graphs, tiered summaries — losing the original text.
24
47
25
48
| System | Verbatim? | Local? | MCP? | Notes |
26
49
|---|---|---|---|---|
27
50
|**MemPalace**| Yes | Yes | Yes | What we have. 137,949 drawers as of 2026-04-18. |
28
-
| Hindsight | No — LLM extracts facts | Yes (Docker) | Yes | Original text is lost. |
|[Hindsight](https://github.com/vectorize-io/hindsight)| No — LLM extracts facts | Yes (Docker) | Yes | Three ops: retain / recall / reflect. Original text is lost. |
52
+
|[Mem0](https://github.com/mem0ai/mem0) / [OpenMemory](https://github.com/mem0ai/mem0/tree/main/openmemory)| No — extracts "memories" | Partial | Yes | Cloud-first; OpenMemory is the local-mode sibling. |
53
+
|[Cognee](https://github.com/topoteretes/cognee)| No — knowledge graph | Yes |Yes (added since we wrote this row) | "Knowledge Engine" via ECL pipeline.|
54
+
|[Letta](https://github.com/letta-ai/letta)| No — tiered summarization | Yes | No | Formerly MemGPT.|
55
+
|[engram](https://github.com/NickCirv/engram)| Structured fields, not raw | Yes | Yes | Go + SQLite FTS5. |
**Verbatim storage is the differentiator.** For recovering exact commands, error messages, code snippets, and what someone actually said, you need the original text. Everything else — hierarchy, tags, knowledge graphs, decay — is enrichment *layered on top of* a faithful archive. If any of those layers fails or needs rebuilding, the underlying truth is still there.
36
59
@@ -83,6 +106,14 @@ Neither has automatic consolidation. Claude Code has unreleased "Auto Dream" con
83
106
84
107
What this fork adds beyond upstream v3.3.1.
85
108
109
+
### Headlines
110
+
111
+
The three that matter most if you only read one section:
112
+
113
+
-**Silent-save hook architecture** — the stop hook writes to the palace directly via the Python API, advances the save marker only after a confirmed write, and surfaces a `systemMessage` line in the terminal. Deterministic, zero data loss, no dependency on the AI acting on a `block` prompt. ([#673](https://github.com/milla-jovovich/mempalace/pull/673), APPROVED externally.)
114
+
-**ChromaDB 1.5.x hardening** — `quarantine_stale_hnsw()` recovers a palace whose HNSW has drifted from sqlite before it segfaults the Rust graph-walk ([#1000](https://github.com/milla-jovovich/mempalace/pull/1000), closes #823). Plus `None`-metadata guards across 8 read-path loops (searcher.py, miner.status, four mcp_server handlers) that upstream's current code still raises `AttributeError` on ([#999](https://github.com/milla-jovovich/mempalace/pull/999)).
115
+
-**Search that never silently misses** — `search_memories` returns `warnings: [...]`, `available_in_scope: N`, and a sqlite+BM25 fallback when vector underdelivers. The palace will tell you *why* it returned fewer results than the scope holds, instead of just returning them ([#1005](https://github.com/milla-jovovich/mempalace/pull/1005)).
116
+
86
117
### Still ahead of upstream
87
118
88
119
| Area | Change | Files |
@@ -125,7 +156,7 @@ What this fork adds beyond upstream v3.3.1.
125
156
- Batch ChromaDB writes — upstream has file-level locking for concurrent agents via [#784](https://github.com/milla-jovovich/mempalace/pull/784)
126
157
- Inline transcript mining in hooks — upstream uses `mempalace mine` in background
127
158
128
-
## Roadmap
159
+
## Planned work
129
160
130
161
Ordered by impact. Informed by competitive research ([Karta](https://github.com/rohithzr/karta), Hindsight, [engram](https://github.com/NickCirv/engram), [context-engine](https://github.com/Emmimal/context-engine), CaviraOSS) and our own usage patterns — see [Sources](#sources) at the bottom for the full reference list. Each item is evaluated against the three principles above.
131
162
@@ -264,11 +295,9 @@ Articles and surveys that shaped the fork's direction, competitive framing, and
264
295
-[**engram**](https://github.com/NickCirv/engram) — Go + SQLite FTS5 parallel index; file-read interception prototype referenced in [discussion #798](https://github.com/MemPalace/mempalace/discussions/798). Cited in deprioritized FTS5 item and the auto-surfacing open problem.
265
296
-[**context-engine**](https://github.com/Emmimal/context-engine) — ~200-line exponential decay implementation that ports directly into P2. Author Emmimal P Alexander's [context-engineering writeup](https://towardsdatascience.com/rag-isnt-enough-i-built-the-missing-context-layer-that-makes-llm-systems-work/) (*Towards Data Science*) frames the five components of the "missing context layer" — hybrid retrieval, re-ranking, memory decay, compression, token-budget enforcement — and informs our framing of the auto-surfacing open problem.
266
297
267
-
### Systems mentioned without captured primary URLs
268
-
269
-
The comparison table names several systems whose primary repos we did not record when writing it. Anyone sourcing from this README should cite their upstream directly:
Columns in the comparison table were filled in on 2026-04-14–18 by reading each project's README and, where unclear, a recent issue or PR on the same repo. Feature status on any of these projects will drift — cite them upstream before treating rows here as current. [TagMem](https://codingwithcody.com/2026/04/13/mempalace-digital-castles-on-sand/) is deliberately omitted; we could not find a public repo for it at the time of writing.
0 commit comments