The idea had been sitting around for a year or 2. Multiple bank accounts, separate spreadsheet files for each, monthly CSV exports that needed cleaning and reconciling by hand. I knew what I wanted to build. I just kept not starting.
Building Interval Coach changed that. That session made the approach feel real: blank repo to working tool, in a single day. The bottleneck wasn't ability. It was inertia about starting.
The next weekend, I built Ledgerflow, a personal finance tool for my own accounts.
The problem
Multiple bank accounts, each exporting CSVs in a slightly different format. Every month: download, clean, reorder, and append to the relevant master spreadsheet. Then tag each transaction, often with multiple tags. The same expense might need a personal finance category and a separate tax classification. Repeat across every account.
None of it was complicated. It was just relentlessly manual.
There are tools built for this. I probably should use one. But I also wanted to see if I could build something exactly fitted to how I think about my own money.
One weekend
By end of Saturday: parsers for each bank, all raw CSV files ingested, a web app with a sortable filterable transaction table.
By end of Sunday: all-accounts view, financial year filters, bulk tagging, CSV and Excel export, a classification pipeline with a manual override system.
The foundation decisions made early held up. Raw data goes into /data/raw and is never touched again. Everything processed is regenerated from raw via a deterministic pipeline. Overrides are stored as YAML and applied at read time, not written back into processed files. The pipeline can always be rerun cleanly.
Privacy by design
Building a personal finance tool with vibe coding raises a real question: what does the AI see?
The answer depends on the workflow. For algorithm work like auto-categorisation logic, parsing rules, and deduplication strategies, vibe coding is genuinely useful. The prompts describe the shape of the problem, not the data itself. Real transactions never appeared in a prompt. Sensitive data stayed on the machine; the AI helped with the code that processed it.
That shaped the architecture too. The system is local-first deliberately: no cloud sync, no hosted version, no external authentication. Financial data stays on the filesystem, processed entirely locally.
Data, not code
Working with real bank data means handling genuine variation. Different institutions, different export formats, different column layouts depending on account type. Formats that change over time. A parser needs to handle all of it, and the only way to know a case is covered is to encounter it.
This is the part vibe coding doesn't compress. Scaffolding, UI, parsers: fast. Verifying a parser handles every format variation across multiple years of real exports takes time that doesn't respond to faster prompting.
Built to use
The system replaced the spreadsheet workflow. Bulk tagging is the most useful feature: search for a merchant name, select all matching rows, apply a tag in one step. Monthly income and expense reports now take seconds instead of an hour of cross-file aggregation.
Built to use, not to show. The goal was never a portfolio piece. Vibe coding made that category of project viable: useful only to me, running on local data, never going to be showcased anywhere.
The thing vibe coding unlocked wasn't speed, exactly. It was permission to start something just for yourself.