The parts
Quivr is one program,quivr, that runs as an API and a worker, next to a few standard services and the plugins you choose:
The API and the worker scale separately: add API processes for more searches and worker processes for more documents.
quivr migrate prepares the databases before either starts. Deploy and configure Quivr gives the details for operators.
The path of a document
Follow one article from the moment your application sends it:- Stored, then confirmed. The API writes the article to PostgreSQL and object storage, and only then answers with a receipt. Everything after this happens in the background.
- Read. Plain text needs no reading. A file such as a PDF goes to a reader plugin that extracts its text.
- Cut into passages. The ingestion plugin cuts the text into passages. As soon as they are in the index, the article is searchable by keyword, usually within a second.
- Checked against alerts. Each saved alert’s rule decides whether the article matches. A match is recorded with its reason.
- Searchable by meaning. The ingestion plugin computes a vector for each passage, a list of numbers that captures what it means. Once they are in the index, searches by meaning find the article too. Alerts that judge by meaning are asked again at this point.
- Told to your application. Every step that matters is published in the change feed, which your application can follow, and a match can also be sent as a webhook.
What Quivr promises
Nothing confirmed is lost. Quivr confirms a document only after storing it. A crash, an outage or a slow plugin delays processing; it never drops a document Quivr has confirmed. Retrying is always safe. Every request that creates something carries an idempotency key, a name your application chooses. Sending the same request again with the same key returns the same result instead of a second copy. Reusing a key for a different request is refused with a conflict. After a timeout, your application simply sends the request again. History is kept. A version never changes. A correction creates a new version, and search moves to it only once it is ready, so readers never see a half-processed text. Earlier versions stay readable. A withdrawn document leaves search and alerts for good. Search tells the truth. Every result is checked against stored content and against the caller’s access before it is returned, and points to the exact passage it quotes. When a service search depends on is down, search returns an error, never an empty “nothing found”. The index is disposable. PostgreSQL and object storage hold the real data. The search index can be rebuilt from them, for example to change the embedding model, while search keeps answering from the old one. Notifications arrive at least once. A webhook is retried until your receiver accepts it or the retry window ends, so it can arrive more than once: your receiver ignores the copies it has seen. Matches stay readable through the API, so a receiver that was down can catch up. Your text stays in your installation by default. The plugins Quivr runs by default, and its embedding model, work inside your installation. Text goes out only through a plugin the operator turns on that calls an outside service, such as a hosted embedding model. Security covers the rest.Where to go next
Core concepts
Collections, documents, versions, search and alerts, in plain words.
How plugins work
The five jobs a plugin can do, and who runs it.