Omnigraph
Graph engine for context assembly. Object-storage native. Agents work with graph data the way engineers work with code: branched, typed, reviewed, merged, audited, and governed.
Follow The Money IL — production campaign-finance platform: 6.4M+ rows of Illinois state + federal FEC filings, searchable. Python/Flask/SQLite.
Translation pending
DataGitHub @Doommen3OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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.