Skip to content
All work

Case study

Acta

An AI workspace for notaries and law firms. Acta reads the office’s documents and answers questions with the exact source, and it drafts letters from templates, translates and anonymizes documents, in English, French and German.

Role
Sole designer and developer
Type
Independent product
Timeline
2025 – today
Status
In development, demos on request
  • Next.js
  • TypeScript
  • FastAPI
  • Python
  • PostgreSQL
  • pgvector
  • OpenAI API
Acta’s landing page in a browser window with the phone version beside it, on Acta’s blue.

Problem

Notary and law offices spend hours finding a clause in old deeds, writing the same letters after each signing, translating documents and removing personal data before sharing them. General chat tools don’t know the office’s own files, and their answers can’t be checked.

Ownership

I designed and built Acta on my own: the web app, the API, the background worker, the database schema, the landing page and the demo data.

Constraints

  • Legal documents are private: each workspace only ever sees its own files, and no hosted backend service such as Supabase sits in between. The only outside service is the AI model API.
  • Answers must be checkable: every answer cites the passages it comes from, and a citation opens the document at the cited page.
  • Files come in every shape: PDF, scans, Word (.doc and .docx), Excel, CSV, PowerPoint and images, read page by page with OCR where needed.

Architecture

The web app is Next.js (App Router, TypeScript, Tailwind) in English, French and German. It talks only to a FastAPI backend, which keeps the login token in an httpOnly cookie and runs every query as the user, so Postgres row level security does the filtering.

Long work is a row in a jobs table: indexing, answers, translation, anonymization, drafting and Smart Processing. A Python worker claims jobs from the table, renews its lease while it works and retries up to three times, so work survives a restart.

Indexing splits each document into passages of about 1,500 characters and stores their embeddings in pgvector. Ask Acta is a chat: it decides whether a message needs the documents, searches the 12 closest passages and answers with numbered citations. Long chats are summed up so the model never reads more than it can hold.

Each feature can use its own model, set in one file, through two small adapters (OpenAI-compatible APIs and Anthropic).

Tradeoff

Smart Processing learns an office’s routine from a few examples: a document before and after the team worked on it. A tool like DSPy could tune the prompt, but it needs a score and many examples, and offices have two to five long pairs.

Instead, Acta writes the steps in plain words, follows them on up to three of the examples, compares its result with the real one and corrects the steps. People can read and edit the steps, and the result is built on a copy of the example’s Word file, so it keeps the office’s letterhead and styles.

Testing & reliability

  • 174 backend tests in 27 files cover file reading, the job runner, the API, the knowledge base, translation, anonymization and Smart Processing.
  • Failures are saved as error codes, not sentences, so the app explains them in the reader’s language.
  • Not done yet: the newest features still need a full check in the browser, and there are no end-to-end tests.

Outcome

Acta runs end to end with a demo notary office: Knowledge Base, Ask Acta, templates and drafting, Smart Processing, translation, anonymization, clients and cases, an appointment agenda and team workspaces. It is not public yet; I show it in live demos.

Evidence

The screenshots below are from the app running with invented demo data. The code is in a private repository.

Ask Acta answering a question about VAT on notarial fees, with the cited passage from the fee schedule. (full-size image, opens in a new tab)
Ask Acta. Every answer cites the passages it comes from and opens the document at that page.
A deed of sale side by side with the letter to the buyer that Smart Processing wrote from it. (full-size image, opens in a new tab)
Smart Processing. A deed of sale turned into the letter to the buyer, in the office’s own layout.
A client intake form next to its anonymized copy, with the list of removed names, dates and addresses. (full-size image, opens in a new tab)
Anonymization. People review what was found, keep items visible or add words to hide.

More case studies