← Back to AI work

Open Source Project

Voter Research

By Norton Lam · MIT licensed · Updated July 11, 2026


A single, model-agnostic prompt that turns any capable LLM with web access into a rigorous, non-partisan election researcher. Point it at any race, in any district or country, and it hands back sourced candidate memos, a fact-checked claim ledger, and an issue comparison table an ordinary voter can actually use.

Free & open source Model-agnostic No API keys, no code

The short version: local races get almost no fact-checking coverage. National outlets pick apart the presidential race and skip the state senate primary and city council runoff completely, even though those affect daily life more directly. This prompt makes any LLM do that missing work on demand, with a sourcing standard strict enough to trust and output plain enough to read over coffee.

Why I built it

Attack ads and vague claims travel fastest exactly where scrutiny is thinnest: down-ballot races. I wanted a tool that would apply the same rigor a national fact-checker gives a presidential debate to a school board seat or a state senate primary, without requiring an API key, a codebase, or a subscription to anything beyond the AI chat tool someone already uses.

The result is a single prompt file. Copy it, fill in the race, paste it into Claude, ChatGPT, Gemini, or Perplexity, and it runs the research itself, live, sourcing every claim as it goes.

What you get

DeliverableDescription
Race overviewWhat the office actually does, how the winner is decided, all ballot-qualified candidates, seat history
Candidate memosOne per candidate: background, priorities, record, funding, endorsements, red flags, claims checked
Issue comparison tableKey issues x candidates, every cell cited, "No stated position found" where that's honestly the answer
Claim ledgerEvery claim quoted exactly, attributed to its true speaker, rated, and sourced
Voter logistics boxRegistration deadlines, ID rules, early and mail voting, from the official election authority
Report cardWhat was verified, what was assumed, what was skipped and why, source freshness

Fact-check ratings

Every claim in the ledger gets one of six ratings, on a strict sourcing bar: at least 3 independently owned sources that did their own reporting, or 1 verifiable public government record. If the bar isn't met, the claim is marked Unverifiable and stated plainly, never guessed.

✅ True 🟢 Mostly True 🟡 Half True 🟠 Mostly False ❌ False ⚪ Unverifiable

Design principles

Verify before reasoning
Every fact traces to a source fetched during the session, never training memory. The official election administrator's candidate list is ground truth for who is actually in the race.
Attack its own conclusions
The model has to search for evidence against each rating before assigning it, watching for satire, deepfakes, out-of-context clips, and name confusion.
Count everything
All candidates covered, all issues filled, all claims rated. Silent skips are the classic long-task failure, so the prompt forbids them outright.
Symmetric scrutiny
Same depth and skepticism for every candidate, no loaded framing, no endorsements. Asked "who should I vote for," it declines and points at the table.
Honest uncertainty
"Unverifiable" is a first-class answer. So is "no stated position found." Neither gets papered over to look more complete than the research actually was.
Subagent-aware
On platforms that support parallel agents, an orchestrator keeps judgment (scoping, ratings, the final report) while cheap workers collect evidence in parallel, with a strict handoff. Falls back to sequential work with checkpoints elsewhere.

Quick start

Open prompt-candidate-research.md, copy everything below the first horizontal rule, and fill in the input block:

Race: U.S. House District/Seat: MN-04 State/Province: Minnesota Country: USA Election type: general Election date: next scheduled Issues I care most about (optional): housing costs, healthcare

Paste it into your model of choice and run. It works for any jurisdiction: a UK constituency, a Canadian riding, a German Wahlkreis, a mayoral runoff, a school board seat.

Cost warning: this is a deep-research prompt and it's deliberately expensive. The sourcing standard (3+ independent sources per claim, all candidates, all issues, adversarial re-checking) can drive dozens to hundreds of web searches in a single run, especially in a crowded primary.

On metered APIs, set a spend limit first. On subscription chat plans, expect a run to consume a meaningful chunk of your usage quota. Cost scales with candidate count, so narrow the "issues I care most about" field to cut scope on large fields.

Limitations

Output quality tracks the model's search capability and the jurisdiction's press coverage. Sparse local coverage means more Unverifiable ratings, which is honest, not broken. Ad transparency data is strong in the US and EU and weaker elsewhere, so ad claims outside those regions skew Unverifiable too. A prompt cannot make a model neutral; it can only demand a symmetric process, so it's worth spot-checking results, especially in a race you already know well. And facts decay fast in a live campaign, so re-run close to election day.

Disclaimer
This tool produces research assistance, not voting advice, legal advice, or authoritative fact-checks. Verify anything consequential against the cited primary sources before repeating it. Election logistics must always be confirmed with your official election authority.
github.com/orchinib/voter-research ↗
aiconsultant@nortonlam.com →