Call To Order
Congress is, despite present appearances to the contrary, a living thing. Which means that data about the House and Senate are temporal, even if we don’t always treat them like they are. Take committee assignments, for example.
The Clerk of the House maintains a list of House committee assignments as a PDF and a spreadsheet. Both of those are, by necessity, snapshots that are updated throughout the year. But that’s not how committee membership actually works. Members come on and off committees, not often but often enough. A collection of committee assignment data should be less of a snapshot and more like the work of Charles Stewart of MIT, who has collected and published data from the 80th through the 114th Congress.
That’s what I’ve set out to do with recent House committee assignments, based on resolutions passed in the chamber that add lawmakers to committees and resignation letters printed in the Congressional Record. Neither of those things were originally designed to be machine-readable, nor are they in any real sense subject to proof-reading. Here’s a typical resolution near the start of a Congress, adding members of the majority party to committees:

This is - or should be - data, but it lacks a few important things. One is a unique identifier for members of Congress. That’s largely a solved problem, since there is an official Biographical Directory that maintains such an ID. It’s just that, with rare exceptions, neither the House nor the Senate use them. Fortunately, a group of folks have been maintaining good data that links to other collections.
Another is that the structure of these resolutions is, well, sometimes irresolute. Commas separate the names, except when they don’t. Lawmakers’ names are spelled correctly, except when they aren’t (or when they change them, mostly through . So matching members to their IDs is pretty easy, but there are some slightly annoying outliers.
This is an excellent use case for Large Language Models, which can do pattern matching very well and can also build a review process that allows for human oversight. So that’s what I did for these House resolutions:

The Python code that tries to match a member’s name to the bioguide ID leans conservative in that it relies on exact matching and will not try to choose between two members with the same last name who served at roughly the same time (the House does try to disambiguate those using phrases such as “Mr. Davis of Virginia” but Claude, whether by design or accident, seems to ignore the gendered titles in its probabilistic outcomes).
In most cases the code identified the correct person, but there were times when typos and other issues made it necessary for me to step in. That’s what the review server, which runs locally, is for:

This process makes verification pretty easy - links allow you to search all members who have ever served (probably overkill here) and to view the actual resolutions for more context. Those resolutions, which are not passed but “agreed to” by the House, can be accessed via the Congress.gov API, which is how this project does it.
Almost all of the committee events contained here are additions to a panel; resignations are less common, and typically not handled through resolutions, unless the majority party is removing a member of the minority.
Most resignations are done by inserting a statement in the Congressional Record, like this one from 2023. They mostly read the same way, but sometimes you’ll find one that has slightly different wording or that the parser doesn’t precisely identify the member of Congress involved. Again, that’s what the review server is for.
Doing this involved a fair bit of back and forth with Claude Code, and also - crucially - some level of knowledge of congressional committees and members. LLMs want to create “tidy” solutions to your problems, but a lot of legislative information resists the easiest approach. This was a pretty hands-on session, as these things go, and rarely did I task the model with doing large things unobserved.

The end result is Congress Committees, a site that provides JSON downloads of House committee changes - one per Congress - along with some metrics and the ability to browse individual members’ recent committee history. The code is, as ever, on GitHub. Right now it goes back through the 104th Congress and has some records before that, although not a complete set. And it checks for updates for the current Congress each day. Consider it a companion to Congress Press, and there’s more to come. Next up is Senate committee membership data.
As always, if you find this data useful, I’d love to know about it.