← Self-Hosting · Home & Life · Replaces: filing cabinets, Evernote for documents, Google Drive scans
What You'll Build
Paperless-ngx turns paper and PDFs into a searchable archive. Scan a letter (or photograph it with your phone) and Paperless reads the text (OCR), works out who it's from, tags it, and files it. Two years later, type "insurance renewal" and it's there in a second.
Port: 8000 · RAM: ~1–2 GB · Time: 30 minutes · Difficulty: Medium
What You Need
- Your home server from Foundations 1 (Docker installed,
~/stacksfolder). - Nginx Proxy Manager with your
*.home.example.comcertificate (recommended). - A scanner is handy but optional — the phone apps can scan too.
Step 1: Run the Official Install Script
Paperless provides a script that asks a few questions, writes the compose and settings files, and creates your admin user:
cd ~
bash -c "$(curl --location --silent --show-error https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/install-paperless-ngx.sh)"
Suggested answers:
| Question | Answer |
|---|---|
| URL | https://docs.home.example.com |
| Port | 8000 |
| Time zone | America/New_York |
| Database backend | postgres |
| Enable Apache Tika? | yes if you'll import Word/Excel/email files, otherwise no |
| OCR language | eng (add others with +, e.g. eng+spa) |
| Target folder | /home/yourname/stacks/paperless |
| Consume folder | /home/yourname/stacks/paperless/consume |
| Media folder | /mnt/data/paperless/media (where the documents are stored) |
| Username / password | Your admin login |
The script pulls the images and starts everything. Open http://192.168.1.50:8000 and log in.
Step 2: Get Documents In
- Drag and drop PDFs or photos onto the web page.
- Consume folder: anything copied into
~/stacks/paperless/consumeis imported and then removed from that folder. Point your scanner's "scan to folder/SMB/FTP" feature here (share the folder with Samba), or sync a phone folder to it with Syncthing. - Phone apps: Paperless Mobile (Android) or Swift Paperless (iPhone) scan straight into Paperless.
- Email: Mail → add your email account and a rule, e.g. "attachments from bills@ get the tag Bills".
Step 3: Organise With Tags, Correspondents, and Types
| Concept | Example |
|---|---|
| Correspondent — who it's from | City Water, Chase Bank, Dr. Smith |
| Document type — what it is | Invoice, Statement, Receipt, Contract |
| Tags — anything else | Taxes 2026, House, Car, Important |
| Storage path — how files are named on disk | {{ correspondent }}/{{ created_year }}/{{ title }} |
Each one has a matching setting. Leave it on Auto: after you've filed a few documents by hand, Paperless learns and starts filing new ones itself. Use the Inbox tag to review what it guessed.
Step 4: Search
The search box searches the text inside every document, not just titles. Try a word that only appears in the body of a letter. Save useful searches as views on the dashboard (e.g. "Inbox", "Tax 2026").
Add It to Your Proxy, Dashboard, and Backups
- Nginx Proxy Manager: new proxy host
docs.home.example.com→ schemehttp,192.168.1.50, port8000, Websockets on, your wildcard certificate, Force SSL. Advanced tab:client_max_body_size 0; - Homepage: add a tile in
services.yaml(how). - Uptime Kuma: add an HTTP monitor for the new address (how).
- Backups:
~/stacks/paperlessis already covered by the restic script. Also add/mnt/data/paperlesstoEXTRA, and un-comment thepaperless-db-1dump line. For a portable, human-readable copy rundocker compose exec webserver document_exporter ../exportmonthly.
Troubleshooting
- Files sit in the consume folder and never import — a permissions problem. The folder must be writable by the user ID the script configured (usually 1000).
- OCR text is garbage — scan at 300 dpi, and set the right OCR language.
- "CSRF verification failed" through the proxy — the URL you gave the installer doesn't match the one you're using. Fix
PAPERLESS_URLindocker-compose.env, thendocker compose up -d.