WARM
Memory serverOfficial Writerslogic project
Created by Writerslogic
Published in writerslogic/warm. Publisher page
27 GitHub stars
What it is
WritersLogic Adaptive Retention & Memory (WARM): local document search (BM25 + embedding cosine) and vector-symbolic associative memory.
AutoGineer overview, from the brain’s own files
WARM (WritersLogic Adaptive Retention & Memory) is a local-first memory engine designed to provide AI agents and applications with persistent storage and retrieval. It combines traditional document search—using stemmed BM25 and vector-based cosine similarity—with a vector-symbolic layer for associative memory and multi-hop queries. The system is built in Rust and can be deployed as an embedded library, an HTTP server, or an MCP server, allowing it to integrate with various agent hosts and development environments. It emphasizes local control, offering optional encryption and provenance features while avoiding external service calls or telemetry.
How it works
Memory model: Hybrid
AutoGineer overview, from the brain’s own files
The system stores text, vectors, and facts in a local directory. It uses a hybrid approach where document search combines chunking and BM25 with vector embeddings. The vector-symbolic layer utilizes sparse hypervectors to support associative memory, triples, and multi-hop queries. It provides an API for memory management including remember, recall, and forget operations, with support for source provenance and atomic storage updates.
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 37 |
| assets | attachments | 10 |
| docs | docs | 1850 |
| examples | examples | 47 |
| scripts | scripts | 77 |
| src | source-code | 327 |
| tests | tests | 362 |
| benches | folder | 7 |
| benchmarks | folder | 2898 |
| bindings | folder | 273 |
| deploy | folder | 18 |
| figures | folder | 6 |
| fuzz | folder | 54 |
| integrations | folder | 225 |
| interop | folder | 3 |
| notebooks | folder | 3 |
| npm | folder | 1 |
| proptest-regressions | folder | 1 |
| schemas | folder | 9 |
The agent reads
- query_batch evidence: README.md
- get_document evidence: README.md
- list_documents evidence: README.md
- get_document_info evidence: README.md
- list_document_info evidence: README.md
Requirements
Runtimes: Node.js, Python >=3.9, Rust
Databases: SQLite
API keys (by name): WARM_API_KEY
Works with: Gemini CLI
Set it up
This brain runs code automatically: 1 hook (claude-code), 1 script. Review benchmarks/results/sbg_positions_development/setup.sh, integrations/editors/claude-code/plugin/hooks/hooks.json before opening the folder in Claude Code. No step below turns a hook on for you.
benchmarks/results/sbg_positions_development/setup.sh:sh benchmarks/results/sbg_positions_development/setup.shintegrations/editors/claude-code/plugin/hooks/hooks.json:node
- Not scanned by AutoGineerThe author’s README also describes installing it from a clone of its repository. Read its install section: AutoGineer did not scan that path. https://github.com/writerslogic/warm/blob/e176d5572dd86bf2233bcb120e3a485dc109ea3a/README.md#get-started
- Not scanned by AutoGineerThe author’s README also describes installing it as the npm package writerslogic-warm. Read its install section: AutoGineer did not scan that path. https://github.com/writerslogic/warm/blob/e176d5572dd86bf2233bcb120e3a485dc109ea3a/README.md#get-started
Created by Writerslogic. Published in writerslogic/warm. Licence: Apache License 2.0.
Usage
AutoGineer overview, from the brain’s own files
- Integrating memory into an AI agent via the MCP server.
- Building local-first applications that require embedded search and storage.
- Providing a multi-tenant memory service via the HTTP server.
- Using the Rust library for in-process memory management.
- “Remember that the project deadline is Friday.”
- The agent stores the fact with associated metadata, making it available for future retrieval.
- “Recall information about the project deadline.”
- The agent retrieves the stored fact using hybrid search and provides the information with source provenance.
Documentation by Writerslogic
<img src="https://raw.githubusercontent.com/writerslogic/warm/main/assets/crystal-halo/crystal-detailed-static.png" alt="WARM logo" width="96" align="left">
WARM
Local memory for AI agents and applications.
WARM (WritersLogic Adaptive Retention & Memory) gives agents persistent memory, full-text and vector search, and source provenance in one embeddable Rust engine. Use it inside your application, through HTTP, or from an MCP client, with storage on infrastructure you control.
Image: CI Image: MSRV 1.89 Image: OpenSSF Scorecard Image: OpenSSF Best Practices Image: License: Apache-2.0 Image: WARM MCP server: quality and maintenance score on Glama
Website · Docs · Get started · Standards and provenance · Evaluation · Capabilities · Limits · Contribute
<br clear="left">
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 optional Node.js, C, WASM and UniFFI bindings, an HTTP server with portable JavaScript and Python clients, and an MCP server. The embedded engine makes no service calls or telemetry requests. HTTP clients connect to the server you configure; model stages are opt-in.
| Capability | What you get |
|---|---|
| Document search | Chunking, stemmed BM25 over blocked postings, Boolean and phrase queries, hybrid fusion with embeddings you supply, metadata filters, byte offsets |
| Vector index | Graph index with a memory-mapped vertex file, an updatable delta for inserts and deletes, optional query-aware routing trained on sample queries |
| Memory API | remember, recall, forget and explain with time validity and supersession; conversation memory with source provenance |
| Storage | Atomic replace and delete, crash-safe journal and checkpoints, verified compaction, one writer per store |
| Security | Optional AES-256-GCM storage encryption with documented coverage and limits, signed audit log, COSE/SCITT provenance |
| Vector-symbolic layer | Sparse hypervectors with bind, bundle and permute, triples with multi-hop queries, Hopfield cleanup |
Who it's for
| You are building | What you get |
|---|---|
| An agent or assistant that needs memory | A memory API with forgetting that removes facts from the store, and an MCP server for editors and agent hosts |
| A local-first or offline app | Embedded search and storage in one directory, with no server process and optional encryption |
| A service that needs vector or text search | warm-server over HTTP with tenants and scoped keys, or the library in-process |
Get started
For an editor or agent host, start with the MCP integration. For an application, choose the Rust library or HTTP server below. WARM runs locally or on your own infrastructure; this repository does not provide a managed cloud service.
To try the offline memory demo from source:
git clone https://github.com/writerslogic/warm
cd warm
cargo run --release --example demo-offline-agent<details open> <summary><strong>Rust</strong></summary>
From your own Rust project, add the current Apache-2.0 source. The crate is warm-rust; the library is imported as writerslogic_warm. The MSRV is Rust 1.89; local-models and --all-features need Rust 1.94 or newer.
cargo add warm-rustThe 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.
use writerslogic_warm::{DocumentInput, WarmCore, SearchOptions};
let dir = tempfile::tempdir()?;
let warm = WarmCore::new(4096, Some(dir.path().display().to_string()), None)?;
warm.memorize_document(DocumentInput {
id: "backups".into(),
text: "Restore deleted documents from verified backups.".into(),
source_uri: Some("operations.md".into()),
version: Some("1".into()),
metadata: Some(serde_json::json!({ "project": "alpha" })),
chunk_words: None, overlap_words: None, store_text: None, embeddings: None, title_weight: None,
})?;
let hits = warm.search_documents("restore backups", &SearchOptions::default())?;
println!("{} {:?}", hits[0].document_id, hits[0].source_uri);Rust API change in 0.6.6 (0.6.5 returns these values directly): 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.
</details>
<details> <summary><strong>JavaScript and TypeScript: portable client</strong></summary>
warm-sdk 0.2.1 is the portable HTTP client for a separately running warm-server.
It has no native binaries or runtime dependencies and uses standard Fetch and Web Streams APIs
(Node 18 or newer). Installing or importing it does not load the embedded engine or download models.
For a published release, install the client in your application:
npm install [email protected]Check the available npm versions. To build the client from this checkout:
npm ci --prefix bindings/js/warm-sdk
npm run build --prefix bindings/js/warm-sdkIn your application, install that directory with
npm install /absolute/path/to/warm/bindings/js/warm-sdk.
Start the server in a separate terminal:
cargo build --release --features server --bin warm-server
WARM_API_KEY=change-me target/release/warm-server --input-dim 384import { WarmClient } from 'warm-sdk'
const warm = new WarmClient({
url: process.env.WARM_URL ?? 'http://127.0.0.1:8080',
apiKey: process.env.WARM_API_KEY, tenantId: 'demo',
})
await warm.memory.remember('Restore deleted documents from verified backups.', {
id: 'backups', metadata: { project: 'alpha' },
})
const hits = await warm.memory.recall('restore backups', { filter: { project: 'alpha' } })
console.log(hits[0]?.text)Set WARM_API_KEY to the server's key before running the client. This memory example uses
lexical retrieval and needs no embedding model. A runnable source example also checks retrieval
and deletion in an isolated namespace:
WARM_URL=http://127.0.0.1:8080 WARM_API_KEY=change-me \
node examples/quickstart/js-client/quickstart.mjsSee the client API and release availability. Browser deployments must permit the application's origin at the HTTP service boundary.
</details>
<details> <summary><strong>Node.js: optional embedded engine</strong></summary>
writerslogic-warm embeds the Rust engine in Node. For a published engine release,
install it explicitly with npm's optional dependencies enabled:
npm install [email protected]Check the available npm versions. To build from the cloned repository, with Rust installed:
npm ci --omit=optional
npm run buildThe portable client and embedded engine are separate packages with different APIs.
listDocuments supports scoped pruning. See the
integration guide for source
provenance, namespace isolation, dry runs and deletion limits.
const { WarmMemorySystem } = require('writerslogic-warm')
const { DocumentMemory } = require('writerslogic-warm/semantic')
async function main() {
const dir = require('node:fs').mkdtempSync(require('node:path').join(require('node:os').tmpdir(), 'warm-readme-'))
const memory = new DocumentMemory(new WarmMemorySystem(4096, dir))
await memory.memorize({
id: 'backups', text: 'Restore deleted documents from verified backups.',
sourceUri: 'operations.md', version: '1', metadata: { project: 'alpha' },
})
const [hit] = await memory.search('restore backups', { filter: { project: 'alpha' } })
console.log(hit.documentId, hit.sourceUri, hit.text)
await memory.flush()
}
main().catch(error => { console.error(error); process.exit(1) })</details>
<details> <summary><strong>Server and Python</strong></summary>
The Python package warm-sdk is an HTTP client for warm-server, which stores vectors you
supply. (warm-python, imported as writerslogic_warm, provides native vector indexes and phase vectors, but no document search.)
cargo build --release --features server --bin warm-server
WARM_API_KEY=change-me target/release/warm-server --input-dim 384 &
uv pip install warm-sdkfrom writerslogic_warm_sdk import WarmClient
client = WarmClient(url="http://127.0.0.1:8080", api_key="change-me", tenant_id="demo")
client.add_documents([{"id": "a", "vector": [0.1] * 384, "text": "hello", "metadata": {}}])
print(client.query([0.1] * 384, top_k=1)["matches"][0]["id"])Endpoints, flags, tenants and limits are in the
server docs. A runnable Python quickstart
with a toy embedder is in examples/quickstart/python.
</details>
<details> <summary><strong>MCP</strong></summary>
warm-mcp serves a store to any Model Context Protocol client over stdio or HTTP:
npx -y writerslogic-warm-mcp # stdio; downloads a verified binary on first run
npx -y writerslogic-warm-mcp --transport http # http://127.0.0.1:8765/mcpThe MCP package is a separate launcher. To build the server from source:
cargo build --release --features mcp,security --bin warm-mcp # add local-models for semantic recall
./target/release/warm-mcp # stdio
./target/release/warm-mcp --transport http # http://127.0.0.1:8765/mcpClient setup, data directory and the one-writer rule: MCP integration.
For normalized content from multiple applications, see the organizational knowledge adapter.
</details>
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.
<a id="headline-results"></a> <a id="where-its-behind"></a>
Evaluation
Recorded results and limitations cover memory quality, text retrieval and vector search. Each result retains its workload, hardware, model, source revision and known losses. The full comparison and reproduction protocol provide the evidence for evaluating WARM on your own workload.
What ships today
| Capability | Status | Documented limit |
|---|---|---|
| Hybrid document search (BM25 + exact cosine, filters, byte offsets) | Ships | Exact scan of eligible chunks; benchmark your corpus before assuming capacity (guide) |
Boolean lexical search (+required, -excluded, quoted phrases) | Ships | Flat queries only, no nesting; an empty or only-excluded query matches nothing (design) |
| Atomic replace/delete, crash-safe journal, verified compaction, process lock | Ships | One writer per store; compaction is not secure erasure |
Vector index (qgraph vertex graph, memory-mapped) | Ships | Build time and serving RSS behind hnswlib on SIFT-1M (gaps) |
| Updatable vector index (durable delta for inserts and deletes) | Ships | Single writer; format in VECTOR-UPDATES.md |
| Query-aware graph routing (trained on sample queries) | Ships (opt-in) | Needs representative training queries; tested on VIBE llama and yi (report) |
| Memory API: remember, recall, forget, explain | Ships | Forgetting removes a fact from the store; it does not cover what a model inferred (docs) |
Conversation memory (conversation-memory) | Ships | Bounded context with exact source provenance; native recall not yet benchmarked on LongMemEval end to end |
| Meaning memory: triples, multi-hop, Hopfield cleanup | Ships (runtime opt-in) | Tested on synthetic and 2,120-fact sets (research_bench_16384_256.json) |
Union-bundle membership (experimental) | Research | At D = 16,384: positive gap to N = 500 (4% false positives), tested to 2,500 (benchmark_scaling_results.json) |
Sparse vector index (memorize_vector) | Experimental | Not competitive with HNSW (results) |
Encrypted stores (security) | Ships | AES-256-GCM, Argon2id; covers the log, index caches and the text segment. Metadata, file names and sizes are not encrypted |
Signed audit log, credential-gated access, COSE/SCITT/C2PA (provenance) | Ships | Host must authenticate DIDs; PoSME, RATS, did:web not implemented |
On-device models (local-models: Qwen3 embed/rerank/LLM) | Ships | Local weights only; never downloads |
warm-server HTTP API, multi-tenant (server) | Ships | Single node; TLS, per-tenant scoped keys (guide) |
MCP server (mcp: warm-mcp, stdio and HTTP) | Ships | Encryption needs security; semantic recall needs local-models |
JavaScript/TypeScript client (warm-sdk 0.2.1) | Source and release builds | Portable HTTP client; requires a separately running server |
Embedded Node.js (writerslogic-warm 0.6.8) | Source and release builds | Eight optional native platform packages; separate from the client |
| C, Go, .NET, Java, Kotlin, Swift and WebAssembly bindings | Source available | Require local builds; the language packages and native bundles are not yet published (runtime guides) |
| Python | HTTP client (warm-sdk); native vector indexes and phase vectors (warm-python) | No in-process document search |
Query-private search (private-search) | Experimental | For searching an index someone else holds; hides the query vector from the scorer only (notes) |
Optional engine capabilities use Cargo features or runtime configuration; Cargo features lists the build choices.
The compatibility policy defines API stability, deprecation windows and storage-format migration rules.
Architecture
flowchart TB
subgraph bindings["Bindings and servers"]
rust["Rust crate"]
node["Node: writerslogic-warm (napi)"]
ffi["C, WASM, UniFFI"]
clients["JavaScript and Python: warm-sdk"]
server["warm-server (HTTP)"]
mcp["warm-mcp (stdio, HTTP)"]
end
subgraph engine["Engine API"]
core["WarmCore: documents, vectors, facts, mutation gate"]
prov["Security and provenance: signed audit log, COSE/SCITT"]
end
subgraph indexes["Indexes and memory"]
text["Text index: blocked postings, BM25, Boolean and phrase"]
vector["Vector index (qgraph): vertex file, updatable delta, query-aware projection"]
memory["Memory API: remember, recall, forget, conversation memory"]
vsa["Vector-symbolic layer: bind, bundle, Hopfield cleanup"]
end
subgraph storage["Storage"]
journal["Journal and checkpoints"]
segments["Append-only segments (CRC32, LZ4)"]
mapped["Memory-mapped files"]
crypto["AES-256-GCM encryption (optional)"]
end
clients --> server
rust --> core
node --> core
ffi --> core
server --> core
mcp --> core
core --> text
core --> vector
core --> memory
core --> vsa
core --> prov
memory --> text
text --> journal
vector --> journal
memory --> journal
journal --> segments
segments --> mapped
segments --> cryptoModule 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: falsekeeps 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.
docs/RELEASING.md
<!-- Copyright 2024-2026 WritersLogic Contributors -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
Releasing WARM
The engine and binding tags produce artefacts, provenance attestations and SBOMs. MCP launchers
have their own version and release tag. Pull requests do not publish. Manual runs default to
builds and checks; explicit publish inputs enable protected crate-only recovery, npm publication
on main, or publication from the Python release workflows. MCP manual runs do not publish.
| Tag | Workflow | Produces |
|---|---|---|
vX.Y.Z | .github/workflows/release.yml | the crate, 8 writerslogic-warm-* native packages and root writerslogic-warm, Python wheels and sdist (as release assets), SBOMs, SLSA provenance, a draft GitHub release; then publishes the crate and native npm packages |
py-models-vX.Y.Z | .github/workflows/warm-models-release.yml | the pinned default offline warm-models pack, published to PyPI through Trusted Publishing |
py-vX.Y.Z | .github/workflows/warm-py-release.yml | warm-python wheels and sdist, published to PyPI through Trusted Publishing |
sdk-vX.Y.Z | .github/workflows/warm-sdk-release.yml and .github/workflows/warm-js-sdk-release.yml | portable warm-sdk clients: Python wheel/sdist on PyPI and JavaScript/TypeScript package on npm |
mcp-vX.Y.Z | .github/workflows/warm-mcp-release.yml | five warm-mcp binaries, checksum tables embedded in npm and PyPI launchers, a GitHub release, then the launcher packages and official MCP Registry entry |
Publish a new model pack before a native wheel that requires that new version through [embed].
The existing warm-models==0.1.0 pin does not require another model release for engine 0.6.8.
The Python distributions have separate release tags and Trusted Publisher workflows. For a full
engine release, push both vX.Y.Z and py-vX.Y.Z at the same commit; the native wheels build twice.
The npm native binding writerslogic-warm follows the engine version, currently 0.6.8.
The JavaScript and Python HTTP clients share SDK version 0.2.1 and the sdk-v0.2.1 tag;
their manifests are bindings/js/warm-sdk/package.json and
bindings/python/warm-sdk/pyproject.toml. The engine version script does not bump the SDKs
or MCP launchers. The MCP launchers use version 0.1.7 and the mcp-v0.1.7 tag.
Framework adapters in integrations/js
and integrations/python, and the two Claude memory-tool packages, have no publication workflow
in this release pipeline. Their first publication is separate from the 0.6.8 maintenance release.
Portable HTTP SDK release
Keep both SDK manifests and their lockfiles at the shared SDK version, and document compatibility
changes, including removed adapters. Run Python SDK release on the candidate
with publish=false. Its gate builds with uv build, tests against a real warm-server, and
checks a clean wheel install, import and py.typed marker. Require the framework contract jobs
in ci.yml as well.
The JavaScript client lives in bindings/js/warm-sdk, not the repository-root npm package.
Require the build-only .github/workflows/js-sdk.yml checks before
.github/workflows/warm-js-sdk-release.yml publishes: type checking, client tests, clean packed
CommonJS/ESM consumers, a real server memory round trip, and absence of native/runtime
dependencies. Importing the client must not load the embedded engine. Keep provenance,
registry signature verification and the published-consumer check in the release gate.
Publish one signed sdk-vX.Y.Z tag matching both clients. It triggers their separate registry
workflows. Do not reuse an existing version, substitute the engine version, or mark the shared
SDK release available until both registry installs have been verified.
MCP launcher release
writerslogic-warm-mcp on npm and warm-mcp on PyPI is versioned separately from the engine. Its launchers
download warm-mcp from a mcp-vX.Y.Z GitHub release and verify its hash against a table inside
the package. The release workflow builds macOS arm64 and x64, Linux arm64 and x64 (glibc 2.17
minimum), and Windows x64 binaries. It rejects missing or extra assets, tests both launchers with a
local asset server, packs and installs both distributions, creates the GitHub release, then publishes
to npm, PyPI and the official MCP Registry. The Registry entry uses both packages, and the package
metadata proves ownership of io.github.writerslogic/warm-mcp.
Before the first release, add a pending Trusted Publisher for the new project at
https://pypi.org/manage/account/publishing/: project warm-mcp, owner
writerslogic, repository warm, workflow warm-mcp-release.yml, environment pypi.
PyPI creates the project on the first successful upload. The repository's NPM_TOKEN secret must
have publish access to writerslogic-warm-mcp.
To check the pipeline without publishing, run MCP launcher release with workflow_dispatch or
open a pull request touching its files. To publish, tag the commit containing the tested workflow
with mcp-vX.Y.Z where X.Y.Z matches integrations/mcp/npm/package.json,
integrations/mcp/pypi/pyproject.toml, the Python launcher's __version__, and
integrations/mcp/server.json (including both package entries), and push the signed tag.
python3 scripts/ci/mcp-release.py mcp-vX.Y.Z checks those versions and registry metadata.
A changed warm-mcp binary needs a new launcher release even when launcher source is unchanged. The
workflow never replaces an existing release or registry version. If one publish job fails after the
GitHub release exists, correct its credentials or publisher configuration and rerun that job only.
After the official Registry entry is active, submit the repository through Glama's Add MCP
Server form. glama.json names the maintainer, as in scrivener-mcp. Verify third-party
directories separately; an official Registry entry does not confirm their listings. At the 0.1.2
release, mcp.so has a free submission path and an optional
$39 paid publication option. Use the free path; do not pay. PulseMCP is not accepting submissions.
The modelcontextprotocol/servers repository
now contains reference servers and directs community server discovery to the official Registry.
After Glama approves the listing, a signed-in maintainer must configure its Docker release.
That form generates a Dockerfile from its fields; the repository-root Dockerfile is built and
tested separately by mcp-container.yml. Clear the Pinned Commit SHA (5250df9 points to a
commit before the repository Dockerfile and current tool definitions); leave it empty so Glama can
sync newer commits. Pinning a SHA requires updating it for every subsequent release.
Set Base Image to debian:trixie-slim and Node.js version to 24. Glama installs Node and
mcp-proxy in its generated image. Enter this Build Step after publishing the MCP launcher to
npm:
npm install -g --no-audit --no-fund writerslogic-warm-mcp@latest && WARM_MCP_CACHE_DIR=/tmp/warm-mcp-cache writerslogic-warm-mcp --version && install -m 755 /tmp/warm-mcp-cache/*/*/warm-mcp /usr/local/bin/warm-mcp && install -d -m 1777 /dataThe npm launcher verifies its downloaded binary against the checksum embedded in that release;
the build copies the verified binary into the image so it needs no download at runtime. Set CMD
Arguments to ["mcp-proxy","--","/usr/local/bin/warm-mcp","--data-dir","/data"], Environment
Variables JSON Schema to {"type":"object","properties":{}}, and Placeholder Parameters
to {}. Persistent memory on a hosted deployment requires Glama's optional /data volume.
Click Deploy; after its build test succeeds, choose Make Release and publish the MCP launcher version. The build step picks up npm's latest published launcher on each build. Glama requires a new build test and release publication for each version. A release enables hosted deployment and security scans; a GitHub tag alone does not.
Then check the server score
and confirm it can deploy and introspect all eight tools. Review every tool's six Tool Definition
Quality Score dimensions, the server coherence score, and the listed security and maintenance
findings. Use Glama's specific findings to improve any dimension below 5/5, any overall score below
the highest tier, or any reported risk; then confirm the next scan reflects the fix. The
mcp-container.yml CI check covers the Docker build and stdio introspection before submission.
Afterward, confirm npm view writerslogic-warm-mcp version and the PyPI project page show X.Y.Z.
Run uvx warm-mcp --version and npx -y writerslogic-warm-mcp --version on a
supported platform with an empty launcher cache; these commands print the underlying engine's
version, which is independent of the launcher version.
What is built
Python (
python-wheels.yml): abi3 (cp39-abi3) wheels for manylinux2014 x86_64 and aarch64, musllinux_1_2 x86_64 and aarch64, macOS arm64 and x86_64, Windows x64, and the sdist. Each wheel is installed into an empty virtualenv with no source tree and no network, then a real associative search and a resonator factorization run through it (scripts/ci/smoke_python.py). Linux wheels are additionally installed in a Debian 11 (glibc 2.31, Python 3.9) or Alpine container.Embedded npm (
npm-packages.yml):writerslogic-warm-{darwin-arm64, darwin-x64, linux-arm64-gnu, linux-arm64-musl, linux-x64-gnu, linux-x64-musl, win32-arm64-msvc, win32-x64-msvc}plus the JavaScript-only loader packagewriterslogic-warm, whoseoptionalDependenciesselect the binding by os, cpu and libc. glibc bindings are linked against glibc 2.17, musl bindings with zig. The tarballs are installed into an empty project on a machine of every target (Alpine containers for musl, Debian 11 for glibc) with the root's optional dependencies pointed at the local tarballs, so npm itself must pick exactly one package, and a document search must succeed (scripts/ci/smoke-node.cjs). The rootpackage.json(napi.targets) is the single list of platforms andscripts/ci/npm-platform-packages.cjsrefuses to pack if it disagrees withoptionalDependenciesor any binding is missing.Portable npm client (
js-sdk.yml):warm-sdkfrombindings/js/warm-sdk, with CommonJS, ESM and TypeScript declarations. It has no platform packages or native dependency; its server runs separately. Publication uses the SDK tag andwarm-js-sdk-release.yml.Crate:
cargo package --locked, which also builds the packaged tarball.SBOM: a CycloneDX 1.5 JSON per artefact (
cargo-cyclonedx,npm sbom), named<artefact>.cdx.jsonand paired byscripts/ci/pair-sboms.py, which refuses a release where any artefact lacks one.Provenance:
actions/attest-build-provenancesigns a SLSA provenance statement for every artefact and SBOM, andactions/attest-sbombinds each SBOM to its artefact. The bundle is also a release asset (provenance.intoto.jsonl).
One-time setup (repository settings, by the maintainer)
These cannot be committed; the publish jobs wait on them.
Environments (Settings, Environments), each with required reviewers:
release,crates-io,npm,pypi.crates.io: add this repository's
release.ymland environmentcrates-ioas a Trusted Publisher forwarm-rust. The job usesrust-lang/crates-io-auth-actionand holds no token.npm: configure publishing authority for
writerslogic-warm, its eightwriterslogic-warm-*platform names, and the separate portablewarm-sdkpackage throughNPM_TOKEN(a repository ornpmenvironment secret). Publishing uses--provenance. Legacy package retirement runs separately throughretire-legacy-npm.yml; registry policy and interactive two-factor authentication can restrict permanent deletion.PyPI: add pending Trusted Publishers under owner
writerslogic, repositorywarm, environmentpypi:warm-modelsuseswarm-models-release.yml,warm-pythonuseswarm-py-release.yml, andwarm-sdkuseswarm-sdk-release.yml. The MCP launcher useswarm-mcp-release.ymlwith the same owner, repository and environment. PyPI permits three pending projects at a time; publish one before registering the fourth.
Cut a release
Version.
uv run python scripts/ci/bump-version.py X.Y.Zsets Cargo.toml, Cargo.lock, package.json with itsoptionalDependencies, package-lock.json anddocs/server/openapi.json;scripts/ci/check-versions.pyruns in every artefact job and again against the tag, so a mismatch fails the build.Changelog. Use git-cliff 2.14.2, matching the pinned workflow; older versions can assign merged branch commits to releases that never contained them. Run
git cliff -c cliff.toml --tag vX.Y.Z -o CHANGELOG.mdand commit aschore: Update changelog. The tag argument prepares the release heading without creating a Git tag. Generate it on the intended UTC tag date and require the changelog gate on the actual tag. Tag the commit before any[skip ci]commit (those run no workflows).Dry run. Merge to
main, then run Actions, Release and Python native release onmain. Keep all publish inputs false. Run both SDK build/check workflows and MCP launcher release when those distributions change; run Python models release only when a new pack is needed. The dry runs build and test without publishing. TheReproducible buildworkflow must also be green on that commit.Tag and push (signed):
git tag -s vX.Y.Z -m vX.Y.Z && git push --no-follow-tags origin refs/tags/vX.Y.Z, and the same forpy-vX.Y.Z. Publishpy-models-vX.Y.Zfirst if the native[embed]extra needs a new model pack. Publish matching independentsdk-vX.Y.Zandmcp-vX.Y.Ztags when those distributions change. Use--no-follow-tagson every branch and tag push, naming only the intended refs. Approve therelease,crates-io,npmandpypienvironments when asked.GitHub release.
release.ymlleaves a draft release holding every artefact, SBOM,SHA256SUMSand the provenance bundle. Prepare the notes, but keep it a draft until the registry and artefact checks below pass, then publish it. The data releases (evidence-v*) use other tags and never trigger these workflows.Native npm listing. Verify the root package and all eight platform packages are available:
version=X.Y.Z for package in writerslogic-warm \ writerslogic-warm-darwin-arm64 writerslogic-warm-darwin-x64 \ writerslogic-warm-linux-arm64-gnu writerslogic-warm-linux-arm64-musl \ writerslogic-warm-linux-x64-gnu writerslogic-warm-linux-x64-musl \ writerslogic-warm-win32-arm64-msvc writerslogic-warm-win32-x64-msvc; do test "$(npm view "${package}@${version}" version)" = "$version" || exit 1 done npm view "writerslogic-warm@${version}" deprecated # must print nothing npm dist-tag ls writerslogic-warm # latest must be X.Y.ZConfirm the latest registry page shows no deprecation banner, the README logo renders, and
npm install writerslogic-warmresolves to X.Y.Z. npm can acknowledge a new package before its version is available; a0.0.0-stageplaceholder alone is not a published binding. Require theverify-publishedjob to pass for this release: it waits for the root and every declared optional platform package with a fresh npm cache, installs the published root package in a clean consumer, verifies npm signatures, and runs a document search. Registry metadata or a successful tarball build alone does not establish that consumers can use the release.Verify what was shipped (see below).
<a id="first-npm-release-under-warm-sdk"></a>
JavaScript package availability
The JavaScript packages are portable warm-sdk 0.2.1 and embedded writerslogic-warm 0.6.8.
Check available npm versions for the client
and the embedded engine
before choosing a registry release. The installation guide also covers
source builds. The existing native writerslogic-warm family is retained; it is not deprecated
or replaced by the client.
For the SDK, verify npm view [email protected] version, install that exact version in a clean
consumer, verify signatures, and run an authenticated memory round trip against the supported
server. Verify the Python client independently under the same SDK tag. Keep native platform
build/install gates, provenance and registry consumer checks for the embedded package.
The 0.6.6 release partially published the new npm names: seven platform packages succeeded,
but npm rejected warm-sdk-win32-x64-msvc for package-name spam detection and the job stopped
before publishing root warm-sdk (failed job).
That historical failure does not block either current package: the embedded release uses the
existing writerslogic-warm-* names, and the portable client has no native helpers. Do not
retry or require clearance of warm-sdk-win32-x64-msvc for these releases. Preserve the
historical tags and receipts.
Existing embedded consumers retain writerslogic-warm imports, including /semantic,
/memory and /vectra, and their existing store directories and configuration. Adopting the
portable WarmClient requires an HTTP server and an explicit API migration; it is not a rename
of WarmMemorySystem. There is no warm-sdk/embedded export.
The framework adapters in integrations/js remain explicit native integrations with a
writerslogic-warm >=0.6.5 peer. Their separate publication is not part of the SDK or engine
release. MCP, embedding-model packages, WebAssembly and Rust keep their existing identities.
Verify an artefact
gh attestation verify warm_python-X.Y.Z-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl \
--repo writerslogic/warm
gh attestation verify writerslogic-warm-linux-x64-gnu-X.Y.Z.tgz --repo writerslogic/warm
npm audit signatures # in a clean consumer of the package being released
sha256sum -c SHA256SUMS # next to the downloaded release assetsReproducible builds
.github/workflows/reproducible.yml builds warm-eval, warm-server, the napi cdylib, the Python
wheel and the crate on two independent runners from different checkout paths and fails unless the
SHA-256 of every artefact is identical (scripts/ci/repro-build.sh, scripts/ci/compare-hashes.py).
Inputs that are pinned: the committed Cargo.lock (--locked), SOURCE_DATE_EPOCH (the commit
time), maturin, no incremental compilation, and --remap-path-prefix for the checkout, cargo home
and rustup home. The Rust toolchain is the runner's current stable, so both legs must run in the
same workflow run.
Result of the first runs (two runners, different checkout directories): warm-eval, warm-server,
the napi cdylib and the crate are bit-for-bit identical. The Python wheel is identical member for
member except *.dist-info/sboms/* (and RECORD, which lists its hash), the SBOM maturin embeds, whose bom-refs contain the absolute
checkout directory; the workflow therefore allows the wheel hash to differ and fails if any other
member differs.
| Artefact | Reproducible | Reason |
|---|---|---|
warm-eval, warm-server, napi cdylib, .crate | yes | |
| Python wheel (manylinux x86_64, built natively) | all members except the embedded SBOM | absolute checkout path in the SBOM bom-refs |
Not covered: the per-platform npm bindings and the cross-compiled wheels, which depend on the zig
and napi cross toolchains downloaded at build time (their SHA-256 are in SHA256SUMS and the
attestations, not compared).
If something goes wrong
A publish job failed partway: inspect its logs and the workflow at that tag before retrying. Current npm release steps skip existing versions,
cargo publishrefuses an existing version, and PyPI usesskip-existing. Historical tag workflows may lack current recovery guards; a re-run uses the workflow file at the tag. Fixes onmainapply from the next tag, not to the old run.npm answered
E403 Package name triggered spam detectionfor a new package name: ask npm support to clear that exact name and verify the resolution before another publish. For 0.6.6, the rejected name waswarm-sdk-win32-x64-msvc; seven platform packages had succeeded and the root was not published. This error does not establish a credential or ownership failure, and changing the version alone does not clear it. The current native family useswriterslogic-warm-*; clearance of the abandoned helper name is not a release prerequisite. Preserve the signed 0.6.6 tags and the existingv0.6.7,py-v0.6.7,sdk-v0.2.0andmcp-v0.1.6tags when preparing the new releases. Do not move or reuse them.For npm-only recovery from the reviewed candidate on
main, rungh workflow run npm-packages.yml --ref main -f publish_npm=trueafter resolving the failure. This protected path builds and verifies the packages, compares the integrity of any existing versions before skipping them, and requires the published-package consumer gate. Confirm the candidate's version and commit first; the normal full release uses the signed engine tag.A tag's crate upload failed because the archive is too large: fix the
Cargo.tomlpackage contents onmainand verifycargo package --locked --no-default-featuresreports less than 9.5 MB compressed. Thecrates-ioenvironment normally permits onlyv*tags; temporarily addmainas an allowed deployment branch while retaining thev*policy and required reviewer. RunReleaseonmainwithpublish_crate_only=trueand approve thecrates-ioenvironment. Remove the temporarymainpolicy after the job finishes. This protected run packages, attests, and publishes only the crate. Verify that the crate index checksum matches thecrate-recoveryartifact and the registry download. If the GitHub release is still a draft, replace its crate, crate SBOM, and matchingSHA256SUMSentries before publishing. If it is already immutable, leave those assets intact; record the recovery commit, registry checksum, and attestation in the editable release notes so readers can distinguish the published crate from the original oversized release asset. Never move the signed release tag.Published a bad version: crates.io
cargo yank --version X.Y.Z; npmnpm deprecate <affected-package>@X.Y.Z "reason"(unpublish only within 72 hours); PyPI yank in the web UI (no API). Then release X.Y.(Z+1); never re-tag.A signed release tag pushed by mistake: cancel its workflows and leave the tag unchanged. Keep any draft unpublished and prepare a new version before approving publication.
512 files · 481 not served here
- .bestpractices.json (not served here)
- .dockerignore (not served here)
- .editorconfig (not served here)
- .gitattributes (not served here)
- .github/CODEOWNERS (not served here)
- .github/FUNDING.yml (not served here)
- .github/ISSUE_TEMPLATE/bug_report.yml (not served here)
- .github/ISSUE_TEMPLATE/config.yml (not served here)
- .github/ISSUE_TEMPLATE/feature_request.yml (not served here)
- .github/SECURITY.md (not served here)
- .github/SUPPORT.md (not served here)
- .github/badges/coverage.json (not served here)
- .github/dependabot.yml (not served here)
- .github/pull_request_template.md (not served here)
- .github/workflows/bench-refresh.yml (not served here)
- .github/workflows/bindings.yml (not served here)
- .github/workflows/changelog.yml (not served here)
- .github/workflows/ci.yml (not served here)
- .github/workflows/coverage.yml (not served here)
- .github/workflows/dco.yml (not served here)
- .github/workflows/dependency-review.yml (not served here)
- .github/workflows/docs.yml (not served here)
- .github/workflows/examples.yml (not served here)
- .github/workflows/format.yml (not served here)
- .github/workflows/fuzz.yml (not served here)
- .github/workflows/importers.yml (not served here)
- .github/workflows/js-sdk.yml (not served here)
- .github/workflows/links.yml (not served here)
- .github/workflows/mcp-container.yml (not served here)
- .github/workflows/npm-packages.yml (not served here)
- .github/workflows/python-wheels.yml (not served here)
- .github/workflows/release.yml (not served here)
- .github/workflows/reproducible.yml (not served here)
- .github/workflows/retire-legacy-npm.yml (not served here)
- .github/workflows/scorecard.yml (not served here)
- .github/workflows/standards-interop.yml (not served here)
- .github/workflows/warm-js-sdk-release.yml (not served here)
- .github/workflows/warm-mcp-release.yml (not served here)
- .github/workflows/warm-models-release.yml (not served here)
- .github/workflows/warm-py-release.yml (not served here)
- .github/workflows/warm-sdk-release.yml (not served here)
- .gitignore (not served here)
- .lychee.toml (not served here)
- .npmignore (not served here)
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CITATION.cff (not served here)
- CODE_OF_CONDUCT.md
- CONTRIBUTING.md
- Cargo.lock (not served here)
- Cargo.toml (not served here)
- Dockerfile (not served here)
- LICENSE
- README.md
- SECURITY.md
- assets/crystal-halo/README.txt (not served here)
- assets/crystal-halo/crystal-detailed-loop.apng (not served here)
- assets/crystal-halo/crystal-detailed-loop.svg (not served here)
- assets/crystal-halo/crystal-detailed-loop.webp (not served here)
- assets/crystal-halo/crystal-detailed-static.png (not served here)
- assets/crystal-halo/crystal-detailed-static.svg (not served here)
- assets/crystal-halo/source/build_additional_exports.py (not served here)
- assets/crystal-halo/source/build_crystal_halo.py (not served here)
- assets/crystal-halo/source/crystal-halo-geometry.json (not served here)
- assets/social-preview.png (not served here)
- benches/audit_delivery.rs (not served here)
- benches/ingest_alloc.rs (not served here)
- benches/intersection_kernels.rs (not served here)
- benches/query_alloc.rs (not served here)
- benches/vector_record_query.rs (not served here)
- benches/vector_updates.rs (not served here)
- benches/warm_benchmark.rs (not served here)
- benchmarks/ann-benchmarks/campaign/ga.py (not served here)
- benchmarks/ann-benchmarks/campaign/gen_heldout.py (not served here)
- benchmarks/ann-benchmarks/campaign/mkdefs.py (not served here)
- benchmarks/ann-benchmarks/campaign/mkdefs_ivf.py (not served here)
- benchmarks/ann-benchmarks/campaign/mkreport.py (not served here)
- benchmarks/ann-benchmarks/campaign/plans/b1-sift.json (not served here)
- benchmarks/ann-benchmarks/campaign/plans/b2-glove.json (not served here)
- benchmarks/ann-benchmarks/campaign/plans/g1-sift.json (not served here)
- benchmarks/ann-benchmarks/campaign/prebuild.py (not served here)
- benchmarks/ann-benchmarks/campaign/prof.sh (not served here)
- benchmarks/ann-benchmarks/campaign/profq.py (not served here)
- benchmarks/ann-benchmarks/campaign/run_gen.py (not served here)
- benchmarks/ann-benchmarks/campaign/summ.py (not served here)
- benchmarks/ann-benchmarks/campaign/test_campaign_integrity.py (not served here)
- benchmarks/ann-benchmarks/campaign/warm_module_campaign.py (not served here)
- benchmarks/ann-benchmarks/campaign/warmivf_module.py (not served here)
- benchmarks/ann-benchmarks/warm/Dockerfile (not served here)
- benchmarks/ann-benchmarks/warm/config.yml (not served here)
- benchmarks/ann-benchmarks/warm/module.py (not served here)
- benchmarks/competitive/GAPS.json (not served here)
- benchmarks/competitive/README-block.md (not served here)
- benchmarks/competitive/ann_updatable_measure.py (not served here)
- benchmarks/competitive/lucene/LuceneBm25.java (not served here)
- benchmarks/competitive/modal_run.py (not served here)
- benchmarks/competitive/predictions/heavy-20261021T093821.json (not served here)
- benchmarks/competitive/repin_compare.py (not served here)
- benchmarks/competitive/requirements/annoy.footprint.in (not served here)
- benchmarks/competitive/requirements/annoy.footprint.txt (not served here)
- benchmarks/competitive/requirements/annoy.in (not served here)
- benchmarks/competitive/requirements/annoy.txt (not served here)
- benchmarks/competitive/requirements/bm25s.footprint.in (not served here)
- benchmarks/competitive/requirements/bm25s.footprint.txt (not served here)
- benchmarks/competitive/requirements/bm25s.in (not served here)
- benchmarks/competitive/requirements/bm25s.txt (not served here)
- benchmarks/competitive/requirements/chroma.footprint.in (not served here)
- benchmarks/competitive/requirements/chroma.footprint.txt (not served here)
- benchmarks/competitive/requirements/chroma.in (not served here)
- benchmarks/competitive/requirements/chroma.txt (not served here)
- benchmarks/competitive/requirements/diskann.footprint.in (not served here)
- benchmarks/competitive/requirements/diskann.footprint.txt (not served here)
- benchmarks/competitive/requirements/diskann.in (not served here)
- benchmarks/competitive/requirements/diskann.txt (not served here)
- benchmarks/competitive/requirements/duckdb.footprint.in (not served here)
- benchmarks/competitive/requirements/duckdb.footprint.txt (not served here)
- benchmarks/competitive/requirements/duckdb.in (not served here)
- benchmarks/competitive/requirements/duckdb.txt (not served here)
- benchmarks/competitive/requirements/faiss.footprint.in (not served here)
- benchmarks/competitive/requirements/faiss.footprint.txt (not served here)
- benchmarks/competitive/requirements/faiss.in (not served here)
- benchmarks/competitive/requirements/faiss.txt (not served here)
- benchmarks/competitive/requirements/hnswlib.footprint.in (not served here)
- benchmarks/competitive/requirements/hnswlib.footprint.txt (not served here)
- benchmarks/competitive/requirements/hnswlib.in (not served here)
- benchmarks/competitive/requirements/hnswlib.txt (not served here)
- benchmarks/competitive/requirements/lancedb.footprint.in (not served here)
- benchmarks/competitive/requirements/lancedb.footprint.txt (not served here)
- benchmarks/competitive/requirements/lancedb.in (not served here)
- benchmarks/competitive/requirements/lancedb.txt (not served here)
- benchmarks/competitive/requirements/milvus.footprint.in (not served here)
- benchmarks/competitive/requirements/milvus.footprint.txt (not served here)
- benchmarks/competitive/requirements/milvus.in (not served here)
- benchmarks/competitive/requirements/milvus.txt (not served here)
- benchmarks/competitive/requirements/ngt.footprint.in (not served here)
- benchmarks/competitive/requirements/ngt.footprint.txt (not served here)
- benchmarks/competitive/requirements/ngt.in (not served here)
- benchmarks/competitive/requirements/ngt.txt (not served here)
- benchmarks/competitive/requirements/pynndescent.footprint.in (not served here)
- benchmarks/competitive/requirements/pynndescent.footprint.txt (not served here)
- benchmarks/competitive/requirements/pynndescent.in (not served here)
- benchmarks/competitive/requirements/pynndescent.txt (not served here)
- benchmarks/competitive/requirements/qdrant.footprint.in (not served here)
- benchmarks/competitive/requirements/qdrant.footprint.txt (not served here)
- benchmarks/competitive/requirements/qdrant.in (not served here)
- benchmarks/competitive/requirements/qdrant.txt (not served here)
- benchmarks/competitive/requirements/scann.footprint.in (not served here)
- benchmarks/competitive/requirements/scann.footprint.txt (not served here)
- benchmarks/competitive/requirements/scann.in (not served here)
- benchmarks/competitive/requirements/scann.txt (not served here)
- benchmarks/competitive/requirements/server-clients.footprint.in (not served here)
- benchmarks/competitive/requirements/server-clients.footprint.txt (not served here)
- benchmarks/competitive/requirements/server-clients.in (not served here)
- benchmarks/competitive/requirements/server-clients.txt (not served here)
- benchmarks/competitive/requirements/sqlite-vec.footprint.in (not served here)
- benchmarks/competitive/requirements/sqlite-vec.footprint.txt (not served here)
- benchmarks/competitive/requirements/sqlite-vec.in (not served here)
- benchmarks/competitive/requirements/sqlite-vec.txt (not served here)
- benchmarks/competitive/requirements/stdlib-prev.footprint.in (not served here)
- benchmarks/competitive/requirements/stdlib-prev.footprint.txt (not served here)
- benchmarks/competitive/requirements/stdlib-prev.in (not served here)
- benchmarks/competitive/requirements/stdlib-prev.txt (not served here)
- benchmarks/competitive/requirements/stdlib.footprint.in (not served here)
- benchmarks/competitive/requirements/stdlib.footprint.txt (not served here)
- benchmarks/competitive/requirements/stdlib.in (not served here)
- benchmarks/competitive/requirements/stdlib.txt (not served here)
- benchmarks/competitive/requirements/tantivy-prev.footprint.in (not served here)
- benchmarks/competitive/requirements/tantivy-prev.footprint.txt (not served here)
- benchmarks/competitive/requirements/tantivy-prev.in (not served here)
- benchmarks/competitive/requirements/tantivy-prev.txt (not served here)
- benchmarks/competitive/requirements/tantivy.footprint.in (not served here)
- benchmarks/competitive/requirements/tantivy.footprint.txt (not served here)
- benchmarks/competitive/requirements/tantivy.in (not served here)
- benchmarks/competitive/requirements/tantivy.txt (not served here)
- benchmarks/competitive/requirements/usearch.footprint.in (not served here)
- benchmarks/competitive/requirements/usearch.footprint.txt (not served here)
- benchmarks/competitive/requirements/usearch.in (not served here)
- benchmarks/competitive/requirements/usearch.txt (not served here)
- benchmarks/competitive/requirements/voyager.footprint.in (not served here)
- benchmarks/competitive/requirements/voyager.footprint.txt (not served here)
- benchmarks/competitive/requirements/voyager.in (not served here)
- benchmarks/competitive/requirements/voyager.txt (not served here)
- benchmarks/competitive/requirements/whoosh.footprint.in (not served here)
- benchmarks/competitive/requirements/whoosh.footprint.txt (not served here)
- benchmarks/competitive/requirements/whoosh.in (not served here)
- benchmarks/competitive/requirements/whoosh.txt (not served here)
- benchmarks/competitive/tests/test_ann_systems.py (not served here)
- benchmarks/competitive/tests/test_common.py (not served here)
- benchmarks/competitive/tests/test_server.py (not served here)
- benchmarks/competitive/tests/test_table.py (not served here)
- benchmarks/competitive/tests/test_text_systems.py (not served here)
- benchmarks/competitive/tests/test_warm_ann_build.py (not served here)
- benchmarks/competitive/warm-bench (not served here)
- benchmarks/competitive/warmbench/__init__.py (not served here)
- benchmarks/competitive/warmbench/_spawner.py (not served here)
- benchmarks/competitive/warmbench/analyze.py (not served here)
- benchmarks/competitive/warmbench/analyzer_latency.py (not served here)
- benchmarks/competitive/warmbench/ann_worker.py (not served here)
- benchmarks/competitive/warmbench/cli.py (not served here)
- benchmarks/competitive/warmbench/common.py (not served here)
- benchmarks/competitive/warmbench/data.py (not served here)
- benchmarks/competitive/warmbench/envs.py (not served here)
- benchmarks/competitive/warmbench/h5_convert.py (not served here)
- benchmarks/competitive/warmbench/jars.py (not served here)
- benchmarks/competitive/warmbench/land.py (not served here)
- benchmarks/competitive/warmbench/multilingual.py (not served here)
- benchmarks/competitive/warmbench/registry.py (not served here)
- benchmarks/competitive/warmbench/runner.py (not served here)
- benchmarks/competitive/warmbench/server_proc.py (not served here)
- benchmarks/competitive/warmbench/server_registry.py (not served here)
- benchmarks/competitive/warmbench/server_runner.py (not served here)
- benchmarks/competitive/warmbench/server_worker.py (not served here)
- benchmarks/competitive/warmbench/servers.py (not served here)
- benchmarks/competitive/warmbench/table.py (not served here)
- benchmarks/competitive/warmbench/text_worker.py (not served here)
- benchmarks/competitive/warmbench/textdata.py (not served here)
- benchmarks/cue_tags/cue_tagger.py (not served here)
- benchmarks/cue_tags/labels.csv (not served here)
- benchmarks/cue_tags/measure.py (not served here)
- benchmarks/cue_tags/sample.py (not served here)
- benchmarks/cue_tags/stale_arms.py (not served here)
- benchmarks/embedding/agreement.py (not served here)
- benchmarks/embedding/agreement_sample.json (not served here)
- benchmarks/embedding/assemble_selection.py (not served here)
- benchmarks/embedding/bench_torch_cpu.py (not served here)
- benchmarks/embedding/embed_store_bench.rs (not served here)
- benchmarks/embedding/pin_model.py (not served here)
- benchmarks/embedding/reference_granite-embedding-30m-english.json (not served here)
- benchmarks/embedding/run_engine_eval.py (not served here)
- benchmarks/embedding/run_store_eval.py (not served here)
- benchmarks/embedding/select_model.py (not served here)
- benchmarks/evidence/MANIFEST.json (not served here)
- benchmarks/evidence/README.md (not served here)
- benchmarks/evidence/retired-inputs.json (not served here)
- benchmarks/modal_benchmark.py (not served here)
- benchmarks/private_search/lattice_estimate.py (not served here)
- benchmarks/private_search/lwe_core_svp.py (not served here)
- benchmarks/public/accuracy_qualification/PLAN.json (not served here)
- benchmarks/public/accuracy_qualification/analyze.mjs (not served here)
- benchmarks/public/accuracy_qualification/prepare.py (not served here)
- benchmarks/public/accuracy_qualification/pyproject.toml (not served here)
- benchmarks/public/accuracy_qualification/run.mjs (not served here)
- benchmarks/public/accuracy_qualification/test-analyze.mjs (not served here)
- benchmarks/public/accuracy_qualification/test_prepare.py (not served here)
- benchmarks/public/accuracy_qualification/uv.lock (not served here)
- benchmarks/public/aml_cycle2/README.md (not served here)
- benchmarks/public/aml_cycle2/adapter.py (not served here)
- benchmarks/public/aml_cycle2/experimental/__init__.py (not served here)
- benchmarks/public/aml_cycle2/experimental/citation_matches.csv (not served here)
- benchmarks/public/aml_cycle2/experimental/evidence_selection.py (not served here)
- benchmarks/public/aml_cycle2/experimental/findings.json (not served here)
- benchmarks/public/aml_cycle2/experimental/semantic_cases.json (not served here)
- benchmarks/public/aml_cycle2/experimental/test_evidence_selection.py (not served here)
- benchmarks/public/aml_cycle2/gce_install.sh (not served here)
- benchmarks/public/aml_cycle2/local_host.py (not served here)
- benchmarks/public/aml_cycle2/modal_deploy.py (not served here)
- benchmarks/public/aml_cycle2/runtime-requirements.in (not served here)
- benchmarks/public/aml_cycle2/runtime-requirements.txt (not served here)
- benchmarks/public/aml_cycle2/test_adapter.py (not served here)
- benchmarks/public/aml_cycle2/test_local_host.py (not served here)
- benchmarks/public/aml_cycle2/test_query.py (not served here)
- benchmarks/public/analyze_glove_batch_pool.py (not served here)
- benchmarks/public/analyze_glove_batch_pool_feature.py (not served here)
- benchmarks/public/analyze_glove_batch_pool_isolation.py (not served here)
- benchmarks/public/analyze_glove_development.py (not served here)
- benchmarks/public/ann_extra.py (not served here)
- benchmarks/public/ann_failure_map.py (not served here)
- benchmarks/public/ann_modal_confirm.py (not served here)
- benchmarks/public/ann_modal_graph.py (not served here)
- benchmarks/public/ann_modal_repair.py (not served here)
- benchmarks/public/audit_calibration.py (not served here)
- benchmarks/public/audit_serving_job.py (not served here)
- benchmarks/public/batching_assemble.py (not served here)
- benchmarks/public/batching_compare.py (not served here)
- benchmarks/public/batching_inputs.py (not served here)
- benchmarks/public/batching_timing.py (not served here)
- benchmarks/public/bemula/README.md (not served here)
- benchmarks/public/bemula/run_warm.py (not served here)
- benchmarks/public/bemula/summarize.py (not served here)
- benchmarks/public/bemula/warm_adapter.py (not served here)
- benchmarks/public/build_native_bridge.py (not served here)
- benchmarks/public/check_algebraic_codebook_report.py (not served here)
- benchmarks/public/check_compaction_updates.py (not served here)
- benchmarks/public/check_competitive_ann.py (not served here)
- benchmarks/public/check_document_competition.py (not served here)
- benchmarks/public/check_document_operations.py (not served here)
- benchmarks/public/check_document_search_compare.py (not served here)
- benchmarks/public/check_document_sqlite_rank_control.py (not served here)
- benchmarks/public/check_encoder_version_diagnostic.py (not served here)
- benchmarks/public/check_evidence_budget.py (not served here)
- benchmarks/public/check_evidence_completeness.py (not served here)
- benchmarks/public/check_factored_evidence.py (not served here)
- benchmarks/public/check_geometry_report.py (not served here)
- benchmarks/public/check_learned_sparse.py (not served here)
- benchmarks/public/check_lexical_relevance.py (not served here)
- benchmarks/public/check_longmemeval_answers.py (not served here)
- benchmarks/public/check_longmemeval_complete_history.py (not served here)
- benchmarks/public/check_longmemeval_full_history.py (not served here)
- benchmarks/public/check_longmemeval_production.py (not served here)
- benchmarks/public/check_longmemeval_role_reader.py (not served here)
- benchmarks/public/check_longmemeval_user_first.py (not served here)
- benchmarks/public/check_longmemeval_verifier.py (not served here)
- benchmarks/public/check_manifold_report.py (not served here)
- benchmarks/public/check_manifold_schema_report.py (not served here)
- benchmarks/public/check_native_harness.py (not served here)
- benchmarks/public/check_operand_report.py (not served here)
- benchmarks/public/check_operand_tampering.py (not served here)
- benchmarks/public/check_phase_path_report.py (not served here)
- benchmarks/public/check_publication_serving.py (not served here)
- benchmarks/public/check_reader_suspensions.py (not served here)
- benchmarks/public/check_sparse_composition.py (not served here)
- benchmarks/public/check_superiority_checkpoint.py (not served here)
- benchmarks/public/check_weak_reader_evidence.py (not served here)
- benchmarks/public/compact_owned_publication.py (not served here)
- benchmarks/public/compaction_updates.py (not served here)
- benchmarks/public/compare_fact_caches.py (not served here)
- benchmarks/public/competitive_ann.py (not served here)
- benchmarks/public/direct_commit_publication.py (not served here)
- benchmarks/public/document_competition.py (not served here)
- benchmarks/public/document_search_compare.py (not served here)
- benchmarks/public/document_sqlite_rank_control.py (not served here)
- benchmarks/public/durability_matrix.py (not served here)
- benchmarks/public/encoder_version_diagnostic.py (not served here)
- benchmarks/public/evaluate.py (not served here)
- benchmarks/public/evidence_budget_diagnostic.py (not served here)
- benchmarks/public/evidence_completeness.py (not served here)
- benchmarks/public/factored_evidence_diagnostic.py (not served here)
- benchmarks/public/geometry_experiments.py (not served here)
- benchmarks/public/instrument_publication.py (not served here)
- benchmarks/public/learned_sparse_dense_tune.py (not served here)
- benchmarks/public/learned_sparse_encode.py (not served here)
- benchmarks/public/learned_sparse_results.py (not served here)
- benchmarks/public/lexical_relevance_tune.py (not served here)
- benchmarks/public/lme_context/README.md (not served here)
- benchmarks/public/lme_context/breakdown.py (not served here)
- benchmarks/public/lme_context/extract_modal.py (not served here)
- benchmarks/public/lme_context/prep_extract.py (not served here)
- benchmarks/public/lme_context/render.py (not served here)
- benchmarks/public/lme_context/run_arm.py (not served here)
- benchmarks/public/locomo/assemble_results.py (not served here)
- benchmarks/public/locomo/locomo_bench.py (not served here)
- benchmarks/public/locomo/mem0_prompts.py (not served here)
- benchmarks/public/locomo/test_locomo_bench.py (not served here)
- benchmarks/public/locomo_comparison.py (not served here)
- benchmarks/public/longmemeval_500_frozen_config.json (not served here)
- benchmarks/public/longmemeval_answer_evidence.py (not served here)
- benchmarks/public/longmemeval_compact_context.py (not served here)
- benchmarks/public/longmemeval_complete_history.py (not served here)
- benchmarks/public/longmemeval_config.json (not served here)
- benchmarks/public/longmemeval_dev_conversations.py (not served here)
- benchmarks/public/longmemeval_dev_sources.py (not served here)
- benchmarks/public/longmemeval_full_history.py (not served here)
- benchmarks/public/longmemeval_history_budget.py (not served here)
- benchmarks/public/longmemeval_incremental_judges.py (not served here)
- benchmarks/public/longmemeval_local_modal.py (not served here)
- benchmarks/public/longmemeval_local_reader.py (not served here)
- benchmarks/public/longmemeval_memory_recall.py (not served here)
- benchmarks/public/longmemeval_modal.py (not served here)
- benchmarks/public/longmemeval_obligations.py (not served here)
- benchmarks/public/longmemeval_official_qa.py (not served here)
- benchmarks/public/longmemeval_official_qa_500.py (not served here)
- benchmarks/public/longmemeval_pipeline.py (not served here)
- benchmarks/public/longmemeval_production.py (not served here)
- benchmarks/public/longmemeval_qa_l01.py (not served here)
- benchmarks/public/longmemeval_quality.py (not served here)
- benchmarks/public/longmemeval_quota.py (not served here)
- benchmarks/public/longmemeval_reader_api.py (not served here)
- benchmarks/public/longmemeval_reader_api_v2.py (not served here)
- benchmarks/public/longmemeval_reader_budget.py (not served here)
- benchmarks/public/longmemeval_retrieval.py (not served here)
- benchmarks/public/longmemeval_retrieval_limits.py (not served here)
- benchmarks/public/longmemeval_role_reader.py (not served here)
- benchmarks/public/longmemeval_role_retrieval.py (not served here)
- benchmarks/public/longmemeval_run_preopen.sh (not served here)
- benchmarks/public/longmemeval_run_preopen_r3.sh (not served here)
- benchmarks/public/longmemeval_session_closure.py (not served here)
- benchmarks/public/longmemeval_sota.py (not served here)
- benchmarks/public/longmemeval_sota_closure.py (not served here)
- benchmarks/public/longmemeval_sota_context.py (not served here)
- benchmarks/public/longmemeval_sota_expand.py (not served here)
- benchmarks/public/longmemeval_sota_hybrid.py (not served here)
- benchmarks/public/longmemeval_sota_receipts.py (not served here)
- benchmarks/public/longmemeval_sota_replay.py (not served here)
- benchmarks/public/longmemeval_sota_report.py (not served here)
- benchmarks/public/longmemeval_split.json (not served here)
- benchmarks/public/longmemeval_split.py (not served here)
- benchmarks/public/longmemeval_sweep.py (not served here)
- benchmarks/public/longmemeval_user_first.py (not served here)
- benchmarks/public/longmemeval_verifier.py (not served here)
- benchmarks/public/longmemeval_verifier_sources.py (not served here)
- benchmarks/public/longmemeval_weak_reader.py (not served here)
- benchmarks/public/lucene_hnsw/LuceneHnsw.java (not served here)
- benchmarks/public/matched_server/PLAN.json (not served here)
- benchmarks/public/matched_server/adapters.py (not served here)
- benchmarks/public/matched_server/calibrate.py (not served here)
- benchmarks/public/matched_server/check_adapters.py (not served here)
- benchmarks/public/matched_server/check_measure.py (not served here)
- benchmarks/public/matched_server/check_qualification.py (not served here)
- benchmarks/public/matched_server/claim_gate.py (not served here)
- benchmarks/public/matched_server/diagnose_search.py (not served here)
- benchmarks/public/matched_server/distribution.py (not served here)
- benchmarks/public/matched_server/measure.py (not served here)
- benchmarks/public/matched_server/oracle.py (not served here)
- benchmarks/public/matched_server/prepare_inputs.py (not served here)
- benchmarks/public/matched_server/pyproject.toml (not served here)
- benchmarks/public/matched_server/qualify.py (not served here)
- benchmarks/public/matched_server/seal_qualification.py (not served here)
- benchmarks/public/matched_server/test_claim_gate.py (not served here)
- benchmarks/public/matched_server/test_distribution.py (not served here)
- benchmarks/public/matched_server/test_measure.py (not served here)
- benchmarks/public/matched_server/test_prepare_inputs.py (not served here)
- benchmarks/public/matched_server/test_protocol.py (not served here)
- benchmarks/public/matched_server/test_qualify.py (not served here)
- benchmarks/public/matched_server/test_seal_qualification.py (not served here)
- benchmarks/public/matched_server/uv.lock (not served here)
- benchmarks/public/matched_server/verify_evidence.py (not served here)
- benchmarks/public/mem0_protocol/README.md (not served here)
- benchmarks/public/mem0_protocol/budget_ledger.py (not served here)
- benchmarks/public/mem0_protocol/clear_failed.py (not served here)
- benchmarks/public/mem0_protocol/grade_validation.py (not served here)
- benchmarks/public/mem0_protocol/live_smoke.py (not served here)
- benchmarks/public/mem0_protocol/manifest_template.json (not served here)
- benchmarks/public/mem0_protocol/openai_proxy.py (not served here)
- benchmarks/public/mem0_protocol/price.py (not served here)
- benchmarks/public/mem0_protocol/protocol_scope.py (not served here)
- benchmarks/public/mem0_protocol/quota_resume.py (not served here)
- benchmarks/public/mem0_protocol/retrieval_config.json (not served here)
- benchmarks/public/mem0_protocol/retrieval_config_count_matched.json (not served here)
- benchmarks/public/mem0_protocol/retrieval_config_hybrid_dev.json (not served here)
- benchmarks/public/mem0_protocol/retrieval_config_ordered_dev.json (not served here)
- benchmarks/public/mem0_protocol/reuse_locomo_dev.py (not served here)
- benchmarks/public/mem0_protocol/run_mem0_protocol.py (not served here)
- benchmarks/public/mem0_protocol/shim.py (not served here)
- benchmarks/public/mem0_protocol/test_budget_ledger.py (not served here)
- benchmarks/public/mem0_protocol/test_clear_failed.py (not served here)
- benchmarks/public/mem0_protocol/test_openai_proxy.py (not served here)
- benchmarks/public/mem0_protocol/test_quota_resume.py (not served here)
- benchmarks/public/mem0_protocol/test_reuse_locomo_dev.py (not served here)
- benchmarks/public/mem0_protocol/test_run_mem0_protocol.py (not served here)
- benchmarks/public/mem0_protocol/test_shim.py (not served here)
- benchmarks/public/mobile_qualification/ANDROID-PLAN.json (not served here)
- benchmarks/public/mobile_qualification/IOS-PLAN.json (not served here)
- benchmarks/public/mobile_qualification/PLAN.json (not served here)
- benchmarks/public/mobile_qualification/RecoveryConsumerTest.kt (not served here)
- benchmarks/public/native_bridge/Cargo.toml (not served here)
- benchmarks/public/native_bridge/build.rs (not served here)
- benchmarks/public/native_bridge/src/lib.rs (not served here)
- benchmarks/public/native_bridge/src/vertex_support.rs (not served here)
- benchmarks/public/native_harness.py (not served here)
- benchmarks/public/native_recovery/PLAN.json (not served here)
- benchmarks/public/native_recovery/Program.cs (not served here)
- benchmarks/public/native_recovery/RecoveryConsumer.java (not served here)
- benchmarks/public/native_recovery/recovery.c (not served here)
- benchmarks/public/native_recovery/recovery.go (not served here)
- benchmarks/public/native_recovery/run.py (not served here)
- benchmarks/public/native_recovery/test_protocol.py (not served here)
- benchmarks/public/node_recovery.cjs (not served here)
- benchmarks/public/operand_experiment.py (not served here)
- benchmarks/public/platform_microbench_aggregate.py (not served here)
- benchmarks/public/platform_modal_avx512.py (not served here)
- benchmarks/public/platform_modal_e2e.py (not served here)
- benchmarks/public/platform_paired.py (not served here)
- benchmarks/public/prepare.py (not served here)
- benchmarks/public/prepare_ann_scale.py (not served here)
- benchmarks/public/proxies/ann_proxies.py (not served here)
- benchmarks/public/proxies/beir_proxies.py (not served here)
- benchmarks/public/proxies/lme_proxies.py (not served here)
- benchmarks/public/proxies/qgraph_sim.py (not served here)
- benchmarks/public/proxies/stop_screen_report.py (not served here)
- benchmarks/public/publication_serving.py (not served here)
- benchmarks/public/publication_serving.rs (not served here)
- benchmarks/public/publication_trace.rs (not served here)
- benchmarks/public/python_sdk_recovery.py (not served here)
- benchmarks/public/qag_serving_execute.py (not served here)
- benchmarks/public/qag_serving_module.py (not served here)
- benchmarks/public/qgraph_paired.py (not served here)
- benchmarks/public/qgraph_table.py (not served here)
- benchmarks/public/reader_protocol_v1.json (not served here)
- benchmarks/public/remote_document_pilot.py (not served here)
- benchmarks/public/replay_capacity_publication.py (not served here)
- benchmarks/public/report_sparse_composition.py (not served here)
- benchmarks/public/restore_ann_checkpoint.py (not served here)
- benchmarks/public/resume_longmemeval_readers.py (not served here)
- benchmarks/public/run_glove_batch_pool_ablation.py (not served here)
- benchmarks/public/run_glove_batch_pool_feature.py (not served here)
- benchmarks/public/run_glove_batch_pool_isolation.py (not served here)
- benchmarks/public/run_glove_candidate_checks.py (not served here)
- benchmarks/public/run_glove_development.py (not served here)
- bindings/js/warm-sdk/LICENSE
- docs/ARCHITECTURE.md
- docs/COMPARISON.md
- docs/DETERMINISTIC-RESONATOR.md
- docs/GOVERNANCE.md
- docs/INTEGRATION.md
- docs/PREREGISTRATION-binding-readout.md
- docs/PRIVACY.md
- docs/PRIVATE-SEARCH.md
- docs/PUBLIC-BENCHMARKS.md
- docs/RELEASING.md
- docs/RESEARCH.md
- docs/SECURITY.md
- docs/SERVER.md
- docs/STABILITY.md
- docs/SUPERPOSITION-FLOOR.md
- docs/assets/fonts/LICENSE-OFL.txt
- docs/evaluation.md
- docs/index.md
- docs/production-readiness.md
- integrations/mcp/npm/LICENSE
- integrations/mcp/pypi/LICENSE
- tests/fixtures/vectra-0.15/LICENSE
Advantages
- Supports local-first operation with no external service calls or telemetry. evidence: README.md
- Provides a memory API that allows for explicit fact removal via a forget operation. evidence: README.md
Limitations
- The system supports only one writer per store. evidence: README.md
- The vector index build time and serving RSS are currently behind hnswlib on SIFT-1M benchmarks. evidence: README.md
Security
Risk level: Medium risk
This brain runs
Install scripts (1)
benchmarks/results/sbg_positions_development/setup.sh:sh benchmarks/results/sbg_positions_development/setup.sh
MCP servers (3)
integrations/editors/claude-code/plugin/.mcp.json(writerslogic-warm):npx -y writerslogic-warm-mcpintegrations/editors/claude-desktop/claude_desktop_config.json(writerslogic-warm):npx -y writerslogic-warm-mcpintegrations/editors/gemini-cli/gemini-extension.json(writerslogic-warm):npx -y writerslogic-warm-mcp
Hooks (1)
integrations/editors/claude-code/plugin/hooks/hooks.json(SessionStart):node
- Medium risk: runs-mcp-server-unpinned-runner (integrations/editors/claude-code/plugin/.mcp.json)
- Medium risk: runs-mcp-server-unpinned-runner (integrations/editors/claude-desktop/claude_desktop_config.json)
- Medium risk: runs-mcp-server-unpinned-runner (integrations/editors/gemini-cli/gemini-extension.json)
- Low risk: scripts-present (benchmarks/results/sbg_positions_development/setup.sh)
Attribution and licence
- Created by
- Writerslogic
- Declared authors
- WritersLogic, Inc. (declared in package.json)
- WritersLogic, Inc. (declared in pyproject.toml)
- WritersLogic Contributors (declared in CITATION.cff)
- Publisher
- Writerslogic (Official Writerslogic project)
- Source
- writerslogic/warm · commit e176d55
- Licence
- Apache License 2.0 (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Writerslogic.
Install from source
481 of its files are not served here, so there is no ZIP. writerslogic/warm at e176d55