
A public data product that shows how criminal charges in Philadelphia's courts have historically resolved. Public UJS docket sheets run through a Python pipeline — PDF text extraction, deterministic parsing, and roster normalization — into an eligibility-gated fact build that publishes immutable, versioned aggregate runs to PostgreSQL. A Fastify aggregate-only API serves those runs to a Next.js frontend that renders figures rather than computing them. Built as a pnpm monorepo with strict TypeScript, Kysely migrations, and a Playwright suite that asserts WCAG 2.2 AA accessibility, copy safety, and privacy on every public page.












