We asked people what key issue they wanted the candidates to be talking about as they competed for their votes in Edmonton’s 2021 municipal election. Then we turned that input into an interactive survey that would allow voters to quickly find out which candidates aligned best with their values. The survey results played a big role in our coverage leading up to election night on Oct. 18, 2021, showing not only who won but also what they stood for.
From Sept. 23 to Oct. 18, 2021, we received more than 21,000 responses to our survey from people seeking to find out who they agreed with most among those running for mayor and council in their ward. Anecdotally, a number of people shared on social media that we had the best tool to help them decide how to vote, and they shared it enthusiastically. “The survey was very well done,” said one user. “The context was short, but well referenced and made for solid opportunities to explore topics in greater detail. And then at the end, you can see how each candidate responded? ::chef’s kiss::” Another said: “Shout out to @taprootyeg, the real MVP of #yegcc #yegVote. If you’re gonna give a local org some dollars, the Taproot folks are an incredible team.” The project seemed to be the deciding factor for about a dozen people to upgrade to paid memberships. Our mailing list for our daily newsletter grew from 340 in January 2021 to 2,400 by the end of October, and while this project would not be the only factor, it is part of what has grown awareness of Taproot as a reliable and valuable source of information on civic affairs.
We built a custom website to power our election matching engine and results dashboard. The site is built using ASP.NET Core in C# and runs entirely inside the Microsoft Azure cloud environment. We used App Service, Cosmos DB as our data store, Redis for caching, and other features of Azure including DNS, storage, etc. The code is hosted in and deployed automatically from the Azure DevOps service. Using Azure meant that as the election drew near and more people started using the site, we could scale it effortlessly (and for a relatively low cost) and that resulted in 100% uptime even as we served thousands of simultaneous users.
We used the City of Edmonton’s open data catalogue, which runs on Socrata, to bring in data such as the wards, candidate names, etc. We augmented that data using web scraping. We wrote a JSON importer to download the data from the open data catalog and input it into our data store. We also wrote a results importer for election night, to translate the raw data into our format. We used Microsoft Excel to prepare data for upload into our system, and in some cases to help with data analysis.
On the frontend we used Bootstrap, jQuery, Leaflet.js and OpenStreetMaps, Chart.js, Font Awesome, and various other CSS and JS libraries. We generally looked for tools with wide usage, good documentation, and frequent/recent updates to allow us to build the site relatively quickly and reliably. We also wanted something that looked professional and clean.
We built an administration part of the website, to help our team track the progress of candidates and see how many voters had completed the survey. That was protected using the Auth0 authentication service.
We used Zoom for our listening sessions, and Google Jamboard to gather attendees’ input.
What was the hardest part of this project?
Getting the categories, questions, options, and context right probably took the most time. At a certain point, it had to be set in stone, so it was very important to get it right. Then chasing the candidates to get them to complete the survey was a big, important task. In the end we got responses from 67 of the 85 candidates for mayor and council, with only a couple of the candidates who were considered contenders turning us down. The survey would not have been as useful without such a robust set of answers to work with.
On the tech side of things, the most critical part of the site was calculating a match between a voter’s responses and a candidate’s, and displaying the correct results in an easy-to-consume way. We went through a number of iterations before we landed on the final layout.
Another challenge was getting the live election results on election night into our system so that we could display a rich dashboard with charts and other results. The City of Edmonton didn’t produce a feed until just a few days before the election and didn’t incorporate our feedback until the day or two before, so incorporating that was a challenge.
We are a very small team, but we have some advantages that other media outlets don’t have, such as a co-founder who is both a developer and a nerd for city hall stories. This unique mix helped us punch way above our weight in our mid-sized market.
What can others learn from this project?
A series of stories or ward profiles is not necessarily the best way to equip voters with the information they need to choose well. Neither is a steady stream of polling data indicating who is winning, no matter how creatively it is visualized. Ask people what matters to them. Then ask the candidates where they stand on this issue in a way that yields accurate but structured data that you can do something with.
Also, build on the cool things that others are building. This project started out as our take on Jay Rosen’s Citizens Agenda approach to election coverage, and we benefited greatly from the peer mentorship and training we received through Election SOS. Then we hit a bit of a wall when it came to deciding what to do with all of the input we had gathered. That’s when we saw the Meet Your Mayor: Ultimate Match (thecity.nyc) project put together by The City to help voters choose from a large field of mayoral candidates. That inspired us to build something similar for our election.