A self-built financial command center: real transaction data, AES-256 encryption, and an AI-generated CFO intelligence report across 9 interactive dashboards
I built a private, browser-based financial command center to replace passive banking apps with an active CFO layer — encrypted HTML dashboards auto-generated from a local transaction database, with an AI-authored intelligence report and 9 interactive CFO reports covering burn rate, cash flow forecasting, debt payoff projection, AR aging, and subscription auditing.
The brief
I had no single view of my financial position. Banking apps show balances; credit card apps show statements. Nothing connects income timing, burn rate, subscription waste, accounts receivable aging, and forward cash flow in one place — let alone surfaces the behavioral patterns underneath the numbers. I needed a CFO layer, not another bank dashboard.
What I built
A four-page financial command center, locally generated from a transaction database (finance.db) and served as encrypted static HTML:
Financial Position — one-page net worth snapshot with tooltips on every number, cash flow history chart, and AR outstanding tracker. Built for fast clarity, not accounting precision.
CFO Report Suite — 9 interactive reports behind a sticky tab nav: Burn Rate and Runway, Income Concentration Risk, Credit Card Payoff Projector (interactive slider, real amortization math), Spending Trend by Category, AR Aging, Subscription True-Cost Stack (tiered Keep / Review / Kill), Savings Rate Analysis, 3-Month Cash Flow Forecast (two scenarios), and Reimbursement Recovery Tracker.
Financial Intelligence Report — a 15-section long-form document authored by Donna v3 (my Claude-based AI system), covering executive summary, behavioral pattern analysis, three frameworks to install, five automation designs, an insurance gap review, and a 30-day action plan. The report is the CFO’s memo; the dashboards are the supporting exhibits.
Index / Command Center — a nav hub with no financial data, so it needs no encryption.
How it’s built
All financial pages are AES-256-GCM encrypted at build time using encrypt.py. The script reads a password from macOS Keychain (security find-generic-password), derives a 256-bit key via PBKDF2-HMAC-SHA256 at 600,000 iterations, encrypts each HTML file, and writes a self-contained unlock shell to ./encrypted/. No server. No auth endpoint. Decryption runs entirely in the browser via the Web Crypto API — the password never leaves the client.
Chart.js renders all data visualizations inline. The CC payoff calculator runs a live amortization loop on slider input. The forecast chart computes two scenario projections (zero income vs. invoices collected plus retainer) directly in JS from hardcoded known values — no backend, no API call, no stale cache.
The intelligence report was generated by Donna v3 analyzing the finance.db transaction export, then written as structured HTML with callout blocks, pull quotes, numbered sections, and a linked table of contents.
Why it matters
Most personal finance tools ask you to adapt to their categories. This system is the opposite — it was built from my actual transaction data, structured around the decisions I actually need to make (collect these invoices, kill these subscriptions, pay off this card in a lump sum), and delivered as a private artifact I control entirely.
The encryption approach is worth noting on its own: no cloud storage, no OAuth, no session tokens. A password in Keychain, a Python script, and browser-native crypto. The sensitive pages are computationally indistinguishable from random bytes until the right password is entered — at which point they render instantly, client-side, with no round-trip.
The AI-authored intelligence report demonstrates the pattern I use across client work: give a capable model clean structured data plus a sharp brief, and it produces analysis that would take a human CFO a day to write. The output here was good enough to act on immediately — subscription cancellations, invoice follow-ups, and a lump-sum payoff recommendation all executed the same day the report was generated.
Want something like this?
That's the kind of thing I build. Tell me about yours.