Another rabbit hole: Paperless-ngx
Published on Jan 25, 2026
As part of my quest to make things in my daily life more complicated I stumbled upon Paperless-ngx a few times already. This weekend I finally went ahead and set it up on my Synology NAS (In Docker and with sqlite as the database) and was pleasently surprised. It was very simple to set up and with Tailscale and Swift Paperless for iOS I now have access to all my documents that are safely stored at home, from anywhere.
Until now I've used EagleFiler which I really liked, but had the downside that there was no easy way to access all my documents when I'm not in front of my computer. Sometimes it's good to be able to pull up a scan of some important document while you are out and about.
What works well
- UI: Simple and powerful. Very good multi-selects and ways to apply tags and flag documents to easily put everything in the right categories
- Responsive maintainers on Github and big community on Matrix
- Lots of neat little features, well structured
- Integrates with Home Assistant, so I can get a push notification if there's a new document to review
- Imports file attachments directly from multiple Email accounts
- Potentially possible to contribute code myself, I got the development setup up and running locally and was able to add a small feature ("Retry" button on tasks) for myself.
- "Saved views" are a great and well implemented feature
What didn't work so well
- Matching: Matching the documents to "Correspondants" didn't work very reliably and often times picked random ones. This might get better over time as it's ML powered and in theory learns from your assigned documents.
- Some parts are still a bit rough (Duplicate handling, logs having stack traces for expected events like dupliates)
- Many settings are applied via the environment variables instead of in the UI so not that discoverable
- Import tasks ("Consumer") don't feel super stable. I had many errors like "Database is locked" or "File not found" that needed to be fixed by restarting Paperless completely. Annoyingly there's no auto-retry on these transitive errors.
It looks like they are currently working on v3 so some of my points above might already be resolved there.