What is Resistbot and how did it get started?
Jason Putorti: I would say Resistbot started on election night. We were in the Javits Center in New York that night for hours just waiting and watching the returns. Imagine a room full of very passionate Hillary supporters, fundraisers who had worked very hard, when the results started rolling in on TV and the news started saying she wasn’t going to win.
It was rough. When it was over, we walked out into the street, and it was all super surreal. It was very quiet—we didn’t really know what the hell just happened. We were both pretty depressed.
Jen wanted to leave the country—we started looking at New Zealand and Canada and applying for programs that needed tech workers, because all the stuff Trump wanted to do was very scary. I went home to see my parents. Jen went back to California and just let things settle out.
I’d been in the technology and politics space for a while. I moved out to the Valley in 2007, and when the 2008 race happened I was at Mint and started to get interested in merging tech and politics. How could we use one to help the other?
Fast forward to after the election. I’m starting to think: okay, what am I going to do now? So I kicked around a few different ideas. There was a lot of political technology out there, but there wasn’t anything quite what we wanted—some sort of tool to get people to pressure Congress.
I talked to my friends in politics about different ideas, and got connected with Eric Ries, who was an original investor in my previous company Votizen. Eric had a similar problem where he could not reach Dianne Feinstein on the phone, because she represents 38 million people. The size of Congress hasn’t kept up with the number of people they represent, especially senators from California.
He couldn’t reach his representatives via conventional means, so he was interested in doing some sort of chatbot in order to reach them. I was originally thinking about building a tool with call patching, but his main problem was that he couldn’t reach them with calls. So ultimately we settled on faxing.
Eric called Twilio and we were able to get some volunteers. We were able to get some support internally, because Twilio’s foundation has an initiative called Voices of Democracy which specifically seeks to connect people to their representatives. It all came together pretty quickly—the MVP of it was just text-to-fax: you text “resist” to 50409. It asks you your name, it asks you your zip code, and what you want to say. Done: two minutes later, it sends a fax to your senator.
Could you talk a little bit about your strategy for reaching members of Congress? Why faxes?
Jason: After the election there was a big emphasis on calling your representative. The feeling was calls, calls, calls—that’s what mattered most. But Eric could not call his representatives, since he could never get through—that method didn’t work.
You could email your representatives, but Congress deliberately makes web forms difficult. When you go to the website, you have to fill out a captcha, enter your entire address, and classify at a low level what each message is about. They don’t make it particularly easy.
It’s not with bad intentions. They want only their own constituents to be able to reach them. Nancy Pelosi does not want people in Kentucky calling her office, so they need to screen for real constituents. That is difficult to do.
The systems that exist now make it very easy for Congress, and put all the burden on the user. We wanted to make it easy for the user. We went with SMS as a medium, since at this point it is universal. You don’t even need a smartphone for it. Then faxing was actually the easiest way to launch fast and get a message directly to a Congressperson.
Can you talk a bit more about the technology involved with creating Resistbot?
Jason: We started out at first with Phaxio and then moved on to use Rapid Pro—Twilio SMS is the thing that’s actually getting the message from your phone to Rapid Pro, which is basically a big conversational state machine. It’s a bunch of flows with a database behind it, and can call webhooks out to different services. We later moved on to use the Twilio Fax API—Jen can talk more about that.
Jen Aprahamian: Jason and Eric and the crack team from Twilio worked on building Resistbot initially. And I was just like, “Oh, this is really neat, I’m so excited for you that you have this side project that you’re working on.”
At some point it started growing bigger, and so I asked if they needed anybody to help with it. I think I was fishing for a side project. So Jason bought me into the Slack channel, and then I immediately started getting to work on the backend: the Flask app that powers all the sauce to find your representatives and their numbers, and Rapid Pro, which handles all of the conversation bot logic.
At first I was like, I’m going to casually contribute to this. And then all of a sudden both of us realized that this is what we now do with every waking moment. We went on vacation and ended up barely leaving the hotel room. We were like, we should probably go do some activities, but there’s a bug that can be fixed, and what if we fixed that instead?
Jason: Eric and I originally intended it to be a side project: an experiment in how we could get people to engage daily. And one of our big ideas was to bring in the principles of game design, by starting people off really simply and revealing functionality over time.
That’s why initially Resistbot just asks you for your name and zip code, and just connects you to your senators. The thought was: let’s get people as quickly as possible to a delightful, successful outcome, and the next day we’ll introduce their representatives. And the next day, hey, now you can sign your letters. Now you can mail letters. Now you can start to target who you send a message to. Now you can submit a letter to the editor. Now you can access a town hall.
It introduces new concepts slowly, and celebrates milestones of participation. When you hit ten letters, when you hit twenty letters, we send a little congratulations iOS message which will trigger confetti to go off on your screen.
What was the arc of the project, and when did it become apparent that it was something bigger than a side project?
Jason: It really took off via word of mouth. Originally, we launched with a Re:code article and a Product Hunt post. But it really just took off: people wrote about it and it went crazy. More volunteers were attracted to it; it got bigger and bigger. We had to keep up with the scale, and pretty soon we were spending thousands of dollars a day on Twilio charges.
What started out as an experiment in taking a thousand people and seeing if we could get them to engage with politics daily started hitting scaling issues. We found ourselves fixing bugs for tens of thousands of people.
Jen: All of a sudden now we need load balancers because oh, my god, there are so many people faxing.
With the word-of-mouth promotion, a community started to spring up around it. People get really hyped about unlocking new bot abilities, and there’s arisen a de facto community of user support. For example, someone will tweet at the bot and say, “Hey, how do I send something to just my rep?” And someone else will jump in and say, “Did you know that you could text ‘house’ to the bot?” And then suddenly they are sending screenshots to each other.
We started hearing success stories. People will tweet, “Hey, I got a personalized response back from my rep.” And they’re happy, because they feel like their voice has been heard. Hearing stories of officials writing back or calling back proves they are listening. Some of them are not used to hearing so much about these issues, especially when the AHCA came up.
Jason Kander actually tweeted about us. There was someone who stopped him on the street, and live-sent a fax right in front of him using Resistbot. He was just like: this is blowing my mind.
Someone sent a note that said they were watching the news, and Chuck Schumer actually quoted a line that they had sent in their fax. That was one of those moments where they knew they really made an impact: not only did he read your note, but he remembered everything you had said and he said it on TV.
Jason: That person will participate for life.
Do you know how many people are using your service? How many different areas do you serve?
Jason: It’s national: we have users in all fifty states. We have over 200,000 people signed up. And I believe we have sent over 1.3 million messages to Congress.
Jen: Currently Resistbot only communicates with senators and representatives, but coming down the line there will be deeper coverage at the state level, such as governors and state legislatures.
What’s really interesting to me about the origin story you told is that, while the idea came from a particular political viewpoint, ultimately what you are talking about is civic engagement. One of the things that I’m interested in is: why do you want people engaging every day?
Jason: The country has gotten too big for the amount of representatives that are in Congress, and that necessitates intermediaries. That’s why you have big money in politics—it’s incredibly leveraged to spend money to turn out votes.
But it’s also because people don’t engage. If everybody is disengaged and not directly making their feelings on issues known, then that leaves room for special-interest groups to come in and say “Hey, my X number of people that vote, we all want this particular policy and that’s a block of votes that you are not going to be able to ignore, and I’ll make sure that they get to the polls.” So intermediaries fill in the gaps created by a lack of engagement.
We’re both liberals, progressives, and Democrats. However, we both truly believe that if you can get more people to engage, the better it will be, and you won’t have intermediaries taking over.
Jen: The other side of the coin is the apathy question. If you’re not engaging on a regular basis in some meaningful way and feeling like you’re part of democracy, then what is your incentive to vote?
Look at the 2016 election. Look at how many people didn’t turn out. There are a million reasons for that, but I feel like some of the common threads are: “I didn’t think my vote would matter.” “I thought Hillary was going to win anyways.” “I didn’t like either of them.”
If you feel apathetic or powerless, those feelings affect your participation when it counts. But if you can get into a pattern of regular engagement, you’ll start to feel more like a citizen—like your voice is being heard by someone. And whether or not they are directly shaping policy, people who are more engaged are going to show up at the polls.
I think the other thing that happened is that after 2008, you saw people on the other side of the fence really engaging. A lot people made fun of the Tea Party, but it had an impact. It really caused a shift in the way American politics work. There has been activism on both sides for a long time, but liberal activism, especially among normal citizens rather than career activists, has just felt absent. It feels like we’re just not showing up in the same way as regular citizens. Resistbot is an opportunity to mobilize people to do so.
Jason: The other big problem in our politics is the death of the political middle. Let’s say you’re a middle-of-the-road kind of citizen, and you go to a town hall to try to listen to the city councilman or the mayor talk about stuff. And what ends up happening is you have the people shouting over each other from both sides.
You’re just going to check out. You’re not going to engage.
To fix our politics, we need to get the middle to engage again. We need to make it easy and meet people where they are, in order to get them regularly doing any level of participation. Because if they build a habit, and they start thinking about civic engagement on a more regular basis—not just once every four years when they watch the news in October and November—then you’ll bring back the age of compromise.
Jen: It’s interesting as progressives to advocate for a more centrist view. There’s something about it that feels almost a little off message. But we believe it’s in the greater interest to have a middle ground so there’s not just a line in the sand, and demilitarized zones around it.
It seems there is a good community around the Resistbot project that has scaled up really quickly both in terms of volunteers and users. Could you talk about how have you managed that—how has the community been built?
Jason: The timing is key. The one small silver lining of Donald Trump is that he is so terrifying that everyday people want to do something.
Eric has a massive social media following on Twitter, so it started with: who wants to help on this? Who wants to help test it? We had to figure out how to get organized and how to do onboarding. It evolved to the point where there’s a menu of things to get into: there’s the query API, AWS, data and analytics, continuous deployment, writing tests, and so on.
Eric is an amazing engineering manager, so he’s done a lot of it. He’s taught me a ton. Motivating a distributed, unpaid team of volunteers through Slack is a very different skillset than managing employees. They have to care about the mission and really get excited.
And they’re fueled off of the user response too. This has been just a big snowball. We’ve gone from zero to over four thousand Twitter followers in a couple of weeks, and received lots of good feedback.
What does the technical side of product development look like?
Jen: In terms of technical feature development and code review and how that’s managed, first let’s consider the moving pieces.
First, there’s Rapid Pro, which houses the bot logic. Then there’s the Flask app that has our API for civic agenda stuff: addresses, Senators, Representatives, and then also the things that tie together the fax sending protocols. We’re using a couple of different libraries in there but it’s mostly Google Civic, and then there’s a Python library called usaddress that we also throw in there as well. It’s like a one-stop shop for looking up who your reps are, and then also compiling the fax for sending out the message.
After receiving an SMS, the Rapid Pro system communicates with the Flask backend to fill in questions relevant for the user. It asks, “Hey, I have this zip code, please send me back the senators for this zip code.” Or, “I have a full address, can you tell me this person’s Congressional district and the reps and their fax numbers?” Rapid Pro handles the communication flow, and the Flask API is just kind of a layer that connects a bunch of disparate data sources together.
Then there’s also everything that happens on AWS, which is everything from DevOps to meaningful storage. And then there are also integrations with things like HelloSign—if you have a iOS 10 device, you can digitally sign your faxes, which is really cool.
We’ve got teams that are working on those, in addition to any of the special features. Something that is coming out soon is a new Alexa skill. So you can be like: “Alexa, RESIST.” Which is wild, and kind of cool, because you’re talking to a device that talks to your reps.
So we’ve got some teams dedicated to specific feature integrations. And then I’d say the rest of the volunteers are pretty good at self-identifying what they’re good at and how they want to contribute. Within the volunteer team, people have started to carve out roles, and we’ve been able to make everyone feel like they have a spot. It’s self-management, with some good oversight. It’s empowering, and it makes things move very quickly.
When you see your feature in the wild, it’s very motivating. Especially if at your day job you work for a large enterprise company, you don’t always have that experience. At least that’s what keeps me coming back.
Jason: One thing we’ve learned is if someone doesn’t get a project in the first hour or two and find a spot, they’ll churn. And folks get busy, things come up, they have family emergencies. So I do have to continually find people. The people who are really active right now are not the people who were really active two weeks ago. You have to ask people to set their own deadlines.
But seeing the impact of what you’re doing, and having ideological motivation, can be even more powerful than a financial motivator.
Jen: It’s been less than two weeks since all Resistbot could do was get your name and zip code and fax your senator. Now you can talk to Alexa. And that’s… not normal.
Jason: Eric moves uncomfortably fast. There’s no way I would actually do that myself, but he keeps throwing stuff on and is like, “Hey, if we have someone that is interested in building feature X, say yes. Get them excited about it, have them ship it. Say no to bad ideas or try and steer them into better ideas. But if someone is going to offer you X, Y, Z, just say yes—embrace it, bolt it on, and figure it out later.”
It’s one of the reasons why we’ve been able to move so fast. We have accumulated a ton of technical debt. But you know what? I wouldn’t trade it for being stuck in the small set of functionality that we had a month ago. It’s nuts.
What is Resistbot going to look like in the next few months, and in the long term?
Jen: I would say in the next month or two, some of that technical debt needs to be cleared up. “Moving fast and breaking things” means, yes, there are some broken things.
Jason: The API needs more test coverage to prevent things from breaking. But the biggest source of our pain is generally the user experience itself. Eric built out the first version himself without really knowing exactly how this tech stack worked. So things have to be separated out. They have to become more durable and maintainable—everything’s really brittle now. Just imagine this giant state machine—you’re in these different flows and loops, and sometimes you can get into more than one at the same time, and certain flows don’t time out for a day, so you’re throwing commands at one flow and you’ll get pulled into another.
Features are really fun. We keep adding features, and each of them have their own complexity. But at some point I’m like, “Oh my god, we need some people to fix the core because it’s pulling itself apart.”
But the tech stuff aside, the long-term vision is we want Resistbot to be something like everybody’s personal lobbyist or political action committee. It should be there when you need her. If there’s something in the news and I’m in my emotional peak and I want to sound off about something, Resistbot should be there to make the connection. And if Resistbot notices from all the things that you’re writing to Congress that you care about X, Y and Z, it can tell you there’s a vote coming up tomorrow—here’s what it is and here’s how to send a fax, make a call, and act.
If folks want to get involved, how would they do that?
Jason: Well, we need both volunteers and money. You can go to the website or email firstname.lastname@example.org. We’re looking for people to help us with quality assurance and Python, Flask, operations, AWS, continuous integration, and continuous deployment—all that kind of stuff.
Jen: I would also say anybody who has the ability to connect the Resistbot team to influential groups with the ability to fund us or give us grants to keep the lights on would be great, so the donation model doesn’t need to be the only thing keeping us running.
We could use help with both technical and non-technical QA. Technical QA is very valuable, but also non-technical QA is valuable because not all of our users are technical.
There’s tons for everyone to do.