DEV Community

Cover image for I built a local-first document organizer for Windows because DEVONthink doesn't exist there
roberto carlesso
roberto carlesso

Posted on

I built a local-first document organizer for Windows because DEVONthink doesn't exist there

I kept accumulating PDFs, invoices, and contracts in one messy folder with no real way to search inside them — just filenames. DEVONthink solves this well, but it's Mac-only. The open-source alternative, Paperless-ngx, is solid but requires Docker and a self-hosted server, which is overkill if you just want something that runs locally on your own machine.

So I built Robelius — a Windows desktop tool that indexes PDF, DOCX, and TXT files, makes them fully searchable by content (not just filename), and organizes them automatically.

What it does

  • Full-text search, including inside DOCX tables and scanned PDFs (automatic OCR via Tesseract)
  • Auto-detects document type (invoice, contract, quote, receipt, resume, certificate) and sorts into folders
  • Smart rename based on actual content — document type + date, with a preview before applying anything
  • Duplicate detection with a recoverable internal trash (nothing is permanently deleted without explicit confirmation)
  • Automatic backup before any operation that moves or deletes files
  • Real-time folder monitoring — new files get indexed as soon as they land
  • Multi-folder profiles, each with a separate search index (useful if you manage multiple clients)

The technically annoying parts

SQLite + threading. Running the indexer in a background thread (so the GUI doesn't freeze) while sharing a single SQLite connection threw SQLite objects created in a thread can only be used in that same thread — the fix was check_same_thread=False, but figuring out why it broke took longer than fixing it.

Interrupting mid-file, not just mid-folder. My first version of the Stop button only checked between files — meaning if you hit Stop while OCR was running on a big scanned PDF, nothing happened until that file finished, sometimes minutes later. Had to push the stop check down into the page-by-page OCR loop itself, and make sure a stopped file doesn't get saved with partial content (otherwise it'd be skipped forever on resume, stuck half-indexed).

Tkinter's native dialogs don't theme. messagebox and simpledialog ignore your app's color scheme entirely — ended up building themed replacements from scratch with Canvas and Toplevel to keep a consistent dark UI.

Where it stands now

Windows-only, everything runs locally, nothing sent to the cloud. Free 7-day trial, full features, no credit card:

👉 https://payhip.com/b/cUDBw

If you've built something similar or use a different local-first tool for this, I'd like to hear what you use.

Top comments (0)