The public site for FedCourtsAI. Static, built with Astro, hosted on Cloudflare Pages.
- Content is Markdown/MDX under
src/pages/. Edit it in the GitHub UI, open a PR, and Cloudflare Pages attaches a preview URL to the branch. - Data is never hand-edited.
scripts/fetch-ledger.mjsruns before every build (prebuild), downloads thefedcourtsairepo tarball, counts what is indata/cases, copies the committedmetrics/roll-ups, and writessrc/data/ledger.json(gitignored). Components read from that file. - Results come from
scripts/fetch-results.mjs, which runs after the ledger fetch. The list of releases is the release manifest committed infedcourtsai(docs/releases.json), read frommain, so publishing a release needs no change here. Each release it lists is read from thefedcourtsairepo at its own tag (for Release 1,docs/release-ot2026-public-summary.mdatresults/ot2026-longconf) and nowhere else./resultslists every release, newest first, and each published one gets its own page at/results/<slug>; a release whose tag doesn't exist yet is listed as upcoming, and the first rebuild after the tag is pushed publishes it. A manifest that cannot be read, does not parse or lists no releases fails the build, and so, once a release's tag exists, does an unreadable summary or any unfilled‹…›placeholder, so Pages keeps the last good deploy. - Freshness comes from
.github/workflows/rebuild.yml, which runs the same build daily and calls the Cloudflare deploy hook only if it passes, so a ledger change that breaks the site shows up as a red scheduled run instead of a silently failed deploy. It never commits here. - Checks:
.github/workflows/build.ymlrunsnpm ciandnpm run buildon every PR intomain, and itsbuildcheck is required before a PR can merge..github/workflows/lint-actions.ymlruns zizmor and actionlint on any change under.github/, and.github/dependabot.ymlkeeps the pinned actions and npm dependencies current. Agent conventions are in AGENTS.md.
| Component | What it renders |
|---|---|
<Stats /> |
The headline counters with a ledger stamp |
<LedgerStat key="…" label="…" note="…" /> |
One figure from ledger.counts (events_open, events_resolved, events_with_predictions, predictions, predictions_frozen, evaluations, leaderboard_events_scored, leaderboard_predictors_ranked) |
<LedgerTable limit={n} onlyOpen onlyResolved /> |
The ledger table, newest first |
<Stamp /> |
"ledger <sha> · <time>" pointing at the exact commit read |
Import them at the top of a page: import Stats from "../components/Stats.astro";
npm install
npm run build # runs the fetch first
npm run previewnpm run dev needs src/data/ledger.json to exist; run npm run fetch once first.