Independent verification for AI citations

Catch your AI citing sources that don't say what it claims.

Memora is the independent check that proves your AI's citations are real. It re-reads the exact source span behind every citation, recomputes its hash, and rejects anything the source does not contain before the answer ships. Deterministic and provider-agnostic: it verifies any model over your own sources, and never asks a second model to grade the first. Run it in CI, in your eval suite, or at request time.

your model shouldn't grade its own homework.

100% of fabricated citations rejected in the bundled eval · local-first by default · single Rust binary · Apache-2.0
memora demo
✓ VERIFIEDWe chose MessagePack for drift's serialization format.
source verbatim contains this; hash matches
✗ REJECTEDThe stack runs on PostgreSQL with three hot replicas.
cited a claim id that does not exist (hallucinated)
⚠ SUPERSEDEDAuth uses short-lived JWTs.
claim was retracted (valid_until has passed)
1 verified3 rejected1 superseded
A naive tool returns all of it as fact. memora returns only what it could prove: "We chose MessagePack for drift's serialization format."
The problem

Prompt-level "please cite your sources" does not survive a confident model.

RAG over notes, second-brain wrappers, and agent memory layers retrieve text and then trust the model to quote it faithfully. When it invents a meeting, misquotes a decision, or cites a source that does not contain the claim, there is no structural defense. You catch the hallucination yourself, or you ship it.

How it works

Three steps, one guarantee.

01

Extract atomic claims

Memora turns prose into subject-predicate-object claims, each pinned to a byte-range span in your markdown and fingerprinted with a full-width blake3 hash.

02

The model cites claim IDs

When it answers, the model references claims by ID. Retrieval is hybrid: BM25 plus vector search plus reciprocal-rank fusion over your claim graph.

03

Re-read, re-hash, reject

The validator re-reads each cited span, recomputes the hash, and strips any citation that does not match. The model is retried with verified context only.

Source · markdown in your vault
---
region: projects/drift
privacy: private
updated: 2025-09-12
---

## serialization update

drift switched serialization from JSON to MessagePack after benchmarks showed 3x throughput.
Claim · stored in SQLite + HNSW
verified
subjectdrift predicateuses_serialization objectmessagepack sourceroadmap.md span184 .. 281 fingerprintblake3:9a4e2f1c…e3b92f7d valid_from2025-09-12 privacyprivate
Put it in your pipeline

Fail the build when the AI cites something false.

memora verify checks an answer's citations against your sources and exits non-zero if any cannot be proven. Drop it into your eval suite or CI and a hallucinated citation never reaches production. Deterministic, provider-agnostic, and it adds no extra LLM call.

# locally, or inside your AI eval suite
memora verify --vault ./sources answer.txt # exit 1 if a citation is unprovable

# or as a step in GitHub Actions
- uses: radotsvetkov/memora/.github/actions/verify@main
  with:
    vault: ./sources
    file: ./agent-output.txt

Building in Python? It drops into your eval suite in one line.

# pip install memora-verify
from memora_verify import assert_cited

def test_answer_is_grounded():
  assert_cited(my_rag_app(question), vault="./sources") # raises on any unprovable citation

It verifies any model's output over your own corpus, so the check is independent of the thing it's checking. An optional --entailment pass adds a best-effort look at whether the source actually supports the claim, kept clearly separate from the hash-proven part.

Proof

See it catch a hallucination in 10 seconds.

No vault, no API key, no network. memora demo builds an ephemeral vault, feeds the real validator an AI answer containing one of every kind of bad citation, and shows the verdict. It is the same check memora query runs on every answer.

$ memora demo
✓ VERIFIEDWe chose "MessagePack" for drift's serialization format.
source verbatim contains this; hash matches
✗ REJECTEDThe launch is "set for April 1".
quoted text is not in the cited source span
✗ REJECTEDThe stack runs on PostgreSQL with three hot replicas.
cited a claim id that does not exist (hallucinated)
✗ REJECTEDThe API "uses gRPC streaming".
source span changed since extraction — hash mismatch
⚠ SUPERSEDEDAuth "uses short-lived JWTs".
claim was superseded/retracted (valid_until has passed)
1 verified3 rejected1 superseded
Why memora

Hallucinated citations are a data-model problem.

Atomic claims

Subject-predicate-object triples, small enough to verify and large enough to reason over.

Span fingerprint

A full-width blake3 hash of the exact source bytes. Edit the note and the hash changes.

Citation validator

Re-reads each cited span, recomputes the hash, and rejects mismatches before output ships.

Verified-only retry

Invented claim IDs are stripped, and the model is re-prompted with verified context only.

Time-aware

Claims carry valid_from and valid_until. Superseded claims are flagged, not asserted as current.

Privacy bands

Secret content is redacted at one type-enforced wire boundary before any cloud call.

Provenance + staleness

Synthesis claims point to their sources. Edit a source and dependent claims fall stale.

Ingest anything

Pull PDFs, web pages, and meeting transcripts into the vault as verifiable notes with memora ingest.

Visual report

memora report renders the whole vault — an interactive claim graph, contradictions, stale dependencies, the world map — as one offline HTML file.

Local-first binary

Rust, SQLite, and HNSW. No Postgres, no Pinecone, no Node. Fully offline with Ollama or a bundled on-device embedder.

What it guarantees

Provenance integrity. The cited source verbatim contains the quoted text and is unmodified, proven by hash. That is stricter than model-asserted citation APIs, which never re-read the source.

What it does not guarantee

Entailment. Provenance proves the source says the quoted text, not that it supports your conclusion. memora verify --entailment adds an optional, LLM-judged check for that, kept clearly separate from the proof. We tell you exactly where the hard guarantee ends, because that line is the point.

How it compares

One claim no funded vendor makes.

Mem0, Zep, Letta, and Cognee store and recall memory well, but none re-read the source and reject a citation whose bytes do not match. Anthropic's Citations API asserts citations from the model without re-hashing them. Memora is behind on scale, integrations, and ecosystem, and it would rather you knew.

Read the honest comparison →

Get started

Up and running in a minute.

One binary, no daemon. Start with the offline demo, then point it at your own vault.

# No vault, no API key, no network. Watch it reject fabricated citations.
memora demo
memora demo --open # also opens an HTML Proof Report
# Homebrew (macOS and Linux)
brew install radotsvetkov/memora/memora

# Or with cargo
cargo install memora-cli

# Or the release installer script
curl --proto '=https' --tlsv1.2 -LsSf \
  https://github.com/radotsvetkov/memora/releases/latest/download/memora-cli-installer.sh | sh
git clone https://github.com/radotsvetkov/memora
cd memora
# Stable Rust, MSRV 1.75
cargo build --release
# Add to your Claude Desktop / Cursor MCP config
{
  "mcpServers": {
    "memora": {
      "command": "/usr/local/bin/memora-mcp",
      "env": { "MEMORA_VAULT": "/path/to/your/vault" }
    }
  }
}
# For Python AI teams: verify citations in your eval suite / CI
pip install memora-verify

from memora_verify import assert_cited
assert_cited(answer, vault="./sources") # raises on any unprovable citation
# Fully local: pull a model and an embedder
ollama pull llama3.2:3b
ollama pull nomic-embed-text

# Point memora at Ollama in .memora/config.toml, then query offline
memora query "summarize this week's decisions" --vault ~/brain

Then bring in documents and see the whole picture: memora ingest <file|url> adds PDFs, web pages, and transcripts as verifiable notes, and memora report --open renders an interactive claim-graph overview.

Cite, or it didn't happen.

Verifiable memory for your notes and your agents. Single binary, no subscription, every citation auditable.