尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Follow The Money IL aggregates, normalizes, and analyzes Illinois campaign-finance data from both state and federal sources, making the flow of political money searchable and explorable in one place. It ingests Illinois State Board of Elections bulk filings alongside federal Schedule A/B/E data from the OpenFEC API, then layers on entity resolution, network analysis, and donor intelligence across election cycles. The platform tracks 6.4M+ itemized receipt rows, 530K+ D-2 filing totals, and 1.3M+ donor-analytics rows, and is deployed in production at followthemoneyil.com with scheduled syncs that keep federal and analytics data current.
/candidates/<id>: all of a candidate's committees, most recently active first); full donor and payee lists per committee (/committees/<id>/donors, /committees/<id>/payees) and contributor / recipient lists per 527 organization (/527/<ein>/contributors, /527/<ein>/recipients), linked from each profile's top-N tables; every state race of a cycle (/analytics/state-races/); and an opt-in roll-up of serial committee re-registrations (/committees/?by=family) driven by admin-reviewed committee families (/admin/committee-families). Ingest Parse / normalize Store Serve
────── ───────────────── ───── ─────
ISBE bulk filings ┐ ┌── PostgreSQL ──┐
OpenFEC API ├─► chunked ETL + async ───┤ normalized ├─► Flask web UI
IL SOS lobbying │ Playwright scraping, │ tables + │ + JSON/CSV API
IRS 527 filings │ entity resolution, │ analytics │ (Redis-cached
Chicago open data │ cross-matching │ rollups │ heavy views)
OpenBook contracts ┘ └────────────────┘
Scheduled jobs keep the data fresh: a recurring sync refreshes federal (FEC) contributions, rebuilds donor identities, and rebuilds analytics rollups.
git clone https://github.com/Doommen3/Illinois_campaign_finance.git
cd Illinois_campaign_finance
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
playwright install chromium
cp .env.example .env
# Set DATABASE_URL, FEC_API_KEY, and FLASK_SECRET_KEY in .env
createdb ilcf
export DATABASE_URL=postgresql://$(whoami)@localhost/ilcf
DATABASE_URL is required in all environments. (A legacy DATABASE_PATH SQLite setting exists for backward compatibility but is deprecated and unused for new setups.)
# Create the database schema
python run.py init-db
# Sync federal (FEC) data for Illinois candidates
python run.py sync-fec-il-federal
python run.py rebuild-fec-donor-identities
# Build analytics rollups
python run.py refresh-analytics
# Start the development web server
python run.py runserver --port 5000
In production the app is served via Gunicorn against the WSGI entry point (wsgi.py). Run python run.py --help to see the full set of ingestion, scraping, and maintenance commands. Table shapes, join keys, and data quirks are documented in .claude/data-dictionary.md.
Contributor addresses come from public ISBE filings. Removal requests under the
Illinois Judicial Privacy Act (705 ILCS 90) and similar laws are honored by
scrubbing the address to ISBE's own Redaction Requested format while keeping
the contribution record. The public policy is at /privacy.
python run.py add-privacy-redaction --first Jane --last Doe --zip 60601 \
--requested-by "Requester" --request-date 2026-07-16 --statute "705 ILCS 90"
python run.py apply-privacy-redactions # re-apply after sync-prod-db; sunshine-import does this automatically
Runbook: docs/runbooks/privacy_takedown_response.md.
Serial re-registrations of one political actor are grouped (never merged) into reviewable families; only accepted families appear on public pages.
python3 scripts/committee_families.py report --limit 30 # read-only dry run: proposed families and weak pairs
python3 scripts/committee_families.py seed # store new proposals as pending (idempotent); review at /admin/committee-families
Design: docs/committee_families_design.md.
pytest -q
A new windowed widget needs a row in tests/scope_widgets_registry.py and a probe in tests/test_scope_widgets.py; CI runs both.
Devin Oommen — devinoommen.com · Oommen & Company
Released under the MIT License.