Building a Safe AI-Powered Expense Tracking AppBuilding a Safe AI-Powered Expense Tracking App
The network for creativity
Join 1.25M professional creatives like you
Connect with clients, get discovered, and run your business 100% commission-free
Creatives on Contra have earned over $150M and we are just getting started
Most AI apps work like this: the model decides, the app saves, and the user finds out later that the numbers are wrong. 😬
For Notarik, I set one rule. The AI can only propose. Nothing gets saved until the user confirms. ✅
🧾 What it does Take a photo of a receipt, or type "lunch 45k at the warung". You get a categorized expense, a monthly recap, and a chat assistant you can ask things like "where did my money go this month?":
🔒 The parts I care about most • Receipt totals are checked by plain code, not by the model. If the math doesn't add up, it gets flagged. • Money is stored as whole numbers (IDR), never decimals, so there are no rounding bugs. • Every user's data is locked at the database level with Postgres row-level security. Even if the app has a bug, it can't show someone else's records. • Text on a receipt is treated as untrusted. If a receipt says "ignore your instructions", it's just text. • The agents have tests, so when I change a prompt I can see right away if it got worse.
🛠 Built with Next.js, React Native, Python (FastAPI), LangGraph and PostgreSQL. One person, web and mobile, from design to API.
🤝 If you're building something where an AI touches real money, records or user data, this is the kind of work I like: agents that are useful and also safe to put in front of users.
Want to talk about yours? Send me a message.
Post image
Kapil's avatar
For the receipt-total checks, I'd include a cash receipt where the amount tendered and change are both printed. How do you distinguish the actual expense from those payment fields before showing the confirmation?
Nashir's avatar
Great edge case, Kapil! To handle cash receipts with printed tendered amounts and change, Notarik enforces a strict JSON schema that requires the extraction model to map line items, tax, grand total, cash tendered, and change into separate fields explicitly instructing it to...
Yonatan's avatar
Treating receipt text as untrusted input is a detail a lot of people skip. When the plain-code total check flags a mismatch, does the user see it on the confirmation screen, or does the entry get held back until they fix it?
Nashir's avatar
Great question, Yonatan! It shows up directly on the confirmation screen with a clear visual warning badge highlighting the math mismatch. Since Notarik follows a strict "AI only proposes" principle, nothing is saved automatically or held back in a background queue, the user...
Vansita's avatar
Smart call keeping the confirmation.
Nashir's avatar
Thanks, Vansita! When handling real money, having that final human verification is essential for building trust and keeping data accurate. Appreciate the feedback! 🙌
Back to feed
The network for creativity
Join 1.25M professional creatives like you
Connect with clients, get discovered, and run your business 100% commission-free
Creatives on Contra have earned over $150M and we are just getting started