How I use it
A letter arrives in the post. I scan it with my phone, or just take a photo, and send it to a dedicated address the app watches. That is the whole effort on my side. A minute later the document is already in the system with a clean title, the right date, the sender, and a handful of tags it chose by reading the content.
Behind that one email, the file lands in Paperless-ngx and gets OCR'd, then a local model running on Ollama reads the text and fills in the metadata. I only step in through a review screen, and only when something looks off, where I can correct a field with a single keystroke and move on. Nothing reaches the permanent archive until I have confirmed it, so the AI never gets the last word.
Finding things again later is where it earns its keep. Instead of digging through folders I ask a plain question like 'how much was the last heating bill' or 'when does my liability insurance renew', and I get a written answer with the actual documents it came from listed right underneath, so I can open the source and check for myself. Under the hood the question becomes an embedding, gets matched against a Qdrant vector index, and the closest passages are reranked down to the few most relevant ones before the answering model ever sees them. All of it runs on my own machine, and the Anthropic API is wired in only for the moments I want a sharper answer than the local model gives.
Architecture
10
Docker services
2
Python services
Local-first
Ollama or Anthropic
Event-driven
post_consume webhook
Stack
Key decisions
- 01
Local-first AI: runs entirely on personal hardware with Ollama. Anthropic API as optional upgrade, not a dependency.
- 02
State machine with lifecycle tags instead of a status column — every state transition is visible, auditable, and recoverable.
- 03
RAG with reranking, not naive similarity search — bge-reranker-v2-m3 filters the top-50 chunks down to 5 high-relevance results before the answer LLM sees them.
- 04
Fault boundaries per document: one extraction failure doesn't block the queue.
