The Governance Company

We’re a small engineering team that has run civic texting at consumer scale for nine years, and now builds AI on top of it.

American civic life is a graph of relationships, and most of its edges don’t exist yet. We build the missing ones and keep them running.

The civic graph: constituents, candidates, government, business, advocacy groups and lobbyists, and the directed relationships between them. The two we run in production are drawn solid; the two-way candidate channel we’re building is dashed. Constituents Candidates Government Business Advocacy Lobbyists

Resistbot turns a text message into a letter in front of the right elected official, and it has answered on the same short code since 2017. Amendment is the layer on top: every bill in every legislature, the people who vote on them, and the tools organizations use to take positions, endorse, and raise money. Four engineers build and run both, on machinery we wrote ourselves and opened where we could. The discipline that keeps the texting up carries over to the AI, where model output has to pass graders in CI before it ships. We take on outside work, and we talk to anyone who wants to build on what’s here.

Two products

Resistbot mark

Resistbot

Write to your officials from your phone. The bot finds them, writes the letter, and delivers it however each office accepts mail: its web form, Congress’s own message API, email, fax, or postal mail.

Messages a month, since 2017
615,131,886
resist.bot
Amendment mark

Amendment

Every bill in every legislature, the people who vote on them, AI summaries with a grading harness, and the primitives an organization needs to move people and money.

Visitors a month
279,656
amendment.app

What we’ve built

What we’ve built · 01

One conversation, six channels.

We write each conversation once. A forked RapidPro engine (we merge back upstream) and a forked Go gateway that abstracts 36 channel types run the same 773 flows on SMS, iMessage, web chat, Telegram, Messenger, and Instagram, plus Discord through a bridge we published. Apple Pay inside iMessage is its own service: stateless payment sessions encoded into the request ID (no database at all), a webhook path with no compute behind it, and a default-deny WAF whose Stripe allowlist is re-fetched from Stripe’s published ranges on every deploy.

What we’ve built · 02

We deliver to Congress by driving its own forms.

Every office publishes a different contact form; half sit behind a CAPTCHA; they change without notice. Mercury is a generic form interpreter: a 12-verb YAML DSL with 28 meta-variables (every office splits a phone number differently), running in a Chrome fleet that scales from zero to a hundred on queue depth. It fingerprints six CAPTCHA families before solving, invokes the site’s own JavaScript callback after, proves success three different ways when a form gives no receipt, classifies failures into a 17-category taxonomy grown from production data, and carries a VCR-style replay layer so an engineer can fix a selector without ever re-submitting to a live office. About 1.2 million form-fill runs a month.

What we’ve built · 03

We know every way to reach every official.

Discovery is the address book of American government: 13 official types, 22 party codes (including New York’s fusion tickets), 56 jurisdictions, and for each person an ordered list of how they can actually be reached. It encodes the legislatures that don’t fit, like New Hampshire’s 43 floterial districts, Puerto Rico’s dual representation, and Idaho’s NA/NB seats. It refreshes hourly from a dozen upstream sources and keeps a field-level provenance record, so a human correction survives the next automated import. The public half is contact-officials: 83 public-domain form definitions covering 47 states and D.C., written with meta-variables so election churn needs zero file changes. Opened in 2018 and still maintained.

What we’ve built · 04

Every legislature, one graph.

278 scrapers over 59 jurisdiction modules feed 279,656 bills, 7,485 politicians, and 2,160 elections into one GraphQL API. Base classes cover the commercial code hosts most cities publish through, so municipal code lands on the same graph as federal and state law. Durable work runs on 14 Temporal workflows, including ones that repair the platform’s own officeholder data. We publish 46,000+ pages, and the crawler policy lets GPTBot and ClaudeBot in on purpose.

What we’ve built · 05

Ask it about any bill in the country.

Thirteen LangGraph agents work behind a supervisor to answer questions across the whole corpus of federal and state bills, state law, and municipal code. Among them are a search planner, a query validator, a preflight validator, a prompt revisor, a summarizer, and a writer. Retrieval is pgvector, cosine similarity with MMR and metadata filtering, routed per collection. Claude runs on Bedrock with multi-model fallback and jittered backoff, and agent state checkpoints to DynamoDB so a long run survives a restart. Answers stream to the browser as structured objects. The same graph is reachable by agents directly: our MCP server runs locally over stdio and in production as an OAuth 2.1 resource server.

What we’ve built · 06

Model output has to pass CI like anything else.

LLM-as-judge evaluators grade both the bill summaries and the letters we send. They run as their own CI tier, with dedicated llm and llm_full_eval pytest markers and a separate job, inside a suite of 693 test files. A summary that regresses fails the build the way a broken unit test does. It’s the same habit behind our tracing: decide what “working” means before shipping, then keep measuring it.

What we’ve built · 07

One trace from text message to delivered letter.

Tracing has been a build-time requirement since 2020. Four codebases in three languages share one header contract, so a single Honeycomb trace follows a message from the conversation engine to the API, the PDF renderer, and delivery: 24 million spans a week across 17 services. Even the 24-commit URL shortener ships with Sentry and Honeycomb. When no Koa or Flask-3 instrumentation existed, we wrote it.

What we’ve built · 08

Infrastructure that cleans up after itself.

Every pull request stands up a complete, DNS-resolvable AWS stack with its own API, certificate, and hosted zone, down to a Stripe webhook managed as a CloudFormation resource. It runs live integration tests, diffs against stage and prod, and deletes itself on a TTL. Fifteen reusable workflow templates and a handful of platform libraries are how four engineers keep a dozen services running.

What we run

Our traffic is consumer-shaped: it arrives when the news does. A bill moves and a Tuesday triples, with no warning and no scheduling window.

615,131,886
Messages handled
175.6 million
Messages in 2020
84.9 million
In Aug and Sep 2020
1.7 million
Messages a day, for a month
113
Consecutive months texting
99.6%
Of 7.9 million requests
2,395,763,211
Flow runs
54,683,435
Deliveries to officials
5,175,423
People who have written
103,651
Deliveries in a day
0 → 100
Browsers, on demand

Where it reaches

Deliveries by the state each sender wrote from. California alone accounts for one in eight.

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.5
Deliveries per sender
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
8,318
Officials who received mail
~870
Contact-form definitions
6
Live conversational channels
Share of 2026 letters, by channel
iMessage56.5%
SMS35.6%
How a letter reaches the office
Web form, API, email94.3%
Fax3.0%
Postal mail0.3%
Other paid2.5%

Nine years, in eras

Org-authored commits per year
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2017The first build
Viral within days of launch: a Flask monolith, a RapidPro fork, a Go PDF service, and Twilio SMS.
2018The pipeline, and an open standard
A router on FIFO queues sends each letter by web form, Congress’s API, fax, mail, or email. contact-officials opens in the public domain.
2019–2021Containers, serverless, tracing
Courier fork for multi-channel; the RapidPro stack moves to containers; district lookup on Lambda with 53 states of vendored geometry.
2021–2023Events and consolidation
A typed cross-language event contract; a cross-account EventBridge backbone over four AWS accounts; Apple Pay in iMessage.
2024–2026The platform
Amendment: deepspace, voyager, a GraphQL graph over every legislature, AI summaries with evals, Stripe Connect, an MCP server.

Team

Jason Putorti
347
@putorti
Jessica Peters
995
@jesse-peters
Chris Erickson
413
@chris-erickson
Tyler Britten
369
@tybritten

The stack

languages
Python
TypeScript
Go
Swift
api and frameworks
FastAPI
Strawberry GraphQL
Next.js 16
React 19
AWS AppSync
Django
data
Postgres
pgvector
DynamoDB
Elasticsearch
Redis
workflow
Temporal
Inngest
Step Functions
SQS
compute
ECS Fargate
Lambda
Vercel
Kubernetes
infrastructure as code
CDK
Pulumi
Terraform
observability
Honeycomb
Sentry
PostHog
ai
LangGraph
Claude on Bedrock
vendors
RapidPro
Apple Messages for Business
Stripe Connect
Clerk
Lob
Documo
Infobip

Open source

We name our repositories after spaceflight: voyager, deepspace, discovery, highgain, xenon.

  • contact-officials
  • rapidpro
  • courier
  • @resistbot/middy-beeline
  • putorti/people
  • discordbot
  • github.com/resistbot

Working with us

We can do something for every node on that graph. What differs is how much of it already exists.

Constituents
Free, and staying that way. Five million people have used Resistbot to write to their own officials.
Business · Lobbyists · Lawyers
Live today. Amendment is self-serve: sign in, research any bill, statute, or municipal code across 57 jurisdictions, and track what moves. Tiered plans buy more questions and the harder comparisons. Larger teams that want something bespoke can have it.
Advocacy groups
Running. Campaign publishing, petition hosting, constituent mobilization, and per-state and per-office delivery reporting.
Candidates
Ready. The two-way channel between voters and campaigns that Amendment is opening: demands, endorsements, vote pledges, and fundraising inside the conversation.
Government
Ready. Texting programs for election offices and agencies: the office’s own registered sender, routing by county, suppression of anyone who opted out under a previous vendor, and a delivery report after every send. Public-sector programs are nonpartisan; the content is the office’s.

Every letter is one identified person taking one voluntary action, written only to their own members, from a first-party, opt-in list. We deliver letters. The contact list isn’t for sale at any price.

Contact

Four engineers, nine years, two products we still run ourselves. Everything on this page is ours, so we can tell you what it costs to keep a texting program up through two presidential elections, and what it takes to put a model’s answer in front of people and stand behind it.

If you have that kind of work, tell us what you need.

Tell us what you need