LedgerlineBudget Dashboard
What it does for you
Bank CSV in, categorized spending dashboard out, with hand-drawn SVG charts and nothing leaving the browser.

Screenshots

In more detail
Ledgerline takes the CSV file your bank already gives you and turns it into a private dashboard of where your money went. Nothing leaves your browser, and there is no bank login. You get categories, budgets, recurring charges, and six charts, plus a searchable transaction table.
Honest limits
Imports were verified through the core and the demo path. Drag and drop and the file picker were not clicked through by hand. The README briefly claimed split transactions; that exists in the core but is not wired into the UI, and the case study says so. The sample data is fictional. It runs and passes its checks, but it has not seen a year of real bank exports.
How I built it
Claude Code built this one, and it took more than one run to get there. Earlier runs wrote the core and most of the UI, then got stopped by the same dropping API stream that hit the whole batch. The finishing run on September 23 took about 0.1 hours.
That finishing run did not rewrite anything. It audited what the stopped run left behind: node --check on every module, headless Chrome DOM dumps for every view, then an extra check in verify.mjs that every file index.html references actually exists. It shot the dark and light screenshots and wrote everything in small pieces, per the tiny-writes brief.
All the hard logic lives in one pure module, budget.js, with 73 exports. Claude Code wrote the parsing core and its tests: amount formats like (45.10), 12.50-, 1.234,56, and 45.00 CR, date detection that flags ambiguous files, and column detection when a bank gives no usable headers. It also wrote a seeded generator for a fictional six-month household, so the demo is realistic and byte-stable. I set the spec, the privacy rule, and the scope.
What I learned
- Bank CSVs are the real problem, not the charts. Column detection needs both header names and value shapes, and it has to admit uncertainty (flag ambiguous dates) instead of guessing quietly.
- A stable per-row hash is what makes "import again" safe. Re-importing the same file is a no-op, which is why the totals can be trusted.
- "Learn from my edit" works best as a visible rule you can reorder or delete, with undo, not hidden magic.
- Keeping chart geometry (nice ticks, arc paths, column paths) in the pure core let 315 assertions cover the math without a browser.
- Audit what a stopped run left before rewriting anything. Most of the work was already good.
What carried forward
This finished on the tiny-writes pattern that the #31 pilot proved on September 20: small modules, short writes, one tool call per response. The pure core plus verify.mjs setup goes back to #9. The "flag ambiguous dates, do not guess" idea shows up again in #40 CSV Doctor, which was built separately in Claude Cowork and landed on the same answer.
If I took it further
I would wire the split-transaction UI and add a real multi-file import test in the browser from the start.
#032 Built with Claude Code September 23, 2026 315 automated checks