New XERJ Query-1, answers that show their work →

The search engine for AI agents, with a neurosymbolic model inside.

Search in milliseconds on your own CPU, local and offline, MCP-ready. XERJ Query-1 turns questions into small programs and answers with the evidence.

Give this to your AI agent
Set up XERJ for me, following https://xerj.org/llms.txt.
1. Install XERJ with the XERJ Query-1 model and start it.
2. Index the folder I point you to (ask before reading anything outside it) and run one search.
3. Write three facts from that data into a facts namespace and ask XERJ Query-1 one question about them. Show me the answer, the program and the evidence.
4. Set up reference coding: index one open-source repo close to this project and look up one definition in it.
5. If this client takes MCP servers, register XERJ (llms.txt has the line for each client) and save one memory note through it.
If you have no shell, use the HTTP or MCP steps in llms.txt instead.

Check it worked: curl -s localhost:9200/_facts | grep -o '"state":"loaded"' prints "state":"loaded" (empty for a few seconds while the model loads).

No shell: HTTP and MCP steps in llms.txt. Install it yourself: curl -fsSL https://xerj.org/get | sh -s -- --with-model on Linux and macOS; Windows and other targets: install.

Why now

Agents now do a growing share of the searching. Every answer they get from a language model costs seconds and money, and comes back as text nobody checked. XERJ moves that work into the index: search in milliseconds, and answers computed as small programs over your own facts, each with the evidence it used.

For developers whose coding agents need real code, and for teams whose data cannot leave their network.

Programs, not prose.

XERJ Query-1 writes a short program and the engine runs it. No fact, no answer: it says UNKNOWN.

One binary, no stack.

Search, vectors, facts, memory and an Elasticsearch-compatible API in one Rust binary.

Your data stays put.

Runs offline on a CPU, on a laptop or a server inside your network.

Your data (folders and S3, code repos, Postgres, facts) goes into one XERJ binary on a CPU that holds keyword and vector search, facts with XERJ Query-1, memory and graph, and an Elasticsearch-compatible API; AI agents, your apps and Elasticsearch clients call it, and an outside model is off unless you turn it on.Your data (folders and S3, code repos, Postgres, facts) goes into one XERJ binary on a CPU that holds keyword and vector search, facts with XERJ Query-1, memory and graph, and an Elasticsearch-compatible API; AI agents, your apps and Elasticsearch clients call it, and an outside model is off unless you turn it on.
How the pieces fit. Postgres sync ships in rc.102.

Measured

A program on a CPU instead of a model call per question.

WhatXERJThe usual wayHow we got it
Time from question to answerabout 220 ms, XERJ Query-1 on 4 laptop CPU cores1.5 to 2.3 s, Opus 5.5 writing a RAG answer (API time)Measured, same 160 questions
Cost per million questions$42 of CPU, not counting writing the facts$13,400 to $21,000 RAG; $65,400 GraphRAG; up to $694,000 with Opus reading the whole storePriced from measured tokens and list prices
Wrong answers out of 1601 (35 declined)9 to 15, RAG on Opus 5.5 searching one merged store. Opus 5.5 given the same records: 5; our sample can't tell 1 from 5 apart.Measured on our development set; Query-1 was given each question's own records
What you run1 binary3 services: vector DB, graph DB, cacheArchitecture, not a benchmark

Data sets, method and caveats: the XERJ Query-1 post. Engine benchmarks, wins and losses alike: benchmarks.

Use cases

One binary. Seven jobs.

01 · Answers

Answers you can check, or an honest UNKNOWN.

XERJ Query-1 turns a question into a short program and the engine runs it over facts you or your agent wrote. No backing facts: UNKNOWN. Facts that disagree: CONFLICT.

How XERJ Query-1 works

XERJ Query-1 answers 170 cm and cites characters 11 to 14 of document d1, says UNKNOWN for a salary nobody wrote down and CONFLICT for two heights that disagree; after one correction it answers 172 cm, and asked at revision 6 it still answers 170 cm.XERJ Query-1 answers 170 cm and cites characters 11 to 14 of document d1, says UNKNOWN for a salary nobody wrote down and CONFLICT for two heights that disagree; after one correction it answers 172 cm, and asked at revision 6 it still answers 170 cm.
Real rc.101 responses with the XERJ Query-1 model, trimmed to the final_*, program and evidence keys. Captured 2026-11-07.

02 · Reference coding

Your coding agent stops guessing APIs.

Index the open-source repos closest to what you build, and on code it hasn't memorised your coding agent reads the real definition instead of inventing one and looping. Ready-made corpora are on the Corpus Hub.

2.7x fewer output tokens

than Claude Code grepping the same source, both 16 of 16 solved; 8 tasks in 4 languages on libraries written for the test. On code the model already knows, retrieval saved nothing.

The case study

Output tokens to solve 16 tasks: memory only 260,916 with 11 of 16 solved, Claude Code grepping the source 26,477 with 16 of 16, XERJ reference retrieval 9,982 with 16 of 16; below, xerj def returns src/tree.rs line 1037 and the signature of compare_and_swap in sled.Output tokens to solve 16 tasks: memory only 260,916 with 11 of 16 solved, Claude Code grepping the source 26,477 with 16 of 16, XERJ reference retrieval 9,982 with 16 of 16; below, xerj def returns src/tree.rs line 1037 and the signature of compare_and_swap in sled.
Bars: the reference-coding case study (real billed output tokens). Terminal: xerj def on the rc.101 release over a clone of sled, captured 2026-11-07.

04 · Live data Ships in rc.102

Search what your database says right now.

xerj connect postgres://... takes a consistent snapshot, then follows every insert, update and delete through Postgres logical replication, and picks up again after a restart.

19.7 ms

median from Postgres commit to readable in XERJ, 60 updates on a 200,000-row synthetic table, Postgres 16 (p95 21.7 ms; run 2026-11-05).

The worked example

xerj connect snapshots a 200,000-row Postgres table and starts streaming; 60 updates were readable in XERJ at a median of 19.7 ms, p95 21.7 ms, max 34.6 ms.xerj connect snapshots a 200,000-row Postgres table and starts streaming; 60 updates were readable in XERJ at a median of 19.7 ms, p95 21.7 ms, max 34.6 ms.
A development build of main, run 2026-11-05. The run kept only the median, p95 and maximum, so only those are marked.

05 · Memory

Agents that remember, and show why.

Agents store, recall and forget notes, and link them into a graph where every edge keeps its evidence. Recall works by keyword and word overlap by default; turn on a neural encoder to recall by meaning.

24 MCP tools

on one node, next to search and facts (23 when XERJ Query-1 is off). Setup per client in llms.txt.

Agent memory recipe

A graph read back from the API: mem:falcon is led_by person:ana-bel, who works_in team:berlin-platform, each edge with the sentence it came from; beside it, the 24 tools xerj mcp lists, xerj_facts_ask among them.A graph read back from the API: mem:falcon is led_by person:ana-bel, who works_in team:berlin-platform, each edge with the sentence it came from; beside it, the 24 tools xerj mcp lists, xerj_facts_ask among them.
GET /_graph/agent1/ego and xerj mcp tools/list on the rc.101 release with the model on, captured 2026-11-07.

06 · Enterprise on-prem Cohere hooks ship in rc.102

Search and answers inside your own network.

One XERJ node indexes your documents and databases on a CPU server you own, and passes the best hits to Cohere Rerank, Embed and Command, at a private endpoint, only when you turn them on. XERJ is not affiliated with Cohere.

787 MB of RAM

for the search node holding a live 200,000-row table, 3,033 document records and their vectors; the node running XERJ Query-1 used 1.05 GB (run 2026-11-05). Cohere calls were tested against a mock of Cohere's API.

Cohere on XERJ

Inside a dashed network boundary, files, Postgres and S3 feed one XERJ node; a dashed line leaves the boundary to Cohere Rerank, Embed and Command only when you turn it on.Inside a dashed network boundary, files, Postgres and S3 feed one XERJ node; a dashed line leaves the boundary to Cohere Rerank, Embed and Command only when you turn it on.
Architecture of the 2026-11-05 worked example, not a benchmark.

07 · Bridge

Keep your Elasticsearch clients. Change the engine.

XERJ answers the Elasticsearch 8.x REST API for indexing, search, aggregations and kNN, so existing clients and scripts can keep working while you move to the native API. It is its own engine, written from scratch in Rust.

0 failed

in our Elasticsearch 8.x conformance suite on main: 1,448 of 1,458 cases passed, 10 skipped (CI, 2026-11-07). No client version matrix yet, and the Python client's bulk helper sends PUT /_bulk, which rc.101 refuses; POST works (fix: #3036).

Migrate from Elasticsearch

The official Python elasticsearch client, version 8.19.3, indexes four log lines into XERJ, searches for timeout and gets 2 hits and a terms aggregation with api: 2.The official Python elasticsearch client, version 8.19.3, indexes four log lines into XERJ, searches for timeout and gets 2 hits and a terms aggregation with api: 2.
The official elasticsearch 8.19.3 Python client against the rc.101 release, captured 2026-11-07.

What is open

Open engine. Your data. Your hardware.

The engine

Apache-2.0, on GitHub. Build it, audit it, fork it. Source

XERJ Query-1

Ships as a separate download with each release.

Nothing leaves

Runs offline. Text goes out only to a model you turn on, at an endpoint you choose. Security policy

Built in the open · counts from the GitHub API, 2026-11-07

120

contributors

100

1.0 release candidates since 8 July 2026

14,239

engine binary downloads from GitHub releases

Build on it, deploy it, or back it.

XERJ is building the search layer agents run on. If you want to deploy it, build on it or invest, write to us.