Local, cited document answers and approved Odoo checklists
Private Offline Document Intelligence
A local workspace helps MSP teams search client contracts and SOPs, answer with page-level sources, and prepare service checklists for separate review before saving them to Odoo.
Offline local lab handoff validated
A synthetic single-host lab exercised OCR, local inference, tenant isolation, human review, Odoo read-back, and MCP stdio. The host was not physically air-gapped.

- 13/13
- Synthetic answer and abstain/review regression cases passed
- 5.056s
- First sourced answer on fresh local volumes
- 0
- Published service ports in the rechecked Compose profile
System flow
From intake to a governed outcome.
- 01Upload or find a client-scoped local document
- 02OCR and index its page, version, and effective-date evidence
- 03Answer with citations or flag missing and conflicting material
- 04Review and approve a sourced service checklist separately
- 05Save the approved Odoo activity and verify it by read-back
Problem and solution
An MSP technician may need to reconcile a client contract, an exception, and a current runbook before answering a service question. A fluent answer without the right client boundary or document version can be wrong.
I built a local document workspace that keeps OCR, retrieval, model inference, review, and Odoo checklist delivery within a controlled workflow. The assistant cites source pages, shows missing or conflicting evidence, and waits for separate human approval before saving a checklist.
Verified outcomes
A fresh synthetic local deployment exercised scanned-PDF OCR, cited answers, missing-evidence abstention, conflict review, cross-client denial, Chromium review, Odoo save/read-back, and MCP stdio search and answer. The first sourced answer on fresh volumes took 5.056 seconds without manually restarting the API. After a full stop and restart, a sourced answer took 17.768 seconds and the document and Odoo receipt remained.
A 13-case synthetic regression passed seven answerable and six abstain/review cases, with 14/14 expected fields and citations. That set was used to improve relevance, so it is regression evidence rather than an untouched holdout. A short separate workload completed 20 searches and seven answers with no HTTP errors; answer p95 was 30.180 seconds.
Architecture and reliability
FastAPI and PostgreSQL/pgvector enforce client scope and retain source provenance. Local OCR and embeddings prepare the index; Ollama provides local inference with no hosted fallback. A React workspace and TypeScript MCP server use the same domain controls. Approval binds to the reviewed checklist, while an operation ledger and Odoo read-back establish the saved result.
The four application services ran on an internal Docker network. The current Compose source declares no published service ports; a temporary bridge permits loopback-only browser and MCP access. App and Odoo database backups restored into disposable clones in the lab. Odoo filestore restore was outside that check.
Validation boundary
The screenshots and all records use synthetic data. The cited-answer image is a UI replay, not a live-model capture; the Odoo review image comes from the connected lab. Saving a checklist does not perform an IT change. The host was not physically air-gapped, and the revised no-port Compose profile has not yet been repackaged and fresh-install validated as a new release.
Repository and evidence
Product views

