The problem
Two problems, one system.
Access. Every person who messages a firm wanting help needs a lawyer to hear the story, decide whether it is a matter for that firm, and check it does not conflict with an existing client. That is hours of a lawyer's week, most of it spent on enquiries that were never going to become cases. So people wait, and some never hear back at all — and walk away from a problem they had every right to be helped with.
The file. The clients a firm does take on send everything over WhatsApp, across months, in no order. Storing it is easy. Finding the one document that decides a hearing is not.
What it does
A client messages the firm on WhatsApp. The system takes the intake across however many messages it takes, scores urgency, runs a conflict check, and hands the lawyer a matter ready to accept or decline.
Once the matter is open, the case runs from the system — tasks, deadlines, hearings, parties. Every document the client sends is filed against the right case automatically, hashed the moment it arrives, and then read: dates onto a case timeline, parties extracted, and where two documents contradict each other, raised as an open question.
- AI intake over WhatsApp — takes the client's story across several messages, scores urgency, runs a conflict check against the firm's existing clients, and hands the lawyer a matter ready to accept or decline.
- Case management — matters, parties, tasks, deadlines, hearings and the court calendar, with reference numbers per series.
- Evidence intelligence — every file hashed on arrival, text and entities extracted, dates placed on a case timeline, contradictions between documents raised as open questions, and gaps in the evidence identified.
- Document requests — the firm asks the client for a specific document from inside the case; when it arrives on WhatsApp it is filed against that request.
- Ask the file — a lawyer asks a question of their own case documents and gets an answer citing the document it came from. A citation the model invents is dropped before the lawyer sees it.
- A client desk that knows its limits — routine questions answered from the firm's records; advice, opinions on the merits and predictions refused and routed to a human.
- Subscriptions and payments — priced in cedis on two meters, lawyer seats and case volume, settled by card, bank transfer or mobile money.
Nothing is auto-confirmed. The system flags; the lawyer decides.
How it is built
Python, FastAPI and PostgreSQL on the backend; Vue 3 on the front end. A modular monolith by deliberate choice — the module boundaries are real, so evidence processing, messaging and AI can be split out when load justifies it. Running twenty services to onboard the first ten firms would not help anyone.
The job queue is Postgres. Storage is pluggable, local to S3 by configuration. Fewer moving parts to run, back up and secure while the product finds its shape.
The AI layer is model-agnostic: Claude, GPT, Gemini or a model hosted on the firm's own infrastructure, switched by configuration rather than a rewrite. It never touches the database — it receives a bundle already filtered by firm, by matter, and by the permissions of the person asking.
367 automated tests, including tests that specifically prove one firm cannot reach another's files.
The decisions we would defend
No cross-firm data access, enforced twice
Once in the application, and again in PostgreSQL row-level security across all 33 firm-owned tables — where the application connects as a role that cannot bypass it. If a query is ever written without a firm filter, it returns nothing rather than another firm's privileged case files. A structural test fails the build if a new table ships without a policy.
Evidence is immutable
Files are hashed before anything else touches them. Replacing a document creates a new version that supersedes the old; downloads re-verify the hash and are refused if it no longer matches.
The audit trail cannot be rewritten
Append-only, enforced by a database trigger — update and delete are rejected outright, including for a firm administrator. An audit trail that can be edited is not an audit trail.
Court dates are never generated
Dates, amounts, court names and case numbers are looked up from the record and handed to the model as facts. A client who misses a hearing because software was confident about the wrong Tuesday has been actively harmed, and no amount of fluency makes up for it.
The system reports; the lawyer decides
Contradictions are raised with a severity, never a verdict. Detected deadlines and claims stay unconfirmed until a human confirms them.
Where it stands
The full journey runs end to end in development.
No firm is using it yet. Ahead of a pilot: WhatsApp Business verification with Meta, a penetration test, and a privacy and regulatory review. Mediation and ADR, and firm-to-client invoicing, are the next modules — they are not built.