Civic texting and legislative data, built and run by four engineers.
We make Resistbot and Amendment. Constituents have written to their own officials through our software since 2017, and organizers have reached constituents through it since 2018. We build the same kind of software for clients.
The civic graph. Solid edges run in production: letters to officials since 2017, campaigns to constituents since 2018, and legislative data since 2025. Dashed edges are the two‑way connections we’re building.2017Constituents write to their officials.This is the first edge. A constituent’s message goes in, and a letter arrives at the right office.2018Organizers reach constituents.This is the second edge. Under the first one now sit the delivery system and the directory of officials.2019 to 2020175.6 million messages in 2020.No new edge. The same two carry the election year.2021 to 202244.3 million messages in 2021 and 2022.No new edge. We rebuild the two we have for the next cycle.2023 to 2024Amendment starts alongside Resistbot.No new edge yet. The dotted lines are legislative data, which we started building in June 2024.2025Legislative data goes out from government.Three new edges carry 281,986 bills to business, lobbyists, and advocacy groups.NowFive connections that run both ways.These are the dashed edges. We’re building them inside Amendment.
2017A text message becomes a delivered letter
A person texts RESIST to 50409, and the message becomes a letter in front of their own elected officials. It works on the phone they already have.
Resistbot launched in February 2017 on that one idea and spread within days. Volunteers helped build the first version, and 41 people committed code to the first backend. We started on EFF’s form-filler and began replacing it by December.
Text RESIST to 50409, or message us on iMessage. resist.bot
Constituents write to their officials.
2018We deliver to every kind of office
Every office takes mail its own way, and the rules change without notice. Our delivery system handles web forms, the congressional APIs, email, fax, and postal mail, and it sends each letter by the route its office accepts.
Today it reads about 870 contact-form definitions and tells six kinds of CAPTCHA apart. Behind it is our directory of officials, including the seats that don’t fit the usual pattern. New Hampshire has 43 floterial districts laid over its ordinary ones. Idaho elects an A seat and a B seat in every House district.
Some of this is people. We keep contacts in the offices and with the IT staff behind them, so when a route breaks we know who to call.
We built the delivery system and the directory in 2018. In October 2018 organizers started publishing petitions to constituents, and the second edge went live.
Organizers reach constituents.
2019 to 2020It holds when the news breaks
Civic traffic comes in bursts, so the system has to scale with no warning. In 2020, the election year, we handled 175.6 million messages, in and out, across every channel. The officials lookup scaled out to carry it.
We write each conversation once, and it runs on SMS, iMessage, web chat, and the major messaging apps. The engine underneath is a fork of RapidPro that we run ourselves. Six channels carry letters today.
Every service ships with tracing. A single trace follows a message from the first text to the delivered letter.
The data platform behind Resistbot is serverless: AppSync, Lambda, Step Functions, and DynamoDB, all deployed with CDK. Lambda does much of the connecting. It backs API calls, runs workflow steps, and reacts to changes in the tables. We know DynamoDB well. Conditional writes keep a letter from going out twice, transactions keep petition counts exact, and Streams keep Amendment’s counts live.
It also has to be cheap. A team of four has run this since 2017, which only works when a quiet system costs little. The form-filling workers scale to zero between bursts, and we lean on spot capacity.
Messages a month, since 2017
52.5M · Dec 201750.3M · Sep 2020
Feb 2017Jul 2026
Messages in and out, all channels, by month.
175.6 million messages in 2020.
2021 to 2022We rebuild the system while it carries messages
We rebuild a system without taking it down. In 2021 and 2022 Resistbot carried 44.3 million messages, and we moved the services under it onto one shared event system.
We kept shipping through it. In 2021 people could pay inside iMessage without leaving the conversation. The Resistbot iOS app shipped in 2022.
Every pull request stands up a complete environment of its own, runs live tests, and cleans up after itself. We deploy to production more than 50 times a week.
44.3 million messages in 2021 and 2022.
2023 to 2024We finish the rebuild and start Amendment alongside Resistbot
We build the next product while the current one runs. In 2023 we folded four delivery services into one. Twitter suspended our API access in April 2023, and the other channels kept carrying letters.
2024 was an election year. Resistbot carried 28.8 million messages across 2023 and 2024. It has carried messages in every month since February 2017, through four federal elections.
In June 2024 we started building Amendment. On the graph, the dotted lines are the legislative data we collected for a year before anyone outside could use it.
Amendment starts alongside Resistbot.
2025Amendment: every legislature’s bills in one graph
Amendment holds 281,986 bills across 57 jurisdictions and more than 7,500 politicians and candidates, from Congress down to city councils. We collect them from hundreds of public sources and keep them current in one graph. Organizations use its tools to take positions, endorse, and raise money.
Amendment launched in July 2025, a year after we started building it. On the graph, its edges run from government out to the businesses, lobbyists, and advocacy groups that track legislation.
Visitors a month
57 · Jul 20258,444 · Sep 2026
Monthly visitors to amendment.app since it launched in July 2025.
Legislative data, and the tools to act on it. amendment.app
Legislative data goes out from government.
NowNext: connections that run both ways
So far, each connection carries messages in one direction. A letter goes to an office, a campaign goes to constituents, and legislation goes out to the people who track it. We’re building the connections that run both ways, inside Amendment.
The first is between voters and candidates, with endorsements, vote pledges, and fundraising. The others connect advocacy groups and lobbyists with each other and with government.
We build software that connects people to their government, for our own products and for clients. Some of it is live today, and some we’re building. The story above shows how we built each piece.
Advocacy groups
Live.Campaign publishing, petition hosting, and letters delivered to the right offices, with delivery reports per state and per office. We also run texting programs for organizations whose supporters asked to hear from them.
Business, lobbyists, and lawyers
Live.Amendment is self-serve: research legislation from Congress to city hall, and track what moves. For teams that need data feeds, API access, or their own tools, we build those too.
Government
Available.Texting programs for election offices and agencies, sent from the office’s own registered number, with delivery and opt-out counts for every send. Public-sector programs are nonpartisan, and the office writes the content.
Candidates
Building.Two-way conversations between voters and candidates inside Amendment: endorsements, vote pledges, and fundraising.
Constituents
Free to write.Five million people have used Resistbot to write to their own officials. Web forms, the congressional APIs, and email cost the sender nothing; fax and postal mail are paid.
Custom work
AI features with evaluation built in, data pipelines from government sources, integrations, and texting at scale. If it connects people to their government, we’ll talk about it.
We’ve built campaigns with elected officials, national organizations, and well-known artists. References on request.
What we runThe systems we run every day
Our traffic arrives when the news does. A bill moves, and deliveries can reach four times an ordinary day with no warning. In a typical week, more than half of the people who write to their officials write again the next week.
618,113,260
Messages handled
in and out since 2017, across every channel
114
Consecutive months texting
never a dark month, and one short code, 50409, since February 2017
2,424,756,220
Flow runs
one person through one conversation flow
55,606,771
Deliveries to officials
one letter to one official, so writing Congress counts three
5,175,423
People who have written
everyone who has sent at least one letter
103,651
Deliveries in a day
four times an ordinary day
8,359
Officials who have received a letter
every office that has taken at least one letter
By state
Deliveries by the state each sender wrote from. California alone accounts for one in eight.
Bills from this cycle’s sessions, 2025 and 2026, for every legislature and for Congress. We are adding earlier sessions.
Point at a state for its numbers.
1 million and up
400K – 999K
100K – 399K
under 100K
CA6,995,930
NY3,701,645
TX3,421,886
PA2,914,399
FL2,792,142
OH2,211,849
WA2,115,520
NC1,909,451
10,000 and up
5,000 – 9,999
2,500 – 4,999
under 2,500
Congress19,287
NY25,357
NJ21,918
TX12,787
IL12,102
MN10,532
HI10,137
OK9,146
TN9,141
Deliveries, people, officials and bills by state
State
Deliveries
People who wrote
Officials
Bills, 2025–26
California
7,214,782
736,850
267
5,381
New York
3,785,600
440,129
268
25,357
Texas
3,532,714
347,470
270
12,787
Pennsylvania
3,028,888
226,197
300
5,123
Florida
2,894,589
267,546
217
3,781
Ohio
2,299,718
175,803
161
2,520
Washington
2,196,395
168,820
186
3,098
North Carolina
1,972,792
157,591
211
2,338
Illinois
1,919,557
210,981
241
12,102
Michigan
1,723,137
148,763
190
4,159
Colorado
1,706,349
134,416
122
1,208
Arizona
1,585,229
112,685
120
3,714
Virginia
1,347,885
133,888
174
7,229
New Jersey
1,329,580
145,792
160
21,918
Oregon
1,263,538
106,819
115
3,772
Georgia
1,204,776
132,082
280
5,255
Massachusetts
1,175,763
133,803
226
8,546
Missouri
1,159,719
90,551
208
5,474
Indiana
1,125,979
105,374
167
2,409
Minnesota
1,065,168
98,517
223
10,532
Wisconsin
1,049,167
85,901
157
3,083
Maryland
1,019,735
103,533
208
5,262
Tennessee
942,052
82,857
152
9,141
Utah
716,085
53,047
121
1,980
South Carolina
591,887
50,506
198
3,974
Kentucky
588,174
53,065
155
3,131
Kansas
547,322
43,253
179
1,472
Iowa
526,182
41,319
166
4,199
Connecticut
486,015
57,578
205
5,201
Maine
466,632
24,978
197
2,389
Nevada
462,098
41,175
78
1,237
Louisiana
434,412
41,994
157
3,571
Oklahoma
400,479
38,845
164
9,146
Alabama
370,929
36,872
168
2,910
New Mexico
337,817
24,171
120
2,152
Nebraska
317,998
24,923
63
1,844
Arkansas
296,820
27,570
147
2,169
Idaho
283,319
22,824
120
1,592
New Hampshire
253,381
21,518
416
2,055
West Virginia
210,525
18,006
144
5,657
Alaska
209,381
12,360
67
839
Montana
208,292
15,311
161
1,761
Mississippi
134,903
13,490
188
7,824
Rhode Island
133,268
16,170
121
5,602
South Dakota
133,048
7,722
113
1,167
Vermont
129,028
12,472
188
1,707
Delaware
125,835
12,485
71
1,291
Hawaii
123,425
13,575
86
10,137
North Dakota
79,631
6,172
150
1,117
Wyoming
58,539
4,641
101
819
District of Columbia
35,016
11,069
15
1,791
Puerto Rico
2,664
904
84
none
United States Virgin Islands
261
123
1
none
Guam
18
12
1
none
Northern Mariana Islands
2
2
1
none
American Samoa
1
1
1
none
Heaviest congressional districts, lifetime
369,628CA-12
348,806WA-7
320,403NY-12
301,224CA-30
298,793NC-11
289,996CO-2
280,323NY-10
262,136PA-3
How people write in: share of 2026 letters, by channel
iMessage57.0%
SMS35.6%
Web chat4.5%
Telegram2.0%
Messenger0.8%
Instagram<0.1%
In 2026, iMessage passed SMS.
In the pressCoverage since 2017
What reporters and the open-data community have said about Resistbot.
“Resistbot isn’t so much a partisan tool as a general-purpose facilitator.”Engadget · March 2017
“The folks at Resistbot… have helped to breathe new life into the openstates/people portion of the project.”Open States · February 2022
The stackWhat we build with
languages
Python
TypeScript
Go
Swift
web and API
FastAPI
Strawberry GraphQL
Flask
Django
Next.js
React
Tailwind CSS
data
Postgres
pgvector
Elasticsearch
Redis
InfluxDB
scraping and workflows
Scrapy
Playwright
Temporal
Airflow
Inngest
AWS
DynamoDB
Lambda
EventBridge
ECS Fargate
Step Functions
SQS
Aurora
S3
AppSync
API Gateway
CloudFront
Bedrock
infrastructure as code
Terraform
Pulumi
CDK
hosting and network
Vercel
Docker
Kubernetes
Cloudflare
Tailscale
testing and CI
GitHub Actions
GitLab
CircleCI
observability
Honeycomb
OpenTelemetry
Sentry
PostHog
Prometheus
Grafana
AI
Claude
OpenAI
Gemini
Cohere
Hugging Face
LangChain
LangGraph
LangSmith
Model Context Protocol
messaging
RapidPro
Apple Messages for Business
Twilio
Bird
Infobip
Telegram
Messenger
Bluesky
Discord
email, mail and fax
Loops
Resend
Lob
Documo
payments and sign-in
Stripe
Clerk
Auth0
Some of this code is public: contact-officials, our contact-form definitions for 47 states and D.C.; our rapidpro fork; and our contributions to Open States’ legislators dataset.
TeamWho builds and runs it
We build and run both products ourselves. Each of us had a career of more than 20 years before this one, at startups and large enterprises, across engineering, infrastructure, and sales. Between us, we have taken companies from first build through acquisition.
Jason Putorti
Product
Co-founded Resistbot in 2017 and leads product across Resistbot and Amendment, from the user experience to pricing and the civic data behind both.
Jessica Peters
Data, infrastructure and AI
Leads data and infrastructure: the cloud platform both products run on, the pipelines that collect and normalize government data at scale, and the AI systems built on that data.
Chris Erickson
Product architecture and reliability
Leads architecture across our web applications and core services, from the product frontend down, and the reliability practice that keeps them running through every news cycle. Has built Resistbot since its first months.
Tyler Britten
Backend, AI and product
Leads backend engineering, from the messaging infrastructure behind every Resistbot conversation to the APIs and AI services that power Amendment, and shapes the product for enterprise customers.
How we workRules we work by
Opt-in only
We only message people who asked to hear from us, and we turn down work that doesn’t meet that bar.
A first-party list
Everyone on the list signed up with us directly, and the list stays with us.
Every letter, the same way
Every letter is one person writing to their own officials. We deliver each one the same way, whatever the sender’s party or position.
Every change ships tested
Every change runs the tests that cover it, then deploys on its own. The whole system runs the same way on a laptop, in CI, and in production, so we find a problem before a customer does.
ContactCome talk to us
The four of us run everything on this page, and we’ve kept it up through two presidential elections. If you’re building civic software, or you want to compare notes on how we run it, write to us.