Developer / Software Architect for Abacus at the Dutch Electoral Council (Kiesraad) • Developing software for 20+ years • MSc Embedded Systems and BSc Computer Science & Engineering, TU Delft
& apportionment Nomination day Political parties submit candidate lists Public committee session Final tallied result and seat allocation presented Election day Voters cast ballots, counted by hand
• 10M voters • 100K volunteers • 10K polling stations • 342 municipal electoral committees • 20 electoral district electoral committees • 1 central electoral committee Software is used to add up all results!
• Memory-safe • Strictly typed with a modern type system • Great tooling (Cargo) • Cross-platform support • Easy to deploy: compile to single executable • High performance and low system requirements
list and specific change for a specific residual seat #[derive(Clone, Debug, PartialEq)] pub enum SeatChange<LN> { HighestAverageAssignment(HighestAverageAssignedSeat<LN>), UniqueHighestAverageAssignment(HighestAverageAssignedSeat<LN>), LargestRemainderAssignment(LargestRemainderAssignedSeat<LN>), AbsoluteMajorityReassignment(AbsoluteMajorityReassignedSeat<LN>), ListExhaustionRemoval(ListExhaustionRemovedSeat<LN>), } Compiler enforces that every seat change (allocation or removal) has a legal basis.
• Split major functionality into separate crates • Many great crates available (e.g. Typst), but also lower quality and unmaintained ones: choose carefully • Had more issues with React development than Rust
user feedback • Implement remaining features (e.g. apportionment) • Next up: ‣ Municipal reorganisation election in November 2026 ‣ Provincial council and water board elections in March 2027
political parties to nominate candidates • Currently a paper process with offline software • Desire to move to digital process (requires new law) • After good experience writing Rust for Abacus, decided to use Rust again • Possibility to have a future single Rust software maintenance team • Public tender in 2025
• Centrally hosted web application, not air-gapped like Abacus • Mission critical in period up to election nomination date • Integration with Basisregistratie Personen (Personal Records Database) • Authentication with DigiD and eHerkenning • Single Rust-native codebase (with HTML, CSS and some JavaScript) • Also open source: github.com/kiesraad/e-ks
Parse, manipulate and emit EML_NL documents • Built on the quick-xml crate • Source on github.com/kiesraad/rust-eml-nl • Available on crates.io/crates/eml-nl • Round-trip preservation: use eml_nl::{documents::EML, io::{EMLRead, EMLWrite}}; let xml = "eml110b_polling_stations_construction_output.eml.xml"; let eml_doc = EML::parse_eml(xml, eml_nl::io::EMLParsingMode::Strict)?; let xml_output = eml_doc.write_eml_root_str(true, true)?; assert_eq!(xml_output, xml);