Tech Digest

Head to head

Paperless-ngx vs Nextcloud

Nextcloud stores the PDF you put in it. Paperless-ngx reads it, extracts the text, files it and lets you find it by a phrase you half remember. That is the difference.

Last reviewed 2 tools compared

Do you need Paperless-ngx if you already run Nextcloud?

Yes, if you deal with paper. Nextcloud is file sync and groupware: it stores documents, versions them and shares them, but it does not OCR a scanned page, so a PDF from your scanner is an unsearchable image inside it. Paperless-ngx exists to read that page, extract the text, classify it by correspondent and type, and make ten years of statements searchable by a phrase. They are not competitors and the common setup is both, with the scanner writing into a folder Nextcloud syncs and Paperless consumes. Skip Paperless only if your documents already arrive as text-layer PDFs and filename search is genuinely enough.

These two are not competitors, and any page that ranks them against each other on a feature grid has already misunderstood the question. Nextcloud is a file sync and groupware platform: files, calendar, contacts, shares, office documents, an app store. Paperless-ngx is a document management system: it OCRs, classifies and indexes finished documents and gives you no way to write one.

The question people are actually typing is "do I still need Paperless if I already run Nextcloud", and the answer for anyone who owns a scanner is yes.

What Nextcloud does with a scan, precisely#

You scan a bank statement. Your scanner produces a PDF that is, internally, a photograph of a page. You put it in Nextcloud. Nextcloud stores it, versions it, syncs it to your laptop and lets you share a link to it.

What Nextcloud does not do is read it. There is no text layer, so searching for the account number returns nothing. Nextcloud's search finds it by filename, which means the entire filing system is whatever naming discipline you personally sustain across ten years, and nobody sustains that.

Nextcloud's full text search is an app-store construction rather than a core feature: you install a provider app to extract content plus a platform app that talks to a search backend such as Elasticsearch, which is another service to run, tune and back up. And it indexes text that already exists in a file. It does not manufacture text from an image.

Paperless-ngx runs OCRmyPDF, Tesseract and Ghostscript over every incoming file, embeds a text layer, and stores a searchable PDF/A archive copy next to the original. That is the entire reason it exists.

What the spec table means here#

Compare these rows and ignore the rest. Container count is 5 against 4 and both are underestimates of the attention involved. Ops load is 3 against 4, and the extra point on Nextcloud is nothing to do with size, it is the release calendar. Idle RAM understates Paperless badly: it sits at roughly 450 MB doing nothing and then saturates every core you gave it the moment a document arrives.

SpecificationPaperless-ngxNextcloud
LicenceGPL-3.0 (Copyleft)AGPL-3.0-or-later (Copyleft)
Written inPython / Django, Angular frontendPHP, with Vue and TypeScript frontends
First release20222016
MaturityMatureMature
DatastorePostgreSQL (SQLite and MariaDB also supported)MariaDB 10.11+/11.x or PostgreSQL 14 to 18, plus Redis for file locking and caching
Services to run54
Idle memory450 MB600 MB
Memory in use1200 MB1800 MB
Operational load3 / 5, Moderate4 / 5, Heavy
IdentityNative OIDCOIDC via plugin
arm64 buildsYesYes
Default ports800080, 443, 8080
Backup shapePostgres dumpMySQL dump

The consume folder is the actual product#

Paperless's workflow is one directory. Anything that lands in ./consume gets picked up, OCRed, classified against your existing correspondents and document types, filed, and then deleted from the folder. Your scanner writes there over SMB. Your phone's scanning app syncs there. An IMAP mailbox rule drops invoices there. You never name a file.

Two configuration facts decide whether this works on day one:

yaml
environment:
  USERMAP_UID: 1000                        # match whoever writes into ./consume
  USERMAP_GID: 1000
  PAPERLESS_CONSUMER_POLLING_INTERVAL: 30  # required on NFS or SMB
  PAPERLESS_OCR_LANGUAGE: eng
  PAPERLESS_TASK_WORKERS: 1                # workers x threads must not exceed cores
  PAPERLESS_THREADS_PER_WORKER: 1

The polling interval is the one that wastes people's weekends. Paperless watches the consume directory with inotify, and network filesystems do not deliver inotify events. Files land, nothing happens, nothing is logged. It presents exactly like a broken scanner.

The worker arithmetic is the other one. PAPERLESS_TASK_WORKERS multiplied by PAPERLESS_THREADS_PER_WORKER must not exceed your core count or consumption gets slower rather than faster, and OCR chews several hundred megabytes per worker thread. On a 2 GB single-board computer that means 1 and 1, and a bulk import runs overnight. There is no GPU acceleration to reach for.

The uncomfortable part of each one#

Paperless: an export only restores into the same version it came from. The docs are explicit that a document_exporter archive cannot be imported into a different Paperless version, because the manifest mirrors the database exactly and migrations change the layout. So store the image tag alongside every export. Restoring a year-old backup means starting that exact tag first, importing, then upgrading forward through the normal migration path. Version 3.0 in July 2026 also swapped the Whoosh search index for tantivy, removed document and thumbnail encryption outright, deleted the positional arguments passed to pre and post consume scripts, and dropped API versions below 9. Custom hooks reading $1 and $2 stopped working silently.

Nextcloud: you cannot skip a major version, and there are three majors a year. Version 32 landed 27 September 2025, 33 on 18 February 2026, 34 on 9 June 2026, each supported for exactly twelve months. Drift for eighteen months and you are running four sequential upgrades, each with its own PHP window (32 wants PHP 8.1 to 8.4, 34 wants 8.2 to 8.5) and each gated on every installed app being marked compatible. This is why All-in-One exists: it pins the whole stack including PHP and moves it as a unit. An update strategy that does not lose data covers making that a calendar item rather than a crisis.

Backups, where the two differ most#

Paperless has exactly one safe backup and it is not a file copy:

bash
docker compose exec -T webserver document_exporter ../export

That writes originals, archive PDFs, thumbnails and a manifest.json carrying every tag, correspondent, custom field and permission. A raw copy of the media volume gets you 0000123.pdf and no filing system at all. The exporter updates in place, so rsync the export directory for incremental backups; -d prunes deleted documents, and -na -nt skips archive files and thumbnails, which you can regenerate later with document_archiver and document_thumbnails.

Nextcloud needs three things taken at the same moment: config/, the data directory, and the database, with occ maintenance:mode --on first so the dump and the files agree about which uploads exist. Inside the data directory, appdata_*/preview is regenerable and is often the largest single tree, so excluding it is the one safe saving. Push both sets offsite with restic and rehearse the restore using Backups that actually restore; the database consistency details are in Backing up a running database.

The case for running both#

This is what most people who take paperwork seriously end up with, and it is a clean division of labor:

  • Nextcloud owns the working files: things you are still editing, sharing and syncing to a phone. Calendar and contacts come along for free.
  • Paperless owns the archive: things that are finished, need to be findable in seven years, and will never be edited again. Statements, invoices, warranties, tax paperwork, medical letters.

Wire them together with a dedicated inbox folder rather than a shared one. Point Paperless's consume directory at a path Nextcloud also serves, add PAPERLESS_CONSUMER_POLLING_INTERVAL because it will be a network mount, and remember that Paperless deletes files from the consume folder after ingesting them, which looks like data loss to whoever is watching that folder in the Nextcloud client. A folder named Scans/Inbox that nobody treats as storage avoids the argument.

If you only want file sync and none of the groupware, Nextcloud is the wrong half of this pair: see Nextcloud vs Seafile and Syncthing vs Nextcloud before you commit to three upgrade windows a year. If photos are the real driver, Immich vs Nextcloud for photos is the relevant page.

The verdict, by situation#

Your situationPickWhy
You own a document scanner and a filing cabinetPaperless-ngxOCR plus the consume folder is the entire point
You want files on your phone and laptop, plus calendarNextcloudPaperless has no sync client and is not trying to have one
You already run Nextcloud and scan paperBothNextcloud for working files, Paperless for the archive
You need to find a phrase inside a ten year old statementPaperless-ngxFull text over an OCRed archive, with no extra search platform
Everything you file is already a text-layer PDFNextcloud aloneFilename and metadata search may genuinely be enough
Small business consuming invoices from a mailboxPaperless-ngxIMAP ingestion into the same consume pipeline
A 1 GB single-board computer is all you haveNeitherOCR thrashes and Nextcloud's 5 minute cron will feel broken
You are replacing Google Workspace outrightNextcloudGroupware is what you are actually buying

What to do next#

If you are adding Paperless to an existing Nextcloud, do it in this order: create the dedicated inbox folder, set PAPERLESS_CONSUMER_POLLING_INTERVAL, feed it ten documents by hand and check the OCR quality before you point a scanner at a decade of paper. Pin an exact image tag and record it next to your first document_exporter run. If you are starting from nothing, size both against your hardware in Stack planner, and browse Documents or Photos and files for the lighter options if five containers is more than you want to own.

Questions#

Does Nextcloud do OCR?

Not in core. Nextcloud stores whatever you upload; a scan is an image inside a PDF wrapper and stays that way. Full text search exists as an app-store construction that needs a provider app plus a separate search platform such as Elasticsearch, which is another service to run and tune, and it indexes text that is already present rather than creating it. Community OCR apps exist, but you are then maintaining app-store plugins across three Nextcloud major upgrades a year, which is the exact thing that breaks.

What is the consume folder and why does it matter?

It is a directory Paperless watches; anything you drop in gets OCRed, classified and filed automatically, then removed from the folder. That is the whole workflow: your scanner writes to it over SMB, or your phone scanning app syncs into it, and documents appear in the archive without you naming or sorting anything. Set USERMAP_UID and USERMAP_GID to match whoever writes there, or the scanner drops files the container cannot read.

Why is nothing happening when I put files in the consume folder?

Almost always because the folder is on NFS or SMB. Paperless watches it with inotify, which network filesystems do not deliver, so files land and nothing happens with no error logged. Set PAPERLESS_CONSUMER_POLLING_INTERVAL to a positive number of seconds to switch to polling instead. This is the single most common Paperless support report, and it looks identical to a broken scanner.

Can I back up Paperless by copying the media volume?

No, and this ruins people. The media tree is a pile of files named 0000123.pdf with no metadata; your tags, correspondents, document types, custom fields and permissions live in the database. Use docker compose exec -T webserver document_exporter ../export, which writes originals, archive PDFs, thumbnails and a manifest.json containing all of it. Rerunning updates in place, so you can rsync the export directory incrementally.

How much disk does Paperless-ngx actually use?

Roughly double your scan volume by default, because it keeps the original file plus a generated PDF/A archive copy of every document. Set PAPERLESS_ARCHIVE_FILE_GENERATION=never to halve it, at the cost of in-browser viewing for formats that need conversion. The search index under data/ and classification_model.pickle are regenerable and can be excluded from backups entirely.

Can Paperless read from a Nextcloud folder?

Yes, and it is the standard way to wire them together. Point Paperless's consume directory at a path Nextcloud also serves, so a phone scan syncs into Nextcloud and Paperless picks it up. Two caveats: if that path is a network mount you need PAPERLESS_CONSUMER_POLLING_INTERVAL because inotify will not fire, and Paperless deletes files from the consume folder once ingested, which will look like data loss to a Nextcloud user watching the folder. Use a dedicated inbox folder, not a shared one.

Which is heavier to run?

Nextcloud, by attention rather than by RAM. Paperless is five containers and roughly 450 MB at rest, spiking hard during OCR. Nextcloud is around 600 MB at rest but ships three majors a year with a twelve-month support window and no skipping, so staying supported means two or three upgrade windows annually, each gated on PHP compatibility and on every installed app being ready. That is why Nextcloud scores 4 on ops load and Paperless scores 3.

Sources#

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.