Jotura

Guides / How to / 2026-08-30

Semantic search your notes offline, with no cloud and no API key

A practical guide to semantic search your notes offline: how local embeddings work, what to turn on in Jotura, and the exact commands to search by meaning.

To semantic search your notes offline, you need two pieces running on your own machine. The first is an embedding model, a small AI model that turns text into numbers. The second is an index of those numbers, covering every note you own. With both on disk, a query like “what did I decide about hosting” finds a note that never uses that word. You need no API key, no account, and no text ever leaves your laptop.

Several apps and plugins can do this locally, and they differ mainly in where the embedding runs. Jotura has it built in on Mac, Windows, and Linux, switched off until you ask for it. You enable it once in Settings, Jotura downloads a 34 MB model, and it builds the index on your machine. The search page then gains Semantic and Smart modes, and the bundled command-line tool answers the same queries:

jotura search "what did I decide about hosting" --mode semantic --json

What searching by meaning actually does

An embedding model reads a passage and outputs a list of numbers, called a vector, that stands for what the passage means. Jotura stores a 384-number vector for each chunk of your notes. A chunk is a passage sitting under one heading, or a whole note when the note is short. That is why a result points at a heading inside a note rather than at the file alone.

Two passages about the same subject end up with vectors close together, even when they share no words. Semantic search embeds your query the same way, then finds the chunks whose vectors sit nearest to it. That is how “boiling noodles” surfaces a note that says “cook the pasta for 9 minutes”.

The trade is that meaning search is fuzzy by design. If you know the exact phrase you typed last March, keyword search beats it every time. The two are complements, which is why Jotura keeps both and offers a merged mode.

Where the embedding runs

Semantic search tools differ on one axis that matters for privacy: where the embedding happens. Some send your note text to a hosted endpoint, which usually needs a paid API key. Others run a model on your own machine. Check which one you are installing, because that answer decides whether your notes leave the disk.

Local embeddings solve both problems. Your notes stay on disk, your queries stay in memory, and search keeps working on a plane. For the wider picture of what a notes app can see, read can my notes app read my notes.

The honest cost is one download. Jotura fetches two files, model.onnx and tokenizer.json, from its own release server at releases.jotura.io, checks each against a hash pinned inside the app, and never contacts it again for search. That request tells the server your IP address once. Nothing about your notes or your queries travels with it.

Turning it on in Jotura

  1. Install the desktop app from the download page and open your vault. An existing folder of markdown files works as-is.
  2. Open Settings and go to the Semantic search section.
  3. Click Enable. The model downloads once, with a percentage while it runs.
  4. Watch the first indexing pass in the status bar, which shows progress and a time estimate. A typical vault finishes in a couple of minutes.
  5. Open the search page and pick Semantic or Smart.

You can keep working while that runs, and closing the app is fine. Indexing survives restarts and picks up where it stopped.

After the first pass, the file watcher notices when a note changes on disk and queues just that note, so you never run a rebuild by hand. Settings carries a re-index button if you want to start over, and turning the feature off deletes the index while leaving your notes untouched.

The three search modes

ModeWhat it doesBest for
KeywordRanks your exact words, with a boost for title matches.Exact phrases, names, error strings, code.
SemanticCompares your query’s vector against every stored chunk vector.Half-remembered ideas, questions phrased in your own words.
SmartRuns both, then merges by rank. A note scoring in both lists rises.The default when you are not sure which will win.

Keyword search over 10,000 notes takes about 8 milliseconds in a release build. Semantic and Smart cost more than that, because they also embed your query and then compare it against every stored chunk vector. Jotura publishes no benchmark for those two, so treat the 8 millisecond figure as the keyword leg only.

Searching by meaning from the command line

The jotura command-line tool ships inside the desktop installer, which makes it useful for scripts and for AI coding agents working in your vault:

jotura search "deadline"
jotura search "how do I renew the cert" --mode semantic --json
jotura search "what did I decide about hosting" --mode smart --json

Without --mode, the command runs keyword search, the one mode that works whether or not you have enabled semantic search. The desktop app defaults to Smart and the command line does not.

Semantic and smart results come back as JSON objects with path, headingPath, snippet, and score, using vault-relative paths. That shape pipes straight into jq.

The command line only queries: it embeds your query string but never indexes notes. The desktop app creates the index and keeps it fresh, so enable the feature there first. If the index is missing, the feature is off, or the model has not downloaded, the command exits with code 13 (SemanticUnavailable) and prints JSON naming the missing piece.

jotura search "quarterly planning" --mode semantic --json
echo $?   # 13 means semantic search is not set up yet

In PowerShell, read $LASTEXITCODE instead, because $? there is a true or false value rather than the exit code. Notes written by the command line become semantically searchable after the app’s next indexing pass, not instantly. The full reference lives on the CLI page.

The limits, stated plainly

The model is bge-small-en-v1.5, an open model quantized to int8 with 384-dimension vectors. The en is the limitation: it is trained on English. Notes in other languages still get indexed, but the matching is weaker.

Semantic search is a desktop feature. The Android app opens the same files and works with Jotura Sync, the paid part of the product at 4 pounds a month with no free trial. Android does not run the embedding engine, so meaning search is desktop only. There is no iOS app at all.

Chunking sets a ceiling on results. A long note matches on one passage, so a document whose argument spreads across sections can rank below a short note that states the idea plainly.

The index is per vault and lives at .jotura/vectors.db inside the vault folder. It is derived data, not your notes, so deleting it costs you a rebuild and nothing else. Your notes stay ordinary .md files that any other tool can open.

Other ways to run this locally

Obsidian users have the widest choice, because its community plugins include semantic search. The best known of them, Smart Connections, can run an embedding model on your machine instead of calling a hosted API. Plugin behavior changes release to release, so check the model provider setting yourself rather than trusting a page like this one. That plugin ecosystem is a genuine advantage Obsidian holds over Jotura, which has no plugin system at all. We compare the two on the Obsidian comparison page.

Those routes win on things Jotura does not offer. They cost nothing, several are open source, and some let you choose the model, including multilingual ones that beat an English-only model on non-English notes.

You can also build it yourself. A local model server plus a script that chunks each file and stores vectors in a database works fine. You then own the chunking, the freshness, and the ranking, which is the part that takes the time.

The test that settles it

Whatever you pick, turn off your network and run a query. If it still answers, the search path genuinely runs on your machine.

That test has a limit worth naming. It proves nothing about what an app sends once the network comes back, and Jotura is closed source, so you cannot read the code to check. What you can check is the traffic. Jotura ships no telemetry and no tracking, and a firewall or a packet inspector will show you whether anything moves.

Download Jotura

Free. Plain markdown files, yours forever.