Solo projectRuns locally

Aktenraum

AI-powered personal document management with automatic classification, review workflow, and RAG-based full-text search.

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

Aktenraum system architecture — topology and data flow across the 10-service Docker stack

10

Docker services

2

Python services

Local-first

Ollama or Anthropic

Event-driven

post_consume webhook

Stack

React 19TypeScriptTanStack RouterTanStack QueryTailwind v4FastAPIPythonOllamaAnthropic Claude APIQdrantPaperless-ngxPostgreSQLDocker Composenginx

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.

Private repository