Codecheck's rules are extracted directly from official ordinance PDFs across 505 jurisdictions and 10 states — not scraped, not summarized, not approximated. Every field cites the exact section it came from. Here's exactly how we do it.
We identify the authoritative published PDF for each jurisdiction — the official "as amended" version published by the municipality or county, not a third-party aggregator. Where jurisdictions publish on Municode or American Legal, we verify the codification status and use the municipality's own PDF when it supersedes the online version.
PDFs are converted to machine-readable text using pdftotext with layout-mode formatting to preserve table structure. We verify font embedding and text layer presence before extraction. Scanned PDFs without text layers are flagged and queued for OCR processing.
Each category (dimensional rules, parking, signs, fences, etc.) is extracted per district and mapped to a strict JSON schema. Every field records the source section number alongside the value — so null values are documented as "not yet sourced" rather than silently omitted.
Each jurisdiction receives a depth score (x/18) based on how many of the 18 compliance categories have been fully extracted. A category counts as "real" only if more than 70% of its fields are sourced. Scores are published openly on the Coverage page.
Every extracted jurisdiction is validated by running a compliance check against every registered zoning district. Any field access error (KeyError, TypeError) is treated as a blocking defect — the target is zero errors across all districts before a jurisdiction goes live.
Jurisdictions go live in the checker and API. Ordinance amendment dates are tracked; when a jurisdiction adopts a new amendment, the affected sections are re-extracted and the depth score is re-validated. The rules.json file is versioned with each update.
Every jurisdiction is mapped to the same 18-category schema. Categories that aren't yet extracted are marked explicitly rather than silently omitted — so the checker always tells you what it knows and what it doesn't.
If you spot an error or want to discuss the extraction process, reach out directly.