Twenty-four scanned invoices in, every field read back correctly, on a 1.6 GHz laptop with no GPU. Paperless-ngx is the least demanding self-hosted stack I have measured.
- 49.1s
- To first boot
- 11.4s
- Per document
- 100%
- Field accuracy
- 1.16GiB
- Idle memory
How this was tested
Same box as the Immich review, which makes the two directly comparable: an i5-10210U with four cores and eight threads, 7.62 GiB handed to Docker Desktop 29.6.2 on WSL2. Immich was stopped first so nothing competed for memory.
The test set was 24 A4 invoices generated at 150 dpi as image-only PDFs, with no text layer, so Tesseract had to genuinely read them. Each carries speckle, a half-pixel Gaussian blur and up to 0.6 degrees of rotation to imitate a scanner.
Every document was written alongside a ground-truth file recording its invoice number, vendor, city, net, VAT and total. That is what makes the accuracy figure meaningful rather than a vibe.
Installation
Paperless ships a compose file per configuration. I used the PostgreSQL and Tika variant, which is the one you want if you ever intend to feed it Word or Excel files.
- 131s
- Cold image pull
- 3.3s
- up -d returns
- 49.1s
- UI responding
- 38.4s
- Restart recovery
Five containers: webserver, PostgreSQL 18, Valkey, Gotenberg and Apache Tika. Versions inside are Paperless-ngx 3.0.5, Tesseract 5.5.0 and OCRmyPDF 17.4.2.
Notably, it did not repeat the trap that caught Immich on Windows. Paperless puts its database in a named Docker volume by default rather than a bind mount, so Postgres initialises cleanly with no edits. The only bind mounts are the consume and export folders, which hold ordinary files and do not care about Unix ownership.
What I did change: timezone, OCR language, and a 50-character secret key. Worth doing, because the shipped compose file uses paperless as the database password.
# Verified on Windows 11 + Docker Desktop 29.6.2 (WSL2), 9 Aug 2026
PAPERLESS_TIME_ZONE=Europe/London
PAPERLESS_OCR_LANGUAGE=eng
PAPERLESS_URL=http://localhost:8000
PAPERLESS_SECRET_KEY=50-random-characters
PAPERLESS_TASK_WORKERS=2
PAPERLESS_THREADS_PER_WORKER=2
OCR accuracy

All 24 documents ingested. All 120 fields came back correctly: invoice numbers, vendor names, totals, net amounts and VAT.
I verified this by querying the documents_document table in Postgres directly and matching the extracted text against the ground-truth file, rather than trusting the interface. Zero empty documents, averaging 261 characters extracted per page.
Dropping files into the consume folder is genuinely the whole workflow. Copy in, wait, they appear indexed. No clicking required.
Speed and resource cost

OCR took 273.6 seconds for 24 documents: 11.4 seconds each, or 5.26 documents a minute. That is a five-year-old ultrabook chip with no acceleration, so treat it as a floor rather than a ceiling.
Idle sits at 1.16 GiB across five containers, and peaked at 1.58 GB during OCR. Tika alone accounts for 299 MiB doing nothing, which is the price of Office file support.
Against Immich, on the same hardware

Running both on the same machine makes the contrast plain. Paperless idles at less than half Immich’s memory and peaks at roughly a third of the CPU. Where it loses is disk: 7.18 GB of images against Immich’s 6.1 GB, largely because Gotenberg alone is 2.44 GB.
Practically, that means Paperless will sit comfortably on a 4 GB box where Immich cannot. It is a far better first tenant for a small home server.
Stability
docker compose restart brought the interface back in 38.4 seconds with all 24 documents intact. Nothing crashed, and the consume folder drained without a single failed task.
Who should run it
Run it if you have a scanner and a filing cabinet you resent, and a box with 4 GB free. The consume-folder workflow means you can point a network scanner at it and stop thinking about filing entirely.
Skip it if your documents are already born-digital and searchable, or if you are not going to set up backups. An OCR index of your entire financial life is exactly the thing you do not want to lose or leak.


