Model as extractor
Gemini reads the handwriting and suggests a name; a four-tier matcher (exact, accent-folded, fuzzy, phonetic) plus the eligibility and counting rules all run outside the model.
Case · AI · Civic tech
Photos of handwritten ballots into an auditable tally, with rules around the OCR.
Handwritten ballots need OCR help, but the model cannot be the final authority.
Sole engineer
MVP built: roster checks, four-tier name matching, and tests against a real PostgreSQL.
Manual counts take time, and children's handwriting on Malay-language ballots is a rough case for OCR. This project turns ballot photos into a tally, but it doesn't ask the model to be the final source of truth.
Gemini reads the handwriting and suggests a name; a four-tier matcher (exact, accent-folded, fuzzy, phonetic) plus the eligibility and counting rules all run outside the model.
The tally depends on seeded rosters, eligibility checks, and stored state, so the tests run against PostgreSQL rather than mocks.
Test ballot photos and roster images are real, but git-ignored and never committed, so no real voter data lands in the repo.
An OCR counting pipeline where AI helps with extraction, while eligibility rules, database constraints, and checks decide what gets counted.