← All work

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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 out

    AI written news summaries and endorsements in the first phase.

How the system fits together

votes, tradesbillsfinance, donorsdistrict shapespostslinked recordslookup,profilesgeocode fallbacksourced scoresaddress, followsHouse and SenatesourcesRoll calls, members,disclosurescongress.govBill pages, scrapedwhere neededFEC andOpenSecretsCampaign finance anddonorsCensus TIGER/LineDistrict boundaryshapefilesX APIRepresentatives'postsETL and scrapingasyncio pipelines,SeleniumSupabase withPostGISOne linked model,client's databaseGoogle Places,GeocodingFallback for addresslookupWeb app and APIReact and FastAPI,lookup to feedVotersLook up, follow,compare
Outside serviceBuilt by DaticsData storePeopleEvery number on a profile comes from a public source through one linked model, and the production data sits in the client's own database.

What we built

01

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.

02

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.

03

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.

04

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.

05

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

The CivicQ home page, with its mission to show voters how their representatives perform.
The CivicQ home page, with its mission to show voters how their representatives perform.

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

Supabase

Apps and APIs

ReactFastAPIPython

Also in the stack

PostGISSeleniumGoogle Geocoding APIX API

How it shipped

  1. 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.

  2. 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.

  3. 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.

  4. Feed, admin and client feedback

    One activity feed across followed representatives, floor activity, an admin panel and fixes from the client's feedback rounds.

  5. 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.

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.

Book a 30-minute Product Review