Deployment guide

Migrate from Papermerge to Paperless-ngx

Deploy on a VPS Cloud →

Tutorial

Migrate from Papermerge to Paperless-ngx

Self-hosting10 min read8 steps

On September 5, 2026, Eugen Ciur — the sole maintainer of papermerge-core — opened issue #1318 to announce a full pivot to Papermerge Cloud, a paid SaaS product. Without a community maintainer by October 5, 2026, the repository will be archived and will receive no further security updates. If your team archives documents on a self-hosted Papermerge instance, this thirty-day window is the signal to migrate. Paperless-ngx — a GPL-3.0 community fork with ~23,000 GitHub stars and an official Docker Compose file — is the natural successor: it covers all of Papermerge's features and adds multi-language OCR, tags, correspondents, and S3-compatible storage.

The warning signal: papermerge-core issue #1318

On September 5, 2026, Eugen Ciur published issue #1318 on the papermerge/papermerge-core repository with an unambiguous title: "Looking for a maintainer". The announcement is direct: Papermerge will become a commercial SaaS product under the name Papermerge Cloud. The open source project is looking for a community maintainer within a thirty-day window. Without an identified maintainer, the repository will be archived around October 5, 2026 — tickets will remain visible but no further commits will be accepted.

This scenario is structurally different from a simply inactive project. An archived repository receives no security patches. Papermerge v3.x relies on FastAPI, React, and a REST API — a modern architecture, but one whose dependencies (Python, FastAPI, OCR libraries) regularly publish critical updates. Continuing to run an unmaintained instance means silently accumulating a security debt.

What you lose by staying on a frozen Papermerge

  • No more security patches: any vulnerability discovered after archiving will remain open — FastAPI and its dependencies publish several advisories per month
  • Python compatibility declining: new Python versions drop deprecated APIs; an OS update is enough to break the environment
  • Orphaned plugins and integrations: third-party connectors (scanners, mail clients, webhooks) will no longer be updated to follow Papermerge's REST API evolution
  • No official schema migrations: if a database bug is discovered, no fix will come from the archived repository
  • No contractual support coverage possible: no vendor will cover an installation on an archived project
  • Ecosystem closing in: official Docker images stop being published, and unofficial images introduce a supply chain risk

Why Paperless-ngx is the natural successor

Paperless-ngx is a community fork of paperless-ng, itself derived from Daniel Quinn's original Paperless project. It is published under the GPL-3.0 license, counts ~23,000 stars on GitHub as of September 25, 2026, and receives regular updates from a distributed team of about ten active contributors — no single maintainer.

The architecture is more mature than Papermerge v3.x for SME use: Django as the backend, Celery for asynchronous tasks, PostgreSQL or SQLite as the database, and an integrated Angular frontend. The official Docker Compose file — maintained in the repository — deploys everything with a single command. Volumes persist documents, the database, and index data.

  • Multi-language OCR via Tesseract: French, Arabic, Spanish, English and dozens of other languages configurable via environment variables
  • Hierarchical tags: fine-grained document organization with inherited automatic assignment rules
  • Correspondents: identification of recurring senders/recipients, automatic assignment by rule
  • S3-compatible storage: archive originals to an S3 or compatible bucket (MinIO, Garage) without modifying the interface
  • Documented REST API: integration with external workflows (n8n, curl scripts) via /api/documents/
  • Consume folder: any file dropped in /consume is automatically ingested — natural connection for network scanners and mail clients

Papermerge v3 vs Paperless-ngx: comparison

Papermerge v3 vs Paperless-ngx

Scroll the table

CriterionPapermerge v3Paperless-ngx
Project statusArchiving announced ~Oct. 5, 2026Active, regular releases
LicenseApache 2.0GPL-3.0
BackendFastAPI (Python)Django + Celery (Python)
OCRTesseract (manual configuration)Tesseract multi-language, auto-detect
Document organizationHierarchical foldersTags, correspondents, document types
External storageNot nativeS3 / S3-compatible (MinIO, Garage)
Official Docker ComposeYes, but unmaintained after archivingYes, actively maintained
GitHub community~2,500 stars~23,000 stars

Prerequisites before migrating

Paperless-ngx is lighter than its reputation suggests. The minimum requirements for a team of 1 to 10 users with a corpus of a few thousand documents are reasonable on a standard VPS.

  • VPS: 2 vCPU / 2 GB RAM minimum — 4 GB recommended if OCR runs in parallel on multiple documents during ingestion
  • Docker and Docker Compose: Docker ≥ 24, Docker Compose ≥ 2.20 (integrated plugin, not the legacy Python binary)
  • 40 GB SSD storage minimum for originals + index data; plan for more depending on archive volume
  • Domain or subdomain with a valid TLS certificate — Paperless-ngx does not require HTTPS but strongly recommends it for sessions and API tokens
  • Root or sudo access on the VPS to install Docker and configure the reverse proxy
  • Backup of your existing Papermerge instance before any operation: document export + database dump

Step-by-step migration guide

Migrate from Papermerge to Paperless-ngx

  1. Export your documents from Papermerge

    In the Papermerge interface, go to Documents → Export. Select "All documents" and start the export. Papermerge generates a ZIP file containing the originals (PDFs, images) organized by folder. Download this file to your local machine or transfer it directly to the target VPS via scp:

    scp papermerge-export.zip user@your-vps:/tmp/
  2. Unzip the export and prepare the consume folder

    On the VPS, unzip the archive into a temporary directory:

    mkdir -p /opt/paperless-import
    unzip /tmp/papermerge-export.zip -d /opt/paperless-import/

    You get a directory tree of files. Paperless-ngx will consume these files via its consume folder in a later step.

  3. Install Paperless-ngx via the official Docker Compose file

    Fetch the official docker-compose.yml from the Paperless-ngx repository:

    mkdir -p /opt/paperless && cd /opt/paperless
    curl -fsSL https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/docker-compose.postgres.yml -o docker-compose.yml
    curl -fsSL https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/.env.example -o .env

    Edit the .env file: set PAPERLESS_URL, PAPERLESS_SECRET_KEY (a long random string), PAPERLESS_OCR_LANGUAGE (e.g. fra+eng for French + English), and PAPERLESS_TIME_ZONE (Europe/Paris or your timezone).

  4. Start the instance and create the administrator account

    Launch the containers in the background:

    docker compose up -d

    Wait for the service to be ready (30 to 60 seconds), then create the superuser:

    docker compose exec webserver python3 manage.py createsuperuser

    Log in at http://localhost:8000 (or your domain) to verify the interface responds.

  5. Import documents exported from Papermerge

    Copy the exported directory tree into the Paperless-ngx consume folder. By default, this folder is the consume volume declared in docker-compose.yml:

    cp -r /opt/paperless-import/* /opt/paperless/consume/

    Paperless-ngx will automatically detect the new files and ingest them via Celery. You can monitor progress in the Logs tab of the interface or via:

    docker compose logs -f celeryworker
  6. Configure the reverse proxy and TLS

    Expose Paperless-ngx behind nginx. Minimal block example for a subdomain:

    server {
        listen 443 ssl;
        server_name docs.your-domain.com;
        ssl_certificate /etc/letsencrypt/live/docs.your-domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/docs.your-domain.com/privkey.pem;
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

    Obtain or renew a Let's Encrypt certificate for this subdomain, then reload nginx.

  7. Verify OCR coverage and test imported documents

    In the Paperless-ngx interface, open several imported documents and verify their content is indexed (working search bar). For documents where OCR failed (warning icon), relaunch OCR manually from the interface or via the REST API:

    curl -X POST http://localhost:8000/api/documents/<id>/redo_ocr/ \
      -H 'Authorization: Token <your-token>'
  8. Validate and shut down the old Papermerge instance

    After the full import, verify that the document count in Paperless-ngx matches your Papermerge export. Test full-text search on known terms, check attachments and downloadable originals. Once validation is complete, stop the Papermerge instance and remove its containers: docker compose down from its deployment directory.

Essential Paperless-ngx configuration

After the initial import, three configuration areas have a direct impact on day-to-day service quality.

  • OCR: PAPERLESS_OCR_LANGUAGE accepts a list of Tesseract language codes separated by + (fra+eng+ara). If your corpus is multilingual, declare all languages from the start so imported documents are reprocessed correctly
  • S3 storage: set PAPERLESS_STORAGE_BACKEND=s3, PAPERLESS_S3_ACCESS_KEY, PAPERLESS_S3_SECRET_KEY and PAPERLESS_S3_BUCKET_NAME to offload originals to an S3-compatible bucket — useful for multi-gigabyte corpora on a storage-limited VPS
  • Automatic assignment rules: in the interface, create rules that assign a tag, correspondent, or document type based on OCR content (e.g. any document containing "invoice" → tag Invoices, correspondent Supplier X)
  • Scheduled tasks: the Celery worker already handles automatic consumption; verify that PAPERLESS_CONSUMER_POLLING is 0 (inotify) or a reasonable interval if inotify is not available in your Docker environment

To reduce ingestion time on a large corpus, enable parallel consumption by setting PAPERLESS_TASK_WORKERS=4 in your .env (adjust to your vCPU count). On a 4 vCPU / 4 GB RAM VPS, ingesting 500 single-page PDFs drops from ~20 min to ~6 min. Monitor memory: Tesseract consumes ~200 MB per active worker.

Integration with your existing tools

Paperless-ngx integrates into document workflows without custom development. Three entry points cover the majority of SME use cases.

  • Network scanner: configure your scanner to send scans via SFTP or SMB into /consume. Paperless-ngx ingests them on arrival, with no manual action required
  • Mail client: the mail consumer (PAPERLESS_EMAIL_HOST, PAPERLESS_EMAIL_PORT) monitors an IMAP mailbox and automatically imports PDF attachments from messages matching your filters (subject, sender)
  • REST API: the POST /api/documents/post_document/ endpoint accepts a multipart file. From n8n, a workflow can send any received email attachment directly to Paperless within seconds. The API token is generated under Settings → API Tokens
  • Mobile app: the Paperless Mobile app (Android/iOS, open source) connects to your self-hosted instance via URL and API token

Troubleshooting: common issues after migration

  • Imported documents with no OCR text: verify the Tesseract language code is correct (PAPERLESS_OCR_LANGUAGE=fra not fr). Valid codes are listed in the Tesseract documentation. Relaunch OCR on affected documents via the interface or API
  • Consume folder not monitored: if you use a Docker volume mounted from an NFS partition or object storage, inotify does not work. Set PAPERLESS_CONSUMER_POLLING=60 for a scan every 60 seconds
  • "Permission denied" error on /consume: the Paperless worker runs as UID 1000. If files copied to /consume belong to root, change permissions: chown -R 1000:1000 /opt/paperless/consume/ on the host
  • Incomplete import — missing documents: Papermerge exports documents in the folder structure visible in its interface. Documents in deeply nested folders are all exported, but filenames containing special characters may cause issues. Check with find /opt/paperless-import -name '*.pdf' | wc -l and compare to your Papermerge instance total

Take back control of your archives

The window is short: the papermerge-core repository will be archived around October 5, 2026 if no maintainer comes forward. Staying on a frozen Papermerge instance means silently accumulating a security debt on a tool that handles potentially sensitive documents — invoices, contracts, official correspondence.

Paperless-ngx offers a lossless migration: your original files are imported as-is via the consume folder, OCR is rerun on documents that need it, and no destructive transformation is applied. The official Docker Compose deployment makes the installation reproducible in under an hour on any VPS. On ServOrbit, Paperless-ngx is available directly in the collaboration marketplace — you start from a pre-configured Docker Compose environment ready to receive your archives.

Deploy Paperless-ngx on your VPS

Papermerge is switching to a paid SaaS. Keep control of your document archives on a ServOrbit VPS with Paperless-ngx — GPL-3.0, ~23,000 GitHub stars, official Docker Compose. Installation in under an hour, data hosted on your own infrastructure.

Need help?

Browse our help center and FAQ, or reach our team — callback, WhatsApp or email. Support in French, English and Arabic.

Message us on WhatsAppopens in a new tab