2026 — ongoing
bills
Property bills land in a folder; a command turns them into a queryable record with the arithmetic checked, the files filed and the reminders set.
Private repository — the writing here describes the approach rather than linking to code.
- Python
- SQLite
- Claude vision
- macOS automation
Bills arrive from councils, water authorities, body corporates, insurers and utilities, in every format those organisations can think of. Each one used to mean the same small chore: rename the PDF, file it, set a reminder for the due date, and reconcile it against a spreadsheet at tax time. Multiply by two properties and it is a trickle of admin that never quite gets done.
Now a PDF goes into a property’s inbox folder and one command does the job. It works out what kind of bill it is, extracts every number that matters — dates, amounts, line items, meter readings, tier rates, discounts — renames the file to a consistent form, files it, sets a reminder in Reminders.app for the afternoon before it is due, texts a summary when the batch is done, and backs the database up.
The part that matters
Every bill type carries a rule for whether it adds up. Water: usage plus access charges plus interest minus rebate should equal the total. Insurance: premium plus GST plus stamp duty. If the arithmetic does not reconcile, the tool says so and by how much, and points at the field it thinks is missing.
That check is the whole design. A language model reading a PDF will produce something plausible whatever you give it, and plausible is not the same as right. The arithmetic is a second, dumber opinion that does not care what the model thought.
It has caught real errors: an extractor reading an inc-GST column as ex-GST, a body corp discount applied twice, a water bill with a tier pricing pattern nothing had seen before. Each time the fix goes into the tool, and every bill of that shape works cleanly from then on.
Bills keep changing — providers redesign invoices, add line items, move things around. Each change is a five-minute session: look at the bill, extend the fields or the rule, move on. The tool is built to be edited, not just used.
Asking it things
Structured queries by property, type and date. Or plain English: how much did we pay for New Farm in FY 24-25, and how much of that was water? — in a session that remembers the last question, so the follow-up can just be and how much of that was gas?
Payment details are captured from annotations written on the PDF after paying, so which future bills are unpaid and when did I pay last quarter’s rates both have honest answers.
Direction
A watcher so there is no command to run at all. A unified inbox across properties. Self-healing, where a failed reconciliation has the tool propose the schema change itself, apply it on a branch, and hand back a diff to review rather than a bug to fix. A local web interface for the tax-time use case.
The repository is private — it holds the shape of my finances as much as the code. Screenshots and a demo against synthetic data are on the list.