Skip to content

Release history

MemPalace releases

The highest-scoring AI memory system ever benchmarked. And it's free.

All releases

9 shown

v3.3.5 Bug fix
Notable features
  • feat(searcher): candidate_strategy="union" — BM25 candidates joined with vector pool before hybrid rerank
  • feat(sync): add gitignore‑aware drawer prune
Full changelog

3.3.5 is a fixes release. No new user-facing features — the cycle's energy went into data integrity, recovery, and cross-process correctness. If your palace ever hit Internal error: Error finding id after a big mine, or you had a knowledge-graph triple silently disappear into the void, or you're running on Windows / a multi-tenant host — this release is for you.

The headline fixes:

  • mempalace repair --mode from-sqlite recovers palaces stuck on apply_logs. When ChromaDB's HNSW segment writer wedges (the corruption class reported upstream and in #1308), --mode legacy and the inline repair both call Collection.count() as their first read — which is exactly the call that raises. The old failure mode was a repair printing Cannot recover — palace may need to be re-mined from source files even though the SQLite tables were fully intact. The new mode reads (id, document, metadata) directly from chroma.sqlite3 via the metadata segment join, never opens a chromadb client against the corrupt palace, and re-upserts everything into a fresh palace under your configured embedding function. Verified end-to-end on a 52,300-row real-world corrupt palace. (#1308)

  • Two silent-loss classes in the knowledge graph are now write-time errors. Triples with valid_to < valid_from used to be durably stored but unreachable (the temporal filter matched no as_of); add_triple() now rejects inverted intervals at write time. And date strings forwarded to SQLite are validated up front via sanitize_iso_temporal() (alias sanitize_iso_date()), which accepts YYYY-MM-DD and canonical UTC datetimes (YYYY-MM-DDTHH:MM:SSZ / +00:00) and rejects everything else — natural-language inputs like "yesterday" no longer silently produce empty result sets. Behavior change: partial-date inputs that worked in 3.3.4 ("2026", "2026-05") now error; pass a full date or canonical UTC datetime instead. (#1214, #1164, #1167, #1374, #1417)

  • EntityRegistry.save() is now crash-safe. The people/projects map is months of mining data, and the old code did a non-atomic Path.write_text() — a power loss, OOM, or kill -9 between truncate and full-flush would silently wipe it (the registry's load() swallows JSONDecodeError). Save now writes to a sibling temp file, fsyncs, and os.replace()s into place. The previous registry stays intact on any crash before the rename returns. (#1215)

  • MCP tool_search rides through the post-bulk-mine HNSW flush window. After a CLI mine, ChromaDB's HNSW segment metadata can be unflushed for ~30-60s; wing-scoped MCP search was hitting Internal error: Error finding id for that entire window. tool_search now detects this specific transient, drops both the MCP-local and shared-backend caches for the palace, sleeps 2s, and retries once. Successful retries are tagged with index_recovered: true so callers can observe when it fired. Partial fix for the broader #1315 cluster — tool_check_duplicate and other index-touching tools still need the same wrapper. (#1396)

  • Cross-process correctness on Windows and multi-tenant hosts. ChromaBackend.close_palace() now properly releases ChromaDB's rust-side SQLite file lock — reopening the same palace path after shutil.rmtree no longer fails with SQLITE_READONLY_DBMOVED. And the MCP server's _kg is no longer a module-level singleton: multi-tenant hosts rotating MEMPALACE_PALACE_PATH between tool calls now hit the right SQLite file via a lazy per-path cache. (#1067, #1105, #1136, #1160)

  • Windows stdio is UTF-8 across the board. mempalace search > out.txt and piped fact_checker invocations no longer mojibake Cyrillic / CJK drawer text at the process boundary. mcp_server, hooks_cli, and cli/fact_checker all reconfigure identically. (#1282)

  • miner.detect_room routing fix for monorepos. The substring check was bidirectional, so any token that was a substring of a room name or vice versa matched — views/billing-page/src/Foo.test.tsx routed to an interviews room because "views" in "interviews" matched first. Now uses separator-bounded token matching (-, _, ., /). (#1004, closes #1002)

  • mempalace compress no longer crashes on palaces above ~32k drawers. Drawer fetch is now paginated, mirroring the #851 fix in miner.py. (#1073, #1107)

Internal: test reliability got a pass too — tests/test_palace_locks.py and tests/test_chroma_collection_lock.py switched from fork to spawn for subprocess spawning (Python 3.13 + multi-threaded parent = deadlock under fork, and macOS forbids fork-without-exec via CoreFoundation), and several test files now wrap sqlite3.connect(...) in contextlib.closing() so connections release on the failure path too. (#1430, #1431)

The promises haven't moved. Every word stored exactly. Everything stays on your machine. No telemetry. No fallbacks to cloud APIs we didn't tell you about. Each release sharpens what's already there.

What's Changed

  • fix(mcp_server): pass embedding_function= on collection reopen (#1299) by @igorls in https://github.com/MemPalace/mempalace/pull/1303
  • fix(hooks): quote plugin-root paths with spaces (#1076) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/1077
  • fix(cli): cmd_compress writes to mempalace_closets (#1244) by @igorls in https://github.com/MemPalace/mempalace/pull/1319
  • fix(mcp): case-insensitive agent name in diary read/write (#1243) by @igorls in https://github.com/MemPalace/mempalace/pull/1323
  • fix(backends/chroma): wire quarantine_stale_hnsw into _client() (#1121 #1132 #1263) by @igorls in https://github.com/MemPalace/mempalace/pull/1322
  • fix(mcp): omit absolute filesystem paths from MCP tool responses by @igorls in https://github.com/MemPalace/mempalace/pull/1325
  • feat(searcher): candidate_strategy="union" — BM25 candidates joined with vector pool before hybrid rerank by @igorls in https://github.com/MemPalace/mempalace/pull/1306
  • fix(mcp): forward valid_to and source params in kg_add/kg_invalidate (#1314) by @igorls in https://github.com/MemPalace/mempalace/pull/1320
  • fix(cli): honor --palace flag in cmd_init (#1313) by @igorls in https://github.com/MemPalace/mempalace/pull/1321
  • fix(kg): reject inverted intervals in add_triple (valid_to < valid_from) by @arnoldwender in https://github.com/MemPalace/mempalace/pull/1214
  • fix(backends/chroma): release SQLite file lock on close_palace/close (#1067) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/1105
  • fix(entity_registry): atomic write to prevent partial corruption on crash by @arnoldwender in https://github.com/MemPalace/mempalace/pull/1215
  • fix: paginate closet_llm col.get (#1073) by @sha2fiddy in https://github.com/MemPalace/mempalace/pull/1107
  • fix(cli, fact-checker): reconfigure stdio to UTF-8 on Windows by @mvalentsev in https://github.com/MemPalace/mempalace/pull/1282
  • fix(kg): validate ISO-8601 date formats at MCP boundary by @arnoldwender in https://github.com/MemPalace/mempalace/pull/1167
  • fix(mcp): lazy per-path KnowledgeGraph cache (#1136) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/1160
  • docs(changelog): batch entries for 7 v3.3.5 fixes by @igorls in https://github.com/MemPalace/mempalace/pull/1370
  • fix: serialize ChromaCollection writes through palace lock by @imtylervo in https://github.com/MemPalace/mempalace/pull/1162
  • fix(hooks): treat absent ~/.mempalace as auto-save off by @lcatlett in https://github.com/MemPalace/mempalace/pull/1305
  • fix: add total count to tool_list_drawers pagination response by @Sathvik-1007 in https://github.com/MemPalace/mempalace/pull/1114
  • fix(mcp): force UTF-8 on stdio to fix -32000 on non-ASCII payloads (Windows) by @alonehobo in https://github.com/MemPalace/mempalace/pull/1060
  • fix: guard None metadata/doc in tool_check_duplicate and Layer1/Layer2 by @eldar702 in https://github.com/MemPalace/mempalace/pull/1030
  • fix(lint): hoist hooks_cli_mod import to top of test_hooks_cli (E402) by @igorls in https://github.com/MemPalace/mempalace/pull/1375
  • fix(searcher): clamp effective_distance to valid cosine range [0, 2] by @eldar702 in https://github.com/MemPalace/mempalace/pull/1029
  • fix(mcp): handle null JSON-RPC request payloads safely by @alpiua in https://github.com/MemPalace/mempalace/pull/987
  • fix: MCP server JSON output ensure_ascii=False for non-ASCII support by @hzx945627450-eng in https://github.com/MemPalace/mempalace/pull/1293
  • fix: clamp similarity scores to [0,1] to prevent negative values by @bobo-xxx in https://github.com/MemPalace/mempalace/pull/988
  • fix(searcher): guard against None metadata/doc in search result loops by @cantenesse in https://github.com/MemPalace/mempalace/pull/1019
  • fix: reject non-http(s) LLM endpoints + clear ruff bugbear/silent-except findings by @anthonyonazure in https://github.com/MemPalace/mempalace/pull/1138
  • fix(mcp): retry _get_collection once on transient failure (#1286) by @igorls in https://github.com/MemPalace/mempalace/pull/1377
  • docs: add 30-day expiry callout + ship 4 auto-save tools by @milla-jovovich in https://github.com/MemPalace/mempalace/pull/1391
  • fix(repair): add --mode from-sqlite to recover palaces with corrupt HNSW (#1308) by @potterdigital in https://github.com/MemPalace/mempalace/pull/1310
  • fix: harden Chroma repair preflight and rollback recovery by @mjc in https://github.com/MemPalace/mempalace/pull/1285
  • fix(miner): harden Windows mine against ONNX bad_alloc + silent partial exits (#1296) by @igorls in https://github.com/MemPalace/mempalace/pull/1402
  • fix: use configured collection in repair recovery paths by @mjc in https://github.com/MemPalace/mempalace/pull/1312
  • fix(migrate): verify write roundtrip before bailout by @fatkobra in https://github.com/MemPalace/mempalace/pull/1359
  • fix(storage): quarantine bloated HNSW link payloads by @fatkobra in https://github.com/MemPalace/mempalace/pull/1339
  • fix(repair): preflight poisoned max_seq_id before rebuild by @fatkobra in https://github.com/MemPalace/mempalace/pull/1357
  • fix(storage): quarantine partial HNSW flush without metadata by @fatkobra in https://github.com/MemPalace/mempalace/pull/1342
  • fix(repair): preflight SQLite integrity before rebuild by @fatkobra in https://github.com/MemPalace/mempalace/pull/1364
  • fix(repair): run SQLite integrity preflight before chromadb open (follow-up to #1364) by @igorls in https://github.com/MemPalace/mempalace/pull/1403
  • fix(closet_llm): retry _call_llm on JSONDecodeError (#1155) by @igorls in https://github.com/MemPalace/mempalace/pull/1404
  • fix(exporter): refuse symlinks at export targets (#1156) by @igorls in https://github.com/MemPalace/mempalace/pull/1405
  • fix(diary): detect same-size edits via content hash (#925) by @igorls in https://github.com/MemPalace/mempalace/pull/1406
  • fix(hooks): detach Popen children so hook exits cleanly on Windows (#1268) by @igorls in https://github.com/MemPalace/mempalace/pull/1412
  • fix(mine): identify lock holder + exit non-zero on contention (#1264) by @igorls in https://github.com/MemPalace/mempalace/pull/1413
  • fix(hooks): per-target PID guard with atomic claim (#1212, #1206) by @igorls in https://github.com/MemPalace/mempalace/pull/1415
  • chore: housekeeping — sync 3.3.4 version + recommend uv for installs by @igorls in https://github.com/MemPalace/mempalace/pull/1414
  • chore(deps): bump actions/configure-pages from 5 to 6 by @dependabot[bot] in https://github.com/MemPalace/mempalace/pull/1292
  • feat(sync): add gitignore-aware drawer prune (#1252) by @mvalentsev in https://github.com/MemPalace/mempalace/pull/1421
  • docs: clarify contributor git identity setup by @sjhddh in https://github.com/MemPalace/mempalace/pull/1385
  • fix(miner): use token-boundary matching in detect_room by @coogie in https://github.com/MemPalace/mempalace/pull/1004
  • fix(mcp): retry tool_search once on Chroma "Error finding id" transient (#1315) by @JPdeB61 in https://github.com/MemPalace/mempalace/pull/1396
  • fix(tests): use spawn instead of fork for lock-test subprocesses by @igorls in https://github.com/MemPalace/mempalace/pull/1431
  • chore(tests): wrap sqlite3 connections in contextlib.closing by @igorls in https://github.com/MemPalace/mempalace/pull/1430
  • fix(kg): accept ISO datetimes for temporal inputs by @fatkobra in https://github.com/MemPalace/mempalace/pull/1417
  • chore(release): 3.3.5 by @igorls in https://github.com/MemPalace/mempalace/pull/1432
  • chore(release): 3.3.5 by @igorls in https://github.com/MemPalace/mempalace/pull/1434

New Contributors

  • @imtylervo made their first contribution in https://github.com/MemPalace/mempalace/pull/1162
  • @lcatlett made their first contribution in https://github.com/MemPalace/mempalace/pull/1305
  • @Sathvik-1007 made their first contribution in https://github.com/MemPalace/mempalace/pull/1114
  • @alonehobo made their first contribution in https://github.com/MemPalace/mempalace/pull/1060
  • @eldar702 made their first contribution in https://github.com/MemPalace/mempalace/pull/1030
  • @alpiua made their first contribution in https://github.com/MemPalace/mempalace/pull/987
  • @hzx945627450-eng made their first contribution in https://github.com/MemPalace/mempalace/pull/1293
  • @bobo-xxx made their first contribution in https://github.com/MemPalace/mempalace/pull/988
  • @cantenesse made their first contribution in https://github.com/MemPalace/mempalace/pull/1019
  • @anthonyonazure made their first contribution in https://github.com/MemPalace/mempalace/pull/1138
  • @potterdigital made their first contribution in https://github.com/MemPalace/mempalace/pull/1310
  • @mjc made their first contribution in https://github.com/MemPalace/mempalace/pull/1285
  • @coogie made their first contribution in https://github.com/MemPalace/mempalace/pull/1004
  • @JPdeB61 made their first contribution in https://github.com/MemPalace/mempalace/pull/1396

Full Changelog: https://github.com/MemPalace/mempalace/compare/v3.3.4...v3.3.5

v3.3.4 Bug fix
Security fixes
  • Restrict permissions on tunnels.json file (fix(security): restrict tunnels.json file permissions)
Notable features
  • Init now uses a local LLM (Ollama, LM Studio, llama.cpp) if available, falling back gracefully
  • Cross-wing topic tunnels automatically link related themes across projects
  • Mempalace init combines onboarding and directory mining into one step with size estimate
Full changelog
  • Setup got smart and a local language model does the work for free. Mempalace init now uses a local LLM if you have one running, Ollama or LM Studio or llama.cpp, whichever you prefer. Zero cloud calls, no API key to set up, nothing costs anything. If you do not have one running, it falls back gracefully and never blocks. You are never stuck waiting on something that is not there.

  • The palace now connects ideas across projects. Cross wing topic tunnels are a new feature where, when two projects talk about the same theme, like a framework you use everywhere or a person who shows up across domains, the palace links them together. So when an LLM scans your memories for one project, it can follow the thread into related projects without you having to set anything up.

  • Setup and first ingest are now one step. When you run mempalace init, it asks if you want to mine the directory right after onboarding, and shows you a size estimate first so you are not surprised by a long ingest. One command, two things done, no manual second pass.

  • A storage fix made big palaces dramatically smaller. There was a bug where active palaces could bloat into many gigabytes on disk over time. One contributor reported their palace dropped from about thirty gigabytes down to under four hundred megabytes after the fix landed, and operations that were timing out before now respond instantly. The number is one person's field report, but the underlying fix is in place for everyone.

  • Background hooks now correctly recognize Claude Code conversations. The hooks that auto save your sessions used to treat conversation transcripts as if they were source code, which caused indexing confusion. Now they are tagged correctly as conversations, which means cleaner storage and better recall when you go looking for what you said.

  • The promises have not moved. Every word stored exactly. Everything stays on your machine. Nothing goes anywhere we have not explicitly told it to go. No telemetry. Zero. Each release sharpens what is already there instead of asking you to give up something you care about.

What's Changed

  • perf(mining): batch per-chunk upserts + optional GPU acceleration by @igorls in https://github.com/MemPalace/mempalace/pull/1185
  • feat(graph): cross-wing tunnels by shared topics (#1180) by @igorls in https://github.com/MemPalace/mempalace/pull/1184
  • chore: add OpenArena owner claim verification file by @igorls in https://github.com/MemPalace/mempalace/pull/1189
  • fix(search): CLI hybrid rerank, legacy-metric warning, invariant tests (3.3.4) by @igorls in https://github.com/MemPalace/mempalace/pull/1179
  • feat(cli): init prompts to mine, mine handles Ctrl-C gracefully (#1181, #1182) by @igorls in https://github.com/MemPalace/mempalace/pull/1183
  • docs: fix HOOKS_TUTORIAL.md paths, matcher, and missing timeout (#1037) by @wahajahmed010 in https://github.com/MemPalace/mempalace/pull/1101
  • chore(deps): bump actions/deploy-pages from 4 to 5 by @dependabot[bot] in https://github.com/MemPalace/mempalace/pull/967
  • chore(deps): bump actions/upload-pages-artifact from 3 to 5 by @dependabot[bot] in https://github.com/MemPalace/mempalace/pull/968
  • chore(deps): bump actions/checkout from 4 to 6 by @dependabot[bot] in https://github.com/MemPalace/mempalace/pull/969
  • ci: add pip caching and bump Python on macOS/Windows by @mvalentsev in https://github.com/MemPalace/mempalace/pull/939
  • fix(security): restrict tunnels.json file permissions by @arnoldwender in https://github.com/MemPalace/mempalace/pull/1168
  • fix: HNSW graph corruption, PreCompact deadlock, mine fan-out (closes #974, #965, #955) by @felipetruman in https://github.com/MemPalace/mempalace/pull/976
  • ci: bump Windows and macOS jobs to Python 3.13 by @igorls in https://github.com/MemPalace/mempalace/pull/1205
  • fix: guard against data loss in repair, migrate, and CLI rebuild by @shaun0927 in https://github.com/MemPalace/mempalace/pull/935
  • fix(repair): refuse to overwrite when extraction looks truncated (#1208) by @bensig in https://github.com/MemPalace/mempalace/pull/1210
  • fix: sanitize topic parameter in tool_diary_write by @shaun0927 in https://github.com/MemPalace/mempalace/pull/936
  • feat(init): context-aware corpus detection by @milla-jovovich in https://github.com/MemPalace/mempalace/pull/1211
  • fix: call quarantine_stale_hnsw() in make_client(); lower threshold to 5min by @jphein in https://github.com/MemPalace/mempalace/pull/1173
  • feat(corpus-origin): merge LLM fields into heuristic result instead of replacing by @milla-jovovich in https://github.com/MemPalace/mempalace/pull/1221
  • fix: skip _fix_blob_seq_ids sqlite open on already-migrated palaces (#1090) by @jphein in https://github.com/MemPalace/mempalace/pull/1177
  • fix(palace_graph): skip None metadata in build_graph by @jphein in https://github.com/MemPalace/mempalace/pull/1201
  • fix(searcher): tolerate None documents in BM25 reranker by @jphein in https://github.com/MemPalace/mempalace/pull/1198
  • feat(privacy): warn when LLM tier sends content to external API by @milla-jovovich in https://github.com/MemPalace/mempalace/pull/1224
  • chore(corpus-origin): tag merged evidence by tier + pin confidence-source contract by @igorls in https://github.com/MemPalace/mempalace/pull/1223
  • feat(privacy): treat Tailscale CGNAT range (100.64.0.0/10) as local by @milla-jovovich in https://github.com/MemPalace/mempalace/pull/1225
  • fix(repair): detect HNSW capacity divergence and fall back to BM25 (#1222) by @igorls in https://github.com/MemPalace/mempalace/pull/1227
  • fix(hooks): pass --mode convos when mining Claude Code transcript dirs by @igorls in https://github.com/MemPalace/mempalace/pull/1230
  • fix(hooks): always mine the active transcript as convos, additive to MEMPAL_DIR by @igorls in https://github.com/MemPalace/mempalace/pull/1231
  • fix(graph): normalize wing slug at init so topic tunnels fire for hyphenated dirs (#1194) by @bensig in https://github.com/MemPalace/mempalace/pull/1195
  • fix(tunnels): normalize wing names in topic tunnel lookup for hyphenated dirs by @wahajahmed010 in https://github.com/MemPalace/mempalace/pull/1197
  • fix: narrow _fix_blob_seq_ids + add repair --mode max-seq-id by @sha2fiddy in https://github.com/MemPalace/mempalace/pull/1135
  • fix: prevent HNSW index bloat from resize+persist cycles by @funguf in https://github.com/MemPalace/mempalace/pull/1191
  • feat(privacy): blocking consent gate for env-fallback LLM API keys by @milla-jovovich in https://github.com/MemPalace/mempalace/pull/1233
  • feat(normalize): Gemini CLI session JSONL adapter by @milla-jovovich in https://github.com/MemPalace/mempalace/pull/1234
  • fix(repair): decode BLOB embeddings.seq_id in max-seq-id heuristic (#1254) by @igorls in https://github.com/MemPalace/mempalace/pull/1288
  • fix(repair): scale HNSW divergence floor with hnsw:sync_threshold by @messelink in https://github.com/MemPalace/mempalace/pull/1287
  • fix(storage): stop ChromaDB from crashing when reopening an existing … by @Legion345 in https://github.com/MemPalace/mempalace/pull/1262
  • fix(mcp_server): split get_or_create_collection on reopen (follow-up to #1262) by @igorls in https://github.com/MemPalace/mempalace/pull/1289
  • chore(release): v3.3.4 by @igorls in https://github.com/MemPalace/mempalace/pull/1232

New Contributors

  • @wahajahmed010 made their first contribution in https://github.com/MemPalace/mempalace/pull/1101
  • @dependabot[bot] made their first contribution in https://github.com/MemPalace/mempalace/pull/967
  • @felipetruman made their first contribution in https://github.com/MemPalace/mempalace/pull/976
  • @shaun0927 made their first contribution in https://github.com/MemPalace/mempalace/pull/935
  • @funguf made their first contribution in https://github.com/MemPalace/mempalace/pull/1191
  • @Legion345 made their first contribution in https://github.com/MemPalace/mempalace/pull/1262

Full Changelog: https://github.com/MemPalace/mempalace/compare/v3.3.3...v3.3.4

v3.3.3 Mixed
Notable features
  • LLM-assisted entity classification with Ollama/OpenAI/Anthropic support
  • Improved entity detection with CamelCase extraction and stopword filtering
  • Claude Code conversation scanner for project entities
Full changelog

Bug Fixes

  • Install regressionmempalace-mcp console script is now declared in pyproject.toml alongside .claude-plugin/plugin.json's reference to it. In v3.3.2 the two drifted apart (plugin.json shipped the new "command": "mempalace-mcp" form before the matching entry point landed), so every fresh pip install mempalace==3.3.2 produced a Claude Code plugin config pointing at a binary that wasn't installed. (#1093, #340)
  • Restore silent-save visibility after the Claude Code 2.1.114 client regression — production transcript saves were failing silently until this PR. (#1021)
  • Paginate status-path metadata fetches so large palaces don't trip SQLite variable limits. (#851)
  • Resolve the Claude plugin hook runner across platform / plugin-dir variations; previously broke on Windows and some macOS layouts. (#942)
  • Real python3 resolution for .sh hooks with a MEMPAL_PYTHON override path. (#833)
  • Add optional wing parameter to tool_diary_write / tool_diary_read and derive per-project wing from the Claude Code transcript path when writing from the stop hook — diary entries from different projects no longer collapse into a shared default wing. (#659)
  • Treat empty string as "no filter" in mempalace_search wing/room; LLM agents that default to filling every optional parameter with "" no longer get bounced with must be a non-empty string. (#1097, #1084)
  • Broaden _wing_from_transcript_path to handle Claude Code project folders without a -Projects- segment (e.g. ~/dev/<parent>/<project>, ~/code/<project>). The project name is now derived from the final dash-separated token of the encoded folder, so Linux users with code outside ~/Projects/ get per-project diary scoping instead of falling through to wing_sessions. (#1145, follow-up to #659)
  • mempalace_diary_read(wing="") now returns diary entries from every wing this agent has written to, matching the #1097 "empty-string as no filter" pattern. Previously defaulted to wing_<agent>, siloing entries that hooks wrote to project-derived wings. (#1145)
  • mempalace mine now skips the generated entities.json file so its contents aren't re-ingested as project content. (#1175)

Improvements

  • Deterministic hook saves. Save hook now uses a silent Python API path, so successive hook invocations produce reproducible results and zero data loss on the hot path. (#673)
  • Graph cache with write-invalidation inside build_graph() — warm-path calls no longer rebuild the palace-graph per request. (#661)
  • mempalace init entity detection overhaul. Canonical project names now come from package manifests (package.json, pyproject.toml, Cargo.toml, go.mod) and real people come from git commit authors, rather than being inferred from prose. Includes union-find dedup across name/email aliases, bot filtering that keeps @users.noreply.github.com humans, and automatic "mine" flagging by contribution share. (#1148)
  • Regex detector accuracy. CamelCase extraction so MemPalace, ChromaDB, OpenAI aren't fragmented; tighter versioned/hyphenated pattern kills context-manager / multi-word false positives; dialogue ^NAME:\s requires ≥2 hits so Created: <date> metadata stops classifying field names as people; expanded stopwords for common English participles and descriptors; high-pronoun signal classifies as person rather than dumping to uncertain. (#1148)
  • Init → miner wire-up. Confirmed entities merge into ~/.mempalace/known_entities.json on init, which the miner reads to tag drawer metadata for entity-filtered search. Previously init's output was not consumed by the miner; the per-project entities.json is kept as an audit trail. (#1157)
  • Case-insensitive project dedup across manifest, git, and convo sources so casing variants of the same project name collapse into one review entry. (#1175)

Added

  • i18n: Belarusian translation. (#1051)
  • i18n: entity detection for German, Spanish, and French locales. (#1001)
  • i18n: Traditional + Simplified Chinese entity detection. (#945)
  • mempalace init --llm: optional LLM-assisted entity classification. Defaults to local Ollama (zero-API); also supports any OpenAI-compatible endpoint (LM Studio, llama.cpp server, vLLM, OpenRouter, etc.) and the Anthropic Messages API. Runs interactively with a progress indicator; Ctrl-C cancels cleanly and returns partial results. Useful for prose-heavy folders where the regex detector struggles (diaries, transcripts, research notes). Opt-in only — default init path remains zero-API. (#1150)
  • Claude Code conversation scanner. ~/.claude/projects/<slug>/ directories now contribute project entities using each session's authoritative cwd metadata, avoiding slug-decoding ambiguity. (#1150)

Known — deferred to v3.3.4

  • HNSW parallel-insert SIGSEGV when hnsw:num_threads is unset on collection creation (#974) — fix in-flight as #976, awaiting rebase against develop.

Install

pip install --upgrade mempalace==3.3.3

See the full changelog for historical releases.

v3.3.2 Bug fix

Fixes SIGSEGV crash from HNSW/sqlite drift and related stability issues.

Full changelog

What's Changed

Bug fixes

  • PID file guard — prevents stacking mine processes (#1023)
  • Quarantine stale HNSW — recover from HNSW/sqlite drift, fixes SIGSEGV crash (#1000)
  • Windows Unicode — replace Unicode checkmark with ASCII for Windows encoding (#681)

Copilot review fixes

  • Address Copilot review on release/3.3.2 (#1045)

Full Changelog: https://github.com/MemPalace/mempalace/compare/v3.3.1...v3.3.2

v3.3.1 Breaking risk
⚠ Upgrade required
  • entity_registry.research() retains outbound Wikipedia capability via opt-in parameter
  • KG methods (close(), query_relationship(), timeline(), stats()) now thread-safe with lock-based synchronization
  • MCP stdout redirection prevents library logging from corrupting JSON-RPC channel
Breaking changes
  • entity_registry.research() defaults to local-only — outbound Wikipedia calls require explicit opt-in
Security fixes
  • File permission hardening on sensitive palace data
Notable features
  • Entity detection for 5 new locales: Portuguese, Russian, Italian, Hindi, Indonesian
  • Script-aware word boundaries for Devanagari, Arabic, Hebrew, Thai, Tamil, Khmer scripts
  • Case-insensitive BCP 47 language code handling (PT-BR, zh-cn, Pt-Br all resolve correctly)
Full changelog

MemPalace v3.3.1

Highlights

  • Multi-language entity detection — 5 new locales (Portuguese, Russian, Italian, Hindi, Indonesian) with full entity-detection patterns
  • Script-aware word boundaries — fixes name truncation for Devanagari, Arabic, Hebrew, Thai, Tamil, Khmer scripts
  • Case-insensitive BCP 47 language codes--lang PT-BR, zh-cn, Pt-Br all resolve correctly
  • KG thread safety — lock on close(), query_relationship, timeline, stats
  • entity_registry.research() defaults to local-only (no outbound Wikipedia calls without opt-in)
  • Precompact hook no longer blocks compaction on failure/timeout
  • MCP stdout redirect — library logging can't corrupt JSON-RPC channel
  • File permission hardening on sensitive palace data

See CHANGELOG.md for full details.

Install / Upgrade

pip install --upgrade mempalace
v3.3.0 Breaking risk
Security fixes
  • Shell injection fixes in hooks
  • MCP input validation and argument whitelisting
  • Palace deletion guardrails and WAL redaction
Notable features
  • Closets searchable index layer improving search relevance by 38% (R@1)
  • BM25 hybrid search combining vector similarity and keyword matching
  • Support for 8 languages with localized compression and regex patterns
v3.2.0 Breaking risk
Security fixes
  • Palace deletion guardrails
  • WAL redaction
  • MCP input validation
Notable features
  • i18n support for 8 languages (English, French, Korean, Japanese, Spanish, German, Simplified Chinese, Traditional Chinese)
  • Pluggable storage backends enabling community contributions (PostgreSQL, Qdrant, LanceDB already in development)
  • mempalace migrate command for managing ChromaDB version compatibility
v3.1.0 Security relevant
Security fixes
  • Input validation at MCP entry points
  • Shell-injection fix in save hook
  • File size guard and symlink skip
Notable features
  • OpenAI Codex CLI JSONL normalizer
  • Scale benchmark suite with 106 tests
  • ChromaDB PersistentClient caching for performance
v3.0.0 New feature
Notable features
  • 96.6% LongMemEval R@5 score (100% with Haiku rerank)
  • Palace architecture with wings, rooms, halls, tunnels
  • Specialist agents with per-agent diaries
Full changelog

MemPalace v3.0.0

The highest-scoring AI memory system ever benchmarked. And it's free.

Install

pip install mempalace

PyPI: https://pypi.org/project/mempalace/

Highlights

  • 96.6% LongMemEval R@5 — highest published score with zero API calls
  • 100% LongMemEval R@5 — with optional Haiku rerank
  • Palace architecture — wings, rooms, halls, tunnels, closets, drawers — +34% retrieval from structure alone
  • AAAK compression — 30x lossless shorthand dialect, works with any LLM (Claude, GPT, Gemini, Llama, Mistral)
  • Knowledge graph — temporal entity-relationship triples in SQLite (local, free)
  • Specialist agents — each agent gets its own wing and diary in the palace
  • MCP server — 19 tools, auto-teaches AAAK to your AI
  • Auto-save hooks — for Claude Code (save every N messages + pre-compaction emergency save)
  • Split command — break concatenated mega-transcripts into per-session files before mining
  • Fully local — no API key, no cloud, no subscription. Everything on your machine.

What's New in v3

  • mempalace split command for splitting concatenated transcript files
  • Specialist agent system with per-agent diaries
  • Improved entity detection during init
  • Room detection from folder structure
  • Ruff-clean codebase

Requirements

  • Python 3.9+
  • No API key required

Beta — feedback welcome: [email protected]