Skip to content

heezy-finance — Daily Log

2026-06-18

Phase 1 + Phase 2 — Data consolidation + dashboard improvements

Phase 1 (completed)

  • Full audit of all data sources and dashboard code
  • Dashboard was reading orders + receipts but had zero integration with bank_transactions
  • receipts.date text column had mixed formats — causing silent parse failures; gas showed $36 instead of $140.52
  • Added date_ts (timestamptz), merchant_normalized, payment_type to receipts
  • Added category, merchant_normalized to bank_transactions
  • Backfilled date_ts on all 43 existing receipts
  • Built rule-based bank transaction categorizer (Ollama too slow on CPU for this)
  • Updated app.py to use date_ts for receipts; integrated bank_transactions as third source
  • Updated receipts service to populate date_ts + merchant_normalized on all new inserts
  • Fixed BoA parser: was hardcoded to checking — now detects credit card statements from first 3000 chars of PDF
  • Fixed Cap1 parser: transactions were assigned to wrong account due to stmt_id lookup using flushed-only map
  • Statement auto-ingest: NFS watch dir pipeline confirmed end-to-end (2 PDFs → parsed → DB)
  • docs.heezy.info: MkDocs Material site deployed to Cloudflare Pages with Gitea pipeline
  • All public heezy sites added to Cloudflare Access (Google OAuth, trentnielsen84 + brdrgrl18)

Gas spend fixed: $140.52 (was $36). June 2026 total: ~$2,226 across all sources.

Phase 2 (in progress)

  • Bank page: Added dedicated Bank tab to dashboard — category breakdown cards, Plotly monthly bar chart, top merchants table
  • Bank page "This Month": Falls back to most recent month with data instead of showing empty cards for current month (May 2026 shown)
  • Purchases table: All 6 columns now sortable (Date, Source, Vendor, Item, Total, Category) — click header to sort, ▲▼ indicators
  • Purchases date defaults: Start Date defaults to first of current month, End Date to today on first page load
  • payment_type on receipts: Dropdown added to both edit flows (post-upload + inline): cash / credit / debit / check / other
  • CI/CD: Fixed all deploy-*.yml trigger paths (were using repo name instead of k8s app dir); added rollout restart to auto-deploy.yaml so :latest images actually roll out
  • Monthly reminder: Cron fires 1st of each month at 10am ET to prompt NFS statement drop

Blocked: BoA CC statements + additional monthly statements — manual download from bank portal required.

Evening session (continued)

  • n8n Amazon forwarding fixed: Workflow had been erroring on every run since 2026-06-13. Root cause: two nodes (Log Forward to DB, Log Skip to DB) existed in DB but not in n8n's compiled in-memory graph. n8n caches the workflow graph at activation time and never reloads from DB on restart — only a REST API PUT forces a recompile. Fix: stripped the two missing nodes, rewired connections to route around them. Execs 3694+ all success.
  • Lesson: N8N_PROTOCOL=https blocks HTTP write ops (PUT/POST) on localhost with 403, even via SSH tunnel. To unblock: temporarily set N8N_PROTOCOL=https_DISABLED, restart, make API call, restore.
  • Dev agent context: Created dev-agent/CONTEXT.md — comprehensive reference for spawned dev subagents covering repos, git remotes, CI/CD gotchas, DB, SSH, services, metrics requirement, and commit style.
  • CF Access resource rename (deferred): Attempted to rename cloudflare_access_applicationcloudflare_zero_trust_access_application in Terraform. Neither moved{} blocks nor state mv work in cloudflare provider v4 for cross-type renames — provider v4 can't refresh the new type, so plan shows destroy+create. Reverted access.tf to original names. Defer until provider v5 upgrade.
  • Docs updated: services/cloudflare-access.md added, statement-parser.md + data-sources.md + ci-cd.md updated via docs subagent.