Back to projects
FinMail

Finances read from your inbox

Banks have no open API. This service reads the emails they send anyway.

JavaSpring BootPostgreSQLGmail APIClaude APIReactPWA
Finances read from your inbox

The problem

I could never keep my finances organized. I tried several apps and they all ended the same way: either I logged every expense by hand, or I entered it twice —once in the bank, once in the app. That friction meant I'd stay motivated for three days and then quit. What I needed was to have my spending organized on its own, with the least human intervention possible; if the system forces me to enter something, it already lost.

The solution

I realized something obvious that was right in front of me: my bank emails me for every transaction. If that already arrives on its own, why was I typing it in by hand? The initial idea was to parse those emails so each one became a row —amount, merchant, date— without me touching anything. Then, with the AI boom, it occurred to me to go one step further: use a model to predict which category each merchant belongs to. It's not 100% accurate, but the trick is how it learns: once the system knows a merchant's category, it never asks the AI again. That gives me two wins: I stop accepting categories over and over, and I don't waste tokens for nothing. Basically, it gets more efficient and cheaper the more you use it.

Technical decisions

◆

Read the email, don't wait for an API

Banks expose no API, but they do send an email for every transaction. Work with what exists, not with the ideal.

◆

Pluggable per-bank parsers

Adding a bank is implementing a parser; auth, AI and endpoints are already built.

◆

Learn the category and stop asking

Once the system knows a merchant's category, it never queries the AI again: fewer manual confirmations and fewer tokens spent. Efficiency and savings that grow with use.

◆

The AI can only pick categories that exist

I ask Claude for the answer with a JSON schema whose enum is my category list. It can never invent one that isn't there, and the historical import classifies in batches instead of one call per email.

◆

JWT auth + PWA frontend

The backend exposes a stateless JWT API and the frontend is a React PWA: you use it like an app from your phone, which is where you actually check your spending. The demo runs on sample data, with no backend.

Live

The PWA shows parsed transactions with their AI-suggested category. You can try it in the demo.

Visual demo coming soon