The problem
Eric bills cost-based, and he tracked each job in a hand-maintained Google Sheet. The costs behind it were scattered across bank exports, vendor statements, receipts and email. Tax prep turned out to be a byproduct; the job audit was the real need.
What I built
Five subsystems: collect, normalize, categorize, review, deliver.
- Collect. Exhaustive Gmail and Drive sweeps that enumerate everything in a window instead of searching for keywords, because a keyword search only finds the vendors you already knew about.
- Normalize. A ledger of 781 rows across 8 accounts with deterministic, content-hashed transaction IDs (the fix for the v1 bug that detached 846 edits), plus six vendor document parsers.
- Two tiers of money. Accounts carry the money; vendor documents carry itemization only. Keeping those separate is what stops a receipt and the card charge it explains from counting twice.
- Deliver. Invoice and audit PDFs, and the job audit dashboard as one self-contained HTML file.
All of the configuration (accounts, categories, vendors, transfers) is data, not code, and the tool proposes while Eric confirms. There is no generated prose in anything a client sees: templates plus footnotes Eric writes himself.
How it was run
53 architecture decisions recorded as ADRs, 283 offline tests, and every doc de-identified before its first commit (Eric and EHAS are named; everyone else is a pseudonym like SUB-1). The de-identification approach is written up in a free guide.
The tool holds real client records, so there is no public demo of this one.