The whole knowledge base in one file
.jpg


Island
Forest
Mountain
A folder and a few lines of TOML become one .urna: chunks, vectors, index, media and manifest, each section signed.
The card scans go into the file as AV1 and the vectors move to a smaller preset. The file shrinks, the citation stays the same.
The model_hash gate checks the model, HNSW walks the graph, BM25 matches the word and exact cosine sets the order.
The answer carries a citation back to the source, and urna validate checks every layer before the first query, offline.
From a folder of documents
to a file that answers
What fits in a .urna
00100000 01010011 01111001 01110011 01110100 01100101 01101101 00111010 00100000 01000011 01100001 01110010 01100100 01110011
Public benchmark, same ruler
Benchmark from 2026-09-10 on arm64, single thread. What Urna doesn't do: in-place update and delete, metadata filters, concurrent writes. See the full table.
The urna benchmarks
Compression against search by name
7 files · 1,000 queries eachtimes smaller than the 3.98 GB of source JPEG. The file at crf50 weighs 533 MB and finds the card by name as often as the 3.61 GB lossless file: txt@1 at +0.001, within the standard error.
What this metric measures
txt@1 is the fraction of the 1,000 queries in which the right card came first. The query is the card's name as text ("artwork of the card {name}"), searched in clip's image space: the model only sees the art, which is why the level is low in every file; what matters is where it drops.
drift is the cosine between the compressed image's vector and the original's: 1.00 is identical, and the lower it goes, the more the codec changed what the model sees. The worst decile (p10) is the card at the edge of the 10% that changed the most; the median (p50) is the card in the middle.
How to read this chart
Each column is a file with the same 38,627 cards, from lossless (3.61 GB) to AV1 at crf60 (230 MB), in order of compression.
At the top, both drift lines fall the whole way and cross the gate floor as early as the second file. At the bottom, search stays flat through crf50: the green bars are within one standard error of lossless; the dashed line marks where search drops, and the red bars are the files past it.
| file | size | drift p10 | txt@1 | ±1 standard error | z vs lossless |
|---|---|---|---|---|---|
| lossless | 3.61 GB | 0.9968 | 0.092 | 0.0091 | 0.00 |
| neardup | 1.37 GB | 0.9666 | 0.096 | 0.0093 | 0.31 |
| avif q48 | 1.2 GB | 0.9680 | 0.096 | 0.0093 | 0.31 |
| crf40 | 981 MB | 0.9594 | 0.089 | 0.0090 | -0.23 |
| crf50 | 533 MB | 0.9389 | 0.093 | 0.0092 | 0.08 |
| crf55 | 370 MB | 0.9211 | 0.074 | 0.0083 | -1.46 |
| crf60 | 230 MB | 0.8866 | 0.069 | 0.0080 | -1.89 |
1,000 queries per file, the same cards in all of them; binomial standard error; z is the distance from each file's txt@1 to lossless in combined standard errors: through crf50, none goes past 1.
measured on 2026-09-12 · benchmark/experiments/14-utility-ladder/results.json
curl -sSf https://raw.githubusercontent.com/hoffresearch/urna/main/scripts/install.sh | sh
urna setupurna build --spec corpus.tomlurna ask corpus.urna "does it work offline?" -k 3urna retrieve corpus.urna "does it work offline?" -k 5 --format jsonlimport urna
from urna.embed_potion import potion_embedder
emb, db = potion_embedder(), urna.open("corpus.urna")
qvec = emb.embed_texts(["does it work offline?"])[0]
hits = db.retrieve(qvec, 5, expected_model_hash=emb.model_hash())urna validate corpus.urnaurna cite corpus.urna "urna://content_hash/chunk_id"urna benchmark corpus.urna -q 100 -k 10 --ann 100One release, every package manager
npx @urna/cli validate corpus.urnauvx --from urna urna validate corpus.urnacargo binstall urnaThree groups of verbs and a screen to use them


A file and a vector in, hits out. No Python.
- inspect
- validate
- stats
- media
- search
- search-ann
- search-graph
- search-space
- search-text
- benchmark
- cite
- doctor
Text or a spec in, cited answers out, through the offline Python embedder.
- ask
- retrieve
- build
The installer every channel ends in, and the terminal explorer.
- setup
- tui