Skip to main content
Contact us

Case study · Civic technology

A voting tool that proves its own neutrality

how2vote.au is a National Digital product. It compares your answers with each party's recorded parliamentary votes, and you then author your own voting plan.

National Digital builds custom web applications like how2vote.au for products that need to be trusted.

Last updated

At a glance

Industry
Civic technology
Engagement type
In-house product
First release
2025
Team
National Digital engineering team

✓ Verified Review

“We built how2vote.au to be trusted by people who don't trust it. That meant deriving every match from the public record - the votes members of parliament actually cast - and making the method reproducible: a pure scoring engine with golden tests, a checksummed dataset, an open-source codebase, and an interface with no party colour anywhere. Neutrality you can check, not just take on faith.”

Cameron Young CEO at National Digital

how2vote.au by the numbers

  • 4

    Election datasets in the app

  • None

    Server-side scoring

  • Zero hue

    Colour in the interface

  • GNU AGPL

    Licence

The How2Vote website, showing the opening question and the button to see how your views compare.

The challenge

Voter tools are easy to distrust: recommendations often rest on self-reported positions, and colour or design can quietly signal a partisan lean. The goal was a tool whose neutrality and method a sceptical voter could verify for themselves, and that works on election day with no network connection.

What we built

A non-partisan comparison tool that derives every match from parties' recorded parliamentary votes, never ranks or recommends a preference, exposes its method end to end as open source, and runs entirely on-device as an offline-first progressive web app.

  • Pure, deterministic scoring engine with golden methodology tests
  • Data pipeline compiling a checksummed, ODbL-attributed dataset from They Vote For You
  • Offline-first SvelteKit PWA, packaged unchanged as iOS and Android shells
  • CI integrity gates: neutrality lint, deterministic-rebuild check, axe-core accessibility
  • Open-source release under the GNU AGPL with DCO sign-off

What we built in each area

  • Website & apps

    An offline-first SvelteKit progressive web app on Cloudflare Pages delivers the comparison tool. End-to-end tests run in Playwright and accessibility checks in axe-core.

    • SvelteKit
    • TypeScript
    • PWA
    • Cloudflare Pages
    • Playwright
    • axe-core
  • Apps & workflows

    A pure, deterministic scoring engine derives every match from recorded votes. Capacitor shells package the same build for iOS and Android.

    • TypeScript
    • Capacitor
  • Data & reporting

    A data pipeline compiles a checksummed dataset, attributed under ODbL, from They Vote For You.

    • Cloudflare D1

The outcome

how2vote.au ships as a verifiable, offline-capable voter tool. Every proposition links to the parliamentary divisions behind it, the scoring engine is public and reproducible, and the dataset is deterministic and checksummed. The app carries 4 election datasets, so a voter can compare against the next election as well as past ones. Neutrality is enforced in CI and the code is open for anyone to audit, so people who start out distrusting the tool can check it.

Where it went next

The dataset refreshes from They Vote For You through a pull-request-gated workflow, and official ballots are ingested when nominations are declared. The same engine and interface then serve each federal election.

This case study describes a live civic product designed and built by National Digital. It describes the shipped system and its published specification, and reports no usage figures.

Key Takeaways

Engineering trust into a civic product

  • Revealed preference beats self-reported position: matches derive from votes MPs actually cast.Critical

    Parties are compared on divisions recorded in parliament and sourced from They Vote For You, with every proposition linking back to the divisions behind it. A sceptical user can follow any single match claim to the primary public record.

  • The tool compares and the user decides - nothing is ranked and no preference is recommended.Critical

    Candidates appear in official ballot order and the user authors their own voting plan. Declining to rank keeps the tool a reference rather than a recommendation engine, which is the difference between informing a vote and directing one.

  • A guarantee enforced in CI is worth more than a guarantee written in a policy.Critical

    A neutrality lint over the built CSS fails the build on any hue, a deterministic-rebuild check pins the dataset, and axe-core gates accessibility. Each promise a user has to take on faith is instead a test that must pass before release.

  • On-device scoring removes the need to be trusted with the data at all.Important

    With no account, no server-side scoring and share state confined to the URL fragment, there is no endpoint that could log answers. Privacy comes from the architecture rather than from a commitment about how collected data will be handled.

  • Open source under the GNU AGPL turns the method into something auditable and rebuildable.Important

    Engine, data pipeline and application are all public. Anyone disputing a result can inspect the scoring rules, rebuild the checksummed dataset from source and confirm the output, which is a materially stronger claim than publishing a methodology summary.

  • Compliance records sit in the repository where anyone can read them.Important

    how2vote.au publishes its architecture decision records and a governance document. It carries an electoral authorisation on every screen with a published control register, and names two accountable compliance signatories whose Privacy Act determination records a two-person review.

how2vote.au is built for voters who start out sceptical. Every match comes from the parliamentary record rather than campaign claims, the method is open source and reproducible, and neutrality is enforced in CI rather than promised in copy.

Questions about how2vote.au and how it was built

Does how2vote.au tell you who to vote for?

No. It compares your answers with each party's recorded parliamentary votes and shows how closely they match, against the candidates on your ballot in official ballot order. Nothing is ranked for you and no preference is recommended. You author your own voting plan from what the comparison shows, because the tool's job is to surface the public record and leave the choice to you.

How can a voting tool prove it is neutral rather than just claim it?

By making neutrality checkable. Every match derives from divisions members of parliament voted in, sourced from They Vote For You, and each proposition links back to those divisions. The scoring engine is pure, with the specification's worked examples as golden tests, the dataset is deterministic and checksummed, and the code is open source so anyone can rebuild it and check the answer.

Why does the how2vote.au interface have no colour at all?

Because colour signals allegiance. A strictly two-tone, ink-on-paper palette means match quality is never encoded as party colour, and a high match cannot feel like an endorsement through design alone. A continuous-integration lint over the built CSS enforces it, so a stray hue fails the build.

What happens to my answers in how2vote.au?

All matching runs on-device. There is no account and no server-side scoring, and analytics is off unless you opt in. Your answers leave the browser only if you share a card, and the share link carries them in its URL fragment, which browsers never send to a server. An opt-in research feature adds only anonymous group counts and never your raw answers.

What stack does how2vote.au run on?

It is a TypeScript monorepo. A SvelteKit app built with adapter-static runs as a PWA on Cloudflare Pages, and a pure scoring package computes every match. A data pipeline compiles the dataset from They Vote For You. Cloudflare D1 stores only the opt-in aggregate counts, and Playwright and axe-core run the end-to-end and accessibility checks in CI.

Is how2vote.au available as an iOS or Android app?

Yes. Capacitor wraps the unchanged web build as iOS and Android apps, listed on the App Store, Google Play and F-Droid. Because the shells bundle the same build, dataset included, the apps work offline in the same way as the PWA and need no separate codebase.

Why build an election tool offline-first?

Polling places have poor reception and long queues, which is when someone reaches for their voting plan. A static, offline-capable progressive web app keeps working with no network. One codebase and one scoring engine serve the web and both app stores, and no server sits in the path at the moment of use.

What stops the data going stale between elections?

A pull-request-gated workflow refreshes the dataset from They Vote For You, and official ballots are ingested by hand once nominations are declared. Every refresh passes the same integrity gates, namely the deterministic rebuild, the neutrality lint and axe-core, so a bad data release cannot ship quietly.

More of our own products

What's next

Building something that must be trusted?

how2vote.au earns trust by construction: deterministic builds, CI-enforced guarantees and an auditable method. If your product carries the same burden of proof, see how we approach custom web applications and technology selection, part of our wider custom software development work.

Want a platform like this for your business?

Tell us what you're building. We'll come back within one business day with what we'd do first and what it would take.