How DocketDrift differs from AI legal tools
The closest thing to "AI" in our stack is the voyage-law-2 embedding model, which we use to rank real opinions by similarity to a query — the output is an ordered list of real cases you can click through and verify against the source. Tag suggestions are candidates a human editor reviews; nothing low-confidence gets surfaced as a published tag. There is no chat box, no “summarize this for me,” no synthesized holdings, no AI-drafted text anywhere on the site.
The “AI legal tools” market — Lexis+ AI, Westlaw AI-Assisted Research, CoCounsel, Harvey, Spellbook, Robin AI, Lex Machina, Premonition — is overwhelmingly built on large language models that produce new legal text. They draft briefs, summarize cases, answer “what’s the holding in…?” prompts, and predict outcomes. That is the architecture that hallucinates. The hallucination is not a bug a vendor will eventually patch; it is the same generative behavior that produces the fluent prose in the first place.
| What we don’t do | What we do |
|---|---|
| Generate legal analysis | Index real, published opinions |
| Draft briefs, memos, contracts | Link to the source URL of every record |
| Answer “what’s the holding in…?” | Show you the actual opinion text |
| Summarize cases into prose | Pull verbatim surrounding text around statute citations |
| Predict outcomes or judge behavior | Count actual prior outcomes (counts only, no narrative) |
| Synthesize holdings | Color-code the disposition that’s literally printed in the opinion |
| Chat / answer questions | Provide a tag-suggestion queue a human editor must accept or reject |
Where ML appears at all
Two places, both narrow:
- Voyage embeddings for semantic search. A 1024-dimension vector representation of each opinion. We compare a query vector to opinion vectors with cosine similarity and return an ordered list of opinion IDs. No text is generated; the only output is “these N opinions are most similar to your query.” You click through and read the actual published text.
- Tag-suggestion candidates. Embeddings rank candidate tags by similarity to each opinion. Above a high-confidence threshold the tag is auto-applied and marked
AUTO_APPLIEDfor transparent audit. Below that threshold the suggestion appears in a human-review queue; the editor accepts or rejects. Nothing low-confidence becomes a published tag.
Everything else — case number, release date, disposition, panel composition, statute citations, court breakdown, judge dossiers — is deterministic regex extraction over the actual published text. Either the pattern matches or it doesn’t. There is no LLM in any of those paths, and no LLM is ever asked to synthesize, summarize, or describe what it sees.
The one panel that looks generated, and isn’t
Many opinion pages carry a panel headed “The holding.” On a generative product that would be a model’s paraphrase of the case. Here it is a direct quotation — the court’s own sentence, copied verbatim.
Appellate courts announce their holdings in a small, stable set of phrases: “we hold that…”, “we conclude that…”. The extractor finds that sentence and quotes it. It does not compress, rephrase, or join two holdings into one, and where the court assigned paragraph numbers the panel links to the exact paragraph so you can read the sentence in place. If no such sentence exists, the panel does not render — a blank holding is honest; a guessed one is not. Coverage is therefore uneven by design: roughly 73% of modern New Hampshire opinions carry one, and far fewer nineteenth-century opinions do, because that vocabulary post-dates them.
An LLM summarization pass over the corpus was designed, costed, and deliberately not run. Quoting a court that already wrote “We hold that X” is strictly better than paraphrasing it: it is verifiable against the source, and it cannot drift. Every stored holding records which extractor produced it.
Two practical consequences
- Hallucination is architecturally impossible. The system cannot produce a fake case citation because the system cannot produce any text. Every record traces to an opinion the public can verify against the official source.
- The human-in-the-loop signal is visible. Every opinion page shows the editorial review status. Every auto-applied tag is marked as such. You can tell at a glance whether a record has been read by a human and whether its tags came from human review.
The promise is plainer than “AI legal research”: we treat the public record as what it is. We organize it. We link to it. We don’t tell you what it means. That’s still your job.
Built with open source
DocketDrift is a solo project standing on civic-tech and open-source infrastructure. The honest accounting of what does the work:
- The citation graph comes from two places, neither of them generated. For Minnesota and Arizona it is built from the CourtListener bulk citation-map export published by the Free Law Project — their data, scoped down to edges where both the citing and cited opinion are in this corpus. New Hampshire's graph is extracted from the opinion text itself by a hand-written neutral-cite parser. CourtListener bulk data is also the historical backfill for the opinions themselves. (Free Law Project's eyecite tokenizer is vendored in the repository as preparation for a future text-extraction pass on the non-NH states, but it is not in any production code path today.)
- Semantic search uses voyage-law-2 embeddings from Voyage AI, stored in MariaDB’s native
VECTORcolumn type. - The web framework is Django, the Python web framework.
- The database engine is MariaDB 11.7, with its native
VECTORsupport for vector similarity search. - Client-side interactivity is HTMX, used only where it earns its keep (currently the bulk tag-review admin).