Inspiration
In Brazil, paying bills still means typing long codes by hand and hoping nothing was mistyped. Friends told me about late fees caused by a single wrong digit, and about finance bots that gave confident answers with wrong balances. I wanted the opposite: a helper inside WhatsApp, where people already live, that never guesses a number.
What it does
Paguei reads a photo or PDF of a boleto, utility bill, invoice or Pix code, saves it with the amount and due date, reminds you before it is due, and hands you the exact payment code to copy into your own bank app. It logs expenses by text, voice or receipt photo, and every numeric answer cites the ledger entries behind it. Paguei does not move money in this version. You pay in your bank, with your own code.
How I built it
The core idea is simple: deterministic code first, language model last. A FastAPI gateway receives WhatsApp messages through the official Cloud API, merges fragments sent close together, and routes them through LangGraph flows. Barcodes and Pix BR Codes are decoded with check digit validation, so a decoded value always wins over a guessed reading. Vision and OCR only act as a reading fallback, and every code is validated again after reading. Bills, expenses and receipts live in Postgres, with signed receipts grouped into a daily Merkle root anchored with OpenTimestamps, so history can be verified later. Reminders run on the effective due date, accounting for weekends and holidays, and a web view lets you see the month, export CSV or PDF, and manage a shared household inbox.
What I learned
Trust is a feature, not a slogan. The moment a finance tool shows a wrong number, it loses the user for good. That pushed me to add a faithfulness gate that checks every amount and date in a reply against its ledger row and withholds the reply if anything fails to match. It also pushed me to treat untrusted text as data, never as instructions: document text, beneficiary names and forwarded messages can never trigger a command like delete everything or mark a bill paid.
Challenges
The hardest parts were the ones users never see. Boleto Seguro compares the bank, amount and beneficiary printed on the document with the barcode, and flags a change from last month, including a company that changed its collecting bank. Making that reliable meant handling printed names, CNPJ check digits, and OCR misreads without raising false alarms. Seeded evals now cover tampered amounts, swapped banks and beneficiaries, and prompt injection attacks through forwarded messages. Another challenge was cost: metering every paid call per user per day keeps the service near two reais per active user per month, so a free tier can stay honest.
What is next
Next is a private beta with real bills, then credit card statement import and a morning briefing. The goal stays the same: a finance assistant you can trust because every number can be checked.
Log in or sign up for Devpost to join the conversation.