mothermachine

Browse / Support and bookkeeping

Papra

Minimal document archive for receipts and invoices: email intake, OCR, tagging rules, API, CLI, and 100+ named env vars.

AdaptableOperable Business appWeb app Hybrid TypeScript API License: AGPL-3.0

Papra is an AGPL document management platform built for storing and finding receipts, warranties, and invoices: upload or forward email to a generated intake address, extract text with OCR or a hosted extractor, auto-tag with rules or an LLM, and query it all through a bearer-token API, a CLI, or webhooks. Self-hosting is free; papra.app sells managed plans from $7.50 a month.

Alternative to Dext, Hubdoc

Use it when
  • we want every receipt and supplier invoice forwarded to one address, OCR'd, tagged, and searchable before month-end without paying per user
  • we want our agent to file documents and pull the ones tagged for the accountant through an API key rather than a shared drive
Gotchas
  • AGPL-3.0
  • Archive, not ledger: no amounts, no double-entry; pair with an accounting listing
  • Email intake needs OwlRelay or a catch-all domain wired to a webhook
  • Managed Free plan is 512MB and 3 members

Last activity Sep 3, 2026. Fit: adaptable 2, operable 3.

Editions

Free (self-hosted) · Free open source

  • Clonegit clone https://github.com/papra-hq/papra
  • ImageContainer

Managed Free · Free closed source

closed source

closed source

For agents: JSON · Markdown

Adaptable: what is yours to change

Make it yours

Config only24 things to edit

Everything is env vars, documented at docs.papra.app/self-hosting/configuration. An SMB sets AUTH_SECRET, AUTH_IS_REGISTRATION_ENABLED, DOCUMENT_STORAGE_DRIVER (filesystem, S3, Azure), INTAKE_EMAILS_IS_ENABLED plus a driver, DOCUMENTS_OCR_LANGUAGES or CONTENT_EXTRACTION_STRATEGY, AI_IS_ENABLED with one provider key, AUTO_TAGGING_ENABLED, and EMAILS_DRIVER/SMTP_*. Tagging rules, organizations, and API keys are created in the app.

Env vars
AUTH_SECRET AUTH_IS_REGISTRATION_ENABLED AUTH_FIRST_USER_AS_ADMIN DOCUMENT_STORAGE_DRIVER DOCUMENT_STORAGE_FILESYSTEM_ROOT DOCUMENT_STORAGE_S3_BUCKET_NAME INTAKE_EMAILS_IS_ENABLED INTAKE_EMAILS_DRIVER INTAKE_EMAILS_CATCH_ALL_DOMAIN OWLRELAY_API_KEY DOCUMENTS_OCR_LANGUAGES CONTENT_EXTRACTION_STRATEGY AI_IS_ENABLED AI_DEFAULT_MODEL ANTHROPIC_API_KEY OPENAI_API_KEY OLLAMA_BASE_URL AUTO_TAGGING_ENABLED AUTO_TAGGING_MODEL EMAILS_DRIVER SMTP_HOST WEBHOOK_URL_ALLOWED_HOSTNAMES
Config files
docker-compose (env block) apps/papra-server/.env (optional)
Prompt files
none
Accounts you need
an email intake provider (OwlRelay) or your own catch-all domainoptional: S3-compatible storage, an LLM provider for auto-tagging

Source

Operable: what an agent can drive

Interface

OfficialAPIpublished by the builderremote or local

How an agent can drive an Operable Listing, in five levels: native (built for the agent as the primary interface), official (the Builder ships an agent interface), wrapped (a third party wraps the software's API), config (an agent can only drive it by editing files), gui (screen control only). An interface is official only when it is published by the same organization that ships the software. GUI-level Listings are allowed and sorted last.

Docs
docs.papra.app/resources/api-endpoints/

Reach

Partial coverage. 8 of 10 jobs reachable through the stated interface.

JobThrough the interfaceEvidence
Upload, list, and delete documentsReachableAPI: create document, list documents, get file content, delete by ID
Full-text searchReachableAPI document listing and search with filters; CLI also searches
Tag documents and run tagging rulesReachableAPI: create tag, associate tags, apply a tagging rule to all existing documents
Set custom properties on documentsReachableAPI: define and set custom property values
Manage organizationsReachableAPI: list, create, update, delete organizations
Ingest by forwarding emailReachableINTAKE_EMAILS_* env vars and OwlRelay driver; the address is generated per organization, agent sends mail to it
Ingest from a watched folderReachableREADME: folder ingestion; CLI documented at docs.papra.app/resources/cli
Extract text and auto-tag with an LLMReachableDOCUMENTS_CONTENT_EXTRACTION_ENABLED, AI_IS_ENABLED, AUTO_TAGGING_ENABLED run server-side on ingest
Share documents externallyUndeterminedsharing is a product feature; no sharing endpoint on the fetched API page
Register webhooksUndeterminedwebhooks exist (WEBHOOK_* env) but the API page omits webhook endpoints

Code stack

Languages
TypeScript
Frameworks
SolidJSHonoDrizzleBetter Auth
Package manager
pnpm
Database
SQLite / libSQL (Turso in production)
Hosting target
Docker (ghcr.io/papra-hq/papra)Fly.io
Built
Human-written (recorded, never ranked)

Model stack

Providers
AnthropicOpenAIMistralDeepSeekOpenRouterOllamaLM StudiovLLMCocore (all optional)
Models
none
Keys you need
ANTHROPIC_API_KEY OPENAI_API_KEY MISTRAL_API_KEY DOCLING_API_KEY AZURE_DI_API_KEY
Prompts live in
none

Evidence and confidence

FieldWhere it was seenConfidence
formFactorREADME: docker run ghcr.io/papra-hq/papra; SolidJS client and Hono server95%
executionModelAI_IS_ENABLED and AUTO_TAGGING_* are optional bounded steps in a deterministic pipeline80%
operabilitydocs.papra.app/resources/api-endpoints: bearer token; documents, tags, tagging rules, custom properties, organizations, API keys90%
effortdocs.papra.app/self-hosting/configuration lists every env var by name95%
editionspapra.app/pricing: self-host free under AGPLv3; Plus $9 ($7.5 annual), Pro $30 ($25 annual), Enterprise90%
activegh api: pushed 2026-09-03, 5268 stars–
reach85%

Open questions

  • Webhook and sharing endpoints in the API
  • SDK package name and whether an MCP server is planned

Sources