Inspiration

Every election cycle we'd hear a representative say one thing on TV and then watch them vote the other way a month later. The information to catch that is all public. FEC filings, roll call votes, financial disclosures, lobbying records. It's just scattered across a dozen government sites that nobody has time to dig through.

So the question became pretty simple: what if you could type in your rep's name and get the receipts in one place? Not someone's opinion about them. The actual record.

What it does

Truthcheck.us lets anyone look up a sitting member of Congress by name, district, or FEC ID (or just click the map) and see:

TruthChecks, which are on-demand reports that take a public claim and check it against primary sources Who's funding them, including outside spending and independent expenditures, not just direct donations Where every number came from, with a citation for each claim

How we built it

It's a TypeScript monorepo:

Frontend: React 19, Vite, and Tailwind, with D3 and visx for the map Backend: Express with raw pg on Postgres, JWT auth Hosting: Railway, with a handful of cron workers that keep the data fresh LLM: used to write the reports, but never to decide what's true The data side ended up being most of the work. We pull from about 25 public sources, including:

  1. Money: OpenFEC, FEC independent expenditures, IRS 990s, USAspending, SAM.gov

  2. Votes and bills: Congress.gov, GovInfo, Federal Register

  3. Influence: Lobbying Disclosure Act filings, FARA, SEC EDGAR

Courts and news: CourtListener, GDELT, press releases

Challenges we ran into

Our own disclaimers almost counted as lies. An early version flagged reports that contained words like "misleading" or "false." Turns out those words mostly showed up in our own methodology notes. We caught it before it scored anyone, but it was a good lesson in checking what a signal actually matches.

Government APIs. Rate limits, inconsistent IDs across agencies, missing photos, and fields that mean slightly different things depending on the year. A lot of the work was just getting different datasets to agree on who a person is.

Accomplishments that we're proud of

Every claim has a receipt. There isn't a number on the site you can't trace back to a filing, a vote, or a disclosure.

It refuses to guess. When we don't have data on someone, the site says so instead of hallucinating. That sounds small, but it took three tries to get right and it's the thing we'd defend hardest. About 25 government data sources talking to each other. Getting the FEC, Congress.gov, and lobbying records to agree on who a person is was not fun, and it works now.

It's live. Real accounts, usage limits, admin tools, and a verification flow for campaigns, not just a demo.

What we learned

Being neutral isn't something you get automatically. You have to build it into the data model, down to how nulls get handled. "Show your work" is a feature. People trust a number a lot more when they can click through to the filing it came from.

What's next for Truthcheck.us

Going deeper on state legislatures and local races A public methodology page so anyone can check our math

Built With

Share this project:

Updates

Submission history