Papra

Dark-theme home screen listing recently imported PDFs, receipts and an insurance policy, each with colored tags.

Receipts and contracts filed once, found by their text

Papra is an archive for the paperwork people keep for years and almost never open: invoices, warranties, contracts, letters. A file goes in, Papra extracts its text, and full-text search brings it back the day someone asks for it. A backend-free demo, which keeps its data in the browser, runs at demo.papra.app.

Email intake, a watched folder and pluggable OCR

  • Intake without the web UI: a generated email address (through OwlRelay, a relay run by the Papra team, or a Cloudflare Email Worker), a watched folder, the CLI (papra documents import) or the API. The watched folder waits until a file stops growing before it imports it, so a scan still being written is not picked up halfway.
  • Chained extraction: the built-in engine, @papra/lecture on top of Tesseract.js, needs no setup. Mistral OCR, Docling, Azure Document Intelligence or an HTTP service of your own can sit ahead of it in CONTENT_EXTRACTION_STRATEGY, and when one fails, the next one gets the document.
  • Rule or LLM tagging: a rule tags on name or content and can be replayed over documents already imported. Since 26.6.0, an LLM (OpenAI, Anthropic, Mistral, or a local model through Ollama) can pick from the existing tags based on their descriptions. AI is switched off by default.
  • Optional encryption: AES-256-GCM with one key per document, each wrapped by a versioned master key that can be rotated. Files live on local disk, S3 or Azure Blob, and an exact duplicate (same SHA-256 hash) is rejected within an organization.
  • Sharing: organizations with owner and member roles, custom properties, and external share links with a password and an expiry date.

One SQLite container, one main maintainer

SQLite is the only database Papra runs on. The server uses the libSQL client with a db.sqlite file in the app-data volume or a remote libSQL database. No database server runs alongside it, and PostgreSQL is not an option.

Originals are never modified. The docs set out a no-mutation principle: no format conversion, no metadata written into the file, no OCR layer added to scanned PDFs. Extracted text feeds search inside Papra, and the PDF you download is the one the scanner produced.

By default, files on disk are keyed by document ID, not by name. Readable paths such as {{organization.id}}/{{document.name}} require DOCUMENT_STORAGE_USE_LEGACY_STORAGE_KEY_DEFINITION_SYSTEM=false (since 26.3.0). Encrypted files switch to a Papra-specific format with a PP01 header, unreadable without both the database and the master key.

Email intake needs an instance reachable from the internet. OwlRelay and the Cloudflare Worker both deliver messages through a webhook, and the Worker also requires a domain on Cloudflare.

Paperless-ngx is the project's stated point of comparison. The website runs a Papra vs Paperless-ngx page that puts one 524 MB container against two (app plus Redis) and lists S3 or Azure storage, organizations and an official hosted service on Papra's side. The same page rates Paperless-ngx as the more mature of the two.

Households and small teams are the target. The README pitches organizations for managing documents with family, friends or colleagues. The hosted service runs in Europe, with a free tier of 512 MB and 3 members per organization.

The latest release is 26.7.1, from October 22, 2026. Versions follow the year (YY.MINOR.PATCH) and nothing is backported, so security fixes only reach the newest release. Breaking API changes can land even in a patch release: 26.7.1 trimmed the response of PUT /api/users/me.

Almost every commit comes from one person. Corentin Thomasset, the author, has 1,089 commits; no other human contributor has more than five.

The README trails the releases. It still lists AI and a mobile app under "Coming maybe one day", yet LLM tagging shipped in 26.6.0 and the mobile app reached 1.1.0 on October 1, 2026.