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

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.
(full-size image, opens in a new tab)
(full-size image, opens in a new tab)
(full-size image, opens in a new tab)More case studies
- MenuMate
Independent product
- KartaTunisie
Independent product
- Anywhere Jobs
Independent product
- PromptStream
Independent product