warm-rust 0.6.5

Local-first search engine and agent memory: fast approximate nearest-neighbor and BM25 full-text search, encrypted stores, provable deletion, built on vector-symbolic architectures.
Documentation
{#- Copyright 2024-2026 WritersLogic Contributors
    SPDX-License-Identifier: Apache-2.0
    The landing page. Every runtime, feature and number comes from config.extra.warm, which
    scripts/docs_site.py builds from docs/_data/site.yml and benchmarks/results/. -#}
{% extends "main.html" %}
{% set warm = config.extra.warm %}

{% block site_nav %}{% endblock %}

{% block container %}
<div class="md-content warm-home" data-md-component="content">
  <article class="md-content__inner md-typeset">

    <section class="warm-hero" aria-labelledby="warm-hero-title">
      <div class="warm-hero__text">
        <p class="warm-chip"><span class="warm-dot" aria-hidden="true"></span>{{ warm.license }} &middot; {{ warm.crate_version and ('v' ~ warm.crate_version) or 'open source' }} &middot; runs on your machine</p>
        <h1 id="warm-hero-title">WARM</h1>
        <p class="warm-technical-line">{{ warm.technical_line }}</p>
        <p class="warm-tagline">{{ warm.tagline }}</p>
        <p class="warm-lede">{{ warm.lede }}</p>
        <div class="warm-cta">
          <a class="warm-btn warm-btn--primary" href="{{ 'quickstart/' | url }}">Get started</a>
          <a class="warm-btn" href="{{ 'concepts/holographic/' | url }}">What &ldquo;holographic&rdquo; means</a>
          <a class="warm-btn warm-btn--ghost" href="{{ config.repo_url }}">GitHub</a>
        </div>
        <ul class="warm-runtimes" aria-label="Runtimes">
          {% for rt in warm.runtimes %}<li class="{{ 'is-preview' if rt.status == 'preview' }}">{{ rt.name }}{% if rt.status == 'preview' %} <small>preview</small>{% endif %}</li>{% endfor %}
        </ul>
      </div>
      <div class="warm-hero__art" aria-hidden="true">
        <img src="{{ config.theme.logo }}" width="520" height="520" alt="" class="warm-crystal" fetchpriority="high">
      </div>
    </section>

    <section class="warm-section" aria-labelledby="start-title">
      <h2 id="start-title">What are you building?</h2>
      <p class="warm-sub">Choose a path, run an example, then inspect the evidence it returns.</p>
      <div class="warm-grid">
        <a class="warm-card warm-feature" href="{{ 'integrations/editors/' | url }}"><h3>Memory for an editor</h3><p>Connect an MCP host to a local store. Remember, recall and inspect memories across sessions.</p></a>
        <a class="warm-card warm-feature" href="{{ 'get-started/choose/' | url }}"><h3>Search inside an app</h3><p>Choose Rust, Node or a Python HTTP client, with clear package and storage boundaries.</p></a>
        <a class="warm-card warm-feature" href="{{ 'guides/evaluate-search/' | url }}"><h3>Evaluate your results</h3><p>Check known answers, inspect source passages and compare retrieval on your own questions.</p></a>
      </div>
      <p class="warm-fine">Already installing? <a href="{{ 'get-started/troubleshooting/' | url }}">Troubleshoot setup and retrieval</a>.</p>
    </section>

    <section class="warm-section" id="install" aria-labelledby="install-title">
      <h2 id="install-title">Install, ingest, search</h2>
      <p class="warm-sub">The code below is read from the quickstart examples that CI runs on every pull request.</p>
      {% set rts = warm.runtimes | selectattr("status", "equalto", "available") | list %}
      <div class="tabbed-set tabbed-alternate warm-install" data-tabs="1:{{ rts | length }}">
        {% for rt in rts %}<input {{ 'checked="checked"' if loop.first }} id="__tabbed_1_{{ loop.index }}" name="__tabbed_1" type="radio">{% endfor %}
        <div class="tabbed-labels">
          {% for rt in rts %}<label for="__tabbed_1_{{ loop.index }}">{{ rt.name }}</label>{% endfor %}
        </div>
        <div class="tabbed-content">
          {% for rt in rts %}
          <div class="tabbed-block">
            {{ rt.install_html }}
            {{ rt.code_html }}
            <p class="warm-note">{{ rt.note }}</p>
          </div>
          {% endfor %}
        </div>
      </div>
      <p class="warm-more"><a href="{{ 'quickstart/' | url }}">Full quickstart with the SQLite comparison and encryption &rarr;</a></p>
    </section>

    <section class="warm-section warm-band" id="results" aria-labelledby="results-title">
      <h2 id="results-title">Measured, and traceable</h2>
      <p class="warm-sub">Both results are read from committed files under <code>benchmarks/results/</code> each time the site is built.</p>
      <div class="warm-results">
        <figure class="warm-card warm-result">
          <figcaption>
            <span class="warm-kicker">{{ warm.headline.title }}</span>
            <span class="warm-big">{{ '%.3f' | format(warm.headline.value) }}</span>
            <span class="warm-metric">{{ warm.headline.metric_label }}, WARM hybrid search</span>
          </figcaption>
          {{ warm.headline.svg }}
          <p class="warm-fine">{{ warm.headline.context }} {{ warm.headline.caveat }}</p>
          <p class="warm-prov">Source: <a href="{{ warm.repo }}/blob/{{ warm.repo_ref }}/{{ warm.headline.file }}"><code>{{ warm.headline.file }}</code></a>{% if warm.headline.machine %} &middot; {{ warm.headline.machine }}{% endif %} &middot; <a href="{{ warm.headline.link | url }}">benchmark page</a></p>
        </figure>
        <figure class="warm-card warm-result">
          <figcaption>
            <span class="warm-kicker">{{ warm.chart.title }}</span>
            <span class="warm-metric warm-metric--lead">Queries per second at fixed recall, one thread</span>
          </figcaption>
          {{ warm.chart.svg }}
          <ul class="warm-fine warm-summary">{% for line in warm.chart.summary %}<li>{{ line }}</li>{% endfor %}</ul>
          <p class="warm-prov">Source: <a href="{{ warm.repo }}/blob/{{ warm.repo_ref }}/{{ warm.chart.file }}"><code>{{ warm.chart.file }}</code></a> &middot; {{ warm.chart.machine }} &middot; load gate met by {{ warm.chart.gate_met }} of {{ warm.chart.gate_total }} configurations (limit {{ warm.chart.max_load }}), so throughput is indicative &middot; <a href="{{ warm.chart.link | url }}">benchmark page</a></p>
        </figure>
      </div>
    </section>

    <section class="warm-section" id="architecture" aria-labelledby="arch-title">
      <h2 id="arch-title">One engine, two layers</h2>
      <p class="warm-sub">Document search is a conventional hybrid retriever. The vector-symbolic layer is the associative memory. Both sit on one crash-safe store. <a href="{{ 'ARCHITECTURE/' | url }}">Module map &rarr;</a></p>
      <div class="warm-diagram" tabindex="0" role="region" aria-label="Architecture diagram">{% include "partials/architecture.html" %}</div>
    </section>

    <section class="warm-section warm-band" id="why" aria-labelledby="why-title">
      <h2 id="why-title">Why holographic</h2>
      <div class="warm-why">
        <div class="warm-why__text">
          <p>A hologram stores the whole picture in every fragment. A hypervector memory does the same: many facts are superposed into one long vector, no single bit holds any one fact, and damage is spread thinly over all of them.</p>
          <ol class="warm-steps">
            <li><strong>Bind</strong> a key to a value with XOR. The result looks like neither, and binding again with the key gives the value back.</li>
            <li><strong>Bundle</strong> many bound pairs by majority vote into one vector that stays a little similar to each of them.</li>
            <li><strong>Resonate</strong>: unbind with a key and compare against known values. The right one stands out from the noise, even after you corrupt the memory.</li>
          </ol>
          <p class="warm-fine">The demo uses dense binary vectors so the algebra is easy to see. The engine uses sparse binary vectors, and its document search does not rank with hypervectors; <a href="{{ 'concepts/holographic/' | url }}">the concepts page</a> says exactly which parts do.</p>
        </div>
        {% include "partials/demo.html" %}
      </div>
    </section>

    <section class="warm-section" id="compare" aria-labelledby="compare-title">
      <h2 id="compare-title">{{ warm.comparison.title }}</h2>
      {# Comparison slot: docs/_data/comparison.json, written by the benchmark generator, replaces the derived table. #}
      <div class="warm-tablewrap" tabindex="0" role="region" aria-label="Comparison table">
        <table class="warm-compare">
          <thead><tr><th scope="col">System</th>{% for col in warm.comparison.columns %}<th scope="col" class="num">{{ col }}</th>{% endfor %}</tr></thead>
          <tbody>
            {% for row in warm.comparison.rows %}
            <tr class="{{ 'is-warm' if row.warm }}"><th scope="row">{{ row.system }}</th>{% for v in row['values'] %}<td class="num">{{ v }}</td>{% endfor %}</tr>
            {% endfor %}
          </tbody>
        </table>
      </div>
      <p class="warm-fine">{{ warm.comparison.note }} {% if warm.comparison.source %}Source: <a href="{{ warm.repo }}/blob/{{ warm.repo_ref }}/{{ warm.comparison.source }}"><code>{{ warm.comparison.source }}</code></a>.{% endif %}</p>
    </section>

    <section class="warm-section" id="features" aria-labelledby="features-title">
      <h2 id="features-title">What is in the box</h2>
      <div class="warm-grid">
        {% for f in warm.features %}
        <a class="warm-card warm-feature" href="{{ f.href | url }}">
          <h3>{{ f.title }}</h3>
          <p>{{ f.body }}</p>
        </a>
        {% endfor %}
      </div>
    </section>

    <section class="warm-section warm-prose" aria-label="About this site">
      {{ page.content }}
    </section>

  </article>
</div>
{% endblock %}