First release
Today, we ship the first release of memory engine for AI agents.
Key details:
- Memory write path: save -> semantic dedup funnel (exact/near-duplicate /contradiction via LLM classification) -> human-in-the-loop (HITL) conflicts. Contradictions keep both memories active and queue a conflict; resolutions (keep new/keep existing/keep both/merge) are durable and reversible.
- Node versioning: every belief is a version chain: restating or editing a fact appends a
new version (shared
root_id, prior version staled but kept), and resolving a contradiction is a version step.history()shows how a belief changed; recall returns only the current version.memloom update <id> <text>andmemloom history <id>. - Hybrid retrieval: vector + keyword + entity-graph arms fused with reciprocal-rank fusion
in a single SQL call (
memloom_fuse), over memories and context chunks together. A separate date arm answers "what did I plan on Tuesday": recall scoped to a calendar day, ranked by similarity within it. - Context connector:
memloom context addingests .md/.txt/.pdf into the same recall with section + page citations, from a path, a browser upload, or a chat attachment. Markdown chunks at headings; plain text and PDFs chunk along their outline (ALL-CAPS titles, numbered points; one point per chunk). PDF text is rebuilt from glyph geometry (reading order for equation-heavy documents, 2-up duplicate-column collapse). Documents are mirrors: unchanged files no-op by content hash, changed files replace their chunks transactionally; extractor pipeline versions are salted into the hash so improvements re-ingest automatically. - Pluggable extractor registry: a file format is one registered object (
kind,extensions,version,chunker,extract()); see CONTRIBUTING.md. - Entity graph with a reviewed vocabulary: schema-constrained LLM extraction over memories and chunks. The vocabulary is data (system seeds, your entries, LLM proposals): unknown types and predicates are held out as proposals with their evidence, and approving one links the held-out finds into the graph immediately, no re-index. Typed relationships carry confidence and provenance (a removed document takes its claims with it). Entity corrections built in: rename, retype, merge, delete. Documents roll up chunk mentions into weighted document→entity edges.
- Indexing you can watch:
memloom indexstreams per-item progress, every run is logged to the store (session-grouped, survives restarts, CLI runs show in the viewer Console), and auto-index quietly indexes new memories and files in the background (opt out withMEMLOOM_AUTO_INDEX=off). - Assistant: chat grounded in your store (
memloom ui→ assistant tab). Two-stage turn: tool rounds gather memories and passages, then one streaming answer with numbered source citations. Sessions persist and are searchable; files attached to a chat are scoped to that chat and die with it. - Single-owner daemon:
memloom serveowns the store: HTTP API on 4319 (zod-validated, fast 503 when a Postgres wire client holds the lock), Postgres wire on 54329 (pglite-socket, for psql/Drizzle Studio), embedded viewer. CLI/MCP/viewer are all HTTP clients; any command auto-starts the daemon. - Viewer:
memloom ui: the living memory graph (deterministic layout, document chunk blooms), assistant, memories and documents with edit/history/delete, schema review queue, conflict review with undo, indexing console. - MCP server:
@memloom/mcp(stdio):save_memory,recall_memory(memories + files, with sources),read_passage,memory_history, conflict list/resolve, and schema enable/disable/delete, so an agent can use the memory and you stay in control of the vocabulary. - Storage tiers: embedded PGLite by default (a folder on disk, no Docker); set
MEMLOOM_PG_URLand the same daemon runs on any Postgres with pgvector (Docker, Supabase, managed) over a pooled connection. Same schema, same SQL, both tiers. The embedding-fingerprint guard refuses reopening a store with a mismatched embedding configuration, andmemloom reembedmigrates a store to a new embedding config in place, resumable if interrupted. - Providers: offline hashing mode (no key needed) or OpenRouter cloud mode (qwen3-embedding-8b @ 1024 dims pinned to Nebius, gemini-2.5-flash for classification and chat).