Inspiration

Meet Namuna, 24, applying for her first e-Passport. A neighbour lists three papers, the counter says five, and a website says something else. Then she finds a crack inside her own documents: her birth certificate writes her mother's name as "Mst. Rahima Begum" while her NID says "Rahima Begum". Problems like this surface at the last step, after the journey. (Namuna is a composite, illustrative character. No statistics are claimed.)

The problem is not missing papers. It is having no confidence in your own papers. Kagoj Ready ("Know Before You Go") checks that before the visit.

What it does

Kagoj Ready is a mobile-first, Bangla/English web app that helps first-time adult e-Passport applicants in Bangladesh prepare before visiting the office. The applicant uploads the documents they already own. A guarded AI agent reads them, the applicant confirms every extracted field, and tested code compares the confirmed values. The result is an evidence-linked, printable report: what differs, where each value was found, what is still uncertain, and an ordered checklist of what to verify next.

It is not a chatbot, not a government portal, and not legal advice. It gives no readiness score, makes no approval prediction, and never guesses government requirements. Requirement rules are shown with their verification status and are marked unverified until checked against official sources.

How we built it

  • Bounded agent: a state machine (context, support check, upload, extract, confirm, compare, plan, report). Code decides which tools the model may call at each state. Hard limits: 12 model steps and a token budget per case.
  • AI reads, code decides: a vision model transcribes visible fields into a strict Zod schema; unreadable fields stay empty and are never guessed. Comparison, normalisation (Bangla/English digits, honorifics, spacing, fuzzy matching), severity and checklist order are deterministic, unit-tested code.
  • Human in the loop: the agent pauses until identity and low-confidence fields are confirmed or edited by the user.
  • Provider fallback chain: Gemini, then Groq, then OpenRouter, with every non-live result labelled honestly.
  • Privacy by design: no accounts, no server-side storage of documents or fields, identity numbers masked, one-click "Delete my data".
  • Quality: 117 automated unit tests, 6 Playwright browser journeys including an axe accessibility scan, and an evaluation harness over synthetic SAMPLE documents.

Challenges we ran into

  • Free-tier model quotas and provider differences: the Gemini Developer API rejects systemInstruction and tools in countTokens (a Vertex-only feature), which broke live reading until we fixed it and added a regression test.
  • Keeping the product honest: designing so that an unverified rule, an unreadable field or a non-live run is always visible, never presented as fact.
  • Bangla and English name matching: transliteration agreement is not proof of the same legal name, so we label such cases "possible variation" for human review.

What we learned

Trust is a product feature. Letting AI do only what it is good at (reading), keeping decisions in tested code, and making uncertainty visible gave a more useful and more defensible tool than a model that answers everything.

Limitations and honesty

Vision models can misread Bangla documents. For this reason, Kagoj Ready never compares raw model output: the applicant confirms every field first, and uncertain fields are flagged. Live reading currently runs on free-tier vision models, so accuracy varies with photo quality and model availability, and we do not publish an accuracy figure. Sample mode demonstrates the full pipeline with clearly labelled synthetic documents. Requirement rules are shown as unverified until checked against official sources.

What's next

Verify requirement rules against official government sources, publish live-model accuracy from real evaluation runs, run consent-based usability tests with first-time applicants, and add NID correction guidance (marked "coming soon").

Built With

Share this project:

Updates

Submission history