CivicQ
Voters see how their representatives vote, trade and fundraise, each number sourced
CivicQ had designs and a scoring method but no product. We built the platform and its data: lookup by address on real district boundaries, and profiles that link votes, bills, stock trades and campaign money, each score showing its sources.
Government, Legal & DefenseCivic transparency platformBuilt from zero
- Sources linked
- Roll calls, bills, disclosures, FEC and OpenSecrets
- Lookup
- Address, ZIP, city or state to the right members
- Edge cases
- 12 at large, DC and territory seats mapped by hand
- Scores
- Social and fiscal, each with its sources shown
The challenge
Votes, bills, stock trades and campaign finance were public but spread across many government sites in different shapes, some only scrapable, and every score had to be explainable.
What we did
We designed the data model first, built ETL and scraping pipelines that link every record to the same representative and bill, and built district lookup on PostGIS.
The outcome
The core platform went through client feedback rounds into final QA and deployment, with scores that show their sources and production data in the client's own database.
The starting point
CivicQ lets U.S. voters look up and follow their representatives and see their voting records, bill activity, posts, stock trades and campaign finance in one place. The founder came with an idea, a UI kit, Figma designs and a written scoring method for social and fiscal impact.
What had to change
All of that data is public but spread across many government sites, each in its own shape, and some of it can only be scraped. Nothing linked a representative's votes and bills to their trades and donors, so voters had no single place to compare them.
What could not break
- Only public government sources, some of them scrape only
- Every vote, bill, trade and donation linked to the same representative and bill
- Any address, ZIP, city or state resolves to the right House member and two Senators
- Each score shows how it was calculated and where its numbers come from
- Finance disclosure data used within legal compliance rules
The calls we made
We treated it as a data problem before a screen problem: the scores are only as trusted as the links behind them.
- 01
Data model before the UI
We wrote up the client's scoring method, researched every source and put an ERD and SQL in front of the client before building screens, so each vote, bill, trade and donation links to the same representative and bill.
- 02
Lookup on real district boundaries
The plan called for lookup that follows redistricting, so an address maps to its House district through point in polygon search on Census district shapes in PostGIS, with Google Places and Geocoding as the fallback.
- 03
Map the seats the boundaries miss
At large states, DC and territories do not fit the district model, so we documented the 12 representatives involved, loaded their districts through a manual FIPS mapping and gave users a picker.
- 04
Show the source behind every score
In a politically sensitive product users must be able to challenge a number, so we built the score views to the client's written method: a calculation pop out lists the bills behind a score and what each contributed, with data quality and sources one click away.
- 05
AI after the data
Our plan put LLM bill summaries after the core data milestones and AI assisted scoring in the last one, once votes, bills and finance were linked and checked against their sources.
Ruled outAI written news summaries and endorsements in the first phase.
How the system fits together
What we built
Representative lookup
A full address or ZIP returns the House member by point in polygon search plus both Senators, and a state returns its Senators and every district, with district labels such as OH-07, boundary maps and chamber filters.
Profile pages
Each representative's voting record, bill activity, recent stock trades linked to bills, campaign finance with donor fields, contact details and posts from X.
Scores with their sources
Social and fiscal score views with a calculation pop out that shows the bills used and what each contributed, data quality marked High, Medium or Low, fiscal scores with a source link and explanation, and clickable sources.
ETL pipelines
Pipelines for representatives, district geometry, roll call votes, bills and finance data, with Selenium scraping for bill pages and BA checks of the FEC and OpenSecrets data.
Search, follows and feed
Fuzzy search by name, state, party and district, follows and saved bills and articles, likes and dislikes, an activity log and one feed across every representative a user follows.
How it works
Collect
Pipelines pull votes, bills, disclosures, campaign finance and posts from public sources, scraping where a source has no feed.
Link
Each record is matched to the same representative and bill in one data model.
Locate
A voter enters an address, and PostGIS finds the district, the House member and both Senators.
Explain
Profiles show the record and the social and fiscal scores, each with its sources and data quality notes.
Follow
Voters follow representatives and see all their activity in one feed.
A closer look
What changed
The core platform, covering lookup, search, profiles, votes, finance, engagement and a unified feed, went through client feedback rounds into a final QA and deployment milestone. Every score shows its sources, and CivicQ holds its production data in its own database.
Under the hood
- Datics role
- Product built by Datics
- Public data sources
- House Clerk and Senate roll calls, congress.gov bills, House and Senate disclosure sites, FEC and OpenSecrets, Census TIGER/Line shapefiles and the X API.
- Geospatial
- District geometry loaded into PostGIS with bulk asyncio updates, point in polygon search, GeoJSON polygons in the representative API, and Google Places and Geocoding as the fallback.
- Security
- HTTP only cookie sessions with refresh tokens, email verification, Google and X sign in, and profile images served through signed URLs from Supabase storage.
- Data ownership
- Supabase for Postgres, auth and storage, with the production database moved into the client's own database during the build.
Data and retrieval
Apps and APIs
Also in the stack
How it shipped
Kickoff and data groundwork
User stories, a write-up of the client's scoring method, research on every data source, and an ERD, SQL and ETL flow reviewed with the client before any screens.
Milestone 1
Sign up and profiles, representative lookup on PostGIS with the manually mapped seats, search and follows, deployed to staging for the client to test.
Profiles and engagement sprints
Candidate profiles with votes, trades and campaign finance linked to bills, bill scraping, X posts, saved content, likes and an activity log, plus the move to the client's own database.
Feed, admin and client feedback
One activity feed across followed representatives, floor activity, an admin panel and fixes from the client's feedback rounds.
Score explainability and final QA
A fix round on score explanations, sources, data quality tooltips and donor fields, then final QA and deployment.
Milestones the client could test
Each milestone went to a staging URL with a test account and lookup test cases, and after every feedback round we turned each of the client's notes into its own ticket, tracked on a shared fixes sheet.
Client owned data from mid build
We moved the production database into CivicQ's own database partway through the build, while milestone work carried on.
What this unlocked
The plan lists branded notification emails, suggestions when a search finds nothing, ranking by specificity and a gerrymandering indicator on district maps. The linked, sourced data is also the base that the planned AI bill summaries and scoring need.
Related work
Have a product with the same kind of constraints?
Tell us what already exists and what you want it to do. We will tell you what it takes.
