TL;DR: I built FinMan — a free personal finance app that imports any bank statement with AI, reads utility meters and fuel receipts from photos sent to a Telegram/WhatsApp bot, and tells me what one kilometer in my car actually costs. It started as a Perl script. Here is what I learned along the way.
The problem with every finance app I tried
I just wanted to know where my money goes. Simple wish, right?
I tried the popular trackers. Every single one failed me the same way: too much manual work. Enter every expense by hand. Configure categories for an hour. And almost none of them could pick up online card payments automatically — which is where most of my money actually went.
At some point I caught myself spending more time feeding the tracker than understanding my finances. So I did the developer thing: I wrote my own.
The first version was gloriously unfashionable — Perl on the backend, plain HTML and JavaScript on the front. Ugly, but mine. And it did one thing the polished apps didn't: it worked the way I lived.
Breakthrough #1: expenses that record themselves
The first real win was integrating Monobank's webhook API. Pay with the card — a second later the transaction is in my app: amount, merchant, category. No typing. No forgetting. For the first time my spending picture was complete without me doing anything.
That became the design principle for everything after: if it requires discipline, it will eventually fail. Automate the input.
Breakthrough #2: stop writing bank parsers, let AI read the statement
Other banks meant statement imports. Each bank has its own format: CSV here, PDF there, different columns, different date conventions. I wrote parser after parser — Privatbank, PUMB, Raiffeisen, Revolut, Wise, Erste, N26...
Eventually I got tired and built a different mechanism: a declarative extraction engine where AI recognizes the structure of a statement it has never seen before. Today FinMan imports any statement. New bank? No new code.
Technical lesson: the hard part wasn't the AI — it was stable payment IDs (so re-imports don't duplicate transactions) and currency handling per row. The boring parts are always the hard parts.
Breakthrough #3: the camera is the best input device
Two monthly rituals quietly ate my evenings:
Utility meters. Read the meter, subtract last month, multiply by tariff, repeat per service. Now: photo of the meter → bot → AI reads the digits, recognizes which utility service it belongs to, computes the difference and the amount due.
Car costs. I always wanted the real number: how much per kilometer — fuel vs repairs vs maintenance separately. Now: photo of the fuel receipt + photo of the odometer → the app calculates consumption (L/100km or MPG) and cost per km/mile.
The best part: the bot figures out what you sent it all by itself. Just drop a photo — no menus, no prompts, no explaining. It just knows what to do.
Breakthrough #4: numbers that don't lie
Two smaller features turned out to matter the most for honest analytics:
- Multi-currency with stored exchange rates. My local currency wasn't always stable, so comparing March to October in it was meaningless. Every payment keeps its rate; analytics can be viewed in a stable currency across any period.
- Excluded categories. Business projects and investments don't mix into household totals — but can still be analyzed separately. Daily spending stays readable.
From personal tool to product
Last year I rebuilt everything on a modern stack — FastAPI + SQLAlchemy 2.0 async on the backend, Vue 3 + TypeScript on the front — added family groups (shared budgets with roles), a tenant mode for landlords (your tenant sends meter photos, you stay in control), and an AI-assisted translation pipeline that localized the product into 20+ languages.
The core features are free. The tool was born free — I made it for myself first, and that's still how every feature gets tested.
Try it: finman.vhworx.com · the full story · Telegram bot · WhatsApp bot · feedback & roadmap on GitHub
What's the one manual routine in your life you'd most like to automate away? That question is where this whole project came from.
Top comments (2)
Very convenient. Previously, analyzing expenses was a task of increased complexity, with a lot of time, so much so that it all turned into one-time actions with not always successful completion and a complete lack of understanding of where the money goes. Now it all comes down to a few clicks to select the appropriate interface to view and analyze the structure and details of the expenses made.
This is seriously impressive — turning a frustrating daily chore into a fully automated system is exactly what great dev work looks like. Love the “if it requires discipline, it will fail” mindset. FinMan sounds insanely useful 👏