Chelle Code Michelle Hallworth

client work

Where every dollar on a construction job went

Every month, each dollar spent gets matched to its job, checked against the estimate, and turned into an invoice the client can actually read.

Delivered 2026 PythonpandasGmail and Drive APIsYAML configNetlify FunctionsNetlify BlobsPDF generation

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.

← All work