The step that usually forces a service into a retrieval stack is embedding. Parsing is a library call; vector search is a file. Turning text into vectors is where most projects reach for an API, and once there is an API there is a key, a bill, a network dependency and a copy of your documents on someone else’s machine.
KnowNote does it in the process instead. The default backend loads Xenova/multilingual-e5-small
through ONNX and runs it in the Electron main process.
What is actually local
Concretely, the built-in backend fixes:
- the model,
Xenova/multilingual-e5-small— multilingual, so a question in one language can retrieve a passage in another; - the revision, one pinned commit, so an upstream change cannot silently redefine the vectors your library was built from;
- the quantisation,
q8, which is a small accuracy cost for a materially smaller download and resident footprint; - the dimension, 384;
- the prefixes,
query:andpassage:— E5 was trained with an instruction prefix on each side, and using the wrong one quietly degrades retrieval without erroring. This is the kind of thing that is invisible until you measure it.
The model is downloaded the first time it is needed and cached on disk. After that, embedding never touches the network — remote model loading is explicitly disabled rather than merely unused.
Why not a hosted embedding API
Because the promise and the mechanism have to agree. A tool that says your documents stay on your machine while sending every passage to an embedding endpoint is making a claim its architecture contradicts. The prose and the pipeline would be describing two different products.
There is a second reason, which is that “works offline” is only meaningful if it is true of the whole retrieval path. If embedding needs a network, then an offline mode is a degraded mode.
What it costs
Honesty about the trade:
- One model, not the best model. A 384-dimension multilingual model at
q8will lose to a large hosted embedder on hard retrieval. The project accepts that in exchange for the guarantee. - A download on first use. Small, but not zero, and it needs a connection once.
- CPU work on your machine. Embedding a large library is not free, and the cost lands on the laptop rather than a server farm.
- No per-user tuning. You cannot swap in a model your domain would prefer.
The reason this is a defensible trade for a personal knowledge tool is that the corpus is small. A library of a few thousand passages is nothing for a quantised small model on a modern CPU, and the privacy guarantee is worth more than the last few points of retrieval quality on a corpus that fits in your pocket.
The general lesson
If a product’s claim is about where your data goes, the claim should be visible in the architecture rather than only in the copy. For this project that meant choosing an unremarkable small model and running it in the same process, because “local” is a property of the pipeline, not of the marketing.