The embedding model is now chosen in the last onboarding step and fixed for the whole library. Skipping keeps bge-small, which ships with the app and can't be deleted. Changing the model later is not built. - An embedding_indexes row records the model's spec and its vector table, and each document records which index embedded it. Migration 0021 stamps existing libraries with bge-small. Routes that queue embedding work return 409 embedding_not_chosen until a model is chosen. - Ingest, Studio and search embed through the active index; the old worker embedding module is removed. Workers wait for the schema, and documents interrupted when the app closed are marked failed. - Curated embedders (bge-small, granite-97m, granite-311m) live in the local manifest, run by a new onnxruntime engine. EMBEDDING is a catalog type, never a selection slot. - Hugging Face search finds ONNX embedders. Each download is checked: a probe sets its width, and a ten-question search check must pass. Small tokenizer.json files that Hugging Face lists without a checksum are hashed at the pinned commit. Results use the GGUF search's shapes. - Onboarding renders the embedding step with the same component and shared list as the other steps; only its choice hook differs. Use marks the choice and Finish sends it. Bundled models have no Delete. - Settings has a read-only Embedding section. - ADRs 0036 and 0037, a new embedding architecture doc, and updates to the docs it touches. New strings are translated into every language. |
||
|---|---|---|
| .. | ||
| 0003-artifacts-as-documents.md | ||
| 0004-desktop-app-is-its-own-tree.md | ||
| 0005-hand-written-migrations.md | ||
| 0006-hybrid-retrieval.md | ||
| 0007-bundled-embeddings.md | ||
| 0008-two-job-queues.md | ||
| 0009-freshness-by-invalidation.md | ||
| 0010-studio-builders-not-sandboxes.md | ||
| 0011-llama-cpp-local-runtime.md | ||
| 0012-vulkan-only-gpu-backend.md | ||
| 0013-fit-from-the-allocator.md | ||
| 0014-two-tier-model-catalog.md | ||
| 0015-openai-compatible-connections.md | ||
| 0016-no-telemetry.md | ||
| 0017-egress-off-by-default.md | ||
| 0018-keychain-envelope-encryption.md | ||
| 0019-offline-licenses.md | ||
| 0020-two-update-channels.md | ||
| 0021-no-intel-mac-build.md | ||
| 0022-markdown-only-cloud-import.md | ||
| 0023-sunset-behind-flags.md | ||
| 0024-portal-without-accounts.md | ||
| 0025-scraper-client-as-paid-plugin.md | ||
| 0026-curated-order-is-list-position.md | ||
| 0027-egress-consent-per-host.md | ||
| 0028-model-written-code-runs-with-approval.md | ||
| 0029-icu-translation-catalogs.md | ||
| 0030-formatjs-renders-interface-text.md | ||
| 0031-ranking-blends-absolute-leg-scores.md | ||
| 0032-one-tokenizer-for-index-and-question.md | ||
| 0033-every-candidate-is-scored-on-its-own-cosine.md | ||
| 0034-vision-is-the-runtimes-answer-stored-nowhere.md | ||
| 0035-docker-compose-runs-the-desktop-stack.md | ||
| 0036-the-index-records-its-embedder.md | ||
| 0037-embedding-is-a-type-not-a-slot.md | ||
| README.md | ||
Architecture decision records
Each file here records one decision and the reasons for it: the why behind what architecture/ describes. An accepted ADR is not rewritten. When a decision changes, a new ADR supersedes the old one, and the only edits an accepted ADR takes are its Status line, which becomes "Superseded by" with a link to the new record (or, when only part is superseded, names that part and the record that supersedes it), and fixes to its links.
Adding one
Take the next free number. Add the record in the same pull request as the change it decides, or with the proposal that makes it. Use this shape and keep it short:
# ADR NNNN: <the decision, stated as a sentence>
- **Status:** Accepted
- **Date:** YYYY-MM-DD
- **Supersedes:** <only if it does>
- **Source:** [<short name> L<a>–<b>](<permalink>)
## Context
<the problem and the constraints that forced a choice>
## Decision
<the choice, precisely; bullets are fine>
## Consequences
<what it makes true, what it costs, what it rules out>
## Where the code stands
<only when the code does not fully hold the decision; state the gap plainly, citing file paths>
The Date is the day the decision was first written down. Source links are permalinks to a fixed commit, so they keep working after the file they point at moves or is deleted.
Numbering
0001 and 0002 were hosted-era records about the git-native knowledge base. They were deleted on 17 Sep 2026 in commit 35c83caa8, and their numbers are retired. 0003 was written for the hosted stack and restored for the desktop app.