How it works
A plain-language guide to our pipeline: origination → collection → expenditure. This is about methodology, not how to submit data.
The pipeline
We aggregate public records, normalize them to a common schema, compile to JSON, and render pages.
- Sources: municipal/state codes, agency sites, ballot/ordinance records.
- Normalization: small JSON files under
_data/taxes/…
validated & key-sorted. - Compilation: a build step produces
_data/compiled/taxes.json
. - Rendering: the inventory lists all taxes; per-tax pages show details & sources.
- Visualization: the flows prototype illustrates cyclical movement of funds.
What’s in a tax record
name
,slug
,status
,type
jurisdiction
(level, name, slug)agency
(name, slug)rates[]
(percent/amount; applies_to; cap)revenue
&revenue_year
(latest annual USD)sources[]
(name + URL),updated_at
,notes
Provenance & verification
- Every fact links to an official source.
- Edits via PR/Issues leave an auditable history.
- Automated validation catches schema drift.
How pages are generated
Inventory reads _data/compiled/taxes.json
. Per-tax pages are generated from that dataset
(either via a build step or a Jekyll generator), ensuring the site reflects the latest data.
Roadmap
- Richer jurisdiction coverage (city, county, special districts).
- “Follow the Money” with account/vendor hops.
- APIs & bulk downloads.
Contribute a tax from your jurisdiction
Start small—add one accurate record with an official source. We validate JSON and key ordering automatically.