Repository navigation
Expand file tree
/
Copy pathproduct.html
More file actions
440 lines (404 loc) · 37.4 KB
/
Copy pathproduct.html
File metadata and controls
440 lines (404 loc) · 37.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
<!DOCTYPE html>
<html lang="en" data-theme="day">
<head>
<!-- ga4:begin — generated by scripts/seo/seo_head.py · do not hand-edit -->
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-Z77ETCDJYL"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-Z77ETCDJYL');
</script>
<!-- ga4:end -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>XERJ.ai — Local search for AI agents</title>
<meta name="description" content="XERJ, the search engine for AI agents: one local Rust binary that indexes your code, docs, specs and logs, plus Corpus Hub packs, and returns cited answers.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Big+Shoulders+Display:wght@400;700;800;900&family=Inter:wght@400;500;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><rect width='100' height='100' fill='%230b0b0d'/><text x='50' y='68' font-size='60' font-family='Big Shoulders Display,sans-serif' font-weight='900' fill='%23ffc400' text-anchor='middle'>X</text></svg>">
<script src="/theme.js"></script>
<link rel="stylesheet" href="/style.css?v=sc0706">
<style>
/* Tables use the same rules as /benchmarks/. Kept on this page so style.css stays unchanged. */
.pd-toc { display:flex; flex-wrap:wrap; gap:10px 22px; margin-top:var(--sp-6); font-size:13px; letter-spacing:.06em; }
.pd-toc a { color: var(--z-mute); }
.pd-h3 { font-family: var(--font-display); font-weight: 800; font-size: var(--fs-24, 24px); letter-spacing:.01em; margin: var(--sp-8) 0 var(--sp-3); text-transform: uppercase; }
.vt-wrap { overflow-x:auto; margin-top:var(--sp-6); }
table.vt { width:100%; border-collapse:collapse; font-family:var(--font-data); font-size:13.5px; }
.vt th { text-align:left; font-size:11px; letter-spacing:.06em; text-transform:uppercase;
color:var(--z-mute); font-weight:600; padding:9px 12px 9px 0; border-bottom:1px solid var(--z-ink); }
.vt td { padding:10px 12px 10px 0; border-bottom:1px solid var(--z-faint); vertical-align:top; }
.vt td.n { font-variant-numeric:tabular-nums; white-space:nowrap; }
.vt .w { color:var(--z-accent); font-weight:700; }
.vt .l { color:var(--z-neg); font-weight:700; }
.loss { border:1px solid var(--z-line); border-left:3px solid var(--z-neg); padding:16px 20px;
margin-top:var(--sp-6); font-size:15px; color:var(--z-mute); line-height:1.65; max-width:980px; }
.loss strong { color:var(--z-ink); }
.src { font-family:var(--font-data); font-size:12px; letter-spacing:.03em; color:var(--z-mute); margin-top:var(--sp-4); }
</style>
<!-- seo:begin — generated by scripts/seo/fix_heads.py · do not hand-edit -->
<link rel="canonical" href="https://xerj.org/product">
<meta property="og:site_name" content="XERJ.ai">
<meta property="og:type" content="website">
<meta property="og:title" content="XERJ.ai — Local search for AI agents">
<meta property="og:description" content="XERJ, the search engine for AI agents: one local Rust binary that indexes your code, docs, specs and logs, plus Corpus Hub packs, and returns cited answers.">
<meta property="og:url" content="https://xerj.org/product">
<meta property="og:image" content="https://xerj.org/og/xerj-card.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="XERJ.ai — the search engine built for AI agents">
<meta property="og:locale" content="en_US">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="XERJ.ai — Local search for AI agents">
<meta name="twitter:description" content="XERJ, the search engine for AI agents: one local Rust binary that indexes your code, docs, specs and logs, plus Corpus Hub packs, and returns cited answers.">
<meta name="twitter:image" content="https://xerj.org/og/xerj-card.png">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://xerj.org/#organization",
"name": "XERJ",
"alternateName": "XERJ.ai",
"url": "https://xerj.org/",
"logo": "https://xerj.org/brandbook/xerj-mark.svg",
"description": "A new way for AI to search for data: one local Rust binary that indexes your code, docs, specs and logs, plus Corpus Hub packs, and returns cited answers.",
"sameAs": [
"https://github.com/xerj-org/xerj",
"https://x.com/xerj_org"
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"@id": "https://xerj.org/#website",
"name": "XERJ.ai",
"url": "https://xerj.org/",
"inLanguage": "en",
"publisher": {
"@id": "https://xerj.org/#organization"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "XERJ",
"alternateName": "XERJ.ai",
"applicationCategory": "DeveloperApplication",
"applicationSubCategory": "Search engine",
"operatingSystem": "Linux, macOS, Windows",
"url": "https://xerj.org/product",
"description": "XERJ, the search engine for AI agents: one local Rust binary that indexes your code, docs, specs and logs, plus Corpus Hub packs, and returns cited answers.",
"image": "https://xerj.org/og/xerj-card.png",
"license": "https://www.apache.org/licenses/LICENSE-2.0",
"isAccessibleForFree": true,
"codeRepository": "https://github.com/xerj-org/xerj",
"publisher": {
"@id": "https://xerj.org/#organization"
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://xerj.org/product"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://xerj.org/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Product"
}
]
}
</script>
<!-- seo:end -->
</head>
<body>
<nav class="nav" aria-label="Primary">
<a href="/" class="brand">XERJ</a>
<a href="/product" class="active">PRODUCT</a>
<a href="/use-cases">USE CASES</a>
<a href="/answers/">ANSWERS</a>
<a href="/benchmarks/">BENCHMARKS</a>
<a href="/blog/">BLOG</a>
<span class="spacer"></span>
<a href="/for-agents">FOR AGENTS</a>
<a href="/docs/">DOCS</a>
<a href="/playground">DASHBOARDS</a>
<a href="https://hub.xerj.org" rel="external">HUB</a>
<a class="nav-stars" href="https://github.com/xerj-org/xerj" rel="external" title="XERJ on GitHub" aria-label="XERJ on GitHub, 14,225 stars"><svg viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg><span class="nav-stars-n" data-gh-stars="14225">★ 14.2k</span></a>
<a href="https://x.com/xerj_org" rel="external" title="XERJ on X" style="display:inline-flex;align-items:center"><svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg></a>
<a href="https://discord.com/invite/yetXFusXfs" rel="external" title="XERJ on Discord" style="display:inline-flex;align-items:center"><svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.317 4.37a19.79 19.79 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.74 19.74 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.1 13.1 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.3 12.3 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.84 19.84 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/></svg></a>
<span class="theme">
<button type="button" data-theme="day" class="active">DAY</button>
<span class="dash">·</span>
<button type="button" data-theme="night">NIGHT</button>
</span>
</nav>
<main>
<!-- Claims on this page were checked on 2026-10-23 against the
v1.0.0-rc.98 release binary (xerj --version, xerj --help, xerj hub --help,
xerj mcp --help, xerj init --help, MCP tools/list, and one xerj ask),
files named in the source lines, and the hub fetches named in section 04.
The psf/requests block is the committed 2026-10-19 capture, not a re-run. -->
<section class="scene-section">
<div class="kicker">
<span>THE PRODUCT</span><span class="dash">·</span>
<span>CHECKED AGAINST V1.0.0-RC.98 ON 2026-10-23</span>
</div>
<h1 class="hero">SEARCH FOR<br><span class="accent">AI AGENTS.</span></h1>
<p class="lead" id="what-is-xerj">
<strong>A new way for AI to search for data: one local Rust binary that indexes your code, docs, specs and logs, plus Corpus Hub packs, and returns cited answers.</strong> The binary is Apache-2.0. It
answers with file:line citations and serves them through a CLI, an
MCP server and the Elasticsearch API, so an agent reads a passage instead of
a whole file.
</p>
<div class="pd-toc mono">
<a href="#who">01 WHO IT IS FOR</a>
<a href="#quickstart">02 QUICKSTART</a>
<a href="#surface">03 WHAT SHIPS</a>
<a href="#hub">04 CORPUS HUB</a>
<a href="#measured">05 MEASURED</a>
<a href="#compare">06 HOW IT COMPARES</a>
<a href="#reports">07 FIELD REPORTS</a>
<a href="#faq">08 FAQ</a>
</div>
</section>
<section class="scene-section" id="who">
<div class="kicker"><span class="accent">01</span><span class="dash">·</span><span>WHO IT IS FOR</span></div>
<h2 class="scene">THREE KINDS<br><span class="accent">OF USER.</span></h2>
<div class="row">
<div class="k">Coding agents</div>
<div class="v">Claude Code, Cursor, Codex and any MCP client that needs code it has not memorised. <code class="inline">xerj init</code> writes the MCP config and the skill files for the agent directories it finds, and keeps a <code class="inline">.bak</code> of any file it edits.</div>
</div>
<div class="row">
<div class="k">A folder of data</div>
<div class="v">JSONL, CSV, PDFs, HTML, SQLite, an advisory dump. <code class="inline">xerj autoindex <folder></code> sniffs each file by content. <code class="inline">xerj autoindex map</code> prints what landed. <code class="inline">xerj autoindex remove --prefix <name></code> drops that folder after printing a plan.</div>
</div>
<div class="row">
<div class="k">Elasticsearch clients</div>
<div class="v">The node speaks the Elasticsearch REST API on <span class="mono">:9200</span>. The conformance suite passes 1,444 / 1,454 cases (0 failed, 10 skipped) (<a href="https://github.com/xerj-org/xerj/blob/main/README.md" rel="external">README.md</a>).</div>
</div>
<p class="loss"><strong>Not a fit, today:</strong> neural semantic search with no extra flag (the default embedder is lexical feature hashing; <code class="inline">--embed-mode neural</code> loads an all-MiniLM-L6-v2 model, about 90 MB, at startup), regex search over source (the benchmarks page marks it “not offered”), or a machine where an idle daemon must cost nothing (8% CPU and 8.3 GB on a 15-repo corpus, a published loss).</p>
</section>
<section class="scene-section" id="quickstart">
<div class="kicker"><span class="accent">02</span><span class="dash">·</span><span>QUICKSTART</span></div>
<h2 class="scene">INSTALL, INDEX,<br><span class="accent">ASK.</span></h2>
<p class="wide">The installer at <a href="/get">xerj.org/get</a> picks the release for your OS and CPU, checks its SHA-256, and puts <code class="inline">xerj</code> on <code class="inline">~/.local/bin</code> (<code class="inline">xerj.exe</code> there under Git Bash, MSYS or Cygwin). PowerShell's installer (<a href="/get.ps1">get.ps1</a>) puts <code class="inline">xerj.exe</code> in <code class="inline">%LOCALAPPDATA%\Programs\xerj</code> instead. On Linux the default archive is the static musl build. <code class="inline">xerj --version</code> on that binary, run 2026-10-23, printed <span class="mono">xerj v1.0.0-rc.98</span>.</p>
<pre class="code">curl -fsSL https://xerj.org/get | sh
xerj --insecure --data-dir ~/xerj-data & <span class="comment"># node on 127.0.0.1:9200</span>
git clone --depth 1 https://github.com/psf/requests ref/requests
xerj autoindex ref/requests --prefix req
xerj search --prefix req -k 3 "rebuild auth on redirect strip authorization"
xerj def --prefix req should_strip_auth</pre>
<p class="wide"><code class=&
8000
quot;inline">--insecure</code> turns off TLS and API-key auth. It is for one user on a dev machine. The default bind is <span class="mono">127.0.0.1</span>. Without the flag, clients send the key the node writes to <code class="inline"><data-dir>/admin.key</code>.</p>
<h3 class="pd-h3">No clone: ask a hub corpus</h3>
<p class="wide"><code class="inline">xerj "<question>"</code> is the same command as <code class="inline">xerj ask</code>. It routes the question to a corpus in the signed catalogue, starts a local node when nothing answers on port 9200, pulls that corpus’s pack once, and names the corpus, the pin and the licence. This is the rc.98 binary on 2026-10-23, scratch home, feedback disabled. Stderr first, then the first hit. The rest of stdout is trimmed.</p>
<pre class="code">$ xerj "how does lz4 find a match"
xerj hub: no node answers at http://localhost:9200; starting a local node on port 9300 (…)
xerj hub: node ready on port 9300 (pid 3727)
xerj hub: pulling 'lz4' (4.4 MB) — one-time download, later questions answer locally
xerj hub: pulled lz4 0774d055 4623814 → 4 indices, 1702 definitions
lz4 pin 2026-10-02 (21 days old) mixed: BSD-2 (lib) / GPL-2.0+ (rest) lz4/lib/lz4.c:939
LZ4_FORCE_INLINE int LZ4_compress_generic_validated(
…
approach-only licence (mixed: BSD-2 (lib) / GPL-2.0+ (rest)): read, do not copy</pre>
<p class="src">Same run also cited <span class="mono">lz4/doc/lz4_Block_format.md:0</span>. The node was stopped with <code class="inline">xerj hub stop</code> (<span class="mono">stopped the hub node (pid 3727)</span>). Catalogue entry for lz4, fetched the same day: <span class="mono">pack_bytes</span> 4623814, <span class="mono">pin_sha</span> 0774d055…, <span class="mono">pin_date</span> 2026-10-02.</p>
</section>
<section class="scene-section" id="surface">
<div class="kicker"><span class="accent">03</span><span class="dash">·</span><span>WHAT SHIPS IN THE BINARY</span></div>
<h2 class="scene">ONE BINARY.<br><span class="accent">ONE CLI.</span></h2>
<p class="wide">The rows below are the commands <code class="inline">xerj --help</code> printed on v1.0.0-rc.98, plus <code class="inline">xerj hub --help</code>. On that binary the top-level usage block lists <code class="inline">xerj ask</code> and does not list <code class="inline">xerj hub</code>. v1.0.0-rc.99 lists <code class="inline">xerj hub</code> next to <code class="inline">xerj ask</code> when the build has a hub signing key (<a href="https://github.com/xerj-org/xerj/pull/2282" rel="external">#2282</a>). <code class="inline">xerj hub --help</code> is the subcommand help.</p>
<div class="vt-wrap">
<table class="vt">
<thead><tr><th>Command</th><th>What it does</th></tr></thead>
<tbody>
<tr><td><code class="inline">xerj --insecure --data-dir DIR</code></td><td>Starts the node. Elasticsearch-compatible API on 9200, native REST on 8080, gRPC on 8081. <code class="inline">--port N</code> moves the three to N, N+1 and N+2.</td></tr>
<tr><td><code class="inline">xerj autoindex</code></td><td><code class="inline"><folder></code> discovers and indexes a folder or an <code class="inline">s3://</code> / <code class="inline">r2://</code> prefix. <code class="inline">map</code> prints the data map. <code class="inline">remove --prefix <P></code> drops one autoindexed folder after a plan.</td></tr>
<tr><td><code class="inline">xerj search</code> · <code class="inline">xerj def</code></td><td>Ranked passages with <code class="inline">path:line</code>, and go-to-definition. Lexical by default: they match the words you typed.</td></tr>
<tr><td><code class="inline">xerj "<question>"</code> · <code class="inline">xerj ask</code></td><td>Answers from a hub corpus. <code class="inline">--def SYMBOL</code>, <code class="inline">--how</code>, <code class="inline">--files</code>, <code class="inline">--offline</code>, <code class="inline">--json</code>, <code class="inline">--hosted on|off|auto</code>. Exit 1 when nothing matches.</td></tr>
<tr><td><code class="inline">xerj code</code> · <code class="inline">xerj corpus</code></td><td><code class="inline">corpus add|index|list</code> pins and builds corpora you choose. <code class="inline">code <corpus> "<query>"</code> retrieves a definition and warns on the licence.</td></tr>
<tr><td><code class="inline">xerj hub</code></td><td><code class="inline">sync</code>, <code class="inline">pull</code>, <code class="inline">feedback</code>, <code class="inline">status</code>, <code class="inline">stop</code>, and <code class="inline">config hosted on|off|auto</code>. Packs are verified, then restored. They are not cloned or indexed on your machine.</td></tr>
<tr><td><code class="inline">xerj mcp</code></td><td>On main it serves 23 tools, or 20 in a build with no hub key (<a href="/docs/agents/schemas/mcp-tools.json">mcp-tools.json</a>). The hub three are <code class="inline">xerj_hub_find</code>, <code class="inline">xerj_hub_def</code>, <code class="inline">xerj_hub_ask</code>. It does not start a node.</td></tr>
<tr><td><code class="inline">xerj init</code></td><td>Writes <code class="inline">.mcp.json</code>, and, when the directory exists, <code class="inline">.cursor/mcp.json</code>, <code class="inline">.codex/config.toml</code>, the skill and rule files, and an <code class="inline">AGENTS.md</code> section.</td></tr>
<tr><td><code class="inline">xerj brain</code> · <code class="inline">xerj share</code> · <code class="inline">xerj gain</code> · <code class="inline">xerj feedback</code></td><td>A browsable second brain, a read-only link with a passcode and an expiry, usage counted from the audit log, and the field report in section 07.</td></tr>
</tbody>
</table>
</div>
<p class="wide" style="margin-top:var(--sp-4);">The 20 names from that <code class="inline">tools/list</code>: <code class="inline">xerj_search</code>, <code class="inline">xerj_semantic_search</code>, <code class="inline">xerj_vector_search</code>, <code class="inline">xerj_hybrid_search</code>, <code class="inline">xerj_memory_store</code>, <code class="inline">xerj_memory_recall</code>, <code class="inline">xerj_brain_ego</code>, <code class="inline">xerj_brain_link</code>, <code class="inline">xerj_brain_unlink</code>, <code class="inline">xerj_brain_overview</code>, <code class="inline">xerj_map</code>, <code class="inline">xerj_index_budget</code>, <code class="inline">xerj_autoindex_remove</code>, <code class="inline">xerj_code_search</code>, <code class="inline">xerj_plan</code>, <code class="inline">xerj_field_report</code>, <code class="inline">xerj_corpus_feedback</code>, <code class="inline">xerj_hub_find</code>, <code class="inline">xerj_hub_def</code>, <code class="inline">xerj_hub_ask</code>. The schema on main after the rc.98 tag adds <code class="inline">xerj_def</code> and lists 21 (<a href="https://github.com/xerj-org/xerj/blob/main/landing/docs/agents/schemas/mcp-tools.json" rel="external">mcp-tools.json</a>). That tool is not in the rc.98 binary. The agent surface is also on <a href="/for-agents">For agents</a> and in <a href="/llms.txt">llms.txt</a>.</p>
</section>
<section class="scene-section" id="hub">
<div class="kicker"><span class="accent">04</span><span class="dash">·</span><span>CORPUS HUB · HUB.XERJ.ORG</span></div>
<h2 class="scene">PACKS, SIGNED<br><span class="accent">AND PINNED.</span></h2>
<div class="row">
<div class="k">Signed catalogue</div>
<div class="v"><code class="inline">xerj ask</code> reads <a href="https://hub.xerj.org/api/v1/catalogue.json" rel="external">catalogue.json</a> (ed25519 signature in the sibling <code class="inline">.sig</code>). Fetched 2026-10-23: <span class="mono">generated_at</span> 2026-10-22T07:11:17Z, <span class="mono">format_version</span> 1, 497 corpora, every one with a <span class="mono">pack_url</span>. Eleven domains. 490 are <span class="mono">adapt-with-attribution</span> and 7 are <span class="mono">approach-only</span>. A binary with no hub public key downloads nothing (exit 5). A pack that fails verification exits 3.</div>
</div>
<div class="row">
<div class="k">The registry page</div>
<div class="v"><a href="https://hub.xerj.org/llms.txt" rel="external">hub.xerj.org/llms.txt</a>, fetched the same day, lists 514 pinned corpora (514 <code class="inline">/corpus/</code> links in the file, and the opening line says 514). Seventeen of those slugs are not in the signed catalogue: agent-session-trajectories, concourse, counsel-chat, exploit-pocs-2023, exploit-pocs-2024, exploit-pocs-2025, exploit-pocs-2026, exploitdb-src, fluent-bit, freebsd-handbook, ghsa-db, github-api-description, mtl-bioinformatics-ner, nuclei-templates, rust-vulns, xerj-blogposts, xerj-columnar. A registry corpus that is not in the catalogue is added with <code class="inline">xerj corpus add</code> and indexed with <code class="inline">xerj corpus index</code>.</div>
</div>
<div class="row">
<div class="k">Contributor index</div>
<div class="v"><a href="https://hub.xerj.org/search/index.json" rel="external">search/index.json</a> says <span class="mono">updated</span> 2026-10-13. Fetched 2026-10-23, <span class="mono">p</span> has 4,080 rows (login, name, stars, corpora, kind): 3,663 with kind 0 and a display name, 417 with kind 1 and a blank name. Profiles are at <a href="https://hub.xerj.org/contributors/" rel="external">hub.xerj.org/contributors</a>.</div>
</div>
<div class="row">
<div class="k">Agent scores</div>
<div class="v">Each corpus page keeps an agent score apart from human stars. <code class="inline">xerj hub feedback <slug> --usefulness 1-5 --found yes|partial|no</code> and the MCP tool <code class="inline">xerj_corpus_feedback</code> send the review. Both are in the rc.98 binary (<a href="https://github.com/xerj-org/xerj/pull/1886" rel="external">#1886</a> merged 2026-10-20). <a href="https://hub.xerj.org/api/corpus-feedback" rel="external">GET /api/corpus-feedback</a> on 2026-10-23 returned <span class="mono">prior.mean</span> 3, <span class="mono">prior.weight</span> 5, and scores for 3 corpora (awesome-ai-system-prompts, brex-prompt-engineering, prompt-engineering-guide), each <span class="mono">score</span> 3.17, <span class="mono">reviews</span> 1, <span class="mono">confidence</span> “very low”. zstd returned <span class="mono">reviews</span> 0 and <span class="mono">score</span> null. The <a href="/blog/corpus-hub-v2">Corpus Hub v2</a> post describes the score as a Bayesian mean with that prior.</div>
</div>
<p class="src"><a href="https://hub.xerj.org" rel="external">BROWSE THE HUB</a> · <a href="/blog/the-corpus-hub">WHY WE BUILT IT</a> · <a href="/blog/corpus-hub-v2">HUB V2</a> · <a href="/docs/corpus-hub">HUB DOCS</a></p>
</section>
<section class="scene-section" id="measured">
<div class="kicker"><span class="accent">05</span><span class="dash">·</span><span>MEASURED</span></div>
<h2 class="scene">REAL OUTPUT,<br><span class="accent">REAL NUMBERS.</span></h2>
<p class="wide">The index-and-search block is the capture in <a href="https://github.com/xerj-org/xerj/blob/main/benchmarks/agent-intents-2026-10-19/README.md" rel="external">benchmarks/agent-intents-2026-10-19</a>, run 2026-10-19 on xerj v1.0.0-rc.97 and ripgrep 14.1.1, psf/requests at 611c6162. It was not re-run for this page. The commands are the same ones rc.98’s help lists.</p>
<pre class="code">$ xerj autoindex ./requests --prefix req
done in 2.9s — 1 dataset, 1571 records live, 0 duplicate aliases, 0 junk records, 1 junk/skipped file (543.9 docs/sec)
xerj-done ok=true exit=3 reason=completed-with-junk wall=3.0s files=95 records=1571
$ xerj search --prefix req -k 3 --full 400 "rebuild auth on redirect strip authorization"
xerj search: these hits are lexical; this command does not consult the embedding.
─── src/requests/sessions.py:309 (score 22.97)
def rebuild_auth(
…
3 passage(s) from 'req-*'. Cite ax_path:line for anything you rely on.</pre>
<div class="vt-wrap">
<table class="vt">
<thead><tr><th>Same task, captured 2026-10-19</th><th>Output an agent reads</th><th>Note</th></tr></thead>
<tbody>
<tr><td><code class="inline">rg -n -i redirect</code></td><td class="n">282 lines · 25,150 bytes</td><td>17 files. File: <span class="mono">01-rg-redirect.txt</span></td></tr>
<tr><td><code class="inline">xerj search … -k 3 --full 400</code></td><td class="n w">1,303 bytes</td><td>First hit <span class="mono">rebuild_auth</span> at <span class="mono">sessions.py:309</span>, score 22.97</td></tr>
<tr><td><code class="inline">xerj def should_strip_auth</code></td><td class="n w">949 bytes</td><td>First hit <span class="mono">sessions.py:154</span>. The file also lists other symbols in that module</td></tr>
<tr><td>Wall time, 5 runs, two sessions</td><td class="n">search 8 to 12 ms, then 19 to 23 ms</td><td><code class="inline">rg</code> 5 to 7 ms in both sessions. README timing table</td></tr>
</tbody>
</table>
</div>
<p class="loss">The other phrasing tried that day, “strip the Authorization header when a redirect changes host”, ranked <span class="mono">tests/test_requests.py</span> (score 32.70), <span class="mono">rebuild_method</span> at <span class="mono">sessions.py:370</span> (30.39), and <span class="mono">rewind_body</span> at <span class="mono">utils.py:1139</span> (25.31). <span class="mono">rebuild_auth</span> was not in those three hits. Search is lexical by default, so the words matter. File: <span class="mono">01-xerj-search-first-phrasing.txt</span>.</p>
<h3 class="pd-h3">Published benchmarks</h3>
<div class="vt-wrap">
<table class="vt">
<thead><tr><th>Measurement</th><th>XERJ</th><th>Comparison</th><th>Source</th></tr></thead>
<tbody>
<tr><td>Output tokens, 8 tasks × 4 languages, 16 runs per arm</td><td class="n w">9,982</td><td class="n">26,477 grep-driven · 260,916 memory only</td><td><a href="/benchmarks/">benchmarks §04</a></td></tr>
<tr><td>Cost of that matrix</td><td class="n w">$1.58</td><td class="n">$3.27 grep-driven · $11.18 memory only</td><td><a href="/benchmarks/">benchmarks §04</a></td></tr>
<tr><td>Unfamiliar-API tasks, hidden tests</td><td class="n w">21 / 21</td><td class="n">1 / 21 from model memory · $21.90 vs $3.38</td><td><a href="/case-studies/reference-coding">reference-coding case study</a></td></tr>
<tr><td>88-cell board vs Elasticsearch 8.13.4</td><td class="n w">55 wins</td><td class="n">26 ties · 4 losses · 3 n/a</td><td><a href="/benchmarks/elasticsearch">ES scorecard</a> · <span class="mono">demo/playbooks/SCORECARD.md</span></td></tr>
<tr><td>On-disk size, same docs</td><td class="n w">176.2 MB</td><td class="n">ES 283.0 MB</td><td>SCORECARD.md storage row</td></tr>
<tr><td>Identifier lookup, 15-repo corpus, p50 of 21</td><td class="n w">11.7 ms (one index)</td><td class="n">Zoekt 15.3 ms · ripgrep cold 260 ms</td><td><a href="/benchmarks/">benchmarks §01</a>, rc.70 binary, 2026-08-29</td></tr>
<tr><td>Hybrid nDCG@10, SciFact / NFCorpus, <code class="inline">--embed-mode neural</code></td><td class="n">0.6993 / 0.3448</td><td class="n">BM25 0.6572 / 0.3016</td><td><a href="/benchmarks/">benchmarks §03</a>. FiQA hybrid: not run</td></tr>
<tr><td class="l">Read p99 under a 40k docs/s writer</td><td class="n l">10.3–13.6 ms</td><td class="n">ES 3.5–6.8 ms</td><td>4 LOSE cells on the scorecard (10.27–13.57 ms vs 3.45–6.76 ms)</td></tr>
<tr><td class="l">Idle daemon, 15-repo corpus</td><td class="n l">8% CPU · 8.3 GB</td><td class="n">Zoekt 0.03% · 119 MB</td><td><a href="/benchmarks/">benchmarks §01</a>, <a href="https://github.com/xerj-org/xerj/issues/874" rel="external">#874</a></td></tr>
</tbody>
</table>
</div>
<p class="wide" style="margin-top:var(--sp-4);">Write-ups, losses included: <a href="/blog/does-xerj-beat-jev">Does XERJ beat JEV?</a>, <a href="/blog/jev-vs-a-bm25-vote">a BM25 vote against Jev</a>, <a href="/blog/cutting-the-index-28-percent">cutting the index 28%</a>, and <a href="/blog/the-rc80-gates">the rc.80 gates</a>.</p>
</section>
<section class="scene-section" id="compare">
<div class="kicker"><span class="accent">06</span><span class="dash">·</span><span>HOW IT COMPARES</span></div>
<h2 class="scene">WHAT ELSE<br><span class="accent">YOU COULD USE.</span></h2>
<div class="vt-wrap">
<table class="vt">
<thead><tr><th>Tool</th><th>Where it is ahead</th><th>Where XERJ is ahead</th></tr></thead>
<tbody>
<tr><td>grep / ripgrep</td><td>No index, regex, and lower per-call time on a small tree (5 to 7 ms vs 8 to 23 ms on the requests capture)</td><td>Ranked passages and definitions with file:line. On that capture, 1,303 bytes against 25,150</td></tr>
<tr><td>Zoekt / Sourcegraph</td><td>Idle footprint, and multi-repo fan-out on the 15-repo board</td><td>One binary that also indexes data files and serves MCP, memory and the hub. Definition ranking without ctags</td></tr>
<tr><td>Elasticsearch / OpenSearch</td><td>Read p99 under a 40k docs/s writer, and the plugin ecosystem</td><td>No JVM. The default Linux install is a static musl binary. Agent commands, MCP and the hub are in that binary, on the same wire API. 55 wins on the 88-cell board</td></tr>
<tr><td>A vector database</td><td>A neural index with a model you choose, at a scale you operate</td><td>BM25, kNN and hybrid in one process. The default embedder needs no API key. Neural mode is a server flag</td></tr>
<tr><td>GitHub code search</td><td>Every public repository, no download</td><td>An answer from a pinned, signed pack, offline after the first pull, with the licence on the hit</td></tr>
</tbody>
</table>
</div>
<p class="wide" style="margin-top:var(--sp-4);">Longer comparisons: <a href="/compare/xerj-vs-ripgrep-for-code-agents">XERJ vs ripgrep for code agents</a>, <a href="/compare/xerj-vs-elasticsearch-local">vs Elasticsearch on a laptop</a>, <a href="/compare/xerj-vs-vector-database">vs a vector database</a>, and <a href="/compare/">all comparisons</a>.</p>
</section>
<section class="scene-section" id="reports">
<div class="kicker"><span class="accent">07</span><span class="dash">·</span><span>FIELD REPORTS</span></div>
<h2 class="scene">ONE SHORT<br><span class="accent">REPORT.</span></h2>
<p class="wide"><code class="inline">xerj feedback</code> drafts a field report and fills in only what it can observe. <code class="inline">xerj feedback --submit</code> opens a GitHub pull request that adds one file under <span class="mono">user-feedback/16-agent-field-reports/</span>, and posts to <span class="mono">xerj.org/api/field-report</span> only when GitHub is unavailable. <code class="inline">--disable-feedback</code> or <code class="inline">XERJ_DISABLE_FEEDBACK=true</code> turns the invitation off. The same switch turns off corpus-feedback reviews.</p>
<p class="wide">On main at this rewrite, that directory holds 52 report files besides the README, dated 2026-08-18 through 2026-10-23.</p>
<p class="src"><a href="https://github.com/xerj-org/xerj/tree/main/user-feedback/16-agent-field-reports" rel="external">READ THE REPORTS</a></p>
</section>
<section class="scene-section" id="faq">
<div class="kicker"><span class="accent">08</span><span class="dash">·</span><span>FAQ</span></div>
<h2 class="scene">QUESTIONS<br><span class="accent">PEOPLE ASK.</span></h2>
<div class="row"><div class="k">Is it free?</div><div class="v">Yes. The binary and the source are Apache-2.0. There is no email gate. <a href="/pricing/">Pricing</a> is for teams that want support.</div></div>
<div class="row"><div class="k">Does it send my code anywhere?</div><div class="v">Indexing and search run on your machine. <code class="inline">xerj hub config hosted</code> defaults to <span class="mono">auto</span>: off inside a git repository, on elsewhere. <code class="inline">--hosted off</code> or <code class="inline">--offline</code> keeps the question local. The optional Jev rerank stage is the search-time feature that sends document text off the node, and it stays off until an operator sets a key (<a href="/llms.txt">llms.txt</a>).</div></div>
<div class="row"><div class="k">Is search semantic?</div><div class="v">Not by default. <code class="inline">xerj --help</code> calls the default embedder lexical feature-hash, offline, not neural. <code class="inline">--embed-mode neural</code> loads all-MiniLM-L6-v2. <code class="inline">proxy</code> points at an OpenAI-compatible embeddings endpoint.</div></div>
<div class="row"><div class="k">Which agents?</div><div class="v">Anything that can run a shell command, and any MCP client. <code class="inline">xerj init</code> writes Claude Code, Cursor and Codex config when those directories are present. Other clients use the <code class="inline">mcpServers</code> block <code class="inline">xerj mcp --help</code> describes.</div></div>
<div class="row"><div class="k">What platforms?</div><div class="v">Linux, macOS and Windows, x86_64 and aarch64: eight targets in <a href="/get">the installer</a>. The v1.0.0-rc.98 GitHub release publishes eight archives and two <span class="mono">.deb</span> packages, each with a <span class="mono">.sha256</span> file.</div></div>
<div class="row"><div class="k">Does <code class="inline">xerj ask</code> cover any GitHub repo?</div><div class="v">No. It answers from the signed catalogue (497 corpora on the 2026-10-23 fetch). Any other repo is a clone plus <code class="inline">xerj autoindex</code>. Asking an arbitrary repo URL with no index step is <a href="https://github.com/xerj-org/xerj/issues/1800" rel="external">#1800</a>, still open.</div></div>
</section>
<a href="#quickstart" class="cta">
<span>GET XERJ</span>
<span class="arrow">↑</span>
</a>
</main>
<!-- seo:footer-begin — generated by scripts/seo/fix_links.py · do not hand-edit -->
<nav class="footer-map" aria-label="Site map">
<div class="fm-col">
<span class="fm-h">PRODUCT</span>
<a href="/product">PRODUCT</a>
<a href="/architecture/">ARCHITECTURE</a>
<a href="/benchmarks/">BENCHMARKS</a>
<a href="/pricing/">PRICING</a>
<a href="/security/">SECURITY</a>
<a href="/playground">DASHBOARDS</a>
<a href="/demo/">REAL-DATA DEMO</a>
<a href="/aise-demo">PRODUCT TOUR</a>
</div>
<div class="fm-col">
<span class="fm-h">LEARN</span>
<a href="/answers/">ANSWERS</a>
<a href="/compare/">COMPARE</a>
<a href="/use-cases">USE CASES</a>
<a href="/case-studies">CASE STUDIES</a>
<a href="/industries/">INDUSTRIES</a>
<a href="/blog/">BLOG</a>
</div>
<div class="fm-col">
<span class="fm-h">SOLUTIONS</span>
<a href="/solutions/">SOLUTIONS</a>
<a href="/industries/finserv">FINANCIAL SERVICES</a>
<a href="/industries/public-sector">PUBLIC SECTOR</a>
<a href="/industries/healthcare">HEALTHCARE</a>
<a href="/industries/retail">RETAIL</a>
<a href="/use-cases/code-security-audit">AI CODE-SECURITY AUDIT</a>
<a href="/use-cases/semantic-analytics">SEMANTIC ANALYTICS</a>
<a href="/resources/">SALES KIT</a>
</div>
<div class="fm-col">
<span class="fm-h">DOCS</span>
<a href="/docs/">DOCUMENTATION</a>
<a href="/docs/quickstart">QUICKSTART</a>
<a href="/docs/install">INSTALL</a>
<a href="/docs/migration-from-es">MIGRATE FROM ELASTICSEARCH</a>
<a href="/docs/recipes/">RECIPES</a>
<a href="/docs/agents/">DOCS FOR AI</a>
<a href="/for-agents">FOR AI AGENTS</a>
<a href="/agent-search/">AGENTIC SEARCH DEMO</a>
<a href="/llms.txt">LLMS.TXT</a>
<a href="https://github.com/xerj-org/xerj" rel="external">GITHUB</a>
</div>
</nav>
<!-- seo:footer-end -->
<footer class="footer">
<span>XERJ.AI · PRODUCT · V1.0.0-RC.100</span>
<span>CHECKED 2026-10-23</span>
<span><a href="/">HOME</a> · <a href="/docs/">DOCS</a> · <a href="/benchmarks/">BENCHMARKS</a> · <a href="/llms.txt">LLMS.TXT</a></span>
</footer>
</body>
</html>