For courts · submissions and drafts · local

Citation checking for party submissions and draft judgments. Entirely local.

Party submissions arrive as PDF. A program on the court's workstation or server reads them, finds every citation and every quoted passage, checks them against 1.07 million decisions and 21,000 statutes, and writes a report: which cited decisions do not exist, which passages or quotations differ from the decision's text, and where a "not in the corpus" was to be expected. The same check covers the draft judgment as a Word file before circulation. Nothing leaves the court. No account, no cloud, no logging.

Data sovereignty stays with the court

A submission contains the parties' personal data; before anonymisation, a draft judgment is the most confidential document in a case. The architecture is therefore built so that the court gives nothing away: no data, no control, no dependency.

Nothing leaves the court

Submission, draft, citations and report stay on the court's devices. The provider never sees a submission or a draft. A network-block test proves it: a full check runs without a single connection attempt.

The court holds the data

The corpus is a file at the court. The data is public domain (CC0), the code is open source (MIT). The court may inspect, copy, archive and reuse both, without a licence and without an expiry.

Court IT decides how it runs

When the weekly pack is fetched, from which mirror, and whether it is fetched at all, is the court IT department's decision. Every pack carries a checksum. Without a network everything keeps working on the last snapshot.

No disclosure of personal data

No processing by a third party: so no processor agreement, no impact assessment, no legal basis needed for a disclosure. This holds for the workstation and for a server inside the court's network alike.

No lock-in

If the provider disappears, the program keeps running and the court keeps the data and the code. What is sold is the operation: signed installers, pack mirror, support, calibration. Not the content.

Verifiable

Every line of the program is public. What leaves the device is written down in a data-flow statement that court IT can check against the source code.

Party data stays party data

Submissions contain the parties' personal data, including sensitive data. The program processes them only on the court's devices, like the case file itself; no third party receives them. The check therefore needs no legal basis for a disclosure.

Checking submissions

Courts report submissions written with language models that cite decisions which do not exist, or considerations with wording found nowhere. Such citations look right: volume, page and consideration have the expected form, only the decision is missing. Checking by hand means looking up every reference one by one. The program does that for every citation in every submission, in seconds.

The PDF submission, or a folder of submissions, is dropped on the shortcut or handed over by right-click. The program writes one report per submission and, for the folder, an index with the submissions that have findings at the top. PDF/A from electronic filing (justitia.swiss) is read directly. Scanned submissions without a text layer need optical character recognition (OCR) first.

For every citation the report says three things: whether the decision exists, whether it is the one meant (date, docket, consideration) and whether the quoted passage appears as such in the decision's text. It never says whether the argument holds. "Not in the published corpus" is qualified by coverage: in the official collection, an absence is not to be expected. For a court that publishes only part of its decisions, for an unpublished decision and for the decision under appeal it is, and the report says so in place.

What the program does

A right-click on the file is all it takes, for the PDF submission and the Word draft alike. After a few seconds the report sits next to it and opens in the browser: what exists, what needs attention, and what to do.

CheckResult in the report
The cited decision exists and is the one meant: BGE, BGer, BVGer, BStGer, cantonal courtsexists, not in the corpus, ambiguous
The cited consideration (E. 3.2) exists in the decisionpassage retrieved, not indexed
The quoted passage matches the decision's textverbatim, differs (with the differences), not found, not checked
Date and docket next to the citation match the decisiondiffers (as written versus the decision)
Statute articles exist in the act: Art. 8 para. 1 ZGB, art. 335 al. 1 CO, § 12 StG/ZHfound, article missing, act unknown
Citation-like strings that could not be checkedlisted separately, so no gap stays silent

It does not check whether a decision supports the proposition, whether the case law has since changed, or whether the draft is anonymised. The program checks existence, identity and wording; it does not replace reading. For courts that publish only part of their decisions, the report says so explicitly: "not in the published corpus" is not "cited wrongly". A court's own unpublished decisions and the decision under appeal are in no corpus.

What a finding looks like

Excerpt from the report on a test submission (appeal brief as PDF) with thirteen citations, checked in five seconds.

appeal.check.html6 citations · 7 statute articles · 5 need attention
existsBGer 4A_747/2012 vom 5. April 2013, E. 3Decision present, consideration 3 retrieved.
detail differsBGer 4A_714/2014 vom 22. Mai 2016The decision is dated 22 May 2015.
not in the corpusBGE 147 III 999 E. 4.2No decision carries this reference. BGE collection: 50,492 decisions in the corpus; a citation of this form does not exist. In the official collection an absence is not to be expected.
not in the corpusBGE 999 III 1No decision carries this number. BGE collection: 50,492 decisions in the corpus. A similar case is never substituted.
quotation differsBGE 136 III 513 E. 2.3The quotation is not in E. 2.3. The closest wording in the decision is shown.
not indexedBGE 140 III 86 E. 2.3Decision present; E. 2.3 is not indexed. Indexed: 2, 4.1, 4.2. Quote from the decision text.
act unknownArt. 5 XYZGNo act carries this abbreviation. For a cantonal act, name the canton (StG/ZH).

The corpus

ContentSize
Decisions, 1875 to today, 118 courts and authorities1'070'000
Decisions with numbered considerations indexed76 %
of which Federal Supreme Court / Zurich Obergericht88 % / 96 %
Federal acts (Fedlex)5'500
Cantonal acts15'600
Local verification pack, renewed weekly≈ 9 GB

The same corpus that this overview lists court by court. For courts with their own server: the full corpus with full-text search (about 135 GB) inside the court's network.

Operation

  1. Court IT installs the signed package under Program Files. Only the runtime signed by the Python Software Foundation runs; no third-party binaries, no compiler.
  2. Court IT fetches the verification pack once a week from the mirror, checks the checksum and drops it on a share. Workstations take it from there. No workstation needs the internet.
  3. The clerk selects the submission or the draft, starts the check via "Send to" and reads the report. The report is as confidential as the checked document and sits next to it.

On macOS the same check is available as a command-line tool (ocl); the Windows installer is meant for courts whose IT allows no Python environment on workstations.

Three-month pilot

The court provides two hundred of its own published decisions as a test set. The provider calibrates the recognition to the court's citation style, measures the recall and delivers a measurement report. Then the court decides. No submissions and no drafts are exchanged.

Contact: Jonas Hertner, about OpenCaseLaw.

Corpus figures as of 6 September 2026. The data flow can be checked against the source code (clients/python).