--- title: "Thriftledger: bank accounts, budgets and spending reports for a household" author: "@chris" author_url: https://elements.dev/users/chris published: 2026-09-30T21:49:48.816Z url: https://elements.dev/demos/d5rv9p01/thriftledger-bank-accounts-budgets-and-spending-reports-for kind: post format: article --- # Thriftledger: bank accounts, budgets and spending reports for a household by [@chris](https://elements.dev/users/chris) ยท 2026-09-30 ## Description Bank accounts, CSV import that skips duplicates, rules that categorize, monthly budgets and spending reports. Thriftledger needed a ledger that stays current in every open tab, a CSV importer that knows what it has already seen, rules that sort spending, and budgets that move as transactions arrive. Each of those is a part of Elements, so the agent spent its 24 minutes on the money itself. **What Elements gave the app** - **A live ledger.** Accounts, categories, rules, budgets, imports and transactions are LiveTables, each opened for the signed-in household. A trigger carries every transaction write to the open pages, so the dashboard's budgets move the moment an import lands in another tab. - **CSV import as a function call.** The import page previews the file in the browser, then sends it to an `@rpc` that parses the rows on the server and inserts them in one transaction. Each row carries a fingerprint, so a re-import skips what is already there, and the column mapping is saved for that bank's next export. - **Rules that categorize.** Every imported row takes the longest matching rule, and one rpc runs the rules over everything still uncategorized in a single SQL update. Edits go through the transactions LiveTable, which checks that a split's parts add up to the whole. - **Reports from the data.** The reports page draws its spending charts as SVG from the ledger's own rows. - **Data from SQL files.** Two migrations define the ledger and seed one household with three accounts, categories, rules, budgets and six months of activity ending today. **What the project server gave the agent** The project server runs alongside the agent and answers as soon as a file is saved: it type-checks the templates, TypeScript and SQL, applies migrations and reruns the tests, so every question came back right away and the agent kept building. **What shipped** The app type-checks with zero errors and all 28 tests pass. Every page works on desktop and phone, and live updates arrive across tabs, such as a budget that moves when an import lands.