The Capitol Digest
A nonpartisan legislation reader for the web and iPhone. What Congress is actually voting on, explained at the reader's level with the facts held constant, plus every roll call drawn as a seat map and a player card for every member of Congress.
- Role
- Product, design, web, iOS, data
- Platform
- Web and iOS
- Stack
- Next.js, React Native, Prisma, PostgreSQL, Claude API
- Status
- In development


The screens show two sample bills and test votes over the real, current membership of Congress.
The problem
Political news is loud, slanted, and built around personalities. The thing Congress actually votes on is thousands of words of legal drafting that almost nobody reads.
So young adults form opinions without knowing the logistics, and younger teens can't get through the material at all. The facts are public. They just aren't readable.
The brief was to build something that reports no stance and tells no war stories: just what each bill does, where it is in the process, who voted for it, and who the people voting are, written so that an eighth grader and a second-year law student each get a version they can read.
What we built
One set of facts, four ways to read it. Every bill is explained at Explorer, Student, Citizen, and Expert levels, from grades 6 to 8 up to law and policy professionals. The numbers, dates, and who must do what never change between levels. Only the vocabulary and the depth do.
- Reading levels
- A three-question onboarding picks a starting level from age, comfort with politics, and interests. A one-tap switch changes it anywhere.
- Progress tracker
- Where each bill sits on the path from introduction to law, what that stage means, and what usually happens next, derived from the official action history.
- Section reader
- Full bill text from Congress.gov, parsed into sections and summarized per section at each level, with words to know. The original text is always one tap away.
- Roll calls
- Every vote drawn as a seat map colored by party, with the line it had to beat and a searchable list of who voted which way.
- Member cards
- A player card for every member: portrait, votes with party, attendance, bills sponsored, years served, committees, and service history.
- Bills feed
- On the phone, cards expand in place to the summary, what happens next, and the latest vote, with filters by stage and topic and search by title or citation.
Decisions that matter
The facts never move.
Changing the reading level changes the words, never the facts. Each section summary is written from the official text under a fixed rule set: facts only, no stance, keep every number and deadline, preserve shall, may, and may not, and say when the text is unclear.
The output is structured and cached per section and level. A refusal or a cut-off answer surfaces as an error, never as partial text, and until a level has been written the official summary stands in, labeled as such.

Who voted, drawn like election night.
A roll call is a number to most people. Here it is a seat map colored by party, a split bar showing the line the vote had to beat, and the full list of who voted Yea, Nay, Present, or Not Voting. Each name opens the member.
Party colors are the only colors reserved for politics: blue for Democrats, red for Republicans, purple for Independents. Everything else on the page is navy, so the product reads as professional, not partisan.

Labels only when they said it themselves.
A member's card leads with big, sporty numbers: votes with party, attendance, bills sponsored, years in Congress. All of them are computed from official roll calls only, never estimated.
Political labels like libertarian or progressive appear only when the member said it on the record, with the quote and source shown, or sits on an official caucus roster. Nothing is inferred from votes or news coverage.

One codebase, two clients.
The website serves a JSON API with precomputed view models, and the iPhone app consumes it, sharing the reading-level, status, and seat-map modules directly with the web app.
Underneath, idempotent ingestion scripts load members and committees, bills with their actions, cosponsors, and summaries, full bill text in both XML schemas Congress publishes, and member-by-member roll calls from the House Clerk and Senate feeds. A rules-based status engine turns free-text actions into the stage timeline, including failed motions that later pass, vetoes, and overrides.
Where it stands
Working today
Live data ingestion from official sources, the web app and its JSON API, the summary layer with its guardrails, and the iPhone app, with typecheck, lint, and production builds clean for both clients.
Next
The iPhone build through TestFlight, and reading-level summaries written ahead of time for every active bill, so the official summary stands in less often.
Have an idea that deserves this kind of care?