What it is
Tabularium handles aktindsigt: requests from citizens and journalists to see a Danish public authority’s documents. A caseworker has to collect the documents, redact personal and confidential information, cite the legal paragraph for every redaction, build the list of documents, and write the decision letter, all before a legal deadline.
It has three parts:
- A web app for the organisation: incoming requests, deadlines, statuses, the legal paragraphs each authority uses, statistics, and a portal where requesters can check on their case.
- A desktop app for the caseworker, where the redaction happens.
- An anonymiser that finds and removes personal data (CPR numbers, phone numbers, addresses, emails) from documents.
Why
Redaction is slow, repetitive and easy to get wrong, and the documents are often sensitive. I wanted a tool where the documents never leave the caseworker’s machine, and where the boring parts (the document list, the decision letter, the deadline) follow from the work instead of being typed again.
How it’s built
- Rails 8.1 web app on Postgres with Hotwire, magic-link login and optional two-factor authentication. Organisations are separate tenants. Danish is the first language; everything also exists in English.
- Electron desktop app with React 19 and Zustand. A case is a bundle on disk: one SQLite database plus the original PDFs, addressed by their hash.
- Local AI. Search and page analysis run on small language models inside the desktop app via llama.cpp. Retrieval combines keyword and semantic search. Nothing is sent to a cloud model.
- Hardened by default: sandboxed renderer, tokens encrypted at rest, validated file paths, a strict content security policy.
Where it stands
Tabularium is live. I am still building all three parts.