[WARM logo]
WARM
WritersLogic Adaptive Retention & Memory.
Hybrid search, graph indexing, and vector-symbolic memory.
Local memory for agents and apps: full-text and vector search, a memory API and a vector-symbolic fact store in one embeddable Rust engine that makes no network calls.
[CI]
[MSRV 1.89]
[OpenSSF Scorecard]
[OpenSSF Best Practices]
[License: Apache-2.0]
[WARM MCP MCP server – quality and maintenance score on Glama]
[Bemula forgetting score, DeepSeek backbone]
[LongMemEval dev, gpt-4o reader and judge]
[VIBE llama-128-ip max recall@100, one thread]
Website ·
Docs ·
Get started ·
Standards and provenance ·
Results ·
Capabilities ·
Limits ·
Contribute
What it is
WARM is a Rust library that stores text, vectors and facts in a
directory on your machine and finds them again. It ships with Node.js bindings, C, WASM and UniFFI
bindings, an HTTP server with a Python client, and an MCP server. There are no service calls, no
telemetry and no model downloads unless you turn on a feature that asks for one.
Who it's for
Headline results
Every row links to the committed file it comes from. These are single machines and stated
protocols, not a substitute for testing your own data.
Where it's behind
Method, intervals and every loss: docs/benchmarks and the
benchmarks pages.
Generated from benchmarks/results/competitive/ by warm-bench table; method and caveats in docs/benchmarks/COMPARISON.md. W = WARM ahead (95% interval excludes parity), T = tie, L = a comparator is ahead, - = no verdict (unpinned source revision, no interval, or not comparable). Rows are compared only within one machine.
Get started
Clone once: git clone https://github.com/writerslogic/warm && cd warm.
Run the offline agent-memory demo with cargo run --release --example demo-offline-agent.
Rust
From your own Rust project, add the current Apache-2.0 source:
The historical v0.6.1 source
remains AGPL-3.0-or-later; it is available from that Git tag, not as a
warm-rust 0.6.1 release on crates.io.
Unreleased Rust API change: WarmCore::query, query_batch, and
analyze_components return Result. Handle the result with ? or an explicit
error branch; deferred-encoding failures no longer become successful partial
query results. get_document, list_documents, get_document_info, and list_document_info
also return Result; retained-text and checkpoint decoding failures propagate
instead of panicking, and reads no longer hydrate the
entire checkpoint or hold store locks during text I/O.
Node.js
Install the Node.js package and its platform-specific native binary:
To build from source, run npm ci --omit=optional && npm run build with Rust installed.
The WARM release includes listDocuments for scoped pruning. See the
integration guide for source
provenance, namespace isolation, dry runs and deletion limits.
Server and Python
The Python package warm-sdk is an HTTP client for warm-server, which stores vectors you
supply. (warm-python provides native vector search and phase vectors, but no document search.)
Endpoints, flags, tenants and limits are in the
server docs. A runnable Python quickstart
with a toy embedder is in examples/quickstart/python.
MCP
warm-mcp serves a store to any Model Context Protocol client over stdio or HTTP:
The MCP package is a separate launcher. To build the server from source:
Client setup, data directory and the one-writer rule: MCP integration.
For normalized content from multiple applications, see the organizational knowledge adapter.
The five-minute quickstart
walks through ingest, search, a SQLite FTS5 comparison and encryption in Rust, Python and Node,
and CI runs that code on every pull request. For a whole agent memory with no embeddings and no
network, run cargo run --example demo-offline-agent.
What ships today
Every capability above except document search and the vector index is behind a Cargo feature or
runtime option that is off by default; Cargo features lists them all.
Architecture
Module map: docs/ARCHITECTURE.md.
Limits
- Not anonymous. Hypervector sketches and term counts are not encryption; anyone with a store
can encode candidate text and compare.
storeText: false keeps term counts, IDs and
embeddings, so it is not a privacy control.
- Document search is conventional. It does not use the hypervectors; the holographic parts
are the algebra and the meaning memory.
- One writer per store. A second writing process fails at open with a lock error.
- Capacity numbers are points, not guarantees, and are stated only over the tested range
(capacity).
- Benchmark results are single machines. Conditions are in each results file; the single-core
ann-benchmarks run and the VIBE high-recall points are losses (see Where it's behind).
- Masking is obfuscation. Client-side vector masking preserves every pairwise similarity.
- A store is a directory and
WarmCore::new(.., None, ..) uses the current directory.
Full statement: docs/PRIVACY.md. Report vulnerabilities privately via
SECURITY.md.
Contributing
CONTRIBUTING.md: setup, the checks CI runs, DCO sign-off (git commit -s, no
CLA). Start with a good first issue
or Discussions. See the
Code of Conduct. Benchmark changes regenerate the results file they touch;
the README cites files, not remembered figures.
License
Apache-2.0. See LICENSE. Use, modify and embed it in open-source or proprietary software, including network services, with no copyleft obligation. The historical v0.6.1 source remains available under its AGPL-3.0-or-later license.