The record isn't a feed

American Voices

Your district. The record. What changed.

Method

How to audit this site. If a source is down, you should see the last successful ingest time and blanks — never a fabricated number. Opinions are optional. The reason to install American Voices is the record and the alerts.

Federal

539

House

439

Senate

100

State dir.

40

Judges

0

Schools / local

0

Executive

18

Agencies

7

Roll calls

16

ZIP→CD rows

42033

Context

0

Last ingest

SourceWhenOKNote
fecSep 4, 2026yesFEC bulk weball26.zip (all-candidates summary, 2026 cycle). No API key. In-state vs out-of-state itemized share is not in this file and stays blank. https://www.fec.gov/campaign-finance-data/all-candidates-file-description/ (loaded from checked-in fixture of real records)
fixtureSep 6, 2026yesFallback fixture of real current-congress records plus ZCTA→119th CD CSV. Run npm run ingest without --fixture to refresh votes/FEC/OpenStates from live sources.
house-votes-2025Sep 4, 2026yesClerk XML evs/2025/rollNNN.xml, rolls 1–362 (0 fetched, 362 already stored). Primary source: https://clerk.house.gov/Votes (loaded from checked-in fixture of real records)
house-votes-2026Sep 4, 2026yesClerk XML evs/2026/rollNNN.xml, rolls 1–295 (0 fetched, 295 already stored). Primary source: https://clerk.house.gov/Votes (loaded from checked-in fixture of real records)
legislatorsSep 4, 2026yesunitedstates/congress-legislators legislators-current.json + social + committee-membership-current.json (loaded from checked-in fixture of real records)
openstates-peopleSep 4, 2026yesOpenStates current-legislator CSVs (data.openstates.org/people/current/{st}.csv). Directory only. Votes and AV scores stay empty — almost no state chamber publishes machine-readable roll calls we verified. 0 state files missing. Race citations: ballotpedia.org/State_legislative_elections,_2026 and ncsl.org 2026 legislative races. (loaded from checked-in fixture of real records)
senate-votes-119-1Sep 4, 2026yesSenate LIS XML vote_119_1_NNNNN.xml, votes 1–659 (4 fetched, 655 already stored). Primary source: https://www.senate.gov/legislative/votes_new.htm (loaded from checked-in fixture of real records)
senate-votes-119-2Sep 4, 2026yesSenate LIS XML vote_119_2_NNNNN.xml, votes 1–231 (0 fetched, 231 already stored). Primary source: https://www.senate.gov/legislative/votes_new.htm (loaded from checked-in fixture of real records)
serve-track-metricsSep 6, 2026yesFixture ingest does not pull live BLS or HHS series. Run npm run ingest:serve-metrics (or a live npm run ingest) to store sourced numbers. We do not invent them. No machine-readable metric is ingested for this track yet. The field stays blank. We do not invent numbers.
zip-districtsSep 4, 2026yesZCTA→119th Congressional District crosswalk from OpenSourceActivismTech/us-zipcodes-congress (zccd.csv), built from 2020 Census block equivalency files updated for the 119th Congress (Census, July 30, 2024) and ZCTA relationship files. A ZCTA is not always a USPS ZIP; about 15% of ZIPs span more than one district — we list every district the file records. Street-address and geolocation lookups use the Census Geocoder (Public_AR_Current / Current_Current, 119th CDs) and override the ZCTA table when they match. (loaded from checked-in fixture of real records)

Newest ingested roll call: house-119-2-295 (Sep 3, 2026).

Sources and keys

ZIP vintage ZCTA→119th Congressional District crosswalk from OpenSourceActivismTech/us-zipcodes-congress (zccd.csv), built from 2020 Census block equivalency files updated for the 119th Congress (Census, July 30, 2024) and ZCTA relationship files. A ZCTA is not always a USPS ZIP; about 15% of ZIPs span more than one district — we list every district the file records. Street-address and geolocation lookups use the Census Geocoder (Public_AR_Current / Current_Current, 119th CDs) and override the ZCTA table when they match.. Keys are optional unless marked required. This table never prints secret values — only whether a named env var is present on this host.

SourceEnvKey required?On this hostWithout the key
unitedstates/congress-legislatorsNot scorednoAlways used. Current bioguide, terms, social, committee membership.
House Clerk roll callsScored inputnoAlways used. Machine-readable EVS XML is the attendance/decisiveness input.
Senate LIS roll callsScored inputnoAlways used. LIS XML is the Senate attendance/decisiveness input.
FEC weball26 bulkNot scorednoAlways used. Receipts and coverage_end. In-state split stays blank.
ZCTA → 119th CD + Census GeocoderNot scorednoZIP path always works from the checked-in crosswalk and Census.
OpenStates current-legislator CSVsNot scorednoState directory still loads. Votes and AV scores stay empty.
GPO BILLSTATUS (bulk XML)Not scorednoBill actions for bills that appear on ingested roll calls. Context only.
Congress.gov API v3Not scoredCONGRESS_GOV_API_KEYnosetGovInfo BILLSTATUS + Congress.gov links from roll calls still ingest.
OpenFEC APINot scoredFEC_API_KEYalias OPENFEC_API_KEYnosetweball26 bulk summaries and coverage_end still ingest. No live filing receipts.
OpenStates API v3Not scoredOPENSTATES_API_KEYnosetCSV directory only. No API people enrich. No state-vote context rows.
GovInfo APINot scoredGOVINFO_API_KEYnosetBulk BILLSTATUS XML still used. Package summaries stay unused.
Google Civic Information APINot scoredGOOGLE_CIVIC_API_KEYnosetStreet-address lookup uses the Census Geocoder. ZIP path is unchanged.
Congress trades / STOCK Act PTRNot scoredCONGRESS_TRADES_API_KEYnosetFiled-trade section stays empty. We do not invent disclosures. Override host with CONGRESS_TRADES_BASE_URL if the key is not Quiver.
Financial Modeling PrepNot scoredFMP_API_KEYnosetTrade cards show ticker / range only, no company name or last price.
Official X postsNot scoredX_BEARER_TOKENnounsetEmpty state. We do not invent tweets. Nick does not have X yet — do not wait.
Attributed newsNot scoredNEWS_API_KEYnounsetEmpty state. We do not invent headlines.
CourtListener / Free Law ProjectNot scoredCOURT_LISTENER_TOKENnounsetBest-effort unauthenticated sitting-position pull. If the API refuses, the judge directory stays empty. No invented bios.
Federal Register (executive orders and agency rules)Not scorednoNo key. Recent presidential executive orders and agency documents. Timeline only for rules — we do not vibe-classify them onto the dual ledger.
OpenFEMANot scorednoNo key. DisasterDeclarationsSummaries land on FEMA’s assisting column when the API answers. Fail closed — no invented payouts.
USASpending.gov (optional obligations)Not scoredUSASPENDING_ENABLEDnounsetSkipped unless USASPENDING_ENABLED=1. No API key. Component agencies are labeled as parent-department figures.
unitedstates/congress-legislators executive.yamlNot scorednoSitting president and VP names when the file lists a current term. /executive fetches this file on a cache miss (short timeout, cache-on-success) so the web container does not wait for the ingest job. Photo may come from a YAML bioguide (Vance) or the White House official portrait filename (Trump). Cabinet chairs are a separate White House page.
White House cabinet pageNot scorednoNo key. /executive fetches this page on a cache miss (short timeout, cache-on-success). Sitting cabinet / cabinet-rank names for existing exec-* chairs, plus official portrait URLs when img alt names that person or the filename is the official presidential/VP portrait. Unmapped offices are ignored. If the page fails, chairs stay title-only + shield. Never scored.
BLS Consumer Price Index (CPI-U)Not scorednoNo key. Serve tracks pull national CPI-U (all items, food at home, energy) from the BLS public API. Optional BLS_API_KEY raises the daily query cap. Fail closed — we do not invent inflation.
HHS AFCARS / Child Welfare OutcomesNot scorednoNo key. Foster-adoption track uses Child Welfare Outcomes public tables (in care / waiting) and the AFCARS dashboard when machine-readable. Incomplete parses stay blank.
Census Economic Census / BEA industry accountsNot scorednoLinked from the free-market track. No national concentration series is ingested in v1 — the metric stays blank with that reason. Related votes still hook when keywords match.
Curated local / school-board CSVNot scorednodata/fixtures/local-officials.csv is header-only until Nick adds sourced rows. Ballotpedia is not scraped.
Account email one-time codeNot scoredGRAPH_TENANT_ID / GRAPH_CLIENT_ID / GRAPH_CLIENT_SECRET / RESEND_API_KEY / SMTP_URLnounsetNo mail sent. /join shows Email not configured. AUTH_DEV_ECHO=1 is local-only and returns the hashed-at-rest code in JSON. Production + AUTH_DEV_ECHO refuses to boot. Production without a sender refuses to pretend.
Phone verification (Twilio)Not scoredTWILIO_ACCOUNT_SIDnounsetPhone stays unverified. UI says coming. We do not mark a number verified.
Optional captcha (Turnstile / hCaptcha)Not scoredTURNSTILE_SECRET_KEYnounsetPersonhood is a documented proof-of-work at /api/personhood. We do not fake a captcha pass.
Web Push (VAPID)Not scoredVAPID_PUBLIC_KEYnounsetAlso needs VAPID_PRIVATE_KEY. UI says pushes are coming. Use the digest. We do not fake delivery.
AI Invest API (deferred)Not scorednoDeferred — not wired. Do not copy this Bitwarden secret yet.

How effects are written

Every roll call gets a What this was, What it does / did, and Who it touches block — or an honest empty state: “no machine-readable summary yet.” Effects never enter score_overall.

  • From the official roll — question, description, result, and the stored impact line copied from Clerk / Senate XML. Source link required.
  • Inferred from bill text / CRS summary — only when a named classification rule fired (direction_rule). The rule id is printed. This is not a CRS extract; we do not invent CRS language. Open Congress.gov for official summaries.
  • We refuse to invent constituent quotes, dollar effects, or “what this means for you” without a source. Blank over guessed.

Offices we cover

Congress and OpenStates legislators remain the core directory. The executive branch (president, VP, cabinet chairs) is listed from office titles plus sourced names when a public file attaches them. We also list judges, school boards, superintendents, mayors, councils, and elected prosecutors when a public source answers: CourtListener sitting positions (optional COURT_LISTENER_TOKEN), Google Civic on a full address, or a curated data/fixtures/local-officials.csv. Ballotpedia is a citation, not a datastore — we do not scrape it. If a source is silent, that office type stays empty. score_overall is still only congressional machine-readable roll calls.

Executive branch and federal agencies

The president, vice president, cabinet secretaries, and a seed set of federal agencies (ICE, FEMA, DOJ, HHS, EPA, IRS, CBP — the set expands) get the same sunlight rules as Congress: sourced records or an honest blank. There is no invented AV index for the cabinet. Executive orders and agency actions never enter score_overall.

  • Dual ledger. Every /agency/:slug page always shows Assisting and Complicating / harming. Language is tied to documented outcomes or standing public functions with a source URL. If a side has no structured public items yet, that column says so. We never ship a page that only dunks or only praises.
  • Standing functions come from the agency's own program pages (Stafford Act assistance, ERO detention, IRS refunds and liens, and so on). OpenFEMA declarations append to FEMA assisting when the API answers. Federal Register rules stay on the timeline — we do not vibe-classify a rule onto a ledger side.
  • President and VP names come from unitedstates/congress-legislators executive.yaml (fetched on a /executive cache miss so we do not wait for the ingest job) or a Federal Register president field. Cabinet / cabinet-rank names and official portraits attach from the White House /administration/cabinet/ page onto existing exec-* chairs — same cache-miss fetch on /executive, not only the ingest job. Official presidential and vice-presidential portraits are taken from that page when the filename identifies them, even if img alt is empty. If that page is down or a chair is missing, the chair stays a title-only shield. Named people without a sourced photo get a silhouette labeled “no official portrait on file.” We do not invent faces or secretaries. Agency ledger rows stay shields — no portraits there.
  • Optional USASPENDING_ENABLED=1 pulls toptier obligations. ICE/FEMA/CBP/IRS figures are labeled as parent-department totals. No secret key.

Judicial record and follow-up alerts

A judge profile has retention/election text and CourtListener opinion links when those fields exist. There is no fake attendance score and no computed “soft on crime” label. A public-record follow-up on /alerts needs two primary-source URLs (disposition + later charge or conviction of the same named person) inside 90, 180, or 365 days (default 180). Rows start as pending review. Published alerts never enter the index. If we cannot obtain a reliable open recidivism feed, the list stays empty — we do not invent cases.

Marketplace is not the index

Outreach and cause CTAs live on /marketplace and in labeled slots on district and official pages. Every outreach row says Paid by … and the FEC committee ID when given. Causes say “Nonprofit / cause — not the official record.” Pending $0 drafts appear on /money-trail only. Ads, donations, trades, news, and outreach never enter the leaderboard.

Influencer disclosure

Influencer posts are context / marketplace speech. They never enter score_overall. Every post must choose paid or unpaid — there is no publish path without it. Paid shows Paid by … (FEC / brand optional). Unpaid shows Not paid — independent. American Voices does not endorse influencer speech. False disclosure is a public integrity violation: reprimand → mute → ban. Banned accounts keep old posts with an audit marker. Influencers may wire an external Shopify, Etsy, WooCommerce, Square, or other storefront. American Voices does not sell those items or take payment — checkout stays on the merchant. Product cards are fetched only when an env-referenced token is present; we never invent merch. Storefronts never enter score_overall.

Civic digest and install

The record isn't a feed. Home leads with Your district. The record. What changed. When a ZIP is saved (cookie, localStorage, or account profile), / and /digest show votes by your officials, new filings, published safety follow-ups, and national executive items. Civic-feed opinions and influencer posts are never on that digest. We notify rarely, and only with sources. Default notification categories are roll calls, safety follow-ups, and major executive orders — never influencer posts or topic chatter. Web Push is opt-in and requires VAPID_PUBLIC_KEY and VAPID_PRIVATE_KEY. Without both keys the UI says pushes are coming and tells you to use the digest. We do not fake delivery.

Accounts, thoughts, and anti-bot

Identified profiles live at /join and /u/:handle. Roles are Citizen, Creator, or Candidate — one primary. Thoughts on /topics and the district-first civic feed at /feed are opinion. They never enter score_overall. Email must be verified to post. A candidate without a matching FEC committee shows Self-attested — not verified against FEC. We do not invent verified politicians. Creator profiles reuse the influencer disclosure and sanction ladder. Anti-bot is a public ladder on /integrity — not a paid blue check, not a silent shadowban. Production should add Google/Apple OAuth later; MVP is a hashed email one-time code.

Civic feed ranking (v0)

Phase A social skeleton. Posts live inside American Voices, district-first. The civic record is never for sale and never rewritten by posts, opinions, or ads. Ranking is AV-sized honesty — chronological recency, district relevance, and public mute/report hooks. This is not an import of xai-org/x-algorithm.

Free tier: a labeled marketplace ad occupies every third feed slot. Subscribers skip ads and keep posting privilege after moderation strikes. Non-subscribers cool down or lose posting privilege when muted for spam. Candidates and influencers stay in the labeled marketplace lane — they are not mixed as organic reach in the free feed.

SignalWeightNote
Chronological recency1Newer posts rank higher. Primary sort. No engagement bait.
District relevance2Same ZIP or congressional district as the viewer is boosted. District-first.
Mute hook-4Muted authors sink. Hook only — not a silent delete. Status stays public.
Report hook-1Open reports lower rank. Cases stay on /integrity. No shadowban of the record.

Context is not the index

X posts, news, bill actions, filings, filed trades, state-chamber vote rows, executive orders, agency actions, and topic thoughts never enter score_overall. Attendance, decisiveness, committee workload, optional keyword pillars, and capped verdicts are the only inputs. Context is labeled on the home feed, district “what changed” list, and the official Context tab. Executive / agency items are labeled Executive or Agency — not the congressional record.

Known gaps

  • Default npm run ingest pulls the complete 119th House (2025+2026) and Senate (sessions 1–2). A 2026-09-04 run stored 1,547 rolls after retrying four Senate session-1 files that dropped on the first pass. Leftovers, if any, are named in the ingest table above. Earlier Congresses are not ingested. --recent is the short window.
  • FEC weball26 matched 535 of 539 sitting members. Four seats stay blank (no invented dollars).
  • State legislatures: OpenStates directory (CSV, plus API people enrich when keyed; 7,287 people; 0 state files missing). Empty scores. Machine-readable OpenStates votes are context only.
  • House financial-disclosure timeliness is linked, not ingested.
  • In-state vs out-of-state itemized receipts stay blank unless FEC returns a usable split.
  • Statements and floor speeches are not a feed. We do not invent them.
  • Most school boards and local offices have no national machine-readable people file we can legally bulk-import. Civic-on-address and a curated CSV are the honest paths. Ballotpedia dumps are unused (license).
  • CourtListener ingest is a sampled sitting-position pull, not every U.S. judge. Opinion counts stay blank if the API does not answer.
  • No live recidivism warehouse is wired. Follow-up alerts are a sourced, moderated model with an empty published list until real records are filed.
  • Agency seed set is seven components. IG reports, GAO findings, and adverse court rows stay empty until a machine-readable sourced item is ingested — we do not invent scandals.
  • Cabinet chairs stay title-only if the White House cabinet page fails or omits that office. Congress.gov nominations are not auto-attached (wrong-person risk).

Privacy

How this host treats accounts, cookies, ZIP personalization, marketplace ads, and the civic index is written in plain English on /privacy. The record is never for sale. That page is an operational policy, not a compliance certificate — counsel should review it before anyone leans on it.

Method · American Voices