---
title: "I Digitised Every Piece of Paper in My House"
description: "Paperless-ngx turns your scanner into a searchable archive with OCR, tagging and full-text search on your own hardware, so every receipt and contract is one query away and nobody else hosts your paperwork."
author: "SelfHostedApp"
pubDate: 2026-06-15T00:00:00.000Z
tags: ["guide", "docker", "productivity", "paperless-ngx"]
canonical_url: "https://selfhostedapp.com/blog/go-paperless-with-paperless-ngx/"
source_url: "https://selfhostedapp.com/blog/go-paperless-with-paperless-ngx.md"
---

# I Digitised Every Piece of Paper in My House

import { Picture } from 'astro:assets';
import PaperlessHero from '../../assets/images/heroes/go-paperless-with-paperless-ngx-hero.jpg';

<Picture src={PaperlessHero} formats={['avif', 'webp']} widths={[400, 800, 1200]} sizes="(min-width: 1024px) 768px, 100vw" alt="Paperless-ngx" class="rounded-xl border border-cream-300 dark:border-ink-700" />

Two years ago the income tax department sent me a notice asking for a receipt from three years earlier, and I spent an entire evening digging through a shoebox, a WhatsApp thread and two different email inboxes before I found a photo of it that was too blurry to use. That night I bought a cheap document scanner and promised myself the paper problem would never happen again, and then the scanner produced a folder of PDFs with names like scan_0047.pdf, which solved nothing because a folder of unnamed PDFs is just a shoebox with better lighting.

The fix is an open-source project called Paperless-ngx, a document management system that watches a folder, and the moment a file lands in it, the machine runs OCR over it, reads the date and the correspondent and the title out of the actual content, files it under sensible names, and makes the whole archive searchable down to the text inside every page. Forty-five thousand people have starred it on GitHub, which tells you how many of us were sitting on digital shoeboxes, and everything runs on your own server, so the only place your insurance papers exist is a disk you control.

The daily workflow is the part that won me over, because there is no workflow. I dump every bill and receipt and letter into the consume folder, sometimes straight from the scanner and sometimes by saving a PDF on my phone into the synced copy of that folder, and by the time I remember the document existed, Paperless has already OCR'd it, guessed that it is an electricity bill from a company it has seen before, tagged it accordingly and renamed it to something a human can read. The matching gets smarter as you confirm its guesses, since every document you file teaches the classifier a little more about what your paperwork looks like, and after a month of use I confirm maybe one tag in twenty.

Search is where it earns its disk space. Every word inside every page is indexed, so typing the name of a pharmacy finds the prescription from 2023, and filters stack on top of that by tag and correspondent and document type and date range, with saved searches for the queries I run every month. There is a mobile app that lets you photograph and upload documents straight into the consume flow, share links for handing a single document to someone temporarily, and an email ingestion system that can poll an IMAP folder and file attachments automatically, which is how my bank statements file themselves on the fifth of every month without me touching anything.

The compose file is two services, the web application and a small message broker it uses for background jobs, and it is lighter than most people expect because SQLite is a perfectly supported database here.

```yaml
services:
  broker:
    image: docker.io/valkey/valkey:9-alpine
    restart: unless-stopped
    volumes:
      - redisdata:/data

  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    restart: unless-stopped
    depends_on:
      - broker
    ports:
      - "8000:8000"
    volumes:
      - data:/usr/src/paperless/data
      - media:/usr/src/paperless/media
      - ./export:/usr/src/paperless/export
      - ./consume:/usr/src/paperless/consume
    environment:
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBENGINE: sqlite
      PAPERLESS_SECRET_KEY: change-me
      PAPERLESS_TIME_ZONE: Asia/Kolkata
      PAPERLESS_OCR_LANGUAGE: eng
volumes:
  data:
  media:
  redisdata:
```

The data volume holds the database and the search index, media holds your original files next to the OCR'd archive copies, export is where the document dump lands when you ask for one, and consume is the magic folder everything starts from. Generate a real value for the secret key with `python3 -c "import secrets; print(secrets.token_urlsafe(64))"` before you start, because it signs your sessions and changing it later logs everyone out. The first admin account comes from `docker compose exec webserver createsuperuser`, which prompts you for a name and password interactively.

Two things nobody warns you about, and both cost me an evening. The container runs as a specific user ID and the consume folder needs to be writable by that ID, so if uploads sit there silently ignored, set USERMAP_UID and USERMAP_GID in the environment to match the folder owner and everything starts moving. And OCR defaults to English with German and Italian and Spanish and French pre-installed, so if your documents are in another language set PAPERLESS_OCR_LANGUAGES to the codes you need and the container downloads them on startup, while PAPERLESS_OCR_LANGUAGE picks which one gets used.

If your paperwork includes Office files and emails rather than only PDFs, the project ships compose variants that add two more containers, Apache Tika for parsing Word and Excel and Outlook files and Gotenberg for rendering, wired in with a PAPERLESS_TIKA_ENABLED flag, and the repository keeps those variants ready to copy. I skipped them for a year and then a property agent sent everything as .docx, so they are worth knowing about before that particular evening.

The archive lives in two volumes, which means the whole system backs up with the same Restic job as everything else on my server, and the export command produces a portable dump if I ever want out. Paper documents get shredded once they are scanned, tax receipts take seconds to find now, and the notice that started all of this would take one search query today, which is the kind of revenge against chaos that only a filing cabinet you actually own can give.

If your shoebox of documents deserves better than a drawer, subscribe to the newsletter.
