Static demo site for the Free Law Project citator. The site previews how citator integration into CourtListener will look once shipped: per-opinion treatment summaries, browsable Authorities and Cited By views, and validation indicators against an expert benchmark.
Status: in active development. Demo target: 2026-05-20. Tracking issue: #1.
The site is decoupled from CL's backend for build-speed reasons but is
designed to mirror CL's eventual production UX. Inputs are pre-computed
inference outputs (from the citator pipeline in
freelawproject/ai-research)
plus expert benchmark labels; outputs are static HTML.
For the design rationale, treatment taxonomy, validation indicator
behaviour, and full architectural detail, see the design doc:
citator_launch_plan/demo_site_design.md.
- Eleventy — static site generator (Nunjucks templates).
- Tailwind CSS — styling, configured to match the new CourtListener front-end design.
- Alpine.js — small client-side interactivity (tabs, inline expand, quick filter).
- Python —
scripts/build_data.pytransforms inference output CSVs into per-opinion JSON files Eleventy consumes.
Hosted on Netlify, mirroring the deploy pattern of free.law.
Prerequisites: Node 20+, Python 3.13+, uv (Python package manager).
# install Node deps
npm install
# install Python deps (only needed when running build_data.py)
uv sync
# build once
npm run build
# dev server with hot reload at http://localhost:8080
npm run devcitator-demo/
├── _data/ # JSON files consumed by templates (generated by build_data.py)
│ └── opinions/ # one .json per scoped opinion
├── _includes/ # partials (layouts, components)
├── assets/
│ ├── css/styles.css # Tailwind input
│ └── js/ # Alpine.js bundle (copied from node_modules at build)
├── data-source/ # gitignored — raw CSVs copied in from ai-research
├── scripts/
│ └── build_data.py # CSV → JSON transformer
├── src/ # page templates
└── _site/ # build output (gitignored)
Data flows from
freelawproject/ai-research
(specifically experiments_05012026/data/) into this repo manually:
- Copy the relevant CSVs into
data-source/(gitignored). - Run
npm run build:datato regenerate_data/opinions/*.jsonand_data/index.json. - Commit any tracked output that should be kept.
BSD-2-Clause. See LICENSE.