What one Sunday with Grok Bot taught me about software made to order
For about fourteen years I tracked my money in Suishouji (éšæ‰‹è®°, sui.com). It is a good app. It is also somebody else’s app: my financial history sits on somebody else’s servers, and somebody else decides which features I get. On Sunday, October 11, I wanted to see whether I could replace it without writing the code myself.
I have spent most of my career in manufacturing IT, building integration frameworks and, more recently, open-source tools like the IACF framework, MoM-MCP, apriso-mcp and Testbot. So I know what a “simple” app really costs. A personal finance tool with multiple currencies, credit cards, investments and a decade of imported history is not a weekend project. Normally.
The experiment
I use Grok Bot, an AI agent app. My bot is named Goji, and it has its own Linux computer to work on. At about 9:00 AM PT I asked Goji for a Suishouji-style app. Before writing anything, it went and studied how sui.com is organized: account types, transaction kinds, categories, the export format. About 20 minutes later I had a first working version running.
Then I spent the afternoon doing what I would do with a capable engineer sitting next to me. I used it, noticed what was missing, and asked for the next thing. One request at a time, in plain language. Group my accounts into a tree with totals. Let me set a balance and record why it changed. Add reconciliation. Calculate investment returns properly. Put a home page in front with this month’s numbers.

By the end of the day there were 133 automated tests passing, and the code was on GitHub, merged through pull requests the bot opened.
What I ended up with
IACF Finance is a Python FastAPI service with a SQLite database and a single-page web UI that works on both my phone and my desktop.

It handles the account types I actually have: bank, credit card, cash, Alipay and WeChat Pay, brokerage, retirement, crypto and loans, in multiple currencies, rolled up into net worth. Transactions cover expense, income, transfer, refund, balance adjustment and investment trades.
The feature that makes it usable day to day is quick add. I type “åˆé¥ 35 支付宔 or “paid 300 from checking to amex” and it books the entry. If it isn’t sure, the entry lands in a To-review inbox instead of being guessed silently. When I want more control, a detailed form pre-fills from what I typed, highlights its guesses, remembers my last choices, and has a save-and-add-another button for entering a stack of receipts.

It also watches a mailbox I configure over IMAP and turns bank alert emails into entries, using parsing rules I can edit. There is an optional Telegram bot. Recurring transactions run from a daily job. Balance adjustments record a transaction with a reason, such as investment gain, interest or fees, so the history stays explainable. Investment accounts get simple, Modified Dietz, annualized and XIRR returns. Backups run daily to local storage, and sync to my own Google Drive is built in as an option.
None of these features is new on its own. What is unusual is that every one of them is there because I asked for it, and nothing is there that I didn’t.

Fourteen years of history
The real test was my Suishouji export: about 8,000 rows from 2012 to 2026. Goji built the importer, and we ran it against a test copy of the database first. That surfaced bugs, which it fixed. Only then did we import for real.

This is where I learned the most about the division of labor. The bot was fast and careful. It backed up the database before every change, tested on copies, and asked before anything risky. But it could not know whether the result was right. I could, because it is my history and I know what it should look like. Checking the import against real data, and deciding when it was good enough, was my job. It should be.
Reconciliation came out of the same thinking. After an import like that, I wanted a way to anchor each account to a real statement and see exactly where the numbers drift.

Your app, your infrastructure
The other thing I wanted was independence. No subscription, no vendor holding my data, no risk of the service shutting down. Former Mint users know that feeling. Here the whole database is one SQLite file on a machine I control.

Right now it runs on Goji’s own Linux machine, private, reachable only over my Tailscale network. It is also packaged for Windows, with setup.bat, start.bat and an optional start-at-boot task, and there is a Dockerfile for anywhere else. Same code, three ways to deploy it.
Privacy was part of the process, not an afterthought. My personal data never left my machines. The screenshots in this post use demo data. Before anything went public, the bot checked the package and the repository for personal data and keys.

What still needed me
Here is the honest list. I had to know what I wanted; those requirements came from fourteen years of habits, and no bot can invent them for me. I had to judge results against reality, especially the import. I had to decide what stays private and when a change was risky enough to slow down.
And it is a personal tool built in one day. It is well tested for that, but it is not a product with a support team behind it. If you run it, you own it, backups included.
The bigger idea
For most of my career, getting software has meant a choice: buy a product that mostly fits, or fund a project to build the rest. What I saw on Sunday is a third option. When you need an app, you describe it to an agent, and it builds one that matches your requirements, on infrastructure you choose. You stay the product owner. The agent does the engineering and checks with you before anything you would regret.
I don’t think this replaces professional software teams. Manufacturing systems still need architecture, validation and people who understand the plant floor. But for the long tail of tools that one person or one small team needs, the math has changed.
The code is on GitHub at https://github.com/mdaxf/finance. If you try something similar, I would like to hear what you built.


Leave a Reply