Veritas: The AI Arbitrator
Inspiration
When my grandfather was 60, he had a property dispute with his brothers. It was not a complicated case. Everyone knew he was going to win. He had a plan for the money: he was going to fly to London, a city he had wanted to see his whole life.
The case took 25 years. He won at 85. He never went.
We thought that was one family's bad luck. It is not. India has over 58 million pending cases and roughly 14 judges per million people, compared to about 150 in the United States. Land disputes there average around 20 years. Brazil ended 2025 with 75 million pending cases.
And it is not only a problem of distant courts. In Canada, 5.5 million adults had a serious legal problem or dispute over a three-year period. Only about one in five was ever resolved. Only 8% contacted a court or tribunal at all. The other 92% did what most people do: they gave up and absorbed the loss.
That last number is what pushed us to build. The real market is not the court's backlog. It is every dispute that never became a case because the process cost more than the claim.
What it does
Veritas is a browser-based courtroom for small disputes where both parties agree to be heard.
- Intake. Parties pick a jurisdiction (Canadian provinces are handled individually, because small claims rules differ by province) and a dispute category.
- Hearing. Both parties enter one shared screen. A live voice agent presides. One party testifies at a time while the other microphone is closed. Either side can attach exhibits: bills, photos, receipts, PDFs.
- Judgment. Once both parties rest, a multimodal model produces a reasoned ruling from the transcripts, the venue, the dispute category, and the filed exhibits. It returns an outcome, an amount, its reasoning, the rules it applied, and both transcripts.
- Delivery. The judgment is read aloud, and the case is saved to a local docket so it can be reopened later.
It is a hackathon build, not legal advice, and we say that on the record.
How we built it
Stack: React 19 + Vite + Tailwind, no backend at all.
Two AI systems with two clearly separated jobs:
- ElevenLabs conversational agent runs the live hearing. It listens, responds, and keeps procedure. It is explicitly instructed that it may take testimony only, and may not award money or assign fault before both parties have ended their turn.
- Gemini (multimodal) writes the judgment after the hearing closes. It receives the transcripts, the venue string (for example
Canada · Ontario), the category, and any attached files. The prompt constrains it to numbers that appear on the record and forbids inventing statute sections or dollar figures. - Browser speech synthesis reads the ruling aloud.
Everything else is procedure, and that is where most of our weekend went:
- Floor control. A turn-based state model in the app shell decides who holds the floor, when the judgment may run, and what the voice agent is allowed to say at each stage.
- Empty-record override. If nobody testifies and nobody files anything, we do not pass an empty record to the model and publish whatever it returns. We dismiss at $0 and suppress the fault display. An empty record means there is nothing to decide, not that the claimant is 100% at fault.
- Three-level fallback. Gemini Flash, then Flash Lite on quota exhaustion, then a local rules engine that runs entirely offline. The courtroom degrades instead of dying.
- Local docket. Cases persist in
localStorage, with generated case IDs, sealed cases behind a PIN, and a queue and booking flow that make intake feel like a real court rather than a form. - Two visual rooms. Welcome is light ("Day Court"), the hearing is dark ("Night Bench"), with a courtroom theme per jurisdiction.
No server means no recordings leave the browser, and nothing extra to crash at the booth.
The math that convinced us this matters
Court backlogs follow Little's Law. For a queue in steady state:
$$L = \lambda W$$
where $L$ is the number of cases in the system, $\lambda$ is the arrival rate, and $W$ is the average time a case spends waiting. Rearranged, the wait a litigant actually experiences is:
$$W = \frac{L}{\lambda}$$
Hiring judges raises throughput, which helps, but judges are slow and expensive to add. Diverting a fraction $p$ of arrivals out of the court system entirely acts directly on the numerator:
$$W' = \frac{(1 - p)\,L}{\lambda}$$
Because small claims make up a large share of civil filings, even a moderate $p$ produces a meaningful drop in $W$ for everyone still in the queue, including the cases that genuinely need a human judge. That is the whole thesis: Veritas is not trying to replace judges. It is trying to shrink $L$ so the cases that need a judge reach one sooner.
Challenges we ran into
The judge ruled too early. In our first working hearing, the live voice agent awarded money before Party 2 had said a word. It had heard a coherent story and wanted to resolve it. Fixing this took us out of prompt engineering and into procedure: the agent is now told, in the system prompt, that it takes testimony only, and the app refuses to run the real judgment until both End events have fired. The binding decision is never the live agent's.
The camera had a mind of its own. We initially treated a dropped voice session as the end of a party's turn, so a flaky connection would close the camera mid-testimony. We separated session lifecycle from camera lifecycle: the preview now stays up until the person taps End.
The empty hearing. Our nastiest bug was philosophical. Given an empty record, the model happily produced a confident verdict assigning 100% fault to the claimant. A judgment with no evidence is not a judgment. We added a hard override ahead of the model, and it is now the thing we are proudest of.
Free tier reality. Gemini's free tier gives us roughly 20 verdicts a day on Flash, resetting at midnight Pacific. That forced the fallback chain, which turned out to be a better design than what we would have built with unlimited quota.
Deciding what not to fake. We have a language selector that does not translate the app. We could have hard-coded a demo that looked bilingual. We left it visibly incomplete and say so, because a demo that lies about its scope is worth less than one that does not.
Accomplishments we're proud of
- A working two-party voice hearing, on one screen, with real floor control.
- Judgments grounded in the actual record, with reasoning and transcripts shown, not a confidence-flavoured paragraph.
- The dismiss-at-$0 rule, which is the part a thin wrapper around a model does not have.
- Graceful failure at three levels, so the demo survives a bad network and an exhausted quota.
What we learned
The model was never the hard part. Procedure was.
Almost everything that makes a hearing fair is about sequencing and constraint: who may speak, when, what the decider may consider, and what happens when the record is thin. Those are product decisions, not prompts. We spent the weekend learning that an AI judge is mostly a well-designed process with a language model doing the drafting inside it.
We also learned how much of the justice gap is invisible. The statistic that reframed the project for us was not the backlog. It was the 92% of people who never file at all.
What's next for Veritas
- Jurisdiction rule packs. A small retrieved statute and limits pack per province, so citations come from documents instead of model memory. This is the retrieval step we deliberately did not fake this weekend.
- An evaluation set. A few hundred disputes with defensible outcomes, measured for consistency (does the same case decide the same way twice) and symmetry (if the parties swap, does the outcome flip correctly). Fairness should be testable, not asserted.
- Cross-examination. Letting each party challenge the other's account is the biggest missing piece of a real hearing.
- A path to binding decisions. Consent-based arbitration, where a qualified human arbitrator reviews and signs anything significant. The model drafts, the human decides.
- Institutions first. Universities, student housing, property managers and co-ops, where disputes are frequent, small, and enforceable without a court.
Veritas is a student hackathon project. It is not legal advice, not a filing, and not a court order.
Log in or sign up for Devpost to join the conversation.