-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
385 lines (370 loc) · 27.2 KB
/
Copy pathindex.html
File metadata and controls
385 lines (370 loc) · 27.2 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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>klaris — Graph-native audio separation. Exact, auditable separation. Zero learned…</title>
<meta name="description" content="Graph-native audio separation. Exact, auditable separation. Zero learned weights.">
<meta name="author" content="Independent explainer for ruvnet's klaris — built by Stuart Kerr at ISOvision.ai">
<link rel="canonical" href="https://klaris-explainer.netlify.app/">
<meta name="theme-color" content="#4fc3f7">
<meta property="og:type" content="website">
<meta property="og:title" content="klaris — Graph-native audio separation. Exact, auditable separation. Zero learned…">
<meta property="og:description" content="Graph-native audio separation. Exact, auditable separation. Zero learned weights.">
<meta property="og:url" content="https://klaris-explainer.netlify.app/">
<meta property="og:image" content="https://klaris-explainer.netlify.app/assets/social-card.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="klaris — Graph-native audio separation. Exact, auditable separation. Zero learned…">
<meta name="twitter:description" content="Graph-native audio separation. Exact, auditable separation. Zero learned weights.">
<meta name="twitter:image" content="https://klaris-explainer.netlify.app/assets/social-card.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/favicon-16.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/favicon-32.png">
<link rel="icon" type="image/png" sizes="48x48" href="assets/favicon-48.png">
<link rel="icon" type="image/png" sizes="192x192" href="assets/favicon-192.png">
<link rel="icon" type="image/png" sizes="512x512" href="assets/favicon-512.png">
<link rel="icon" href="assets/favicon.ico" sizes="any">
<link rel="apple-touch-icon" href="assets/apple-touch-icon.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap">
<link rel="stylesheet" href="styles.css">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "klaris",
"description": "Graph-native audio separation. Exact, auditable separation. Zero learned weights.",
"url": "https://klaris-explainer.netlify.app/",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Cross-platform",
"image": "https://klaris-explainer.netlify.app/assets/social-card.png",
"author": {
"@type": "Person",
"name": "ruvnet"
},
"codeRepository": "https://github.com/ruvnet/klaris",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
}
}
</script>
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<div class="prov-banner">
<div class="wrap prov-banner-inner">
<p class="prov-attr">An independent explainer for <strong>ruvnet</strong>'s <a href="https://github.com/ruvnet/klaris" target="_blank" rel="noopener">klaris</a> — built to help you actually implement it.</p>
<p class="prov-live"><span class="prov-dot" aria-hidden="true">●</span> source <code>github.com/ruvnet/klaris</code></p>
</div>
</div>
<header class="site-head">
<div class="wrap">
<a class="brand" href="#top" aria-label="klaris explainer home">
<svg class="logo" viewBox="0 0 32 32" aria-hidden="true">
<rect x="3" y="3" width="26" height="26" rx="8" fill="none" stroke="var(--accent)" stroke-width="2"></rect>
<rect x="9" y="9" width="14" height="14" rx="4" fill="var(--accent-2)"></rect>
<circle cx="16" cy="16" r="3" fill="var(--on-accent)"></circle>
</svg>
<span>klaris</span>
</a>
<nav class="nav-links" aria-label="Sections">
<a href="#what-it-is">What it is</a>
<a href="#how-it-works">How it works</a>
<a href="#how-it-compares">How it compares</a>
<a href="#use-cases">Use cases</a>
<a href="#get-started">Get started</a>
<a href="#the-pack">AI pack</a>
<a href="https://github.com/ruvnet/klaris" target="_blank" rel="noopener">GitHub ↗</a>
</nav>
</div>
</header>
<main id="main">
<a id="top"></a>
<section class="hero">
<div class="wrap">
<div class="hero-grid">
<div>
<span class="eyebrow">Rust · Audio Source Separation · Zero Learned Weights</span>
<h1>Separate overlapping audio in 0.20 ms — no model files, no GPU, no guesswork</h1>
<p class="lede">Klaris partitions mixed audio into clean per-source streams using graph Laplacian spectral clustering and dynamic mincut refinement. The algorithm is purely mathematical: no neural weights to download, no GPU required, no black-box inference. It runs on a desktop, in a browser via WASM, or on a microcontroller — from a single Rust codebase — and clears its 8 ms real-time budget by a factor of 31.</p>
<p class="sub">276 passing tests. 11,032 lines of Rust. One external dependency.</p>
<p class="attrib-lede">An <strong>independent explainer</strong> for <strong>ruvnet</strong>'s <a href="https://github.com/ruvnet/klaris" target="_blank" rel="noopener">klaris</a> — built to take you from "never seen it" to "ready to implement".</p>
<div class="cta-row">
<a class="cta" href="#get-started">Get started</a>
<a class="cta ghost" href="https://github.com/ruvnet/klaris" target="_blank" rel="noopener">View on GitHub</a>
</div>
<div class="meta-row"><span><b>Language</b> Rust</span><span><b>Latency</b> 0.20 ms avg / 0.26 ms max</span><span><b>Model size</b> 0 bytes</span><span><b>Tests</b> 276 passing</span><span><b>Dependencies</b> 1 (ruvector-mincut)</span></div>
</div>
<figure class="hero-art">
<img src="assets/hero.png" alt="klaris: A shard of pure crystal suspended in darkness, one chaotic waveform entering its edge and emerging as six clean, color-separated audio streams — each thread a voice, a stem, a signal reclaimed from noise">
<figcaption>A shard of pure crystal suspended in darkness, one chaotic waveform entering its edge and emerging as six clean, color-separated audio streams — each thread a voice, a stem, a signal reclaimed from noise</figcaption>
</figure>
</div>
</div>
</section>
<div class="sections">
<div class="wrap">
<details class="section" id="problem" open>
<summary>
<span class="num">01</span>
<span class="head-text">
<h2>Overlapping audio breaks every downstream system</h2>
<span class="q">What problem does this solve?</span>
</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="body">
<p class="lead-in">Speech recognizers, hearing aids, and music tools all assume clean, single-source audio. Reality is messier: speakers talk over each other, instruments bleed into adjacent tracks, and crowd noise drowns out the signal you care about.</p>
<p>Standard approaches reach for neural models — Whisper, HTDemucs, BS-RoFormer — that require hundreds of megabytes of trained weights, a GPU for real-time use, and a network connection to download assets. That rules out hearing aids, embedded sensors, and any latency-sensitive edge deployment.</p>
<p>The alternative is to treat audio structure as a mathematical object. If you can represent the relationships between time-frequency bins as a weighted graph, separation becomes a graph partitioning problem — one that has an exact algebraic solution, runs in microseconds, and needs no training data at all.</p>
<figure class="figure">
<span class="tier friendly">The problem</span>
<img src="assets/problem.png" alt="klaris: the problem" loading="lazy">
</figure>
</div>
</details>
<details class="section" id="what-it-is" open>
<summary>
<span class="num">02</span>
<span class="head-text">
<h2>A graph-partitioning engine for audio, written in pure Rust</h2>
<span class="q">What exactly is Klaris?</span>
</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="body">
<p class="lead-in">Klaris builds a weighted graph from the Short-Time Fourier Transform of an audio signal, then uses the Fiedler vector of the graph Laplacian to partition that graph into per-source clusters. Dynamic mincut refinement sharpens the boundary. The result is a set of separated time-domain signals reconstructed via inverse STFT.</p>
<p>Because the algorithm is entirely algebraic, the binary carries zero model weights. The single external dependency is ruvector-mincut, which provides the mincut primitive. Everything else — the radix-2 FFT, the sparse Lanczos eigensolver, the graph construction, the hearing-aid DSP chain, the multitrack stem separator, and the crowd-scale speaker tracker — is implemented in the 11,032 lines of Rust that make up this repository.</p>
<figure class="figure diagram concept">
<span class="tier tech">The big idea</span>
<img src="assets/big-idea.svg" alt="Raw mixed audio is structured as a graph, the Fiedler vector bisects it, and mincut refinement yields clean separated sources — all in under 0.26 ms." loading="lazy">
</figure>
<table class="tbl"><caption class="visually-hidden">Core modules and their roles</caption>
<thead><tr><th>Module</th><th>Purpose</th></tr></thead>
<tbody>
<tr><td>stft.rs</td><td>Zero-dependency radix-2 FFT, STFT/ISTFT with Hann window</td></tr>
<tr><td>lanczos.rs</td><td>Sparse Lanczos eigensolver in CSR format with SIMD optimization</td></tr>
<tr><td>audio_graph.rs</td><td>Graph construction from STFT (spectral, temporal, harmonic, phase edges)</td></tr>
<tr><td>separator.rs</td><td>Fiedler vector spectral clustering + mincut refinement</td></tr>
<tr><td>hearing_aid.rs</td><td>Binaural streaming speech enhancer</td></tr>
<tr><td>multitrack.rs</td><td>6-stem music separator</td></tr>
<tr><td>crowd.rs</td><td>Distributed speaker tracking up to 500 identities</td></tr>
<tr><td>wav.rs</td><td>WAV file I/O and binaural test-signal generation</td></tr>
</tbody>
</table>
</div>
</details>
<details class="section" id="the-insight" open>
<summary>
<span class="num">03</span>
<span class="head-text">
<h2>The Fiedler vector is a natural audio partition</h2>
<span class="q">What is the core insight?</span>
</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="body">
<p class="lead-in">The graph Laplacian L = D − W encodes the full structure of a time-frequency graph in one matrix. Its second-smallest eigenvector — the Fiedler vector — is the continuous relaxation of the normalized cut. Nodes with the same sign belong to the same source.</p>
<p>This is not an approximation or a heuristic. The Fiedler vector is the provably optimal continuous solution to the graph bisection problem. Dynamic mincut refinement then enforces the discrete boundary, yielding a hard partition that maps directly back to time-domain audio via inverse STFT.</p>
<p>Because the partition is derived from the signal's own structure rather than from learned statistics, it generalizes without retraining. A hearing aid, a music workstation, and a crowd-monitoring sensor all use the same algorithm — only the graph construction parameters change.</p>
<figure class="figure diagram concept">
<span class="tier tech">The aha</span>
<img src="assets/insight.svg" alt="Because separation is purely algorithmic via graph Laplacian eigenvectors, klaris runs anywhere — MCU, WASM, desktop — with no model download and sub-millisecond latency." loading="lazy">
</figure>
<p class="oh">Structure in the signal is the model — the math finds it without ever being trained.</p>
</div>
</details>
<details class="section" id="how-it-works" open>
<summary>
<span class="num">04</span>
<span class="head-text">
<h2>From mixed audio to separated streams in four algebraic steps</h2>
<span class="q">How does it actually work?</span>
</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="body">
<p class="lead-in">The pipeline is deterministic and fully inspectable at every stage. No step involves learned parameters.</p>
<p>Step 1 — Spectrogram: the input waveform is windowed into overlapping frames and transformed via radix-2 FFT, producing a complex time-frequency matrix. Step 2 — Graph construction: each T-F bin becomes a node; edges are weighted by spectral similarity, temporal continuity, harmonic relationships, and phase coherence, producing a sparse adjacency matrix W and degree matrix D. Step 3 — Fiedler partition: the Lanczos eigensolver (CSR format, SIMD-optimized) computes the second-smallest eigenvector of L = D − W. Nodes are assigned to Source A or Source B by the sign of their Fiedler coordinate. Step 4 — Mincut refinement: ruvector-mincut sharpens the partition boundary, then per-source soft masks are applied to the spectrogram and inverted via ISTFT to recover time-domain audio.</p>
<p>The hearing-aid pipeline adds a further DSP chain — biquad prefilter, normalized-LMS feedback canceller, multi-band WDRC compressor, NAL-R audiogram-fitted gain, and a brick-wall output limiter — all implemented as Rust AudioProcessor blocks that satisfy the same real-time constraint: no allocation, no locks, no syscalls inside process(). The optional candle-whisper transcription feature feeds the separated streams into a Whisper model for speech-to-text, with the separation stage recovering accuracy lost to overlapping speakers.</p>
<div class="dual">
<figure class="figure diagram">
<span class="tier tech">Architecture</span>
<img src="assets/architecture.svg" alt="A pipeline diagram showing: stereo mic input → biquad prefilter → NLMS feedback canceller → graph separator (Fiedler + mincut) → WDRC compressor → output limiter → binaural output, with an optional candle-Whisper transcription branch forking after the separator." loading="lazy">
<figcaption>The HEARklaris chain (ADR-143) — Tympan’s proven DSP blocks around klaris’s graph separator. The candle-whisper branch is feature-gated and off by default.</figcaption>
</figure>
<figure class="figure diagram">
<span class="tier tech">Data flow</span>
<img src="assets/flow.svg" alt="A runtime flow showing one audio frame moving through the engine: STFT, time-frequency graph construction, Lanczos Fiedler partition, dynamic mincut refinement, Wiener soft masking, and ISTFT overlap-add reconstruction — 0.20 ms per-frame compute." loading="lazy">
<figcaption>Runtime data flow — one 4 ms frame from mixed input to separated streams in 0.20 ms.</figcaption>
</figure>
</div>
</div>
</details>
<details class="section" id="how-it-compares" open>
<summary>
<span class="num">05</span>
<span class="head-text">
<h2>Where it beats the industry — and where it honestly doesn’t</h2>
<span class="q">How does it compare?</span>
</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="body">
<p class="lead-in">Audio separation today is a three-way trade between quality, latency, and deployability. Neural systems win raw quality. Custom silicon wins integration. Klaris occupies a corner nobody else does: sub-millisecond, zero-weight, fully auditable separation that runs anywhere Rust compiles.</p>
<p>Latency is where the gap is starkest — measured against what the hearing-aid industry actually ships. Klaris clears the fastest commercial chip on the market by more than 2×, with no silicon required:</p>
<table class="tbl"><caption class="visually-hidden">Latency comparison with industry systems</caption>
<thead><tr><th>System</th><th>Latency</th><th>Type</th><th>Model size</th></tr></thead>
<tbody>
<tr><td><strong>Klaris</strong></td><td><strong>0.20 ms</strong></td><td>Graph-based (Rust)</td><td><strong>0 bytes</strong></td></tr>
<tr><td>Widex ZeroDelay</td><td>0.48 ms</td><td>Commercial hearing aid</td><td>Proprietary chip</td></tr>
<tr><td>DNN for CI (2025)</td><td>1.0 ms</td><td>Research neural</td><td>Unknown</td></tr>
<tr><td>RT-STT (2025)</td><td>1.01 ms</td><td>Neural (GPU)</td><td>383K params</td></tr>
<tr><td>TinyLSTM (Bose)</td><td>2.39 ms</td><td>Compressed LSTM</td><td>~2 MB</td></tr>
<tr><td>RNNoise (Mozilla)</td><td>10 ms</td><td>Hybrid DSP+GRU</td><td>85 KB</td></tr>
</tbody>
</table>
<p>Deployability tells the same story. Every competing approach needs weights, a GPU, or custom silicon; klaris needs a CPU and one crate:</p>
<table class="tbl"><caption class="visually-hidden">Embedded viability comparison</caption>
<thead><tr><th>System</th><th>Model size</th><th>Hardware</th><th>Dependencies</th></tr></thead>
<tbody>
<tr><td><strong>Klaris</strong></td><td><strong>0 bytes</strong></td><td>Any CPU / WASM / MCU</td><td>1 crate (ruvector-mincut)</td></tr>
<tr><td>RNNoise</td><td>85 KB</td><td>Any CPU</td><td>Minimal C</td></tr>
<tr><td>RT-STT</td><td>~1.5 MB</td><td>GPU required</td><td>PyTorch</td></tr>
<tr><td>Phonak DEEPSONIC</td><td>Proprietary</td><td>Custom AI chip (7,700 MOPS)</td><td>Proprietary</td></tr>
</tbody>
</table>
<p>And the honest column: raw separation quality is the axis where klaris does <em>not</em> lead, and the project says so plainly. On vocals SDR it sits 5–8 dB behind neural state of the art — a structural gap, because learned models have absorbed thousands of labeled songs and klaris has never seen one:</p>
<table class="tbl"><caption class="visually-hidden">Separation quality comparison</caption>
<thead><tr><th>System</th><th>Vocals SDR</th><th>Approach</th></tr></thead>
<tbody>
<tr><td>BS-RoFormer</td><td>~10.5 dB</td><td>Transformer (trained on hundreds of hours)</td></tr>
<tr><td>HTDemucs</td><td>~9.0 dB</td><td>Hybrid transformer</td></tr>
<tr><td>Open-Unmix</td><td>~6.3 dB</td><td>LSTM baseline</td></tr>
<tr><td><strong>Klaris</strong></td><td><strong>1–5 dB</strong></td><td>Unsupervised graph partitioning</td></tr>
</tbody>
</table>
<p>If you need studio-grade stems offline, use a transformer. If you need real-time, on-device, explainable separation with nothing to download, nothing to license, and nothing to certify as a black box — there is no second option in open source.</p>
<p class="oh">Neural SOTA wins the studio. Klaris wins the millisecond — and the millisecond is where hearing aids live.</p>
</div>
</details>
<details class="section" id="use-cases" open>
<summary>
<span class="num">06</span>
<span class="head-text">
<h2>Where Klaris fits</h2>
<span class="q">Where would I use this?</span>
</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="body">
<p class="lead-in">The zero-weight, sub-millisecond profile opens deployment targets that neural approaches cannot reach.</p>
<figure class="figure">
<span class="tier friendly">In the real world</span>
<img src="assets/useCase.png" alt="klaris in use" loading="lazy">
</figure>
<div class="gallery"><div class="grid">
<details class="case" open>
<summary>
<span class="uc-num">1</span>
<span class="uc-title">Hearing aids and embedded DSP</span>
<span class="uc-tag">Edge / Real-time</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="uc-body">
<p>The hearing_aid module provides a binaural streaming enhancer that processes a 4 ms hop in well under budget. The HEARklaris extension ports Tympan's full DSP chain — WDRC compression, feedback cancellation, biquad filtering, audiogram-fitted gain — into the same Rust crate, targeting MCU, WASM, and desktop from a single build. At 0.20 ms average latency, there is headroom for additional stages such as vocoder or electrode mapping for cochlear implant preprocessing.</p>
</div>
</details>
<details class="case" open>
<summary>
<span class="uc-num">2</span>
<span class="uc-title">Music production — 6-stem separation</span>
<span class="uc-tag">Desktop / DAW</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="uc-body">
<p>The multitrack module separates a mixed recording into up to six stems. Every mincut decision is logged in a replay_log for full reproducibility. Because the algorithm carries no trained weights, it does not degrade on genres or recording conditions outside a training distribution — there is no training distribution.</p>
</div>
</details>
<details class="case" open>
<summary>
<span class="uc-num">3</span>
<span class="uc-title">Crowd-scale speaker tracking</span>
<span class="uc-tag">Smart environments</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="uc-body">
<p>The crowd module tracks up to 500 speaker identities across distributed sensors using graph-based association with a configurable threshold. Events from multiple sensors are fused into a unified spatial model. The same latency budget that makes Klaris viable for hearing aids makes it viable for real-time venue monitoring and smart-environment applications.</p>
</div>
</details>
</div></div>
</div>
</details>
<details class="section" id="get-started" open>
<summary>
<span class="num">07</span>
<span class="head-text">
<h2>Get started</h2>
<span class="q">How do I get started right now?</span>
</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="body">
<p class="lead-in">You need a stable Rust toolchain (install via rustup.rs if you do not have one). No model files to download, no environment variables to set — the algorithm carries zero learned weights.</p>
<div class="install-block"><pre class="code-block"><code>cargo build --release</code></pre></div>
<ol class="steps">
<li><strong>Clone the repository</strong> git clone https://github.com/ruvnet/klaris && cd klaris</li>
<li><strong>Build the release binary</strong> Run <code>cargo build --release</code>. Rust will compile the crate and its single external dependency (ruvector-mincut). A successful build prints no errors and produces the binary at target/release/klaris.</li>
<li><strong>Run the benchmark suite</strong> Run <code>cargo run --release</code>. This executes the 6-part benchmark suite: basic separation across three test scenarios, hearing-aid streaming, multitrack stem separation, crowd tracking, WAV I/O, and latency validation. You will see a table of results including SDR values, latency measurements (expect ~0.20 ms avg), and a PASS/FAIL line for each part.</li>
<li><strong>Run the tests</strong> Run <code>cargo test</code>. All 276 tests should pass. The output ends with <code>test result: ok. 276 passed; 0 failed</code>.</li>
<li><strong>Next step</strong> Open src/main.rs to see how each benchmark is constructed, then explore src/hearing_aid.rs or src/multitrack.rs to adapt the pipeline to your own audio input.</li>
</ol>
</div>
</details>
<details class="section" id="the-pack" open>
<summary>
<span class="num">08</span>
<span class="head-text">
<h2>Knowledge pack — 384-dim RVF index</h2>
<span class="q">How do I go deeper?</span>
</span>
<span class="chev" aria-hidden="true">›</span>
</summary>
<div class="body">
<p class="lead-in">The repository has been indexed into a 384-dimensional RVF knowledge base covering 24 passages across the full codebase: algorithms, ADRs, module structure, DSP chain design, and benchmark methodology. Load the pack into any RVF-compatible retrieval system to query Klaris's internals in natural language.</p>
<div class="tree" style="white-space:pre"><span class="cmt"># klaris-knowledge-pack.zip</span>
<span class="d">for-ai/</span> <span class="cmt"># wire this into your agent</span>
<span class="f">klaris-kb.rvf</span> <span class="cmt"># 384-dim vector brain (semantic search)</span>
<span class="f">klaris-kb.passages.jsonl</span> <span class="cmt"># full passage text (search returns TEXT)</span>
<span class="f">klaris-symbols.json</span> <span class="cmt"># exact public API</span>
<span class="f">klaris-dep-graph.json</span> <span class="cmt"># what depends on what</span>
<span class="f">klaris-entrypoints.json</span> <span class="cmt"># build / test / run commands</span>
<span class="f">ask-kb.mjs</span> · <span class="f">kb-mcp-server.mjs</span> <span class="cmt"># CLI + MCP search server</span>
<span class="d heart">for-humans/</span> <span class="cmt"># read first</span>
<span class="f heart">klaris-primer.md</span> <span class="cmt"># the human orientation</span></div>
<div class="dl-cta"><a class="cta" href="klaris-knowledge-pack.zip" download>Download the knowledge pack</a><span class="dl-meta">RVF vector KB + MCP server — drop it into your own agent.</span></div>
<a class="dropzone" href="klaris-knowledge-pack.zip" download><span class="dz-icon" aria-hidden="true">↓</span><strong>Give your AI the same understanding</strong><span class="dz-hint">klaris-knowledge-pack.zip</span></a>
</div>
</details>
</div>
</div>
</main>
<footer class="explainer-footer" role="contentinfo">
<div class="wrap explainer-footer-inner">
<p class="ef-credit">
Explainer page created by <strong><a href="https://stuart-kerr-card.netlify.app" rel="author noopener" target="_blank">Stuart Kerr</a></strong> at
<a href="https://isovision.ai" rel="noopener" target="_blank">ISOvision</a>
</p>
<a class="ef-cta" href="https://explainmyrepo.isovision.ai" target="_blank" rel="noopener">
<span class="ef-cta-lead">Would you like your own repo explainer page?</span>
<strong>Generate one here</strong>
<span class="ef-arrow" aria-hidden="true">→</span>
</a>
</div>
</footer>
</body>
</html>