I joined the NYC Votes project midway through, stepping into a build that had already seen its first major release. The platform was launched in 2021 by the New York City Campaign Finance Board to connect the city’s five million eligible voters to upcoming elections, candidate details, and key civic information. The team at Phases had already laid a strong foundation, and I was excited to help scale it further, while adding features that would make the platform easier to use, easier to manage, and more inclusive for every New Yorker.

This has remained one of the most technically fulfilling projects I’ve worked on and not just because of the scale and complexity involved, but because of how closely it connects to the public. When you're building something used in all five boroughs, you learn quickly that the smallest decision can have a true impact. Everything from language handling to load time are important..

Adapting to a Moving System

The platform was already in production when I joined, but it was far from done. NYC Votes continues to evolve based on the election calendar, changing policy, and new editorial needs. Our team works closely with the CFB team to iterate quickly, with minimal downtime and clear deployment cycles.

All releases are structured using standard deployment environments, the development, QA, UAT, and as well as production. The project runs on Microsoft Azure, with frontend and backend instances kept separate. This separation gives us flexibility to scale traffic-heavy areas independently, which is important because site activity often spikes ahead of elections.

To support stability, we configured automated backups and introduced structured deployment workflows, including scheduled background jobs to sync external data from third-party APIs. These feeds pull candidate data, district changes, and other dynamic information directly into the CMS, minimizing manual input. Image assets are stored via block storage and delivered through a CDN for consistent speed.

Being Responsible with Accessibility 

When I first saw how this project treated accessibility, I knew it was being built the right way. From its earliest version, NYC Votes was engineered to be accessible to everyone, regardless of physical ability, digital literacy, or the device they’re using. The design team, developers, QA testers, and content strategists all worked together to ensure we met and often exceeded WCAG standards.

Forms, navigation, and layout components were tested for screen reader compatibility and keyboard navigation. All transitions were reviewed to make the website accessible. From the beginning, we considered Accessibility. It was baked in from the start and continues to be a guiding principle today.

You can read more about our broader approach to accessibility in civic platforms here.

Handling Multilingual Content at Scale

Supporting multilingual content was a non-negotiable requirement. Initially, we used an external library that required the content team to duplicate every page across fourteen languages. While it worked, it was time-consuming and error-prone.

Later, we transitioned to an external translation endpoint, which automatically translates content based on the user’s language preference. This removed the need to manually publish and manage each language version. It not only improved efficiency for editors but also ensured a smoother experience for users, especially close to election dates when changes come in fast.

Key Features Built Over Time

Key features of NYCvotes

Since joining the team, I’ve worked on expanding several voter-facing features that now sit at the heart of NYC Votes.

1. Candidate Comparison

This is one of the most used features during any election cycle. Visitors can compare candidates in their district side by side, seeing where each one stands on topics like public safety, affordable housing, climate policy, and more. The data is pulled dynamically from external sources and tied to their election district. It’s organized in a way that lets voters browse quickly, but also dig deep when needed.

2. Ballot Worksheet

We built this to let users create a personalized list of their selected candidates. It’s printable, editable, and saved in the browser session. This tool is simple, but it helps voters feel more prepared before stepping into a polling booth.

Upgrade Umbraco to latest version

3. Address-Based Election Lookup

One of the most requested features, this lookup allows users to type in their address and instantly get the list of elections, candidates, and proposals relevant to their location. This feeds into the rest of the site: candidate bios, comparison charts, ballot options, and district-specific content all update based on the address entered.

4. Candidate Exploration Tool

This feature was deceptively simple on the front, but complex under the hood. Built using Vue.js, it gives users a more visual way to explore candidate details and campaign positions. It integrates smoothly with the .NET backend and includes the same accessibility checks as the rest of the site.

5. Latest News and Debate Archive

During election season, staying updated is critical. We added a news and events module that lets users browse announcements and find replays of recent candidate debates. These are auto-updated by the editorial team and grouped by election cycle.

6. Interactive Games and Practice Ballots

For younger voters and first-time participants, we introduced simple games and a practice ballot experience. The idea was to make civic engagement more approachable without sacrificing clarity. These features were also tested thoroughly to meet accessibility standards.

Editorial Autonomy

Everything we build keeps the editorial team in mind. Content managers can update candidate profiles, edit campaign pages, and manage upcoming events, all without needing to go through developers. This autonomy matters, especially during the weeks leading up to an election when updates are frequent.

Form Management and Salesforce Integration

In the early stages, custom and Umbraco forms were used for voter engagement. Over time, these were replaced with forms integrated directly with Salesforce, based on client needs. Every entry submitted via the site now goes into their CRM system, with mapped fields and segmentation in place for accurate reporting.

Platform Upgrades and Maintenance

As Umbraco moved forward with new versions, we planned a version upgrade from Umbraco 8 to 13. This gave us access to new features, a faster editing experience, and better integration with modern packages.

The upgrade was done without any disruption in public access. We continue to roll out updates with every election cycle. New features, interface refinements, and backend improvements are delivered in version-controlled releases, with CI/CD pipelines to ensure stable rollouts.

Recognition and Real-World Impact

The platform received the Best Gold Partner Solution award from Umbraco, which was a moment of recognition that reflected the technical depth and execution quality of the project. But more important than any award is the fact that NYC Votes remains live, stable, and useful across multiple election cycles.

It has become more than a civic site. For many New Yorkers, it’s the default starting point for understanding what’s on their ballot, who is running, and how to make their vote count.

Ongoing Work

The work hasn’t stopped. Every year brings new elections, new candidates, and new information, meaning the platform continues to grow. We are constantly refining the features, listening to feedback, and improving usability. What started as a single launch now lives as an evolving, citywide tool for democratic participation.

 

Credits

A huge thanks to Danesh, who helped shape this platform in its earlier stages and shared the details that made this article possible.